{"version":3,"sources":["vendor/ember-cli/app-prefix.js","connections-ui/adapter.js","connections-ui/adapters/application.js","connections-ui/adapters/call-forwarding.js","connections-ui/adapters/callv2.js","connections-ui/adapters/coded-geolocation.js","connections-ui/adapters/conversation.js","connections-ui/adapters/division.js","connections-ui/adapters/externalcontacts/contact.js","connections-ui/adapters/externalcontacts/external-organization.js","connections-ui/adapters/geolocation-settings.js","connections-ui/adapters/geolocation.js","connections-ui/adapters/grant.js","connections-ui/adapters/group-policy.js","connections-ui/adapters/group.js","connections-ui/adapters/library.js","connections-ui/adapters/location.js","connections-ui/adapters/meeting.js","connections-ui/adapters/person.js","connections-ui/adapters/public-api-user.js","connections-ui/adapters/purecloud-user.js","connections-ui/adapters/purecloud.js","connections-ui/adapters/queue.js","connections-ui/adapters/recorded-call.js","connections-ui/adapters/recording.js","connections-ui/adapters/response.js","connections-ui/adapters/role.js","connections-ui/adapters/station.js","connections-ui/adapters/user.js","connections-ui/adapters/voicemail-message.js","connections-ui/app.js","connections-ui/application-loading/template.js","connections-ui/attach-media-stream/util.js","connections-ui/audio-visualizer/component.js","connections-ui/authenticators/directory.js","connections-ui/authenticators/test.js","connections-ui/authorizers/directory.js","connections-ui/cldrs/ar.js","connections-ui/cldrs/cs.js","connections-ui/cldrs/da.js","connections-ui/cldrs/de.js","connections-ui/cldrs/en.js","connections-ui/cldrs/es.js","connections-ui/cldrs/fi.js","connections-ui/cldrs/fr.js","connections-ui/cldrs/he.js","connections-ui/cldrs/hi.js","connections-ui/cldrs/it.js","connections-ui/cldrs/ja.js","connections-ui/cldrs/ko.js","connections-ui/cldrs/nl.js","connections-ui/cldrs/no.js","connections-ui/cldrs/pl.js","connections-ui/cldrs/pt.js","connections-ui/cldrs/ru.js","connections-ui/cldrs/sv.js","connections-ui/cldrs/th.js","connections-ui/cldrs/tr.js","connections-ui/cldrs/uk.js","connections-ui/cldrs/zh.js","connections-ui/components/accessible-checkbox/component.js","connections-ui/components/admin-ui-modal/component.js","connections-ui/components/admin-ui-modal/template.js","connections-ui/components/alert-message/component.js","connections-ui/components/analog-clock/component.js","connections-ui/components/analog-clock/template.js","connections-ui/components/anchor-tag/component.js","connections-ui/components/anchor-tag/template.js","connections-ui/components/app-img/component.js","connections-ui/components/app-img/template.js","connections-ui/components/audio-player-v2/component.js","connections-ui/components/audio-player-v2/participant/component.js","connections-ui/components/audio-player-v2/timeline/component.js","connections-ui/components/audio-player-v2/waveform-graph/component.js","connections-ui/components/audio-player/component.js","connections-ui/components/audio-player/seek-bar/component.js","connections-ui/components/audio-player/seek-bar/template.js","connections-ui/components/audio-player/template.js","connections-ui/components/audio-recorder/component.js","connections-ui/components/audio-recorder/template.js","connections-ui/components/auth-loading/component.js","connections-ui/components/auth-loading/template.js","connections-ui/components/basic-dropdown.js","connections-ui/components/basic-dropdown/content-element.js","connections-ui/components/basic-dropdown/content.js","connections-ui/components/basic-dropdown/trigger.js","connections-ui/components/card-tree/card-tree-entry/component.js","connections-ui/components/card-tree/card-tree-entry/template.js","connections-ui/components/card-tree/component.js","connections-ui/components/card-tree/template.js","connections-ui/components/card-view/component.js","connections-ui/components/card-view/template.js","connections-ui/components/characters-used/component.js","connections-ui/components/characters-used/template.js","connections-ui/components/chat-settings/component.js","connections-ui/components/chat-settings/template.js","connections-ui/components/click-outside.js","connections-ui/components/create-entity-menu/component.js","connections-ui/components/create-entity-menu/template.js","connections-ui/components/date-picker/component.js","connections-ui/components/date-picker/template.js","connections-ui/components/desktop-notification/component.js","connections-ui/components/document-title.js","connections-ui/components/drag-drop-container/component.js","connections-ui/components/drag-drop-container/template.js","connections-ui/components/drag-drop-item/component.js","connections-ui/components/drag-drop-item/template.js","connections-ui/components/drop-down/component.js","connections-ui/components/dropdown-menu/component.js","connections-ui/components/dropdown-menu/template.js","connections-ui/components/duration-format/component.js","connections-ui/components/edit-profile-picture/component.js","connections-ui/components/edit-profile-picture/template.js","connections-ui/components/ember-modal-dialog-positioned-container.js","connections-ui/components/ember-modal-dialog/-basic-dialog.js","connections-ui/components/ember-modal-dialog/-in-place-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-tether-dialog.js","connections-ui/components/ember-modal-dialog/-tether-dialog.js","connections-ui/components/ember-tether.js","connections-ui/components/ember-wormhole.js","connections-ui/components/emergency-location/component.js","connections-ui/components/emergency-location/template.js","connections-ui/components/emoji-dom/component.js","connections-ui/components/entity-contact-group-v2/component.js","connections-ui/components/entity-contact-group-v2/template.js","connections-ui/components/entity-contact-group/component.js","connections-ui/components/entity-contact-queue/component.js","connections-ui/components/entity-contact/component.js","connections-ui/components/entity-contact/template.js","connections-ui/components/entity-favorite/component.js","connections-ui/components/entity-field-section/-section-footer/template.js","connections-ui/components/entity-field-section/-section-header/template.js","connections-ui/components/entity-field-section/add-new/component.js","connections-ui/components/entity-field-section/add-new/template.js","connections-ui/components/entity-field-section/component.js","connections-ui/components/entity-field-section/entity-contact-info/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.js","connections-ui/components/entity-field-section/entity-contact-info/contact-info-group.js","connections-ui/components/entity-field-section/entity-contact-info/template.js","connections-ui/components/entity-field-section/entity-education/component.js","connections-ui/components/entity-field-section/entity-groups/component.js","connections-ui/components/entity-field-section/entity-groups/template.js","connections-ui/components/entity-field-section/entity-location/component.js","connections-ui/components/entity-field-section/entity-relationships/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-group.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-search/component.js","connections-ui/components/entity-field-section/entity-relationships/template.js","connections-ui/components/entity-field-section/template.js","connections-ui/components/entity-fields/address-field/component.js","connections-ui/components/entity-fields/address-field/template.js","connections-ui/components/entity-fields/boolean-field/component.js","connections-ui/components/entity-fields/boolean-field/template.js","connections-ui/components/entity-fields/date-field/component.js","connections-ui/components/entity-fields/date-field/template.js","connections-ui/components/entity-fields/email-field/component.js","connections-ui/components/entity-fields/email-field/template.js","connections-ui/components/entity-fields/history-field/component.js","connections-ui/components/entity-fields/history-field/template.js","connections-ui/components/entity-fields/image-field/component.js","connections-ui/components/entity-fields/location-field/component.js","connections-ui/components/entity-fields/location-field/template.js","connections-ui/components/entity-fields/multiline-text-field/component.js","connections-ui/components/entity-fields/multiline-text-field/template.js","connections-ui/components/entity-fields/person-field/component.js","connections-ui/components/entity-fields/person-field/template.js","connections-ui/components/entity-fields/phone-field/component.js","connections-ui/components/entity-fields/phone-field/template.js","connections-ui/components/entity-fields/select-field/component.js","connections-ui/components/entity-fields/select-field/template.js","connections-ui/components/entity-fields/tag-field/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/template.js","connections-ui/components/entity-fields/tag-field/tag-wrapper/component.js","connections-ui/components/entity-fields/tag-field/template.js","connections-ui/components/entity-fields/text-field/component.js","connections-ui/components/entity-fields/text-field/template.js","connections-ui/components/entity-fields/validators.js","connections-ui/components/entity-fields/validators/address.js","connections-ui/components/entity-fields/validators/boolean.js","connections-ui/components/entity-fields/validators/date.js","connections-ui/components/entity-fields/validators/email.js","connections-ui/components/entity-fields/validators/history.js","connections-ui/components/entity-fields/validators/image.js","connections-ui/components/entity-fields/validators/location.js","connections-ui/components/entity-fields/validators/multiline-text.js","connections-ui/components/entity-fields/validators/person.js","connections-ui/components/entity-fields/validators/phone.js","connections-ui/components/entity-fields/validators/select.js","connections-ui/components/entity-fields/validators/tag.js","connections-ui/components/entity-fields/validators/text.js","connections-ui/components/entity-fields/validators/weblink.js","connections-ui/components/entity-fields/weblink-field/component.js","connections-ui/components/entity-fields/weblink-field/template.js","connections-ui/components/entity-hover-card-v2/component.js","connections-ui/components/entity-hover-card-v2/template.js","connections-ui/components/entity-hover-card/component.js","connections-ui/components/entity-image-v2/component.js","connections-ui/components/entity-image-v2/template.js","connections-ui/components/entity-image/component.js","connections-ui/components/entity-location/component.js","connections-ui/components/entity-mini/component.js","connections-ui/components/entity-mini/default/component.js","connections-ui/components/entity-mini/default/template.js","connections-ui/components/entity-mini/entity-details/component.js","connections-ui/components/entity-mini/entity-details/template.js","connections-ui/components/entity-mini/external-contact/component.js","connections-ui/components/entity-mini/external-contact/template.js","connections-ui/components/entity-mini/queue/component.js","connections-ui/components/entity-mini/queue/template.js","connections-ui/components/entity-mini/template.js","connections-ui/components/entity-picture-content/component.js","connections-ui/components/entity-picture-content/delete-pictures/component.js","connections-ui/components/entity-picture-content/delete-pictures/template.js","connections-ui/components/entity-picture-content/template.js","connections-ui/components/entity-profile/add-section/component.js","connections-ui/components/entity-profile/add-section/template.js","connections-ui/components/entity-profile/component.js","connections-ui/components/entity-profile/permissions.js","connections-ui/components/entity-profile/profiles/field-data.js","connections-ui/components/entity-profile/profiles/profile.js","connections-ui/components/entity-profile/profiles/section-info.js","connections-ui/components/entity-profile/section-icon/component.js","connections-ui/components/entity-profile/section-icon/template.js","connections-ui/components/entity-profile/template.js","connections-ui/components/entity-search/component.js","connections-ui/components/entity-search/template.js","connections-ui/components/entity-status/component.js","connections-ui/components/entity-status/template.js","connections-ui/components/entity-v2/activity-indicator/component.js","connections-ui/components/entity-v2/component.js","connections-ui/components/entity-v2/contact-group/component.js","connections-ui/components/entity-v2/favorite/component.js","connections-ui/components/entity-v2/hover-card/component.js","connections-ui/components/entity-v2/image/component.js","connections-ui/components/entity-v2/location/component.js","connections-ui/components/entity-v2/presence-indicator-dot/component.js","connections-ui/components/entity-v2/presence-label/component.js","connections-ui/components/entity-v2/presence-selector-dropdown/component.js","connections-ui/components/expander-plugin/component.js","connections-ui/components/expander-plugin/template.js","connections-ui/components/field-label/component.js","connections-ui/components/field-label/template.js","connections-ui/components/fixtable-column-header.js","connections-ui/components/fixtable-column-label.js","connections-ui/components/fixtable-empty-state.js","connections-ui/components/fixtable-footer.js","connections-ui/components/fixtable-grid.js","connections-ui/components/fixtable-row-toggle.js","connections-ui/components/fixtable-row.js","connections-ui/components/flashy-webrtc-troubleshooter/component.js","connections-ui/components/floorplan-editor/component.js","connections-ui/components/floorplan-editor/template.js","connections-ui/components/floorplan-popover/component.js","connections-ui/components/floorplan-popover/template.js","connections-ui/components/font-icon/component.js","connections-ui/components/group-contact-modal/component.js","connections-ui/components/group-contact-modal/inline-number-input/component.js","connections-ui/components/group-contact-modal/inline-number-input/template.js","connections-ui/components/group-contact-modal/template.js","connections-ui/components/group-profile/component.js","connections-ui/components/group-profile/dynamic-rules/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.js","connections-ui/components/group-profile/dynamic-rules/condition-display/template.js","connections-ui/components/group-profile/dynamic-rules/template.js","connections-ui/components/group-profile/group-contact-panel/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/component.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.js","connections-ui/components/group-profile/group-contact-panel/template.js","connections-ui/components/group-profile/group-list/component.js","connections-ui/components/group-profile/group-list/list-item/component.js","connections-ui/components/group-profile/group-list/list-item/template.js","connections-ui/components/group-profile/group-list/template.js","connections-ui/components/group-profile/membership-entry/component.js","connections-ui/components/group-profile/membership-entry/template.js","connections-ui/components/group-profile/membership-listing/component.js","connections-ui/components/group-profile/membership-listing/template.js","connections-ui/components/group-profile/membership-rule-entry/component.js","connections-ui/components/group-profile/membership-rule-entry/template.js","connections-ui/components/group-profile/membership-search/component.js","connections-ui/components/group-profile/membership-search/template.js","connections-ui/components/group-profile/membership-tag-search/component.js","connections-ui/components/group-profile/membership-tag-search/template.js","connections-ui/components/group-profile/roles-edit/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/component.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/component.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/component.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/component.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.js","connections-ui/components/group-profile/roles-edit/template.js","connections-ui/components/group-profile/template.js","connections-ui/components/grouped-facet-term/component.js","connections-ui/components/grouped-facet-term/template.js","connections-ui/components/headset-status/component.js","connections-ui/components/headset-vendor-picker/component.js","connections-ui/components/horizontal-collection.js","connections-ui/components/icon-bootstrap/component.js","connections-ui/components/icon-bootstrap/template.js","connections-ui/components/in-viewport.js","connections-ui/components/infinite-scroll/component.ts","connections-ui/components/infinite-scroll/template.js","connections-ui/components/integration-badge/component.js","connections-ui/components/integration-badge/template.js","connections-ui/components/integration-badges/component.js","connections-ui/components/integration-badges/template.js","connections-ui/components/interaction-annotation/component.js","connections-ui/components/light-gallery-modal/component.js","connections-ui/components/light-gallery-modal/template.js","connections-ui/components/link-to-external.js","connections-ui/components/loading-indicator/component.js","connections-ui/components/loading-indicator/template.js","connections-ui/components/location-display/component.js","connections-ui/components/location-display/template.js","connections-ui/components/login-oauth/component.js","connections-ui/components/login-oauth/template.js","connections-ui/components/logoff-link/component.js","connections-ui/components/media-providers/video-dropdown/component.js","connections-ui/components/media-providers/video-dropdown/template.js","connections-ui/components/mini-card/component.js","connections-ui/components/mini-card/template.js","connections-ui/components/modal-component/component.js","connections-ui/components/modal-component/template.js","connections-ui/components/modal-dialog-overlay.js","connections-ui/components/modal-dialog.js","connections-ui/components/modal-dialog/component.js","connections-ui/components/navigation-sub-menu/component.js","connections-ui/components/new-group/component.js","connections-ui/components/new-group/template.js","connections-ui/components/occludable-area.js","connections-ui/components/pc-style-icon-example.js","connections-ui/components/person-card/component.js","connections-ui/components/person-card/template.js","connections-ui/components/person-graph/component.js","connections-ui/components/person-graph/template.js","connections-ui/components/person-icon/component.js","connections-ui/components/person-icon/template.js","connections-ui/components/pikaday-input.js","connections-ui/components/pikaday-inputless.js","connections-ui/components/popover-on-component.js","connections-ui/components/popover-on-element.js","connections-ui/components/power-select-multiple.js","connections-ui/components/power-select-multiple/trigger.js","connections-ui/components/power-select.js","connections-ui/components/power-select/before-options.js","connections-ui/components/power-select/options.js","connections-ui/components/power-select/placeholder.js","connections-ui/components/power-select/power-select-group.js","connections-ui/components/power-select/search-message.js","connections-ui/components/power-select/trigger.js","connections-ui/components/pre-render.js","connections-ui/components/presence-label/component.js","connections-ui/components/presence-label/person-activity/component.js","connections-ui/components/presence-selector-dropdown/component.js","connections-ui/components/profile-dropdown-menu/component.js","connections-ui/components/progress-underlay/component.js","connections-ui/components/queue-toggle-switch/component.js","connections-ui/components/radio-input/component.js","connections-ui/components/resizable-content/component.js","connections-ui/components/resizable-content/template.js","connections-ui/components/resize-detector.js","connections-ui/components/search-facet-group/component.js","connections-ui/components/search-facet-group/template.js","connections-ui/components/search-facet-term/component.js","connections-ui/components/search-facet-term/template.js","connections-ui/components/search-page/component.js","connections-ui/components/search-page/template.js","connections-ui/components/search-result-context/component.js","connections-ui/components/search-result-context/template.js","connections-ui/components/sms-message-icon/component.js","connections-ui/components/sms-message-icon/template.js","connections-ui/components/station-disassociate-link/component.js","connections-ui/components/tags-input/label/template.js","connections-ui/components/telephone-input/component.js","connections-ui/components/tether-dialog.js","connections-ui/components/tether-popover-on-component.js","connections-ui/components/tether-popover-on-element.js","connections-ui/components/tether-tooltip-on-component.js","connections-ui/components/tether-tooltip-on-element.js","connections-ui/components/time-elapsed/component.js","connections-ui/components/time-elapsed/template.js","connections-ui/components/time-machine-confirmation/component.js","connections-ui/components/time-machine-confirmation/template.js","connections-ui/components/toggle-switch/component.js","connections-ui/components/tooltip-on-component.js","connections-ui/components/tooltip-on-element.js","connections-ui/components/upload-picture/component.js","connections-ui/components/upload-picture/helpers.js","connections-ui/components/upload-picture/template.js","connections-ui/components/uploaded-image/component.js","connections-ui/components/uploaded-image/template.js","connections-ui/components/vertical-collection.js","connections-ui/components/vertical-item.js","connections-ui/components/volume-input/component.js","connections-ui/components/webrtc-debug-modal/component.js","connections-ui/components/webrtc-issues/component.js","connections-ui/components/webrtc-settings/component.js","connections-ui/components/webrtc-troubleshooter/component.js","connections-ui/components/wrap-urls.js","connections-ui/components/wrap-urls/link.js","connections-ui/components/wrap-urls/url.js","connections-ui/components/x-option.js","connections-ui/components/x-select.js","connections-ui/config/asset-manifest.js","connections-ui/controllers/admin.js","connections-ui/controllers/application.js","connections-ui/controllers/array.js","connections-ui/controllers/card/detail.js","connections-ui/controllers/card/tree.js","connections-ui/controllers/chat-room.js","connections-ui/controllers/chat/participants.js","connections-ui/controllers/contacts.js","connections-ui/controllers/engage/embedded.js","connections-ui/controllers/feedback.js","connections-ui/controllers/maintenance.ts","connections-ui/controllers/object.js","connections-ui/controllers/permissions.js","connections-ui/controllers/person/detail.js","connections-ui/controllers/region-chooser.js","connections-ui/controllers/relate/externalcontact.js","connections-ui/controllers/relate/externalorganization.js","connections-ui/controllers/relate/index.js","connections-ui/controllers/reset-password.js","connections-ui/controllers/search.js","connections-ui/controllers/time-machine.js","connections-ui/enums/plantronics-call-events.js","connections-ui/field-config/entities/external-contact.js","connections-ui/field-config/entities/group.js","connections-ui/field-config/entities/org.js","connections-ui/field-config/entities/person.js","connections-ui/field-config/field-config.js","connections-ui/field-config/field-object.js","connections-ui/field-config/field-section.js","connections-ui/field-config/field.js","connections-ui/formats.js","connections-ui/group/store-mixin.js","connections-ui/helpers/-label-for-activity.js","connections-ui/helpers/abs.js","connections-ui/helpers/acos.js","connections-ui/helpers/acosh.js","connections-ui/helpers/add.js","connections-ui/helpers/address-format.js","connections-ui/helpers/and.js","connections-ui/helpers/app-version.js","connections-ui/helpers/array-contains.js","connections-ui/helpers/asin.js","connections-ui/helpers/asinh.js","connections-ui/helpers/atan.js","connections-ui/helpers/atan2.js","connections-ui/helpers/atanh.js","connections-ui/helpers/await.js","connections-ui/helpers/can-add-group-ring-member.js","connections-ui/helpers/can-edit.js","connections-ui/helpers/cancel-all.js","connections-ui/helpers/cbrt.js","connections-ui/helpers/ceil.js","connections-ui/helpers/chat-time.js","connections-ui/helpers/clz32.js","connections-ui/helpers/cos.js","connections-ui/helpers/cosh.js","connections-ui/helpers/css-classify.js","connections-ui/helpers/dasherize.js","connections-ui/helpers/div.js","connections-ui/helpers/ember-power-select-is-group.js","connections-ui/helpers/ember-power-select-is-selected.js","connections-ui/helpers/ember-power-select-true-string-if-present.js","connections-ui/helpers/emoji-text.js","connections-ui/helpers/empty.js","connections-ui/helpers/eq.js","connections-ui/helpers/equals.js","connections-ui/helpers/escape.js","connections-ui/helpers/exp.js","connections-ui/helpers/expand-line-breaks.js","connections-ui/helpers/expm1.js","connections-ui/helpers/facet-label.js","connections-ui/helpers/facet-term-label.js","connections-ui/helpers/first.js","connections-ui/helpers/flair.js","connections-ui/helpers/floor.js","connections-ui/helpers/format-date.js","connections-ui/helpers/format-filesize.js","connections-ui/helpers/format-html-message.js","connections-ui/helpers/format-link.js","connections-ui/helpers/format-message.js","connections-ui/helpers/format-number.js","connections-ui/helpers/format-relative.js","connections-ui/helpers/format-time.js","connections-ui/helpers/fround.js","connections-ui/helpers/full-name.js","connections-ui/helpers/gcd.js","connections-ui/helpers/get-select-options.js","connections-ui/helpers/group-ring-name.js","connections-ui/helpers/gt.js","connections-ui/helpers/gte.js","connections-ui/helpers/has-group-number.js","connections-ui/helpers/help-article-icon.js","connections-ui/helpers/html-safe.js","connections-ui/helpers/hypot.js","connections-ui/helpers/icon-for-activity.js","connections-ui/helpers/ignore-children.js","connections-ui/helpers/imul.js","connections-ui/helpers/initial-letter.js","connections-ui/helpers/intl-get.js","connections-ui/helpers/is-after.js","connections-ui/helpers/is-array.js","connections-ui/helpers/is-before.js","connections-ui/helpers/is-between.js","connections-ui/helpers/is-empty.js","connections-ui/helpers/is-equal.js","connections-ui/helpers/is-favorite.js","connections-ui/helpers/is-fulfilled.js","connections-ui/helpers/is-pending.js","connections-ui/helpers/is-rejected.js","connections-ui/helpers/is-same-or-after.js","connections-ui/helpers/is-same-or-before.js","connections-ui/helpers/is-same.js","connections-ui/helpers/is-selected-call-route.js","connections-ui/helpers/join-strings.js","connections-ui/helpers/l.js","connections-ui/helpers/lcm.js","connections-ui/helpers/localize-realtime-presence.js","connections-ui/helpers/log-e.js","connections-ui/helpers/log10.js","connections-ui/helpers/log1p.js","connections-ui/helpers/log2.js","connections-ui/helpers/lt.js","connections-ui/helpers/lte.js","connections-ui/helpers/max.js","connections-ui/helpers/meeting-date.js","connections-ui/helpers/min.js","connections-ui/helpers/mod.js","connections-ui/helpers/moment-add.js","connections-ui/helpers/moment-calendar.js","connections-ui/helpers/moment-diff.js","connections-ui/helpers/moment-duration.js","connections-ui/helpers/moment-format.js","connections-ui/helpers/moment-from-now.js","connections-ui/helpers/moment-from.js","connections-ui/helpers/moment-subtract.js","connections-ui/helpers/moment-to-date.js","connections-ui/helpers/moment-to-now.js","connections-ui/helpers/moment-to.js","connections-ui/helpers/moment-unix.js","connections-ui/helpers/moment.js","connections-ui/helpers/mult.js","connections-ui/helpers/multi-line-value.js","connections-ui/helpers/not-eq.js","connections-ui/helpers/not.js","connections-ui/helpers/now.js","connections-ui/helpers/or.js","connections-ui/helpers/perform.js","connections-ui/helpers/phone-integrations.js","connections-ui/helpers/pluralize-text.js","connections-ui/helpers/pluralize.js","connections-ui/helpers/pow.js","connections-ui/helpers/promise-all.js","connections-ui/helpers/promise-hash.js","connections-ui/helpers/promise-rejected-reason.js","connections-ui/helpers/random.js","connections-ui/helpers/render-markdown.js","connections-ui/helpers/round.js","connections-ui/helpers/route-action.js","connections-ui/helpers/short-chat-time.js","connections-ui/helpers/show-emoji.js","connections-ui/helpers/sign.js","connections-ui/helpers/sin.js","connections-ui/helpers/singularize.js","connections-ui/helpers/sort-field-data.js","connections-ui/helpers/sqrt.js","connections-ui/helpers/string-or-promise.js","connections-ui/helpers/sub.js","connections-ui/helpers/sum.js","connections-ui/helpers/t.js","connections-ui/helpers/tag-lookup.js","connections-ui/helpers/tan.js","connections-ui/helpers/tanh.js","connections-ui/helpers/task.js","connections-ui/helpers/time-duration.js","connections-ui/helpers/title-for-entity-property.js","connections-ui/helpers/trunc.js","connections-ui/helpers/unix.js","connections-ui/helpers/utc.js","connections-ui/helpers/value-for-choice.js","connections-ui/helpers/xor.js","connections-ui/hosted-context/util.js","connections-ui/index.js","connections-ui/initializers/add-modals-container.js","connections-ui/initializers/app-version.js","connections-ui/initializers/application-service.js","connections-ui/initializers/authentication-setup.js","connections-ui/initializers/authenticators.js","connections-ui/initializers/chat-service.js","connections-ui/initializers/clock.js","connections-ui/initializers/component-styles.js","connections-ui/initializers/container-debug-adapter.js","connections-ui/initializers/data-adapter.js","connections-ui/initializers/device-profiles-v2-service.js","connections-ui/initializers/ember-concurrency.js","connections-ui/initializers/ember-data-change-tracker.js","connections-ui/initializers/ember-data.js","connections-ui/initializers/ember-simple-auth.js","connections-ui/initializers/engines.js","connections-ui/initializers/export-application-global.js","connections-ui/initializers/extend-ember-computed.js","connections-ui/initializers/field-config.js","connections-ui/initializers/injectStore.js","connections-ui/initializers/main.js","connections-ui/initializers/media-providers.js","connections-ui/initializers/phone-service.js","connections-ui/initializers/preferences-service.js","connections-ui/initializers/route-styles.js","connections-ui/initializers/service-discovery.js","connections-ui/initializers/session-service.js","connections-ui/initializers/set-application-theme.js","connections-ui/initializers/setup-webrtc-components.js","connections-ui/initializers/store.js","connections-ui/initializers/transforms.js","connections-ui/initializers/webrtc-sdk-service.js","connections-ui/initializers/webrtc-service.js","connections-ui/initializers/webrtc-settings-service.js","connections-ui/instance-initializers/attach-application-controller.js","connections-ui/instance-initializers/attach-application-session.js","connections-ui/instance-initializers/backburner-debug.js","connections-ui/instance-initializers/conversation-service.js","connections-ui/instance-initializers/embedded-service.js","connections-ui/instance-initializers/ember-data.js","connections-ui/instance-initializers/ember-intl.js","connections-ui/instance-initializers/ember-simple-auth.js","connections-ui/instance-initializers/ember-tooltips.js","connections-ui/instance-initializers/entity-contact-group.js","connections-ui/instance-initializers/entity-favorite.js","connections-ui/instance-initializers/entity-hover-card.js","connections-ui/instance-initializers/entity-image.js","connections-ui/instance-initializers/entity-location.js","connections-ui/instance-initializers/inject-owner.js","connections-ui/instance-initializers/load-asset-manifest.js","connections-ui/instance-initializers/presence-label.js","connections-ui/instance-initializers/recording-service.js","connections-ui/instance-initializers/reopen-component.js","connections-ui/instance-initializers/reopen-route.js","connections-ui/instance-initializers/set-application-service-values.js","connections-ui/instance-initializers/set-application-values.js","connections-ui/instance-initializers/setup-application.js","connections-ui/instance-initializers/setup-apps-api-handlers.js","connections-ui/instance-initializers/setup-error-handling.js","connections-ui/instance-initializers/webrtc.js","connections-ui/media-providers/provider.js","connections-ui/media-providers/purecloud.js","connections-ui/media-providers/teams.js","connections-ui/media-providers/utils/auth.js","connections-ui/media-providers/zoom.js","connections-ui/mixins/acd-attachment-url-mixin.js","connections-ui/mixins/acd-utilities.js","connections-ui/mixins/acd/after-call-work.js","connections-ui/mixins/acd/participants.js","connections-ui/mixins/acd/session-share.js","connections-ui/mixins/auth-controller.js","connections-ui/mixins/authenticated-authorized-route-mixin.js","connections-ui/mixins/batch-data-requests.js","connections-ui/mixins/cache-chat-rooms.js","connections-ui/mixins/change-serializer.js","connections-ui/mixins/chat-message-media.js","connections-ui/mixins/chat-message-mixin.js","connections-ui/mixins/chat-service/chat-events.js","connections-ui/mixins/chat-service/message-notifications.js","connections-ui/mixins/chat-service/message-splitting.js","connections-ui/mixins/chat-user.js","connections-ui/mixins/click-outside.js","connections-ui/mixins/conversation-analysis.js","connections-ui/mixins/conversation-uri-builder.js","connections-ui/mixins/conversation-v2/chats-service.js","connections-ui/mixins/conversation.js","connections-ui/mixins/create-group.js","connections-ui/mixins/device-enumeration.js","connections-ui/mixins/embedded-message-event-handler.js","connections-ui/mixins/entity-controller.js","connections-ui/mixins/entity-image-defaults.js","connections-ui/mixins/entity-presence.js","connections-ui/mixins/entity.js","connections-ui/mixins/evaluations.js","connections-ui/mixins/external-contacts.js","connections-ui/mixins/faxes.js","connections-ui/mixins/field-component.js","connections-ui/mixins/flag.js","connections-ui/mixins/in-viewport.js","connections-ui/mixins/interaction/session-share.js","connections-ui/mixins/interaction/tooltips.js","connections-ui/mixins/job.js","connections-ui/mixins/logger.js","connections-ui/mixins/model-route.js","connections-ui/mixins/paging.js","connections-ui/mixins/phone-service/active-call.js","connections-ui/mixins/phone-service/call-controls.js","connections-ui/mixins/phone-service/call-forward.js","connections-ui/mixins/phone-service/conversation-manager.js","connections-ui/mixins/phone-service/events.js","connections-ui/mixins/phone-service/notifications.js","connections-ui/mixins/phone-service/station.js","connections-ui/mixins/promise-loading.js","connections-ui/mixins/purecloud-model.js","connections-ui/mixins/relate/relate-features.js","connections-ui/mixins/search.js","connections-ui/mixins/searchV2.js","connections-ui/mixins/sort-chat-users.js","connections-ui/mixins/style-namespacing-extras.js","connections-ui/mixins/unprotected-route-mixin.js","connections-ui/mixins/viewport.js","connections-ui/mixins/webrtc-action-utils.js","connections-ui/models/annotation.js","connections-ui/models/app-api-call.js","connections-ui/models/app-instance.js","connections-ui/models/app-pool.js","connections-ui/models/app.js","connections-ui/models/call-communication.js","connections-ui/models/call-forwarding.js","connections-ui/models/callback-communication.js","connections-ui/models/callv2.ts","connections-ui/models/chat-communication.js","connections-ui/models/chat-message.js","connections-ui/models/chat-room.js","connections-ui/models/chat-video-participant.js","connections-ui/models/coaching-appointment.js","connections-ui/models/coded-geolocation.js","connections-ui/models/conversation-legacy.js","connections-ui/models/conversation.js","connections-ui/models/division.js","connections-ui/models/email-communication.js","connections-ui/models/ember-intl-translation.js","connections-ui/models/evaluation.js","connections-ui/models/external-contact.js","connections-ui/models/externalcontacts/channel-record.js","connections-ui/models/externalcontacts/channel.js","connections-ui/models/externalcontacts/contact.js","connections-ui/models/externalcontacts/external-organization.js","connections-ui/models/externalcontacts/facebook-id.js","connections-ui/models/externalcontacts/line-id.js","connections-ui/models/externalcontacts/twitter-id.js","connections-ui/models/externalcontacts/whatsapp-id.js","connections-ui/models/fax.js","connections-ui/models/geolocation-settings.js","connections-ui/models/geolocation.js","connections-ui/models/github-item.js","connections-ui/models/grant.js","connections-ui/models/group-policy.js","connections-ui/models/group.js","connections-ui/models/internally-hosted-app.js","connections-ui/models/library.js","connections-ui/models/location.js","connections-ui/models/meeting.js","connections-ui/models/message-communication.js","connections-ui/models/org.js","connections-ui/models/participant.js","connections-ui/models/person.js","connections-ui/models/presence.js","connections-ui/models/public-api-user.js","connections-ui/models/queue.js","connections-ui/models/recorded-call.js","connections-ui/models/recording.js","connections-ui/models/resource-article.js","connections-ui/models/response.js","connections-ui/models/role.js","connections-ui/models/screenshare-communication.js","connections-ui/models/social-communication.js","connections-ui/models/split-message.js","connections-ui/models/station.js","connections-ui/models/unrecoverable-app-failure.ts","connections-ui/models/user.js","connections-ui/models/video-communication.js","connections-ui/models/voicemail-message.js","connections-ui/models/wfm-notification.js","connections-ui/phone/template.js","connections-ui/resolver.js","connections-ui/router.js","connections-ui/routes/admin.js","connections-ui/routes/application.js","connections-ui/routes/card/detail.js","connections-ui/routes/card/tree.js","connections-ui/routes/custom-fields-contacts-redirect.js","connections-ui/routes/custom-fields-orgs-redirect.js","connections-ui/routes/group/detail.js","connections-ui/routes/index.js","connections-ui/routes/login-oauth.js","connections-ui/routes/login.js","connections-ui/routes/maintenance.ts","connections-ui/routes/no-access.js","connections-ui/routes/performance-summary-queues.js","connections-ui/routes/person/detail.js","connections-ui/routes/search.js","connections-ui/routes/third-party/app-embed.js","connections-ui/routes/time-machine.js","connections-ui/search/adapter-mixin.js","connections-ui/search/request-builder.js","connections-ui/search/service.js","connections-ui/search/store-mixin.js","connections-ui/serializers/application.js","connections-ui/serializers/call-communication.js","connections-ui/serializers/call-forwarding.js","connections-ui/serializers/callback-communication.js","connections-ui/serializers/callv2.js","connections-ui/serializers/chat-communication.js","connections-ui/serializers/coded-geolocation.js","connections-ui/serializers/conversation-v2.js","connections-ui/serializers/conversation.js","connections-ui/serializers/division.js","connections-ui/serializers/email-communication.js","connections-ui/serializers/externalcontacts/contact.js","connections-ui/serializers/externalcontacts/external-organization.js","connections-ui/serializers/externalcontacts/facebook-id.js","connections-ui/serializers/externalcontacts/line-id.js","connections-ui/serializers/externalcontacts/twitter-id.js","connections-ui/serializers/externalcontacts/whatsapp-id.js","connections-ui/serializers/geolocation-settings.js","connections-ui/serializers/geolocation.js","connections-ui/serializers/grant.js","connections-ui/serializers/group-policy.js","connections-ui/serializers/group.js","connections-ui/serializers/library.js","connections-ui/serializers/location.js","connections-ui/serializers/meeting.js","connections-ui/serializers/message-communication.js","connections-ui/serializers/participant.js","connections-ui/serializers/person.js","connections-ui/serializers/public-api-user.js","connections-ui/serializers/purecloud-user.js","connections-ui/serializers/purecloud.js","connections-ui/serializers/queue.js","connections-ui/serializers/recorded-call.js","connections-ui/serializers/recording.js","connections-ui/serializers/response.js","connections-ui/serializers/role.js","connections-ui/serializers/screenshare-communication.js","connections-ui/serializers/skillgroup.js","connections-ui/serializers/social-communication.js","connections-ui/serializers/station.js","connections-ui/serializers/user.js","connections-ui/serializers/video-communication.js","connections-ui/serializers/voicemail-message.js","connections-ui/services/addressformat.js","connections-ui/services/ajax.js","connections-ui/services/analytics.js","connections-ui/services/application.js","connections-ui/services/apps-api-handlers/directory-nav-handler.js","connections-ui/services/apps-api-handlers/toast-handler.js","connections-ui/services/apps.js","connections-ui/services/asset-loader.js","connections-ui/services/batch-data-requests.js","connections-ui/services/chat.js","connections-ui/services/clock.js","connections-ui/services/communication.js","connections-ui/services/conversation.js","connections-ui/services/cookies.js","connections-ui/services/device-profiles-v2.js","connections-ui/services/embedded.js","connections-ui/services/emergency-location.js","connections-ui/services/events.ts","connections-ui/services/external-contacts.js","connections-ui/services/favorites.js","connections-ui/services/feature.js","connections-ui/services/file-upload.js","connections-ui/services/fullscreen.js","connections-ui/services/geolocation.js","connections-ui/services/group-assigned-roles.js","connections-ui/services/headset.js","connections-ui/services/iframe-state.js","connections-ui/services/in-viewport.js","connections-ui/services/integrations-presence.js","connections-ui/services/interaction.js","connections-ui/services/interval.js","connections-ui/services/intl.js","connections-ui/services/media-providers.js","connections-ui/services/modal-dialog.js","connections-ui/services/moment.js","connections-ui/services/names.js","connections-ui/services/notification-proxy.js","connections-ui/services/notification.js","connections-ui/services/org-settings.js","connections-ui/services/permissions.js","connections-ui/services/phone-integrations.js","connections-ui/services/phone.js","connections-ui/services/pigeon.js","connections-ui/services/preferences.js","connections-ui/services/presence-subscription.js","connections-ui/services/presence.js","connections-ui/services/purecloud-oauth.js","connections-ui/services/relate.js","connections-ui/services/resize-detector.js","connections-ui/services/screen-media.ts","connections-ui/services/scroll-activity.js","connections-ui/services/session.js","connections-ui/services/settings.js","connections-ui/services/sound.js","connections-ui/services/stash-logger.js","connections-ui/services/store.js","connections-ui/services/streaming.js","connections-ui/services/text-measurer.js","connections-ui/services/user-activity.js","connections-ui/services/user-idle.js","connections-ui/services/validations.js","connections-ui/services/vendor-implementations/jabra-chrome.js","connections-ui/services/vendor-implementations/jabra-native.js","connections-ui/services/vendor-implementations/plantronics.js","connections-ui/services/vendor-implementations/sennheiser.js","connections-ui/services/video-activity.js","connections-ui/services/video-idle.js","connections-ui/services/webrtc-sdk.ts","connections-ui/services/webrtc-settings.ts","connections-ui/services/webrtc.js","connections-ui/session-stores/application.js","connections-ui/templates/agent-ui.js","connections-ui/templates/call-forwarding-partial.js","connections-ui/templates/card/detail.js","connections-ui/templates/card/tree.js","connections-ui/templates/chat-room.js","connections-ui/templates/components/document-title.js","connections-ui/templates/components/webhooks-collapsible.js","connections-ui/templates/components/webhooks.js","connections-ui/templates/components/x-select.js","connections-ui/templates/group/detail.js","connections-ui/templates/index.js","connections-ui/templates/login-oauth.js","connections-ui/templates/maintenance.js","connections-ui/templates/no-access.js","connections-ui/templates/partials/-no-station-notification.js","connections-ui/templates/person/detail.js","connections-ui/templates/purecloud/partials/conversation-controls-menu.js","connections-ui/templates/reset-password.js","connections-ui/templates/search.js","connections-ui/templates/third-party/app-embed.js","connections-ui/templates/time-machine.js","connections-ui/transforms/iso-date.js","connections-ui/transforms/json.js","connections-ui/transforms/object.js","connections-ui/types/agent-assist.type.js","connections-ui/types/conversation.type.js","connections-ui/types/index.ts","connections-ui/types/maybe.type.js","connections-ui/types/pigeon.type.js","connections-ui/types/webrtc-settings.type.js","connections-ui/utils/acd-ts.ts","connections-ui/utils/acd-v2.ts","connections-ui/utils/acd.js","connections-ui/utils/acdParticipantStatuses.js","connections-ui/utils/analytics-keys.js","connections-ui/utils/analytics-routing.ts","connections-ui/utils/app-provider.js","connections-ui/utils/apps-v2-api-handlers.ts","connections-ui/utils/apps.ts","connections-ui/utils/async.ts","connections-ui/utils/boolean-expressions.js","connections-ui/utils/browser.js","connections-ui/utils/code-utils.js","connections-ui/utils/conversation.ts","connections-ui/utils/dates.js","connections-ui/utils/debug-backburner.js","connections-ui/utils/debug-rsvp.js","connections-ui/utils/display-geolocation.js","connections-ui/utils/email-types/draft-type.js","connections-ui/utils/email-types/email-type.js","connections-ui/utils/email.js","connections-ui/utils/ember-types.js","connections-ui/utils/emergency-location-util.js","connections-ui/utils/emoji-json-helper-expanded.js","connections-ui/utils/emoji-json-helper-v1.js","connections-ui/utils/emoji-json-helper.js","connections-ui/utils/emoji.js","connections-ui/utils/entity-fields.js","connections-ui/utils/error-white-list.js","connections-ui/utils/escape.js","connections-ui/utils/exponential-interval-generator.js","connections-ui/utils/external-contact-messaging.js","connections-ui/utils/feature-toggles.ts","connections-ui/utils/file-extensions-type.ts","connections-ui/utils/focus-management.js","connections-ui/utils/geolocation.js","connections-ui/utils/giphy.js","connections-ui/utils/gsm7.js","connections-ui/utils/hosted-context.js","connections-ui/utils/instagram/instagram-properties.js","connections-ui/utils/intl-tel-input-options.js","connections-ui/utils/intl/missing-message.js","connections-ui/utils/jid-helpers.js","connections-ui/utils/keystroke.ts","connections-ui/utils/logger.js","connections-ui/utils/markdown.js","connections-ui/utils/masonry.js","connections-ui/utils/message-channels.js","connections-ui/utils/names.ts","connections-ui/utils/net.js","connections-ui/utils/newrelic-legacy.js","connections-ui/utils/newrelic.ts","connections-ui/utils/objects.js","connections-ui/utils/phone-number.ts","connections-ui/utils/presence-label-util.ts","connections-ui/utils/presence-utils.js","connections-ui/utils/presence.js","connections-ui/utils/promise-array.js","connections-ui/utils/query-parser.js","connections-ui/utils/queued-processing-chain.js","connections-ui/utils/request.ts","connections-ui/utils/routing-status.js","connections-ui/utils/safeSet.js","connections-ui/utils/serial-processing-chain.ts","connections-ui/utils/simple-cache.ts","connections-ui/utils/sms/sms-properties.js","connections-ui/utils/sound-recorder.js","connections-ui/utils/supported-messaging-subtypes.ts","connections-ui/utils/testing.ts","connections-ui/utils/theme-loader.js","connections-ui/utils/timeout-promise.js","connections-ui/utils/transform-panels.ts","connections-ui/utils/ttl-cache.ts","connections-ui/utils/twitter/twitter-properties.js","connections-ui/utils/types.ts","connections-ui/utils/uri-builder.ts","connections-ui/utils/uuid-generator.js","connections-ui/utils/uuid.js","connections-ui/utils/video-frame-checker.js","connections-ui/utils/webmessaging/webmessaging-properties.js","connections-ui/validators/alias.js","connections-ui/validators/belongs-to.js","connections-ui/validators/collection.js","connections-ui/validators/confirmation.js","connections-ui/validators/date.js","connections-ui/validators/dependent.js","connections-ui/validators/ds-error.js","connections-ui/validators/exclusion.js","connections-ui/validators/format.js","connections-ui/validators/has-many.js","connections-ui/validators/inclusion.js","connections-ui/validators/length.js","connections-ui/validators/messages.js","connections-ui/validators/number.js","connections-ui/validators/presence.js","connections-ui/video-participant-v2/model.js","connections-ui/video-participant/model.js","connections-ui/views/card/tree.js","connections-ui/webrtc-conversation/model.js","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","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","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","oldStream","isLegacyCall","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","target","shimGetDisplayMedia","getSourceId","navigator","getDisplayMedia","constraints","sourceId","video","chromeMediaSource","chromeMediaSourceId","maxFrameRate","frameRate","mediaDevices","getUserMedia","../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","height","width","origGetUserMedia","cs","7","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","deprecated","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","../utils","./filtericeservers","rtcpeerconnection-shim","9","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newIceServers","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","DataChannel","RTCDataChannel","preferredMediaSource","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","Ember","inject","service","session","application","defaultSerializer","namespace","shouldReloadAll","shouldBackgroundReloadRecord","normalizeErrorResponse","status","headers","payload","errors","_super","modelFor","pathForType","modelName","String","camelize","_emberInflector","pluralize","createRecord","store","record","snapshot","_createSnapshot","serializerFor","serialize","includeId","ajax","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","RSVP","findFavorites","findFavoritesPublicApiV2","_this","pcV2Uri","deferred","defer","_findFavoritesPublicApiV2","res","_handleFavorites","page","pageNumber","pageSize","cache","collection","_this2","entities","nextPage","currentCount","forwardVoicemail","voicemail","recipient","voicemailMessageId","userId","_findDirectReports","count","offset","_handleReports","_this3","findDirectReports","_this4","findSuperiors","computed","reads","serializer","adapterOptions","patch","urlForFindRecord","handleResponse","requestData","useExternalContactExpand","paging","queryDefaults","currentInterval","_dates","previousInterval","subtract","typeClass","findLatestCalls","_fetchLatestCalls","_fetchHistory","guid","interval","toISOString","add","getHistoryPath","meta","_","merge","incrementPageNumber","decrementWeek","pcUri","Geolocation","findAll","total","firstUri","lastUri","selfUri","pageCount","divisionLimit","sinceToken","snapshotRecordArray","objectCount","limitUrl","$","PurecloudAdapter","LoggerMixin","RelateFeaturesMixin","relate","addressformat","permissions","cannotViewExternalContacts","not","clearCachedAdapter","originator","urlAndModel","expand","timeout","deleteRecord","returnValue","queryParams","addressFormat","searchTerm","expandField","sortOrder","subType","hasValidSearchTerm","isValidPhoneNumber","isValidNumber","containsOnlyPhoneNumberChars","test","isExactSearch","_newrelic","addPageAction","orgId","formatAddress","useLookupService","lookupVal","term","encodeURI","q","decodeURI","bypassCache","findMatchingExternalContacts","getCachedAdapter","TIME_OUT","EXPAND","dataType","saveBulk","roleId","subjectIds","divisionIds","ajaxOptions","hash","ajaxSuccess","jqXHR","_baseUrl","groupPolicy","title","details","buildQuery","baseUrl","endpoint","urlForFindMany","urlForDeleteRecord","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","Array","isArray","groupNumber","phone","labelKey","hasGroupPhone","groupAlertType","numberInfo","hasNumber","number","hasExtension","groupType","jabberId","BASE_LOCATION_FIELDS","urlForHasMany","location","floors","init","urlForFindAll","meeting","meetingId","urlForQuery","urlForCreateRecord","ajaxService","integrationsPresenceSvc","usingIntegrationSource","integrationPresenceSource","snapshotsOrOptions","guids","jids","_findMany","superiors","mapBy","directReports","baseRequestData","_store","batchEntityIds","_defineProperty","raw","contentType","retry","_ref","_ref2","flat","integrationSource","_loadActivities","findBelongsTo","link","relationship","modelClass","snapshotOrQuery","detail","contextId","objId","_asyncToGenerator","regeneratorRuntime","mark","_callee","fetchDivisions","wrap","_context","prev","next","divisionAgnostic","myQueuesOnly","fetchDivisionsForTargetQueueSearch","sent","entity","divisionId","abrupt","getDivisionLimits","_callee2","_context2","permission","divisionAware","_exports","_recording","currentPage","currentPageSize","libraryId","head","aggregatePayload","records","_getPage","sort","roleA","roleB","UserAdapter","sortQueryParams","sortBy","_genesysSparkComponents","registerElements","iframeCoordinator","registerCustomElements","_loader","defineCustomElements","APP","LOG_RUNLOOP_STACKTRACE","run","backburner","DEBUG","LOG_BINDINGS","Application","_defineModifier","App","cookies","stashLogger","applicationService","customEvents","pageChanged","itemsPerPageChanged","favoriteEvent","contactEvent","navigateToProfileEvent","modulePrefix","podModulePrefix","Resolver","engines","emberEngineCustomFields","services","externalRoutes","personDetail","admin","entityTypes","currentRouteName","debug","initVersion","initContext","isImpersonating","proxyPersonId","read","iframed","top","libraries","register","ENV","LOG_VERSION","Logger","libs","forOwn","controllerFor","instance","lookup","serviceFor","componentFor","listAsync","resolveRegistration","logTimerQueue","logPendingPromises","promiseStackFor","lookupPromiseStack","_emberLoadInitializers","stackTraceLimit","HTMLBars","template","block","moduleName","_util","_component","oauthStoreParams","oauthStoreProps","Base","purecloudOauth","authClient","restore","accessToken","clientId","parent","access_token","_establishLocalSession","pick","Client","token_type","getToken","t0","failedStep","authenticate","scope","reason","deserializeRestoreState","finalOptions","expires_in","token_expiry_time_millis","_getCurrMillis","token_expiry_time_iso_string","Date","SESSION_BOOTSTRAP_ERROR_TYPE","authUrl","_buildAuthUrl","invalidate","allSettled","_destroyLocalSession","authorizer","getOwner","deauthorizeAllDomainRequests","extractAuthData","reduce","accumulator","currPair","tokens","currToken","decodeURIComponent","buildAuthorizeUrl","stateParam","org","buildLogoutUrl","cleanCustomBrowserStorage","clear","localSessionDeferred","authorizeAllDomainRequests","authenticateWithSession","removeAuthCookie","legacyInvalidSessionToken","ensureLogsSent","_x","ajaxGet","finally","login","stateParamValue","targetOrg","baseAuthUri","oauthParams","response_type","client_id","enableRegionSwitching","redirectUri","origin","pathname","lastIndex","redirect_uri","_this6","_callee3","_context3","immediateSaveLogs","now","DirectoryAuthenticator","SEMVER_PARSER","_authData","_ajaxPrefilters","_ajaxErrors","appContextHeaderTokens","headerTokens","semver","semverParseResult","exec","_semverParseResult","_slicedToArray","pkgVersion","buildNumber","gitBranch","gitCommit","curr","replaceAll","isHosted","Callbacks","ajaxPrefilter","fire","ajaxError","authorize","authData","fnToAuthorize","_buildHeaders","_addHeadersPrefilter","empty","original","crossDomain","_isWhitelistedUrl","_isAbsPathOfProxiedEnv","excludeAuthHeader","isFaxUpload","noAuthorizationHeader","Authorization","headerValue","headerName","setRequestHeader","_isGcPublicApiUrl","REQUEST_TELEMETRY_APP_SUBSECTIONS","subsection","subsectionTokens","remoteData","includes","pubApiBase","pubApiProxyBase","currBase","envDetails","environment","local","tgtEnvDetails","netUtils","getEnvDetails","env","unknownEnv","_handleUnauthorizedRequests","settings","thrownError","skipPurecloudUnauthorizedCheck","_sendXhrErrorDetails","unauthorized","ININ-Client-Path","_handleClientUnauthorizedError","msg","_sendErrorMessage","_errors","isUnauthorizedError","xhr","correlationId","getResponseHeader","messageData","post","beforeSend","app","appId","appVersion","traces","level","time","topic","locale","pluralRuleFunction","ord","n100","year","displayName","relative","0","-1","relativeTime","future","zero","one","two","few","many","other","past","month","day","-2","hour","minute","second","v0","parentLocale","n10","i10","i100","on","Component","classNames","notification","sendClose","sendAction","toast","notificationType","markdownToHtml","shouldShowPopup","shouldPlaySound","handleMessageEvent","sameHost","sameName","startMessageListener","elementId","stopMessageListener","off","classNameBindings","attributeBindings","intl","utcOffset","staticMoment","showSecondHand","autoIncrement","_analogSupported","Modernizr","csstransforms","_displayedMoment","_invalidTime","_currTimeLabel","_pendingTick","willRender","_cancelTimers","formatStr","invalid","isNaN","isValid","format","willDestroyElement","didRender","hourElement","minuteElement","secondAngle","minuteAngle","hourAngle","hourRule","minuteRule","secondRule","style","transform","secondElement","later","rerender","timerName","currTimer","cancel","AnchorTagComponent","tagName","httpRegex","ariaLabelledBy","decorateLabel","text","htmlSafe","Handlebars","Utils","escapeExpression","anchor","encodeURIComponent","observer","_email","isValidEmailAddress","IMG_TYPE_CFG_MAP","icon","assetBasePath","closestSizeMaxMultiplierDelta","minSupplimentalRes","maxSupplimentalRes","tile","RASTER_IMG_KEY_REG_EXP","TITLE_MODES","titleMode","assert","showTooltip","equal","appName","imgType","imgWidth","imgHeight","_sortedRasterMultipliers","cfg","allRasterImgs","rasterUrl","rasterKey","rasterMatch","currRasterWidth","currRasterMultiplier","multiplier","_vectorImgUrl","svgasimg","defaultImgUrl","vectorImgUrl","allRasters","lowestDelta","currDelta","abs","imgSrcSet","srcset","supImgs","reverse","svgSpriteHref","svgPropPath","imgClasses","classesPath","guxIcon","guxIconPropsPath","guxIconProps","Howl","Howler","clock","webrtc","attrs","source","markAsRead","playing","didEnd","loading","loadingError","registerStopVoicemailHandler","sound","playFromSelectedOutput","playbackVolume","callVolume","decimalValue","selectedOutputDevice","defaultOutputDevice","outputDeviceUpdate","restartSound","stopPlaying","newOutputDeviceId","setOutputDevice","play","actions","togglePlay","outputDeviceId","volume","pause","seek","seekSound","didReceiveAttrs","registerHandler","setupSound","paths","getAttr","sources","useHtml5","html5","duration","floor","currentTime","loadingAudio","howlOptions","defaultOptions","onload","onLoad","onplay","onPlay","onpause","onPause","onend","onEnd","_checkSoundDuration","Infinity","ontimeupdate","_duration","notifyPropertyChange","newAttrs","oldAttrs","position","left","css","click","offsetX","totalSeconds","recorder","startTime","showOptions","file","uploadImmediately","playerOptions","reset","audioFileReady","startRecording","stopRecording","hasSupport","and","audioBlob","audioSource","recording","hasMediaRecorder","MediaRecorder","showUploadButton","didInsertElement","scheduleOnce","setupRecording","destroy","didUpdateAttrs","Recorder","create","ownerInjection","_basicDropdown","_contentElement","_content","_trigger","canViewChat","person","isChild","isSuperior","toggleExpand","toggleProperty","children","PromiseArray","orderedPeople","getNextPerson","manager","getFieldValue","nextPerson","hasChildren","gt","hasSuperiors","directReportsLabel","showTotalReports","direct","totalReportsLabel","totalReports","attachTextInputListeners","removeTextInputListeners","stopPropagation","presenceSubscription","canMove","flipster","currentPerson","currentPersonId","selfAndSiblings","currentPosition","reportTracker","setCurrentPerson","moveToManager","currentPersonManager","content","getPosition","tracker","setHierarchy","makeCoverFlow","moveToReports","currentPersonDirectReports","isEmpty","trackedReport","setPerson","attachNavigationListener","willClearRender","removeListeners","allPeople","isFulfilled","promises2","haveScrolled","peerCount","siblings","_getPosition","contents","unwrap","removeClass","startPosition","itemContainer","itemSelector","fadeIn","spacing","scrollwheel","keyboard","touch","nav","buttons","onItemSwitch","to","debounce","changeCurrentPerson","toElem","card","entityId","findBy","onKeyDownHandler","_this7","ns","_keystroke","eventToString","is","isNavigation","model","maxCount","charactersUsed","characterCount","activeRoom","check","activeJid","muted","any","toggleRoomMute","roomJid","areNotificationsDisabled","setRoomMuted","ClickOutsideComponent","showCreateGroup","canInvitePeople","canCreateGroups","canCreateLocations","showMenu","or","adminModalSrc","trap","launchCreateGroup","cancelCreateGroup","showAdminModal","closeAdminModal","showDropdownObserver","modalContainer","focusTrap","createFocusTrap","clickOutsideDeactivates","onPostDeactivate","activate","deactivate","removeClassFromBody","minViewMode","days","months","years","srOnly","placeholder","minDate","maxDate","inputMode","minView","isoLocale","monthYearLocaleFormat","moment","localeFormat","creationData","longDateFormat","datepickerValue","dateObject","date","initDatepicker","removeBehavior","datepicker","changes","setupDatepicker","localeData","_longDateFormat","L","language","orientation","todayHighlight","clearBtn","container","startDate","toDate","endDate","dates","fn","selectedLanguage","setData","picker","addClass","val","str","valueOf","clearValue","view","_placeholder","DocumentTitle","dragClass","dragLeave","preventDefault","dragOver","drop","ariaLabel","draggable","dragStart","dataTransfer","toggleMenu","handleKeyDown","parents","targetOutside","targetInput","listItem","prop","editing","canUploadPicture","canEditProfilePicture","canEditInformalPicture","canEditAgentImage","showingProfile","showingInformal","openCaption","currentInformal","upload","select","changeType","showInformalPhotos","showProfilePictures","showAgentPhotos","uploadImage","selectUploadedImage","image","active","deleteUploadedImage","removeAgentImage","imageId","overwrite","forceBrowserNotification","tag","section","saveSection","scrollActiveImageIntoView","activeImg","picturesContainer","scrollTop","parentNode","offsetTop","setupTabListeners","tabId","originalEvent","activeTab","offsetParent","activeElement","blur","focus","teardownTabListeners","emptyProfilesText","emptyInformalsText","profileInstructionText","informalInstructionText","agentImage","x200","x800","x1024","_positionedContainer","_basicDialog","_inPlaceDialog","_liquidDialog","_liquidTetherDialog","_tetherDialog","_emberTether","_emberWormhole","COUNTRY_OPTIONS","editingElocation","eLocation","showTitle","showResetButton","showTitleIcons","showTitleInEditMode","personId","primaryVoice","saving","countryOptions","A","street1","street2","city","zipcode","country","street1ReadOnly","street2ReadOnly","cityReadOnly","stateReadOnly","zipcodeReadOnly","countryReadOnly","isAddressEmpty","showNumberInTitle","notEmpty","updatedAddress","previewAddress","previewAddressIsEligible","previewAddressError","toolTipArrowId","toolTipHelpId","toolTipAlertInfoId","isEligibleForE911","eLocationInlineWarning","hasELocationInlineWarning","setField","field","updateElocationOnChange","countryTranslated","entry","perform","setUpdatedAddress","_emberConcurrency","task","eLocationCopy","waitForQueue","_cloneDeep","restartable","layout","canViewVideo","videoTooltipTitle","linkProfile","showFavorite","showImages","compact","phoneServiceEnabled","phoneAvailable","isOneToOneOfflineOrBusy","isChatEnabled","isWebrtcEnabled","isVideoButtonEnabled","onContact","callEntity","toggleFavorite","useMediaProviders","makeCall","_lodash2","groupExtension","phoneNumber","bubbleAction","actionContext","startChat","sendLove","launchWebrtc","showGallery","navigateTo","isPerson","isGroup","linkToProfileRoute","isSelf","hasImages","personHasImage","groupHasImage","hasPhone","_lodash","PromiseObject","fieldPath","mailto","tel","rel","e164","emailEnabled","phoneEnabled","showPhone","entityData","isFavorite","isInUsersUIAdmin","_updateFavoriteAttributes","element","favoriteButton","querySelector","favoriteComponent","EntityContact","FlagMixin","phoneService","layoutName","makingCall","queue","callPromise","PersonModel","flagInteraction","flagInteractionAction","EntityContactComponent","PromiseLoadingMixin","favorites","showChat","showEmail","shouldTether","contact","callId","shouldDisplayDropdown","showDropdown","callConnecting","flaggingSupportEnabled","isRedial","_closingViaEscape","tether","toggleDropdown","skipFocus","focusTimer","dropdown","firstFocusable","first","recordRecentContact","sendToProfile","isEntityFavoriteDecompEnabled","readOnly","callConnected","activeCall","activeCallId","componentCallIsActiveCall","phoneNumberDetails","formatAddressForDisplay","chatEnabled","favoriteEnabled","isExternal","isExternalContact","setExternalContactInfo","setupGroupPhoneNumber","setGroupNumber","enableFavoriteEvent","personIsDeleted","hideChat","phones","getContactFieldValuesByType","emails","displayDropdown","hasEmail","canDisplay","isContact","callTitle","attachListeners","detectOutsideClick","setupTether","Tether","attachment","targetAttachment","pin","removeTether","remove","isDestroyed","isDestroying","isOutsideComponent","isOutsideTetheredDropdown","closest","once","_this8","keyCode","toggleButton","items","primary","primaryItem","notifyError","show","hideAfter","actionHandlers","reportError","fieldValues","disableDropdown","toggleAddValue","addNewEntry","hide","attachClickListener","removeClickListener","EXCLUDE_TYPES","filterExcludedField","excludedFields","tabindex","ariaLabelledby","sectionKey","sectionInfo","hideHeader","editingProfile","scrollOnAddNew","excludedEditingFields","removeSection","sectionName","editingSection","alias","showModal","cancelling","hideEmptyValues","showInstructionText","disableAddValueDropdown","showRemoveSectionModal","fallbackToEmptyLabel","hideFooterRemoveButton","timer","isEditing","toggleInstructionText","editSection","updateMasonry","readableFields","getReadableFieldPathsForSection","writeableFields","getEditableFieldPathsForSection","_focusManagement","doFocus","cancelEditElocation","animate","valueReference","pop","fieldData","FieldData","pushObject","scrollToNewField","removeEntry","removeEntryFromFieldData","removeContactSection","confirmRemoveSection","cancelRemoveSection","fieldList","_isEmpty","filterBy","getFieldPath","removeObject","_groupedFieldData","_newFields","sectionData","fullPath","setupCacheValues","setProperties","instructionTextTooltipOnInsert","isViewMode","ownProfile","profile","Profile","getProfileForModel","filteredFields","isSuper","excludedFieldsFilter","_curry","readableFieldPaths","addObjects","getFieldEntries","groupedFieldData","groupedData","_groupBy","_map","instructionText","getI18nKey","fieldValuesToAdd","fieldSectionHasData","canEditSection","hideAddNew","disableSave","validFields","_reject","showEditAction","showHeaderLock","showAddNew","onEditingChange","onValidityChange","disableModal","repeatable","values","v","handleEditingChange","reconcileNewFields","reload","info","statusCode","errorTitle","errorMessage","fieldPaths","currentValue","tempValues","tempId","_id","elem","parentTop","setupInstructionText","tooltip","placement","_updateMasonry","_masonry","rerunLayouts","currentTarget","keyForField","EntityFieldSection","updatedElocationAddress","previewAddressisEligible","_groupedContactInfo","editElocation","primaryContactSection","latestPrimaryContactInfo","reconcilePrimaryContact","errorField","saveElocation","refreshAllEmergencylocationInfo","errObject","softError","hardError","hardErrorMessage","defaultErrorMessage","groupKey","entries","lastEntry","last","focusable","remainingFieldsets","removePrimaryContact","groupFieldset","remainingEntries","addButton","setPrimaryCallback","getEmergencyLocation","EmergencyLocationUtil","getErrorString","setEditingSection","groupedContactInfo","handleData","missingData","missingFields","difference","chain","groupBy","setOwner","ContactInfoGroup","primaryContactCollection","rejectBy","_storePrimary","setPrimaryContact","fieldDataId","equalFieldIds","fieldId","equalFieldPaths","isNewFieldValue","valueNumber","primaryNumber","ref","currentLabel","fieldChoices","keyPath","addNewLabel","emptyFields","containsRepeatable","repeatableField","isPhone","isEmail","isIm","isAddress","showHeadings","canAddNew","empties","changeGroups","toggleMore","routeType","routeId","allKeys","activeKey","showMore","flowTabsInline","fieldConfig","hasOfficialField","getFieldByKey","hasSocialField","getGroups","flatten","tabs","titleWidth","tabWidth","tab","acc","activeGroups","shouldShowMore","_cachedGroupFieldData","_cachedLocations","currentEntry","locationId","viewingMore","_relationships","fieldValue","updatedField","relationshipGroup","fieldKey","addObject","removePerson","saveReports","clearDirectReportsCache","updatedLabel","management","assistants","defaultReports","defaultSiblings","relationships","cachedGroups","RelationshipGroup","otherRelationships","findByIds","allRelationships","otherRelationshipValues","labelkey","filteredReports","filteredSiblings","sibling","canAddMultiple","showingMore","onUpdateLabel","onUpdateField","selectPerson","addPerson","removeRelationship","shouldRemove","confirm","valuesToRemove","removeObjects","_forEachRight","toggleShowing","newLabel","oldLabel","_uniqBy","canEdit","canRemove","isManagerField","updatePeople","cachedPeople","relationshipKeyTrimAll","hasMore","haveManager","hideSection","reportsToSave","_lastPromise","lookupKey","isManagerRelationship","isReportRelationship","isAssistantsRelationship","isOtherRelationship","addManager","currentManager","removeManager","newManager","showLabelChoices","updateLabel","focusInput","selectLabel","toggleChoices","trigger","hideChoices","handleKeyDownOnDropdownArrow","handleKeyDownOnLabel","hasLabelChoices","canShowLabelChoices","labelChoices","i18nKey","labelKeys","setLabelKey","handleTooltip","input","focusOut","EntitySearch","searchLimit","selectResult","resultsLoaded","selectNext","nowSelected","nextSelected","eq","scrolling","selectPrevious","previousSelected","FieldComponentMixin","ensurePopulatedField","isFieldEmpty","setValues","complexField","complexValueFields","selectDate","getDate","getMonth","getFullYear","timers","populateFieldOnRender","isComplexFieldEmpty","copy","formattedValue","i18n","previousMonth","nextMonth","_months","weekdays","_weekdays","weekdaysShort","_weekdaysShort","dateFormat","currentTooltip","isActive","headingLevel","hasError","setPrimary","isPrimary","entryId","valid","canSetPrimary","saveHistoryEntry","cancelHistoryEntry","cancelAddNew","focusNewField","added","$input","ensureDateObjectsExist","where","calculateValidityOnInsert","validityChanged","resetData","cleanFieldForSave","useEducationLabels","isNewField","what","notes","whereLabel","datesLabel","whatLabel","notesLabel","whereErrorChanged","dateErrorChanged","TextField","parentLocation","floorLocation","googleMapsHref","showFloorplan","filterLocationsHelper","focusFieldOnInsert","selectParentLocation","selectFloorLocation","saveNewLocation","cancelNewLocation","selectLocation","coordinates","x","y","removeNewParentLocation","noop","toggleFloorplan","hideFloorplan","save","resp","responseText","parentLocationName","selectedFloor","haveParent","haveFloor","locationData","emptyPromise","locationAddress","isRichAddress","parentLocations","getRecord","canShowEdit","locationChoices","choiceText","selectedParentLocation","editText","attachmentId","setGoogleMapsLinkInfo","street","parentLocationUpdated","toggleFlash","locationIds","peekRecord","showFloorPlan","selectPersonFromPicker","requireFields","setPrimarySMS","toggleSMS","updateNumber","updateExtension","_setupData","addBehavior","setupTooltips","_setupInput","dialableNumber","isPrimarySMS","checkPrimaryForType","dialCode","initialCountry","intlTelInput","errorMsg","iso2LocaleCountry","iso2","errorCode","intlTelInputUtils","validationError","INVALID_COUNTRY_CODE","TOO_SHORT","TOO_LONG","NOT_A_NUMBER","isRequiredPhone","isRequiredError","isNumberError","errorClass","_setFieldDataValidity","hasErrorCode","hasClass","countryData","toLocaleUpperCase","emptyData","acceptsSMS","_intlTelInputOptions","setupIntlTelInputAccessibility","orgCountryCode","countryCode","normalized","buildIntlTelInputOptions","retries","choice","setValue","defaultValue","_find","allowedValues","translatedAllowedValue","translatedValue","valueKey","addTag","tags","removeTag","showDuplicateError","navigateToSearchTag","linkable","sortedTags","recordChange","search","tagValue","currentRequest","initTagInput","$typeahead","typeahead","highlight","hint","async","displayKey","syncResults","asyncResults","addTagFromTypeahead","clearInput","request","types","suggestions","suggestion","keyDown","abort","flash","flashTag","requiredFieldPaths","embedded","onProfile","isGeneralField","saveField","notifyUserGeneralFieldUpdated","showPlaceholder","textValidator","watchValidityToDisableModal","disable","placeholderText","setMinWidth","span","append","ensurePopulatedWhenEditing","setWidth","getFieldError","maxLength","history","boolean","weblink","multiline-text","multiline","cleanFieldForEntity","isGroupField","haveStartDate","haveEndDate","isMoment","isEmptyValue","isRequired","numberMaxLength","extensionMaxLength","isValidUrl","baseKey","_s","customLabel","validator","placeholderImages","isInitialized","isNameLatin","feature","hoverParent","applicationUrlPrefix","isPlaceholderImage","useInitialsPlaceholder","enableMiniCard","microCard","showMiniCard","showQueueToggle","showPresenceDropdown","showLogOffButton","isGeolocationEnabled","imageLoadError","isHoveringCard","isHoveringImage","hoverTimer","isFirstHover","haveMediaProviders","mediaProviderComponent","useIntegrationBadges","integrationBadgesComponent","tetherConstraints","hovercardOffset","triggerShowMiniCard","_displayHoverCard","mouseEnterCard","onHoverChanged","mouseLeaveCard","_attachListeners","_removeListeners","isHovering","isOnline","chatPresence","chatPresenceClass","tetherSelector","tetherElementId","uniqueId","entityType","cardImageUrl","getProfilePicture","nameInitials","commaIndex","spaceIndex","leftInitial","rightInitial","initialsPlaceholderSupported","isPlaceholderImageAndUseInitials","showPresenceAndChatEnabled","entityIsGroup","entityDeleted","isSelfEntity","placeholderImage","baseUri","profilePicture","deviceSize","sizeForDevice","exactMatch","sizes","ratio","devicePixelRatio","mouseEnter","mouseLeave","_createPopper","el","targetEl","cardEl","_popper","Popper","modifiers","flip","behavior","arrow","preventOverflow","padding","_destroyPopper","Image","scheduleUpdate","clickedHoverCard","checkHoverState","isLinkable","subscribeToPresence","showStatusQuote","showPresence","_managePresenceSubscription","$img","_removePresenceSubscription","managePresenceSubscription","displayStatusQuote","imageUrl","_animationRun","_currentPresence","isStatusAnimating","animateOnPresenceChange","nextPresence","prevPresence","entityIsContact","modifyPlaceholderImage","autoSubscribe","showDepartment","showActions","clickToProfile","isSearchResult","geolocation","phoneTooltip","entityTypeClass","dasherize","entityIsPerson","entityIsQueue","entityIsMe","canContactEntity","isPresenceLabelToggleEnabled","useInitials","showOrganization","entityRoutePath","isClickable","_subscribePresence","subscribe","conversationSummary","socialExpression","totalMessages","contactCenter","enterprise","_presenceLabelUtil","activityCounter","totalSocialExpression","region","selfLocation","entityLocationData","presenceLabelData","showStatus","showActivity","eActivityPresenceClass","totalCalls","totalChats","totalEmails","presenceLabel","eChatStatus","isShowingActivitySummary","ViewportMixin","requiredPermission","hasRequiredPermission","perms","agentHasOnQueue","agentHasRequiredPermission","isTesting","_subscribeToPresence","didEnterViewport","didExitViewport","_unsubscribeFromPresence","externalContact","showPhones","showEmails","showAcceptsSMS","acdOutboundWhatsApp","_getEmailTypes","modelKey","_getPhoneTypes","dropdownTitle","externalContactHasNoEmailAddresses","phoneType","canUseNonE164","phoneTypeTranslated","phoneTypeId","typeName","externalContactHasNoPhoneNumbers","emailType","hasMultipleEmails","hasMultiplePhoneRecords","selectEntityWithEmail","selectEntityWithPhone","onPreventClick","queueService","isDetailsLoaded","isDetailsLoading","canViewQueueDetails","getQueueData","waitTimePromise","getQueueEstimatedWaitTime","callWaiting","callbackWaiting","chatWaiting","emailWaiting","messageWaiting","joinedData","joinedPromise","waitTimeResults","getMetricCount","array","metricName","metricData","metric","getOnQueueCounts","routingStatus","partial","datum","qualifier","property","sum","joined","queueId","mediaType","callData","callbackData","chatData","emailData","onQueueCount","idleCount","waitStr","queueData","agentData","callCount","callbackCount","chatCount","emailCount","messageCount","bestWaitTime","bestTime","formula","estimatedWaitTimeSeconds","getWaitTime","wait","hr","hours","minutes","sec","seconds","waitTime","imageMappings","informal","activeProfilePictureSection","open","askToDelete","showUploadModal","uploadPicture","confirmUpload","pictures","picture","entityJid","edit","setProfilePicture","notifyUpdateProfileImage","firstObject","updatedSection","images","newImage","profilePictureSection","cancelUploadModal","cancelDeleteModal","doneDeleting","_showing","showing","isPersonOwner","hasAccessToPicture","canEditProfiles","done","selectImage","current","selected","currentSelection","deleteImages","imageType","uploads","currentSelected","imagesToSave","addingSection","emptySections","addSection","toggleAddingSection","_this$attrs","attachHandler","EntityControllerMixin","ProfilePermissionsMixin","mediaProviders","resizeDetector","emergencyLocation","emergencyLocationOn","editEmergencyLocation","lastEntity","showCardView","compactLayout","excludedContactFields","iconHoverText","scrollToBottom","scrollHeight","toggleEditProfile","editProfilePicture","editContactInfo","setContactInfo","$section","focusTarget","toggleCardView","componentUpdated","resize","handleResize","notify","allSections","canEditStatus","isPurecloudSource","_presenceUtils","department","fieldSections","emptyWriteableSections","sectionKeys","isEditingSection","videoProviders","getVideoProviders","haveVideoMediaProviders","_mediaProviders","hasSupplementalVideoProvider","profileChanged","editingSectionChange","handleProfileChange","lastId","handleEditingSectionChange","masonryEl","_useMasonry","enableMasonry","_masonryId","_isInDOM","fieldSectionsUpdate","attachMasonry","masonry","columnWidth","fitWidth","registerLayout","rerun","throttle","detachMasonry","deregisterLayout","startMasonry","stopMasonry","Mixin","canEditProfile","canEditName","canEditTitle","canEditDepartment","canReadHR","onOwnProfile","gallery","canReadGroups","groupsFieldConfig","getSectionByKey","canEditGeneralInfo","canEditContactInfo","canViewLocations","locationsField","canViewInformals","photos","PERMISSIONED_FIELD_PATHS","POSSIBLE_INTEGRATION_FIELDS","findIndex","generateGuid","_sectionLocation","fieldPathClass","writeable","BUILTIN_SECTIONS","myOwnProfile","customKeys","_profile","customSectionKeys","removeable","removable","integrationManaged","integration","Validators","isPrimaryField","primaryFieldId","isNewValue","PROFILE_CACHE","EXCLUDED_SECTIONS","ADMIN_SECTIONS","builtins","_cache","readWritePermissions","writeableSections","readableSections","canReadProfiles","write","profileSections","SectionInfo","canEditProfilePictures","canReadSection","reopenClass","owner","customSections","adding","componentName","hasCustomComponent","emptyValues","ThenableSearchMixin","filterFunction","searchQuery","userInput","debouncedScheduleQueryUpdate","disabled","ensurePluralType","_scheduleSearchQueryUpdate","maxWait","cancelInput","chooseSelected","setUserInput","_updateSearchQuery","submit","clearSearch","entityFilter","_buildResults","wrappedSearchResults","searchResults","haveResults","noResultsKey","plural","areaScroll","entityHeight","clearInputs","chosen","each","isEnter","presence","editable","savedStatus","isLoading","debounceTime","isInvalid","changeStatus","updateStatus","changeStatusEventually","setUsersStatus","showUpdateError","ExpanderPluginComponent","expandText","collapseText","$el","expander","userCollapseText","afterExpand","afterCollapse","fallbackToEmpty","showHistoryYearRange","choices","choicesHidden","customLabelText","labelFor","toggleChoicesView","selectChoice","setupCustomLabelText","hasCustomLabelKey","labelForHistoryField","customLabels","customLabelTextChanged","clickId","pickerParent","containerParent","attachTooltip","html","keyPress","classList","contains","choiceId","hasStartDate","hasEndDate","_locale","monthYearFmt","startDateFmt","endDateFmt","mStartDate","mEndDate","endOf","diff","humanize","formattedStartDate","formattedEndDate","_fixtableColumnHeader","_fixtableColumnLabel","_fixtableEmptyState","_fixtableFooter","FixtableGrid","_fixtableRowToggle","_fixtableRow","saveLocation","coordinatesRatio","selectFloorplan","setCurrentFloor","floorplans","currentLocation","saveFloorplan","closeFloorplan","loadInitialPinLocation","img","coords","getRatioCoordinates","attachPinForXY","floorplanImageUrl","resolution","imageUri","locationFloors","parentFloors","loadFloors","updateCoordinatesRatio","updateCoordinatesOnLocation","clientX","pageXOffset","offsetY","clientY","pageYOffset","operation","naturalHeight","naturalWidth","heightDiff","widthDiff","currentPin","floorSorter","sorted","hidePopover","popoverEl","attachClickHandler","removeHandlers","AUDIO_FORMAT","BrowserUtils","getSuggestedAudioTypeFrom","GroupContactModalComponent","fileUpload","saveContactInfo","originalExtension","voicemailFile","showVoicemailOptions","resetGreeting","rotateCallSecondsError","numberOfRotationsError","saveForm","updateRotateCalls","updateRotations","toggleVoicemail","toggleEmailNotification","toggleOptions","selectVoicemailFile","triggerUpload","chooseFile","fileReader","FileReader","onloadend","arr","Uint8Array","isOpus","isWav","isAiff","readAsArrayBuffer","isOggFileType","recordingReady","resetRecording","resetFile","resetCurrentGreeting","audioPlayerError","setupInput","initNumber","numberOfRotations","rotateCallSeconds","_voicemailOn","voicemailOn","emailNotificationOn","haveExtensionError","isExtensionResourceInUse","isExtensionNotInPool","editingVoicemailDisabled","ringTimeMs","rotations","_this$getProperties","getProperties","ext","invalidExtension","invalidPhoneNumber","haveNumberAndExtension","callNotice","showGroupEmail","greetingOptions","hasGreeting","greeting","greetingAudioSource","audioFile","formatId","mediaFileUri","showEmailNotification","setConfirmDisabled","fieldName","inputElem","extElem","updateSelectedCountryAriaLabel","uploadGreeting","uploadPath","uploadGreetingWithPreSigned","FormData","XMLHttpRequest","onreadystatechange","DONE","uploadComplete","_this$getProperties2","setNumberData","showExtensionErrorNotification","haveError","rotateCallsSecs","stopRingingAfterRotations","sendEmailNotifications","handler","update","disableInput","GroupProfileComponent","showContactInfo","saves","groupRoom","showMembers","showLinkDropdown","displayIndices","hasLinks","hasInformals","displayWarningModal","shouldFocusToggle","excludedFieldSections","excludedMembershipFields","toggleLoading","generalExcludedEditingFields","selectTab","toggleCallsEnabled","saveCallsEnabledState","toggleEditing","changeEditingMode","editGeneralInfo","cancelEditContactInfo","editPrivacyRules","toggleLinks","goToLink","href","confirmGeneral","closeAllModals","job","handleJob","cancelGeneral","metadataFor","deleteGroup","cancelDelete","confirmDelete","back","groupData","setHasLinks","confirmWarningModal","closeWarningModal","toggleGroupProfileEditPopover","getGrants","setupToggleAccessibility","setupKeyboardHandlers","teardownKeyboardHandlers","_handleEscapeKey","editButton","callsEnabledObserver","voicemailStateObserver","schedule","toggleInput","innerLabel","labelText","srText","prepend","labelId","toggleSelector","innerLabelSelector","mapping","toggle","setupConditionalToggleAccessibility","focusToggleAfterSwitch","callsEnabled","isShowingDeleteModal","isShowingPrivacyModal","isShowingGeneralModal","ensureCorrectLinksState","membersTabSelected","settingsTabSelected","generalFieldConfigSection","fieldSection","FieldSection","privacyFieldConfigSection","linksFieldSection","hasRules","phoneRef","groupVisibility","membershipVisible","includeOwners","groupTypeIcon","groupOwners","membershipHeader","groupRolesHeader","canEditLeftRailInfo","canEditInformation","namedPermissions","isOwner","canEditGroups","canEditGroupTelephonySettings","disableToggleCalls","canEditRoles","hasRolesView","hasPermissionAndDivision","hasGrantsEdit","hasPermission","canDeleteGroup","updateLinksChange","setHasInformals","informals","checkMembers","exclusions","inclusions","canEditMembership","disableAction","unloadRecord","_this9","setInterval","getJobData","_this10","jobId","retryJobId","clearInterval","commitRevertHandler","adapterDidCommit","showSaveModal","showCancelModal","previewValue","expressionDisplay","conditions","display","con","lastCondition","opAnd","saveDisabled","maximumExpressions","skills","numberPreview","addCondition","exp","condition","rules","skill","comparator","proficiency","lastRule","removeCondition","removeAt","conditionOperation","op","saveData","prepareExpression","success","skillConditions","put","previewUrl","preview","userCount","openCancelModal","closeCancelModal","parseExpression","closeSaveModal","output","routingSkillConditions","languageSkillConditions","rule","skillPropName","ruleType","newObj","childConditions","comparators","class","compPlace","updateConditionDisplay","addRule","removeRule","ruleOperation","skillChanged","_step","orWrap","_iterator","_createForOfIteratorHelper","skillResults","languageResults","showSearchResults","searchvalue","placeHolder","skillSelected","searchInputUpdated","updateSearchOnChange","attachOutsideHandler","removeOutsideHandler","runSearch","languageSearch","skillSearch","skl","langs","lang","LIST_TYPES","OWNERS","MEMBERS","slideInList","personSearch","orgVoicemailPolicy","listType","routeSelection","ringRotations","isSequential","isRotary","reasons","isMissing","loadOrgVoicemailPolicy","scheduleRemoveAnimation","appendSave","removeSave","rollbackAttributes","changeListType","toastTitle","toastMessage","voicemailGroupId","_state","greetingData","ringSequenceData","saveModelData","savePolicy","saveGreeting","callback","greetings","VOICEMAIL","recordingFile","orgIndividuals","addedDelta","removedDelta","addIndividuals","deleteIndividuals","individualsOperation","memberIds","_emberAjax","pigeon","originalNumber","showVoicemailGreetingOptions","pigeonEventHandler","disableReplaceOverflowBtn","disableRingInputs","forwardingOn","overflowGroup","duplicateNumberError","inputErrorClass","routeTypes","translation","routeSelectionType","routeDescription","selectedRouteType","rotateCallsDisplayText","stopRingingDisplayText","searchText","displaySpinner","enablesHipaa","disablesEmailNotifications","disablesPiiInEmailNotifications","disablesVMTranscription","disablesVoicemails","voicemails","transcriptionToggle","transcriptionDropDown","_getLanguagePreference","transcriptionLanguages","languagesObj","emailNotifications","piiInEmailNotifications","saveFunction","handlePigeonEvent","registerToPigeonTopic","_setupInputs","_setupToggleAriaLabels","previousEntity","rotationsChanged","toggleCallForwarding","selectOverflowGroup","replaceOverflowGroup","toggleVoicemails","toggleEmailNotifications","togglePiiInEmailNotifications","toggleTranscriptions","selectTranscriptionLanguage","badNumber","badExtension","editingObserver","groupTopic","registerPriorityTopic","overflowGroupId","finishedSaving","succeeded","setAriaLabel","contactInfoGroup","BatchDataRequestMixin","searchInput","sequenceContainer","resultsContainer","resizeListener","listDirty","_editing","isOwners","cachedEditing","sequenceList","individualsSequenceList","_sequenceListForPeople","ownersSequenceList","renderedList","_appendRotationListData","searchLabel","searchPlaceholder","addMemberPlaceholder","inputEntered","togglePersonSearch","handleListeners","listModified","_handleResizeEvent","listLength","listModel","beginningOutOfRange","outOfRange","endOutOfRange","popupDismissed","batchPromises","getUser","personArray","fuseOptions","shouldSort","threshold","distance","maxPatternLength","minMatchCharLength","getFn","groupList","selectedIndex","queryAvailable","Fuse","removeItem","_recalculateIndices","notifyParentOfListChange","changePosition","from","_changePosition","isInteger","groupArray","insertAt","input_value","hovercardArrowOffset","scrollIntoView","outOfRotationRange","displayRotationRangePopup","newIndex","popupTarget","indexChanged","changeIndex","dismissPopup","setIndexChanged","submitIndexChange","membership","deletePerson","handleDeleteKeyDown","isLoggedInUser","sessionPerson","cannotDeleteMember","isOwnerAndSelf","multipleOwners","canViewRules","visible","hasPermissions","memberType","isPersonIndividual","memberTypeList","isRule","isAddedIndividual","isCurrentMember","PagingMixin","JobMixin","searchService","filterChoices","string","inclusionFilter","exclusionFilter","showRules","loadedAll","ignoreScroll","rateLimited","currentlySearching","currentMembershipRequest","membershipQuery","memberListLimitSize","retryTimeout","retyTimeOutDuration","toggleRules","updateContentOnChange","selectFilter","updateSearch","searchCriteriaChanged","editMembership","selectKeyword","keyword","addKeyword","addedIndividuals","removedIndividuals","setRulesOnGroup","addJob","handleJobFinish","saveIndividuals","initMembership","loadMembershipList","loadMoreMembersOnInit","inclusionQueries","addedInclusions","exclusionQueries","addedExclusions","membershipRules","isEditingRules","expression","displayEditingFooter","rolesEnabled","isSearching","shouldShowRules","showingFilterChoices","editingFilterChoices","membershipCount","extraParams","generalQuery","queryGroup","cancelEditOnGroupChange","debouncedSearchCriteriaChanged","reloadPageOnGroupChange","loadMore","_args2","reloadPageOnGroupReload","_individualsOperation","Content-Type","loadOwners","loadPathFieldMembers","loadIndividuals","_callee4","_context4","displayClassification","isIndividual","addedRules","rels","personQuery","latestAdded","singularize","currentFilter","keypath","ruleData","loadContentOnScroll","_callee5","listing","scroll","filterKey","_context5","loadSearchMembers","newMembership","_meta","isLastPage","_this11","searchMembership","peopleIds","pushObjects","incrementProperty","_this12","member","filteredResults","isError","allMemberships","uniqBy","setObjects","_this13","updateOffset","aName","bName","loadRules","_callee6","isPending","_context6","loadAll","_callee7","_context7","builder","requestBuilder","addQuery","setPaging","performCustomSearch","listingEl","containerHeight","groupedRelationships","toggleRelationship","_$last","deleteRule","isKeyword","relationshipGroups","relationshipSelected","oid","graph","buildGraphFromRelationships","ancestors","descendants","SearchMixin","searchValue","mode","resetPersonSearch","querySelectorAll","totalItems","nextIndex","updateTabIndex","prevIndex","objectAt","isRules","iconClass","dismissed","currentIds","removeDuplicates","currentSearchRequestUpdated","resultsChanged","firstItem","previousFilter","performPersonSearch","focusIndex","resetSearch","editingStateChanged","addAggregations","aggregates","aggregate","SEARCH_FACET_KEYPATHS","groupAssignedRoles","isEditingRoles","displayRoleRemoveModal","rolesToDelete","displayRulesRolesWarningModel","unsavedGrants","roles","_hasUnsavedGrants","hasUnsavedGrants","grantId","grantModel","recalculateHasUnsavedGrants","addAllFutureDivisions","_ref3","removeAllFutureDivisions","grantMaps","grantMap","groupRolesViewColumns","nameColumn","header","cellClass","typeColumn","descriptionColumn","divisionsViewColumn","hideLabel","groupRolesEditColumns","divisionsEditColumn","assignmentColumn","editRoles","toggleRolesEnabled","_toggleRolesEnabled","_enableRoles","closeRulesRolesWarningModal","getGroupRoles","_getGroupRoles","deleteRoles","_deleteRoles","openConfirmModelSingleRole","grantRole","grantRoles","openConfirmModelMultipleRole","divisionRoles","divisionRole","rolesToUpdate","grantsToDelete","_ref4","undeletedGrant","destroyRecord","_stopEditingRoles","_isTooManyGrantsError","searchAssignedRoles","assignedRoles","filteredRoles","roleDivision","searchAllRoles","allRoles","updateUnsavedGrants","selectedDivisions","previouslySelectedDivisions","_updateUnsavedGrants","confirmHasRolesWarningModal","_disableRoles","closeHasRolesWarningModal","toggleRoleAssignment","isAssigned","addRole","removeRole","trySet","division","stillSelectedDivision","divisions","_removeRole","getRoleWithDivisions","grantRecord","previousVersion","attempt","grants","assignedRolesMap","unloadAll","grant","subjectId","normalize","setMap","turnOnRoles","_toggleRolesOn","_toggleRolesOff","hadRules","_setupAccessibility","_setupKeyboardNavigation","_removeKeyboardNavigation","contentDidChange","_setupFixtableAccessibility","allCheckboxes","checkbox","$checkbox","$headerRow","$toggleSwitch","$row","$roleNameCell","roleName","_setupButtonAccessibility","_setupTableHeaders","$removeButtons","button","$button","$otherButtons","buttonText","buttonTitle","$table","isEditMode","tableLabel","$allHeaderCells","th","$th","headerIds","headerId","rowIndex","row","$cells","cellIndex","cell","$cell","$filterInputs","$headerCell","headerText","$fixtable","selectionIsEmpty","selectedDataRows","isFirstPage","listedPages","totalPages","neighbors","pagesToFirst","pagesToLast","shortageL","shortageR","lowerIndex","upperIndex","pages","isCurrent","firstPageListed","secondPageListed","penultimatePageListed","finalPageListed","showPaginationControls","showRangeLabel","bulkAction","showPage","showNextPage","showPreviousPage","containsRole","rowHasToggled","wasAssigned","homeDivision","peekAll","_updateDivisions","previouslySelected","allFutureDivisionsSelected","updateDivisions","previousSelection","allFutureDivision","_loadDivisions","_setSelectedDivisions","roleDivisions","allDivisions","selectedDivision","rolesEditComponent","allDivisionsSelected","optionsWithoutSpecial","allFutureDivisions","_allFutureDivisionsObserver","powerSelectAPI","_selectAll","selectAll","deselectAll","removeObserver","addObserver","divisionsDisplayList","displayString","_setupKeyboardHandler","_removeKeyboardHandler","dash","firstItemIndex","lastItemIndex","isSingleItem","disabledMessage","_isInitialized","queryChanged","triggerSearch","positionSubclass","removeSelectedTerm","terms","removeSingleTerm","facet","isSingleTerm","facetName","_horizontalCollection","bootstrapIcons","_inViewport","hideScrollbars","scrollBottomThreshold","onscroll","onScroll","scrollBottom","clientHeight","scrollThreshold","checkInfiniteScroll","infiniteScroll","isSmall","useLightIcon","iconUri","phoneIntegrations","LightGalleryModal","escaped","initGallery","caption","lightGallery","loop","speed","closable","escKey","allPhotos","_linkToExternalComponent","isAuthenticated","offerMobileApp","onMobileOfferDecline","mobileOfferDeclined","room","attachTo","_displayDropdown","selectProvider","provider","providerId","launchVideoProviderWithPersonById","_targetEl","setup","arrowElement","handleClick","handleOutsideClick","isAttachTarget","componentParents","attachTargetParents","showingVideo","showingPurecloudVideo","showingMediaProvider","providers","chatRoom","isGroupRoom","MiniCardComponent","managerCount","isManager","managerCountText","translucentOverlay","containerClassNames","overlayClassNames","confirmText","cancelText","showHeader","showFooter","wrapContent","enforceModality","extraClassNames","confirmDisabled","noCancel","sendConfirm","ret","sendCancel","backdropDismiss","setText","confirmAction","cancelAction","attachClassToBody","modalContainerElement","escapeDeactivates","allowOutsideClick","_modalDialogOverlay","_modalDialog","ModalDialog","_initEscListener","CreateGroupMixin","setHandlers","setAttr","createGroup","checkNameLength","isTooLong","_occludableArea","_pcStyleIconExample","WebrtcActionUtilsMixin","EntityImageDefaults","needsServices","checkUnusedFields","entityContactGroupData","linkToProfile","emailAddress","telephoneNumber","initialFieldsCheck","moveToPerson","setEntityContactGroupData","router","profileId","transitionTo","openChat","openVideo","PersonGraphComponent","paper","mini","trueColor","trueStrokeColor","falseColor","falseStrokeColor","disabledColor","disabledStrokeColor","disabledSegments","baseAttrForPath","segmentChanged","segName","segment","attrForSegment","disabledSegmentsChanged","segs","setupGraph","drawGraphics","destroyGraphics","triggerAction","isDisabled","Raphael","drawSegment","renderfix","safari","xform","pathForSegment","stroke-width","node","fill","stroke","cursor","ancestorsPath","parentPath","selfPath","siblingsPath","childrenPath","descendantsPath","ancestorsSmallPath","parentSmallPath","selfSmallPath","siblingsSmallPath","childrenSmallPath","descendantsSmallPath","PersonIconComponent","PikadayInputComponent","_pikadayInputless","_popoverOnComponent","_popoverOnElement","_powerSelectMultiple","_powerSelect","_beforeOptions","_options","_powerSelectGroup","_searchMessage","_preRender","checked","onClick","ariaDescribedBy","isChecked","isMouseDown","minimized","minHeight","maxHeight","toggleSize","attachCurrentHeight","minimizedChanged","_resizeDetector","parentId","selectedTerms","accordianParentId","panelId","isSelected","selectTerm","selectedTermsChanged","keypathRegex","profileSkills","hobbies","interests","certifications","languages","FacetTerm","searchField","reverseLookup","View","attachScrollListener","loadNextPage","createDebouncedLoadNextPage","loadResultsToFillPage","scrollToTopOnPageZero","Controller","integrationsPresence","_searchQuery","queryFacets","saveHistory","totalResults","lastSearchFavoritesCount","onFavoriteChanged","runSearchQuery","changeSearchType","currentActive","termObj","notifyTooManySearchFilters","updateQueryOnTermsChange","changeTabButtons","atPageLimit","remainingResults","hasMoreResults","moreResults","groupedSelectedTerms","currentGroup","isGroups","isLocations","isExternalContacts","isExternalContactsEmpty","isFavoritesEmpty","haveSelectedTerms","displayFacets","updateQueryParameters","queryParameters","newHash","lastHash","sendNavigationEvent","searchInitial","searchOnChange","startsWith","termStrings","keywordStrings","_baseSearch","_baseAggregations","order","_valueQuery","_facetQuery","_baseSearchForEntity","aggregations","MULTI_ENTITY_FIELDS","BASE_PERSON_EXPANDS","BASE_PERSON_FIELDS","_buildSearch","favoriteIds","valueQuery","chunks","chunk","operator","_normalizeSearch","models","modelResults","_processFacets","rawFacets","keyOrder","getFavoriteIds","getLoadedFavorites","favorite","isLoadMore","iterations","numberOfFavoriteToSearch","fetch","buildSelectedTerms","conn-ui-fav-nb","_ref5","userResults","alterUsersWithIntegration","searchKeywords","addSelectedTerm","keywordFacetName","directedSearchTerms","directedSearch","_directedSearch$split","_directedSearch$split2","_toArray","searchSplit","SearchResultContextComponent","searchResultContextVisible","_scrollToPreviousTop","$messagePane","$lastMessage","targetHeight","outerHeight","closeOnContextSwitch","replyToMessage","loadHistoryAfterLast","loadMoreHistoryAfter","loadHistoryBeforeFirst","loadMoreHistoryBefore","subMessageTypeClass","subMessageType","_deprecatedTetherDialog","_tetherPopoverOnComponent","_tetherPopoverOnElement","_tetherTooltipOnComponent","_tetherTooltipOnElement","timeSince","_calculateElapsedTime","durationInMs","asDays","_formatDuration","unit","cnt","msSince","HOUR","MINUTE","tickingDuration","escapedBuildTag","rawBuildTag","isPresent","updRandTime","currTime","currMinutes","currBin","nextMinutes","nextBin","hourMultiplier","_tooltipOnComponent","_didUpdateTimeoutLength","TooltipOnElement","AutoSaveDevicesMixin","currentFile","currentFileInfo","currentCoords","currentXHR","currentImageId","selectedCamera","cameraPending","cameraError","startingMedia","imageUrlData","uploadingImageUrl","autoTakePicture","uploadType","createDropZone","uploadError","x2","y2","showPictures","addIndicatorForPromise","uploadImageUrl","_helpers","displayImage","setupFileFromUrl","clearImage","startCamera","attachMediaStream","mirror","takePicture","canvas","createElement","videoWidth","videoHeight","ctx","getContext","drawImage","dataUrl","toDataURL","asBlob","dataURLtoBlob","pictureInfo","fileName","asFile","File","onTookPicture","cancelCamera","cameraStream","switchCamera","updateDefaultDevices","camera","canUseCamera","getImageDataFromXhr","initCrop","aspectRatio","Jcrop","onSelect","handleCropChange","onChange","setSelect","santizedResult","normalizeSingleResponse","attributes","dimensions","fileInfo","$image","FileAPI","imageCategory","displaywidth","cropProportion","gId","imgData","boundingBox","groupImageType","formData","Blob","uId","userImageType","dataUri","getInfo","handleFileInfo","dropzone","Dropzone","acceptedFiles","uploadMultiple","maxFiles","clickable","autoProcessQueue","addRemoveLinks","maxFilesize","dictInvalidFileType","dictRemoveFile","dictFileTooBig","dictCancelUpload","dictUploadCanceled","files","removeFile","autoplay","disableContextMenu","oncontextmenu","styleName","isSafari","processData","profilePaths","editingCaption","canAddCaption","showImage","addCaption","saveCaption","imageList","initCaption","ownImage","isGroupOwner","closeCaption","canDelete","populated","imagePath","currentImage","getReferencedField","_verticalCollection","_verticalItem","_wrapUrls","_link","_url","XOption","XSelect","metaName","nodeName","_require","rawConfig","getAttribute","unescape","isNonEmptyStringQueryParam","paramStr","isBlank","appsService","panels","initialPanel","updateCurrentRouteName","panelsOverrideObject","panelsOverride","initialPanelOverride","transitionToRoute","openPreferencesModal","_default","managePresenceSubscriptions","subscribeTo","inviteUserToRoom","isOneToOneRoom","promoteToAdhocRoom","inviteToRoom","toggleParticipants","collapseChat","oneToOneTarget","makeNewEmptyRoom","ContactsController","favoritesNameFilter","personBinding","isOnlyFavorite","canSearch","removeFavorite","addFavorite","recents","apiEndpoint","getJSON","idOnly","setLocalFavorites","favoritesFilterChanged","debouncedFavoritesFilterChanged","createDebouncedFavoritesFilterChanged","_filterChanged","filtered","setFavorites","countFavorites","list","checkSearchVisibility","EngageController","engageService","route","replaceRoute","setEngageActive","setEngageInactive","navigationEvent","navRoute","engageRouteToCollaborateRoute","redirectEvent","newRoute","MaintenanceController","hasDesc","messageKeys","titleKey","descKey","actionKey","showMobile","loadingFieldSections","showGridMode","stackedMode","gridMode","treeMode","showStackedMode","showTreeMode","toggleLeftRail","queryParamObserver","syncQueryParamsWithHost","currentLocalHash","currentHostHash","updatedHostHash","desktopRegionId","chooseRegion","context","sendRegionToDesktop","defaultDesktopRegionId","PUBLIC_ENVS","desktopId","RelateExternalContactController","IndexController","RelateExternalOrganizationController","relateService","redirectRoute","SignupController","_heading","_button","_plantronicsCallEvents","FieldConfig","ExternalContactModel","GroupModel","OrgModel","KEY_BLACKLIST","GROUP_BLACKLIST","ORG_BLACKLIST","PROFILE_BLACKLIST","_initModelWithType","blacklist","reopen","unknownProperty","splitFieldPath","splitField","getFieldListByType","getFieldsByType","getAllowedValues","isFieldRepeatable","isFieldReference","isFieldChoice","groupFieldConfig","getFieldConfig","personFieldConfig","extra","createFieldConfig","attachComputedEntries","boundTo","boundToEach","getEntriesFromEntity","getEntityType","serverKey","exists","Field","maxRepeat","i18nLabel","getI18nLabelKey","elemId","cleanForEntity","requirejs","_eak_seen","className","factory","lookupFactory","hhmmss","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","DEFAULT_PARAMETERS","normalizeArrayResponse","activityMessages","sms","voice","Helper","compute","activity","ts","_abs","_acos","acos","_acosh","acosh","_add","formatOrLookupAddressForDisplay","_and","hideSha","versionRegExp","hideVersion","shaRegExp","helper","_arrayContains","arrayContains","_asin","asin","_asinh","asinh","_atan","atan","atan2","_atanh","atanh","_await","promiseArray","permissionsService","_cancelAll","cancelAll","_cbrt","cbrt","_ceil","_clz","clz32","_cos","cos","_cosh","cosh","cssClassify","_dasherize","_div","div","_emberPowerSelectIsGroup","emberPowerSelectIsGroup","_emberPowerSelectIsSelected","emberPowerSelectIsSelected","_emberPowerSelectTrueStringIfPresent","emberPowerSelectTrueStringIfPresent","_emoji","emojifyString","_equal","_equals","equals","escape","_exp","recompute","_escape","_expm","expm1","namedArgs","splitName","fieldObj","lookupPath","_flairRegEx","hideIfText","color","emojiText","_floor","_formatDate","bytes","units","converted","pow","decimals","toFixed","_formatHtmlMessage","_formatMessage","_formatNumber","_formatRelative","_formatTime","_fround","fround","fullNameHelper","externalProfile","fullName","_gcd","gcd","_getSelectOptions","getSelectOptions","hasRecordForId","recordForId","_gt","_gte","gte","_hypot","hypot","activityIcons","_ignoreChildren","ignoreChildren","_imul","imul","_intlGet","_isAfter","_isArray","_isBefore","_isBetween","right","_isFulfilled","_isPending","_isRejected","_isSameOrAfter","_isSameOrBefore","_isSame","routes","station","routeIds","joinStrings","joinCharacter","rest","_l","_lcm","lcm","_this$get","localizePresence","_logE","logE","_log","log10","_log1p","log1p","log2","_lt","lt","_lte","lte","_max","_moment","isSame","_min","_mod","mod","_momentAdd","_momentCalendar","_momentDiff","_momentDuration","_momentFormat","_momentFromNow","_momentFrom","_momentSubtract","_momentToDate","_momentToNow","_momentTo","_unix","_mult","mult","_markdown","_notEqual","notEq","_not","_now","_or","_perform","onIntegrationConfigChange","integrationContactInfo","integrationConfigs","includeBadge","_pow","_promiseAll","promiseAll","_promiseHash","promiseHash","_promiseRejectedReason","_random","renderMarkdown","_round","round","_routeAction","emoji","isUnicode","isUnicodeLookAhead","emojifyStringUnicode","_sign","sign","_sin","sin","sortFieldData","_orderBy","_sqrt","sqrt","_sub","sub","_sum","_tan","tan","_tanh","tanh","_task","padZero","num","willDestroy","_scheduleRecompute","endTime","shouldTick","_setupObserver","titleForEntityPropertyHelper","entityPropertyType","getPhoneTitleFor","getEmailTitleFor","_trunc","trunc","_utc","utc","extLabel","_xor","xor","INCOMING_CALL","TERMINATED_CALL","MISSED_CALL","STOPPED_RINGING","PHONE_CONNECTED","WEBRTC_CONNECTION_INCOMING","WEBRTC_CONNECTION_ANSWERED","WEBRTC_CONNECTION_DECLINED","WEBRTC_CONNECTION_STARTED","WEBRTC_CONNECTION_ENDED","_emberUuid","unparse","v1","v4","initialize","_initializerFactory","after","ApplicationService","before","Route","AuthenticatedAuthorizedRouteMixin","UnauthenticatedRouteMixin","beforeModel","AuthenticatedRouteMixin","deprecateJqueryCookie","jQueryCookieDeprecation","until","cookie","deprecate","removeCookie","oauthProps","_netUtils$getEnvDetai","runtime","loadOauthProps","ChatService","singleton","Clock","StyleNamespacingExtras","ContainerDebugAdapter","WebrtcSdkService","setupContainer","registry","baseURL","rootURL","Configuration","load","_setupSession","_setupSessionService","_engines","exportApplicationGlobal","theGlobal","globalName","classify","throttled","debounced","_register","PersonFieldConfig","GroupFieldConfig","OrgFieldConfig","ExternalContactFieldConfig","MainInitializer","Orgspan","Debug","registerDeprecationHandler","Provider","ZoomProvider","PureCloudProvider","TeamsProvider","PhoneService","PreferencesService","_routeStyles","deferReadiness","authUri","instanceProperties","runtimePublicDomainName","publicDomainName","purecloudV2BaseUri","cobrowseUri","purecloudAppsUri","streamingServiceUri","advanceReadiness","SessionService","_themeLoader","setThemeClass","loadTheme","regex","packages","WebrtcService","WebrtcSettings","_backburnerDebug","_conversationService","applicationInstance","initializeStoreService","instanceInitializer","Intl","polyfill","cldrs","addLocaleData","localeSplit","localeName","addTranslations","_setupSessionRestoration","LazyRenderWrapper","enableLazyRendering","EntityContactGroupComponent","EntityFavoriteComponent","EntityHoverCard","EntityImageComponent","EntityLocationComponent","pushManifest","manifest","PresenceLabelComponent","preferences","parentView","routeTitle","updateRouteTitle","routeName","appRoute","orgName","HostedContext","_net","parseRuntimeCustom","$target","urlPrefix","initializeEmojiRendering","initializeMarkdownRendering","apiHandlers","apiHandlerKeys","currHandlerKey","logout","_logged","nrOnError","URLSearchParams","hasQueryParam","TARGET_PRESENCE","freeze","BUSY","MEETING","OFFLINE","launchVideoImage","getTargetPresence","gcPresence","chatUserPresence","loadData","showRunErrorNotification","haveAccess","canRunAction","allowMultipleMeetings","getJid","originalAction","_action","_args","openChatRoomWithVideo","showingVideoChanged","apps","useCollaborateChat","haveEmbeddedClientAccess","meetingUrl","queryParamsToObject","keyValue","_keyValue","buildAuthUrl","authConfig","cancelTimer","iframe","body","appendChild","contentWindow","removeChild","clearTimeout","INTERNAL_DL_MATCHER","embeddedUrl","isExternalDomain","personGuid","modelSet","_displayApiError","fallbackMessageKey","_displayError","messageKey","messageKeyOption","_displayNotification","conversation","conversationIsDestroyed","getInteractionTypeFromCP","interaction","isCall","isFax","isChat","isCallback","isSms","myselfAgent","findLast","participants","party","partyIsUser","partyIsAgent","purpose","callbacks","calls","chats","handleMissedTimedBoxTimer","Interaction","conversationModel","tmpInteractionModel","interactionHasMissedTimer","windowInFocus","hosted","applicationHasFocus","hasFocus","timeDiff","timeCreated","selectedWrapupCode","wrapupNotSaved","oldWrapupCode","skipAfterCallWork","isAfterCallWorkTimerExpired","isWrapupCodeSet","isNotesSet","activeCallWorkCompleted","activeCallWorkNeeded","canUseCommunicationACW","canAgentRequestACW","useCommunicationACW","isAfterCallWorkCompleted","communicationMedia","communicationObj","isCommunicationAfterCallWorkCompleted","isCommunicationAfterCallWorkRequested","isAfterCallWorkMandatory","wrapupPrompt","isAfterCallWorkForcedTimeout","prompt","isAfterCallWorkTimeout","isNonDiscretionaryCompletion","isWrapupPromptAgentRequested","hasMissedTimer","MACHINE_PARTICIPANTS","CUSTOMER_PARTICIPANTS","MEDIA_TYPES","isCustomerParticipant","participant","isMachineParticipant","isAgentParticipant","isCurrentUserOrMachineParticipant","hostParticipant","customerParticipants","agentParticipants","otherParticipants","otherConnectedParticipants","isDisconnected","isMonitored","monitoredParticipantId","isCoached","coachedParticipantId","isBarged","bargedParticipantId","allHumanConnectedParticipants","allConferenceParticipants","connectingQueue","participantForCustomer","consultParticipantId","trueCustomerParticipant","participantCaller","customer","_findLast","isCurrentUser","isExternalCustomer","isInternalCustomer","nextConnectedParticipant","customerParticipant","_acd","getTrueCustomerIfMultipleCustomersExist","activeParticipantIds","externalContactId","participantsForCurrentUser","participantUserId","getFirstStuckParticipant","currentUserParticipants","stuckParticipant","hasActivePrimary","_doesParticipantHaveActivePrimaryMedia","hasActiveSessionShare","_doesParticipantHaveActiveSessionShare","participantForCurrentUser","lastAlertingParticipant","media","lastNonDisconnectedParticipant","lastCurrentUserNeedingWrapup","wrapupRequired","wrapup","_last","participantsForACD","participantForQueue","dialerParticipant","transferringToParticipant","activeTransfer","destination","PROVIDER_MEDIATYPE","aggregateMedia","screenShares","cobrowsesessions","videos","mediaObj","allMedia","getMediaObject","mediaArray","mediaWithlatestConnectedTime","_maxBy","connectedTime","unix","mediaWithlatestDisconnectedTime","disconnectedTime","maxConnectedTime","maxDisconnectedTime","activeMedia","isAfter","sessionShareCode","isSessionCodeRequired","isSessionSharing","isRequestingEndSessionShare","sessionShareDisconnectTimer","sessionShareExplicitlyInitiated","sessionShareActiveOnLoad","isCobrowseV2Disconnected","isCobrowseV2","canScreenShareOnCall","canScreenShareOnChat","canCobrowseOnCall","canCobrowseOnChat","isRequestingScreenShareOrCoBrowse","isRequestingVideo","sessionShareState","customerShareState","hasSessionShareCode","sessionShareActive","isRequestingSessionShare","isSessionShareConnected","isSessionShareDisconnected","isCustomerInSessionShare","isCustomerDisconnectedFromSharedSession","isAgentDisconnectedFromSharedSession","isWaitingForAgentToConnect","isWaitingForCustomerToConnect","hasCustomerJoinedSessionShareRoom","hasAgentJoinedSessionShareRoom","sessionShareRoomJid","_jidHelpers","isRoomJid","mostRecentAgentSessionShare","mediaObject","mostRecentCustomerSessionShare","sessionShareType","canScreenShare","canCobrowse","mediaTypeIsScreenShare","mediaTypeIsCobrowse","mediaTypeIsVideo","isScreenShare","isCoBrowse","isVideoShare","hasScreenSharePermissionError","hasCobrowsePermissionError","hasVideoPermissionError","hasShareError","sessionShareConnectedTime","sessionShareDuration","_privacyStatement","_securityDisclaimer","transition","BatchDataRequestsMixin","batchDataRequests","refreshUser","getChatUser","getGroup","useChatBetaCleanUp","initRoomCaching","getChatRoom","objectId","getEntityObjectId","isPersonJid","passedInJidIsPerson","isSupervisorJid","closeActiveRoom","personRoom","ChatRoom","rooms","setupRoomContextV2","setupRoomContext","roomMuted","addChatTargetAsParticipant","isGroupJid","loadGroup","addParticipantToRoom","loadRoomSubject","getStreamingRoomInfo","subject","updateRoomSubject","addRoomToCache","addAllParticipantsToRoom","participantJids","cachedParticipants","cachedParticipant","cachedParticipantJid","removeParticipantFromRoom","_keepOnlyChanged","imageRegex","timeStampRegex","audioRegex","giphyRegex","imgurRegex","youtubeRegex","vimeoRegex","ghGistRegex","ghRepoRegex","twitterRegex","googleSlidesRegex","soundcloudRegex","getImageShortName","pattern","parseTimeStamp","timeStamp","mediaItems","giphies","audios","gists","repos","tweets","googleSlides","soundcloud","union","getLinks","gifv","webm","mp4","identifier","youtubeLinks","videoUrl","vimeoLinks","modelData","GithubItemModel","gist","githubRepos","repo","tweetId","tweetInfo","tweet","acdChatUser","isYou","compareJids","isAcdChatUser","chatUserId","acdChatUserId","isLastMessage","messageTime","displayDateRelativeToToday","messageDisplay","correction","isCorrection","ChatEvents","Evented","initialDataLoaded","historyDirty","handleHiddenRooms","hiddenRooms","useChatSyncFix","MessageNotificationsMixin","sendMentionNotification","shouldShowMentionNotification","roomName","getRawDisplaySubject","soundId","getNotificationVolume","notificationOutputDeviceId","getNotificationOutputDeviceId","sendNotification","shouldShowNotification","messageBody","showPopup","playSound","getNotificationTitle","widgetType","rawMessage","sendEngageNotification","clickHandler","severity","isBusyUser","isDuplicate","duplicate","targetRoomIsMuted","isSupervisorRoom","messageAlreadySeen","fromLoggedInUser","groupNotificationsEnabled","coveredByMessageNotification","chatUser","personName","sendTestNotification","messageDelayDefault","messageDelay","maxDelay","_splitOverSizedMessage","messageQueue","_convertSplitMessagesToWidgets","_uuid","stanza","sendSplitMessageQueue","_delayedMessageSender","unsentMessageQueue","_addFailedMessagesToRoom","splitWidget","_manuallyCreateStanzaForFailedMessage","ChatMessage","widget","sendError","checkForMentions","setMessageReadState","addMessage","childName","childPayload","findMessageById","messageId","messageCache","pendingMessage","pending","failedMessage","splitMessageData","splitMessageParent","splitMessageCache","sendMessageToRoom","chatService","oneToOneRoom","presenceSubscriptionCounter","chatField","chatStatus","hasChatStatus","hasMedia","mediaInfo","listener","hasMediaInActiveChatRoom","ClickOutsideMixin","_webrtcConversationAnalysis","acdNormalizedMessages","callsUri","communicationUri","createCommunicationUri","communicationsUri","participantId","mediaId","participantUri","communicationsByTypeUri","consultUri","disconnectMediaTypeUri","getConversationUri","mediaRequestUri","monitorUri","participantsUri","participantDetailsUri","participantWrapupUri","sessionShareCodeUri","expireSessionShareCodeUri","securityKey","participantWrapupCodesUri","participantCommunicationWrapupUri","communicationId","replaceUri","getQueryStr","scheduleCallbackUri","tagsUri","wrapUpUri","wrapUpCodesUri","messagesUri","sendChatMessageUri","conversationId","sendTypingUri","sendMessagingTypingUri","draftUri","draftAttachmentUri","smsUri","smsHistoryUri","smsMessageDetailUri","smsMessageBatchUri","sendSMSMessageUri","createMediaAttachmentUri","getMediaAttachmentUri","copyMediaAttachmentUri","requestACWUri","interactionId","agentCommunicationId","getSupportedContentUri","getDeploymentConfigUri","deploymentId","getSupportedContent","getIntegrationConfigUri","integrationId","getConversationSummaryFeedbackUri","summaryId","arrayParameterCollection","forIn","answerChat","defaultLogLevel","makeRequest","logRequest","correlation","logLevel","captureRequest","resolveRequest","isSuccessResponse","groupName","groupTypeDefault","groupVisibilityDefault","groupMembershipDefault","groupModal","nameLengthExceeded","creatingGroup","visibility","vis","rulesVisible","newPublicApiGroupData","canCreateGroup","isAdmin","adminGroup","groupTypeI18nLabel","newGroupTypeChoices","lookupType","groupVisibilityI18nLabel","newGroupVisibilityChoices","_deviceEnumeration","messageEvent","messageOptions","triggerMessageAction","messageHandlers","lastUploadedImage","editingPictures","viewingGallery","cancelEditProfilePicture","cancelUpload","cancelEditPictures","viewLightGallery","cancelViewLightGallery","setInitialFieldSections","excludedSections","getReadableSections","WebrtcActionUtils","getProvidersForUser","isPresence","presenceMap","definition","apiValue","presenceMapping","systemPresence","presenceService","outOfOffice","acdDivisionPresenceProfileToggle","primaryPresence","presenceList","currentPresenceSource","integrationPresence","currentPresence","existingPresence","pres","presSource","existingPresenceDate","modifiedDate","activitiesPresenceDate","isExistingPresenceLatest","isGCOffline","presenceDefinition","presenceModel","presences","canViewPresenceDefinition","outOfBandPresence","outOfBandPresences","findPresence","matchingPrimaryPresence","newPresence","Presence","endOfTime","primaryPresenceSource","integrationLabel","secondaryPresenceLabel","secondaryPresence","fallbackLocale","languageLabels","_i","_Object$entries","_Object$entries$_i","formattedLocale","primaryStatusMessage","cityExists","regionExists","countryExists","hasGeolocation","isAvailable","isOffline","isAway","isBusy","isOutOfOffice","isOnQueue","isOfflineOrBusy","activityPresence","activityPresenceClass","profilePictureFieldKey","agent","missingFieldsCache","EntityMixin","_currentSection","_missingFieldsCache","volatile","pictureKey","profilePictureSizes","_sortBy","_keys","_parseInt","uploadedImages","stateString","_self","_missingFields","recordPropertyChange","changedSinceSave","changedProperties","referencedField","referencedLookup","fieldArray","reference","isFieldValueEmpty","removeFieldValue","currentFieldValue","object","currentState","stateName","onSaveSuccess","onSaveError","_internalModal","internal","_internalModel","responseJSON","publicApiError","currentVersion","newVersion","currentField","fieldDef","getPermissableSections","getWriteableSections","getReadableFieldsForSection","getWriteableFieldsForSection","deleteField","del","EvaluationsMixin","evaluationsAjax","getEvaluations","agentEvaluations","evaluatorEvaluations","assigneeEvaluations","agentId","evaluationState","userType","isAssigneeFeatureEnabled","isDisputesFeatureEnabled","evaluatorUri","agentFinishedUri","agentInReviewUri","assigneeUri","evaluatorRequest","requestAgentFinished","requestAgentInReview","requestAssignee","_ref$entities","evaluation","changedDate","calibration","dateAssigneeChanged","assignedDate","linkContext","EvaluationModel","_ref2$entities","releaseDate","_ref3$entities","_ref4$entities","evaluationIdSet","resultData","totalResult","queryResult","readEvaluation","evaluationIsAdminContext","externalContacts","externalContactProfiles","consultAgentParticipant","consultParticipant","hasMultipleExternalContactMatches","isIncomingFromExternalContacts","isConnectedWithExternalContact","hasExternalContactProfiles","hasOneExternalContactProfile","_nameForInheritor","componentClassName","externalContactFullName","FaxesMixin","getFaxes","fax","FaxModel","readFax","changeFaxReadState","contentUri","sharingUri","contentLocationUri","markFaxesRead","faxes","markFaxesUnread","renameFax","deleteFaxes","deleteFax","downloadFax","allFieldData","showLabel","savingField","attachObserversForComplexFields","fieldTypeClass","notifyComplexPropertyChange","performNotification","didFlag","flagOperationInProcess","flaggedSelves","myParticipants","myGuid","myFlaggedParticipants","flaggedReason","allowFlagChange","minutesPassed","flagCallHistoryInteraction","customerBrowserDetails","customerDetails","isChrome","isEdgeChromium","hasChromeExtension","isStandAloneApplication","canScreenshare","cobrowseType","isCustomerConfiguredForCobrowse","isCustomerConfiguredForScreenShare","screenShareMisconfiguration","cobrowseMisconfiguration","canCobrowseChat","canCobrowseCall","isAgentAllowedToCobrowseCall","isAgentAllowedToCobrowseChat","isAgentAllowedToCobrowse","isAgentAllowedToScreenShareCall","isAgentAllowedToScreenShareChat","isAgentAllowedToScreenShare","sessionShareStartVideoTooltip","sessionShareStartTooltip","canScreenShareViaHawk","webMessagingCobrowseStartTooltip","disableShareButtonReason","isConfigured","disableVideoButton","disableShareButton","shouldShowSessionShareButton","enableAcdSessionShare","isInternalProvider","acdVoicemailTooltip","holdTooltipTitle","muteTooltipTitle","scriptToolTip","skipACWTooltipTitle","currentJobs","finishedJobs","_currentJobs","_finishedJobs","_logger","errorState","cachedTotal","loadPage","prevPage","decrementProperty","ensureCorrectProperties","currentPageDisplay","hasNextPage","hasPrevPage","haveContent","letterUpdate","letter","directory","isHeld","isMuted","isRecording","isActiveCallACD","isOutsideCall","myself","onCall","setActiveCall","cleanupActiveCall","headset","webrtcSdkService","attemptingToCall","shouldPromptForMerge","callToMergeInto","mergeData","deviceMuteEvent","mute","deviceHoldEvent","holdRequested","hold","deviceCallRejectedEvent","sendToVoicemail","enableHeadsets","changeHeadsetSource","headsetSource","callVoicemail","_handleValidationError","webrtcPhoneWithIssues","_validateCall","callingPerson","onbehalfOfQueue","noStation","_throttledHoldOtherConversations","_holdOtherActiveConversations","_makeCall","formatSipAddress","callFromQueueId","showErrorNotification","startSoftphoneSession","updateActiveConversationEntry","outgoingCall","callArgs","callPersonById","mergeCalls","conversations","callsToMerge","conferences","conversationIds","recordings","makeMergeRequest","toVoicemail","_throttledHandlePhoneStatusChange","_args3","handlePhoneStatusChange","endCall","clearMergeData","makeConferenceCall","parties","bulkAddParticipants","blindTransfer","isNumber","myselfId","participantEntity","isQueue","_handleCallTransferred","conversationsMadeByClient","placedConversation","consultTransfer","currentCallId","otherPartyId","initiateTransfer","addressee","changeSpeakerForConsult","speakTo","otherParty","endConsult","generateConversationsUrl","dialDtmfNumber","digits","_throttledAnswerWebrtc","_answerWebrtc","_throttledAnswer","_answer","_throttledAnswerSoftphoneConversation","acceptPendingSession","answerSoftphoneConversation","_findPendingSessionsByConversationId","validateActionSucceeded","checkForNonACD","_throttledMute","_mute","setMute","skipHoldAll","_held","held","otherConversations","otherConversation","_throttledHeld","_callee8","_context8","setHold","_throttledRecord","_callee9","_context9","_record","_this14","flagActiveInteraction","_this15","isFlagged","_makeFlagChange","_this16","endCallForAll","endCallById","_throttledEndCall","_callee10","_context10","_endCall","_throttledEndCallForAll","_callee11","_context11","_endCallForAll","_this17","_callee12","_context12","conversationWithError","removeConversationFromConversations","_endWebrtcCall","_this18","_callee13","_context13","conversationType","webrtcConversationTypes","SOFTPHONE","notAfter","_throttledEndWebrtcCall","_callee14","_context14","endConversation","_this19","generateConversationUrl","callbackConnected","generateCommunicationUrl","handleOtherParticipantStatusChange","_this20","callForwardingActive","callForwardingNumber","callForwardingExtension","fetchCallForwarding","getCallForwarding","_updateCallForwarding","hasPhoneNumber","_contactObservers","activeConversations","onMultipleCalls","activeAcdCalls","conv","callState","webrtcConversation","getConversation","callIsAlreadyConnnected","hasPendingSession","webrtcSessions","atLeastOneWebrtcConversation","isDefinedAndLengthGreaterThan","activeNonAcdCalls","connectedConversations","dialingOrContactingOrAlertingConversationsToProceed","thisClientMadeTheCall","waitingForSession","recentTransfers","thisBrowserIsTheOneToAnswerFrom","isDialing","isOutbound","disconnectedConversations","eligibleCallsToMerge","onConference","thisCallIsConference","_handleActiveConversationsUpdates","_throttledHandleActiveConversations","handleActiveConversationsUpdates","hasActiveCall","connectedNonAcdCalls","dialingOrIncomingConversation","newActiveCall","activeCallOngoing","dialingOutboundConversations","hasOutboundConversation","activeCallErrors","errorInfo","hasIncomingConversations","_setHasIncomingConversations","hasActiveNonAcdCalls","incomingConversations","incomingNonAcdConversations","isOnConnectedCall","mostRecentlyConnectedConferenceCalls","isConferenceCall","isConnectedCall","myTime","onlyConnectedConversations","recentDisconnectedAgentCalls","isAgentCall","recentDisconnectedNonAcdCalls","userCallSessionsWithErrors","_shouldRemoveNonAcdConversation","conversationMarker","conversationsToRemove","callErrorToRemove","conversationModelTemp","ConversationModel","_throttledRemoveDisconnectedConversations","_removeDisconnectedConversations","participantOnUpdatedConversation","conversationHasErrors","conversationMadeByClient","conversationAcceptedOnClient","conversationWasMadeOrAcceptedOnClient","participantsForUser","updatedParticipantCall","getParticipantCall","conversationWasTerminatedNotDisconnected","disconnectedCalls","timeOutToRemove","stationIsWebrtc","thereArePendingSessions","_debouncedRemoveConversationFromConversations","thereIsAConnectedConversation","updateConversationArray","conversationDetails","conversationExists","monitoredConversationsForErrors","nonAcdCalls","usersCallSessions","callSessions","participantIsUserAgent","participantIsCurrentUser","userParticipant","callsWithErrors","disconnectReasons","thereAreDisconnectReasons","re","disconnectErrors","disconnectTypeIsError","disconnectType","ERROR_WHITE_LIST","registerCPTopics","topics","_updateStationEvent","conversationData","currentCallState","participantOnExistingConversation","participantCall","participantOnCall","participantIsNotVoicemail","isActiveOnCall","newCallState","answerCall","_logConversationDetails","_updateModelForConsult","IGNORED_ERRORS","useNotificationProfileOutput","displayIncomingNotification","notificationOptions","fallbackToInBrowser","EVENTS","handleParticipantCallError","endMoment","isRecent","hasThrownError","showSipError","messageText","phrase","translateServerErrors","messageParams","messageWithParams","fetchStation","stationId","newCode","showFeedbackErrorNotification","showNoStationSelected","isAcdCall","needStation","updateStationEventTimeout","freeSeatPreference","noStationSelected","defaultStation","associatedStationNotDefault","defaultStationNamePromise","selectedStation","guidFromUri","disassociateStation","disconnectPersistentConnection","endAllSoftphoneSessions","chooseDefault","chooseStation","doLoginAssociationLogic","isFreeSeatOrg","_loginAssociationFreeSeat","_loginAssociation","doLogoutAssociationLogic","associatedStation","lastAssociatedStation","lastAssociatedUser","defaultStationUser","userStationSettings","eventBody","_debouncedUpdateStationEvent","_handleUpdateStation","metadata","newStation","newStationId","currentStationIsNewStation","stationUri","_testIsStationWebrtc","PurecloudModelMixin","hasRelateAccess","canShowCustomFields","contactRoute","queueSearchRequest","requestArray","queuePermission","relatePermission","queueSearchData","searchIntegrationKey","queueSearchQuery","userRequest","resultArray","userIds","performTagSearch","searchQueue","searchQueueOnly","searchOnEmpty","pendingSearchRequest","currentSearchRequest","TagSearchMixin","tagSearchQuery","tagSearchRequest","tagSearchResults","HelpMixin","_performHelpSearch","excerpt","performHelpSearch","TIMEOUT","PrepareResults","parsedResults","retrySearch","searchUser","searchRelate","userSearchFailed","queueSearchFailed","relateSearchFailed","userPending","queuePending","relatePending","queueResults","relateResults","debouncedSearch","performReload","searchQueues","searchUsers","userRequests","queueRequests","relateRequests","leading","trailing","presenceToRadixMapping","available","busy","away","idle","offline","on_queue","out_of_office","radixMapping","mapUserToSortable","userName","mapRoomToSortable","radix","SortChatUsersMixin","sortChatUsers","usersList","sortOneToOneRooms","_styleNamespacingExtras","getScrollParent","comp","enableViewport","enteredViewport","rect","windowHeight","windowWidth","bottom","exitedViewport","_teardown","_setup","_bindEvents","_updateBoundingClientRect","innerHeight","documentElement","innerWidth","clientWidth","scrollParent","scrollParentRef","windowRef","$scrollParent","resizeHandler","scrollHandler","getBoundingClientRect","_updateWindowSize","_scrollHandler","requestAnimationFrame","_resizeHandler","streaming","sessionService","_fixTooltips","videoTooltipTitleSr","numberOfParticipants","oneToOneChat","webrtcTarget","videoMediaProviders","haveNonPurecloudMediaProvider","videoTooltipKey","videoButtonEnabled","_annotation","eventType","_assign","customPayload","typeOf","PROTOCOL_FIELD_NAME","OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME","currMetadataFieldName","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","compareTo","anotherState","getPrototypeOf","APP_STATES","LOADING","BOOTSTRAPPING","RUNNING","STOPPING","STOPPED","LIFECYCLE_HOOKS","BOOTSTRAP","FOCUS","BLUR","STOP","APP_LIFECYCLE_CALLBACKS","BOOTSTRAPPED","APP_UPDATED","APP_DELETED","LICENSE_UNAVAILABLE","STATE_CONFIGS","_STATE_CONFIGS","lifecycleDetails","maxDurationMillis","stateOptInPropName","broadcastHookName","appCallbackEventName","LIFECYCLE_ORDERED_APP_STATES","currStateName","state1","state2","AppInstance","instanceId","currState","_currStateStartTimestamp","problem","lastUserAccessTimestamp","_stateTimeoutTimer","attentionCount","guidFor","reportStoppedInteraction","_inAppInteraction","_appendAppInteraction","_startAppInteraction","_advanceState","loaded","bootstrapped","_triggerLifecycleHookEvent","stopped","setProblem","requestedState","requestedStateConfig","nextState","_getNextState","_convertStateToLifecycleEvent","_logInactiveAppStopped","hook","_monitorTransitionalState","currStateConfig","currStateEntryTimestamp","maxDuration","timeInState","currStateIndex","_interactionStartTimestamp","_latestInteractionTimestamp","lifecycleEvent","startTimestamp","_logAppInteraction","interactionStart","interactionDetails","timeSinceInteractionStart","timeSincePrevInteraction","interactionEnd","interactionDuration","commonAttrs","pcAppTypeId","pcAppId","pcAppInstanceId","pcAppDisplayType","pcAppInternallyHosted","InternallyHostedApp","pcAppFeatureCategory","pcAppProblemName","getURLTemplateQueryParams","queryParam","appState","POOL_STATES","IDLE","APP_NOT_FOUND","ALLOCATING_SPACE","SHOWING_APP","ALLOCATION_FAILED","LOAD_FAILED","AppPool","poolName","getMaxActive","fetchAppsFn","loadRetryBaseMillis","loadRetryMaxBackoffMillis","reloadAppsIntervalMillis","reloadAppsRetryBaseMillis","stoppedInstanceRemovalInterval","renderedAppInstances","_loadAppsPromise","_showFailureRestoreAppId","_loadRetryAttempts","_loadRetryScheduled","_reloadFailureCount","skipLongRunningTasks","appAttentionCounts","counts","runningInstances","_searchInstances","maxState","currInstance","totalAttentionCount","_apps","_renderedInstances","_fetchFailureLog","abortedCount","endpointFailureCount","instances","findAllApps","_loadApps","showApp","_findApp","_this3$_searchInstanc","_this3$_searchInstanc2","existingInstance","_setState","_allocateNewInstance","hideApp","_this4$_searchInstanc","_this4$_searchInstanc2","runningInstance","stopApp","_this5$_searchInstanc","_this5$_searchInstanc2","_monitorAppLifecycles","reloadApps","_reloadApps","internalLoadRetry","__fetchApps","latestApps","mergedApps","newApp","_isEqual","APP_PROBLEMS","currNewApp","_findIndex","loadResult","restoreAppId","_logPoolEvent","forceReload","autoLoadRetry","loadRetryAttempt","autoAttempt","_scheduleAppReload","autoRetry","loadRetryScheduled","_retryInitialAppLoad","retryBase","retryAttempts","retryInterval","maxRetryDuration","_loadRetryTask","timeoutVal","abortedAttempts","endpointAttempts","_decorateLogStatement","reloadInterval","reloadWait","reloadFailureCount","_reloadTimerTask","finish","typeOfApps","isAjaxError","isAbortError","pendingInstance","_allocateSpace","renderedInstances","existingInstances","sortedInstances","instanceToEvict","evictedAppId","_ref$instanceId","_ref$appId","_ref$states","_ref$maxState","instanceState","currInstanceState","specificInstance","_removeStopped","_monitorAppLifecyclesTask","stoppedInstances","logText","poolEvent","poolEventDetails","poolState","maxPoolSize","renderedApps","primitivePoolStateDetails","_omitBy","poolStateDetails","_reduce","_merge","Copyable","LIFECYCLE_DEFAULTS","ephemeral","hooks","bootstrap","STANDALONE","WIDGET","INTERAPPTION","DIRECTORY","CONTACT_CENTER_INSIGHTS","LANG_TAG_URL_REPLACEMENT_TOKEN","PC_ENV_URL_REPLACEMENT_TOKEN","PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_LANG_TAG_URL_REPLACEMENT_TOKEN","GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN","GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN","GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_HOST_ORIGIN_REPLACEMENT_TOKEN","GC_TARGET_ENV_REPLACEMENT_TOKEN","TOKEN_REPLACEMENTS","_TOKEN_REPLACEMENTS","queryParamName","replacementProp","replacementValue","interactionType","URL_REPLACEMENTS","replacementToken","_ref2$","regExp","INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS","INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS","INTERAPPTION_COMMUNICATION_TYPE_FILTERS","typeId","urlTemplate","langTag","envTld","usePopupAuth","displayType","featureCategory","permissionsPolicy","enabledQueueIds","enabledCommunicationTypes","gcHostOrigin","gcTargetEnv","currReplacement","rawValue","appUtils","buildLogMsg","deep","ownerMixin","sandbox","cloneDeep","assets","lifecycle","_callCommunication","Model","isExternalVoicemail","_callbackCommunication","hasSipErrors","codes","sipResponseCodes","conversationParticipants","conversationParties","missedCall","wasConference","wasCallback","wasOutboundCampaign","wentToVoicemail","callStart","sentToVoicemail","reachedVoicemail","callEnd","isMultiParty","allParticipants","myParticipant","nonVoicemail","me","internalParticipants","monitoredCallId","externalParticipants","ani","stationParticipants","voicemailParticipant","ivrParticipants","queueParticipants","otherParties","partyFromConversation","callParties","dnis","initiator","outboundParticipant","external","inboundExternal","disconnectReason","disconnectTypeKey","isIvrTransfer","isOutboundCampaign","isBlindTransfer","isConsultTransfer","isPersonalVoicemail","isQueueCall","invalidNumber","groupRingParticipant","isGroupRing","groupRingId","isOutboundGroupRing","groupRingGroup","backgroundReload","groupRingCaller","loadConversation","personParticipants","_chatCommunication","ChatMessageMedia","ChatMessageMixin","corrects","hasMentionLinks","unread","startOfBlock","endOfBlock","isYourLastMessage","splitMessageIndex","determineMessageEditability","isSplitMessage","isEditable","editableEndTime","meAction","startEditing","stopEditing","originalWidgetType","isEditableTimeout","animateChatIcon","rawSubject","pendingRoom","firstMessageTime","lastMessageTime","lastMessageTimeRadix","roomClosedTimeRadix","mentions","unseen","messageActivity","userActivity","loadingHistory","moreHistoryAvailable","moreForwardHistoryAvailable","activated","acdCustomerParticipant","inputCache","isInRoster","participantsVisible","invited","joinCallImmediately","joinScreenshareImmediately","deferredParticipants","roomOwners","setupProperties","authenticatedUserIsRoomOwner","resizeNewPopout","popout","resizeTo","moveTo","videoConversation","videoRoomFull","haveId","haveName","isApiFieldConfigName","mapCanRemoveParticipant","participantList","isMember","isRoomOwner","sortedParticipants","skipGroupDataCheckEnabled","isAdhocRoom","isAcdRoom","isAcdJid","isSoftphoneRoom","isSoftphoneJid","isOneToOne","allowUserRemoval","processRoomDetails","haveGroupData","clearMessageCache","pruneMessages","removeCachedItemsCount","takeRight","reconcileMessages","addHistoryMessages","processHistoryModels","filterSeenMessages","addSelfReference","insertHistory","sortChatMessages","processCorrections","processSplitMessageHistory","markConversationBlockBoundaries","updateFirstUnread","updateMessageTimes","bumpActivityCount","historyMessages","unshiftObjects","splitMessage","processSplitMessage","correctedMessage","m","shouldGroupMessages","splitMessageParentExists","SplitMessage","splitMessageId","addSplitMessage","msgId","isSupervisor","isAcd","lastMessage","yourLast","isBefore","oldMessage","newMessage","updateMessageTimeRadix","updateClosedTimeRadix","addParticipant","removeParticipant","clearUnreadMessages","isUserInRoom","userjid","clearPending","existingMessage","setSendError","addDeferredParticipant","loadDeferredParticipants","audioMuted","videoMuted","sharingScreen","major","domId","hasConnected","inLastN","screenStream","isV1","startedVideoMuted","associatedInteraction","zeroBitrateCount","positiveBitrateCount","noVideoTrack","speaking","mediaPresence","_getInteractionAvatarDisplay","showAvatar","noVideo","avatarDisplay","hasOfflinePresence","connectionStatus","canBeMuted","markedAsRead","actionType","dateStart","lengthInMinutes","appointment","isOverdue","maybeLowerCase","ExternalContactsMixin","maxParticipants","acwNotes","conversationIsAConsult","conversationInitiator","lastPartyTalkingTo","webrtcSession","hasDisplayedDesktopNotification","acceptedByClient","dialingTime","otherPartyJid","setOtherPartyJid","isOtherPartyPerson","connectedDuration","iAmInitiatorOfConsult","otherPartyThatIsNotTheInitiator","partyId","initiatorId","otherParticipantsThatAreNotTheInitiator","aniName","otherPartyThatIsNotTheInitiatorModel","_conversation","userGuidFromParticipant","setLastPartyTalkingTo","connectedParties","lastPartyTalkingToModel","consultOtherParty","initiatorModel","initiatorCall","initiatorConnected","otherPartyThatIsNotTheInitiatorCall","otherPartyThatIsNotTheInitiatorConnected","consultOtherPartyModel","participantModels","communication","isTerminated","isNotSelf","otherPartyModel","personFromStore","otherPartyNumber","doLookup","notTerminatedOrDisconnected","isMonitor","isCoach","isBarge","disconnectedParties","sortedDisconnectedParties","lastDisconnectedPartyModel","selfIsDisconnectedOrTerminated","myState","useDisconnectedParties","allParties","connectedOnConsult","confined","firstCall","sortedParties","callStateA","callStateB","arePartiesDisconnected","recomputeParties","otherDisconnectedParty","isConsult","isOngoing","isStation","isIvr","otherPartiesNoEndTime","otherDisconnectedPartyModel","isDisconnectedQueueCall","setConsultInitiator","nonInitiatorNumber","myConsultId","consultParty","nonInitiator","hasActiveAgent","isMe","isAgent","needsWrapup","isUser","isAlerting","myselfIsMonitor","myselfIsCoach","myselfIsBarged","bargedParticipant","myselfIsMCB","monitoredParticipant","coachedParticipant","monitoredParticipantPerson","coachedParticipantPerson","bargedParticipantPerson","isSelfMCB","peerDisconnectedCall","myselfDisconnectedCall","errorInfoMessage","isIncoming","isRinging","isDialingOrContacting","isContacting","justMyselfOnCall","iAmContacting","theOtherPartyWhileContacting","isMissed","segments","howEnded","lowType","endedWithDisconnect","isConfined","voicemailParties","isConnected","onConsult","others","consultParties","found","markCallAsConsult","consult","canUpdateConsult","consultInitiator","mostRecentEndTime","groupParticipant","currentTimestamp","_groupRingCaller","actualCaller","caller","connectedToStationAndNotConference","anotherPartyIsStation","isStandaloneStation","anotherPartyIsVoicemail","connectedMedia","conversationHasActiveSessionShare","hasActiveMedia","_emailCommunication","TranslationModel","addTranslation","getValue","agentHasRead","evaluationForm","evaluator","redacted","rescore","conversationDate","assignee","declinedReview","displayThumbnail","organization","channelIdProperty","isNewChannel","changesIgnoredByAgent","agentRespondedToPrompt","screenName","channelId","PreferredPhoneContactOrder","PreferredEmailContactOrder","schemaService","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","divisionName","isCanonical","externalOrganization","belongsTo","externalSystemUrl","createdDate","lastUpdated","hasEmailAddresses","address1","address2","postalCode","twitter","isSalesForce","phoneName","featureKey","featureKeyExt","featureKeyAcceptsSMS","initials","bestEmailAddress","preferredEmailType","_bestEmailType","bestEmailType","bestPhoneNumber","_bestPhoneType","bestPhoneNumberDisplay","bestPhoneType","bestPhoneTypeKey","hasEmailAddress","externalDataSourcesAlert","externalDataSource","platform","salesforceLink","expandedSchema","getSchema","schemaTitle","schemaData","getSetter","websites","isOrganization","companyType","industry","primaryContactId","faxNumber","employeeCount","revenue","tickers","hasMany","website1","website2","Channel","dateCreated","dateModified","workspace","createdBy","contentLength","filename","thumbnails","callerAddress","receiverAddress","isDefaultName","faxName","faxFrom","faxFile","longitude","latitude","ISSUE_REGEX","showEmbedConfirmation","getPreference","showEmbed","isRepo","isGist","isIssue","issueNumber","issue","embedString","shouldEmbed","onSettingsChange","setEmbedPreference","pref","embed","setPreference","disableEmailPii","includeEmailTranscriptions","languagePreference","BASE_GROUP","COMPARATORS","EqualTo","NotEqualTo","GreaterThan","GreaterThanOrEqualTo","LessThan","LessThanOrEqualTo","PROFICIENCIES","acdSkills","lastSavedExpression","isDynamicGroup","_expression","groupTypeValue","actualType","profilePictureURL","activeProfilePicture","x128","placeholderImageForSize","uploadedProfilePictures","uploadedInformalPhotos","areOwnersIncluded","groupEmailAddress","membershipSearchQuery","compiledQuery","generalSearchQuery","isDeleted","chatJid","shortName","allowPermissionGroup","uniqueRoleCount","grantVersion","rolesMap","emailNotificationEnabled","voicemailEnabled","membershipChange","guidOwner","setIdForGroupEntity","existingId","idParts","individual","guidIndividual","ownerIds","profileImageSection","profileImage","deleteGrant","conOp","newCondition","newSkill","languageSkill","routingSkill","subdomain","getPcApplicationsSubdomain","currentDomainName","LibraryModel","responses","BASE_LOCATION","LocationModel","imageHistory","contactPersonId","sublocationOrder","floorplanImage","floorplanImageHistory","profileImages","imagex48","imagex96","imagex128","imagex200","x48","x96","floorCount","subs","isFloor","deleted","hasContactPerson","contactPerson","floorplan","_parent","containsRichAddress","setFloor","roomId","organizer","attendees","notifyAttendees","recurringType","meetingAttendees","_messageCommunication","hasUnifiedCommunications","comms","hasChatEnabled","hasHipaaEnabled","hipaa","_orgDetails","orgDefaultCountryCode","sessionUserOrgCountryCodeValue","orgDetails","defaultCountryCode","orgPreferences","parsedPreferences","_participant","permissionRoutes","updates","sectionValue","clearProperties","changedKeys","originalKeys","fieldKeys","pathKey","contactCenterCount","enterpriseCount","Internal","InternalModel","setupData","hasRecord","_changedKeys","_data","isReloading","pushedData","_notifyProperties","didInitializeData","ChatUserMixin","EntityPresenceMixin","_readWritePermissions","_directReports","_siblings","_superiors","roleIds","expands","_activities","activities","_activityCall","_activityCallback","_activityChat","_activityWebChat","_activityEmail","showConversationSummaryIndicator","onProfilePage","totalCallbacks","totalWebChats","activityValues","email_main","integrationPhone","otherPhones","agentName","socialGroups","getGroupsByType","officialGroups","distributionGroups","ownedGroups","managerId","managerSiblings","groupedOtherRelationships","persons","personEntry","adminAssistants","cachedData","cachedIds","sameIds","_loadingSuperiors","directReportCount","cachedReports","attemptedToLoad","dataDiscrepancy","noDirectReports","doNotLoad","cachedIsSame","isEqual","countHierarchyReports","isContentUser","isContentAdmin","isNotBusy","isCommunicateUser","updatePermissionsOnRouteChange","personDetailController","setPicture","setAgentPicture","imageSection","membershipIds","memberships","getFieldPathForFieldValue","actual","fieldType","filteredEntries","uniq","filteredPaths","_presence","primaryContactInfo","addresses","authorization","fieldConfigs","token","isTrustee","isCloned","userState","inviteLastSent","QueueModel","outboundMessagingAddresses","outboundEmailAddress","directRouting","cannedResponseLibraries","recordingRetryCountMap","callerName","durationMilliseconds","userRecordingDownload","mediaUri","fetchAudio","callRecordingUri","resultUri","resolver","pollingTimeout","apiName","userRecRetryCountKey","userRecRetryCurrent","recordingUri","_type","ResponseModel","texts","substitutions","responseType","messagingTemplate","isOpen","libraryName","isWhatsAppResponse","permissionPolicies","_screenshareCommunication","_socialCommunication","messageArray","mentionRegex","mention","failedMessages","StationModel","webrtcMediaDscp","webrtcForceTurn","persistentConnection","webRtcUserId","webRtcCallAppearances","webRtcRequireMediaHelper","isWebrtc","isRemoteStation","toCheck","isGeneralUnrecoverableAppFailure","isSessionBootstrapFailure","GeneralUnrecoverableAppFailureTypes","SessionBootstrapSteps","_types","hasKey","UserModel","welcomeSent","lastLogin","clientVersions","passwordSaved","_videoCommunication","_loadEPCConversation","VoicemailMessageModel","audioRecordingDurationSeconds","audioRecordingSizeBytes","callerUser","parentIds","note","copiedTo","copiedFrom","useVoicemailApp","loadParticipants","dateFromNow","fromNow","isGroupVoicemail","groupEntity","loadEPCConversation","_userId","fetchCallerName","mutableGroupId","shiftTrade","alternativeShift","timeOffRequest","agentNotification","otherNotificationIdsInGroup","adherenceExplanation","Router","locationType","titleDivider","isAborted","resetNamespace","intent","replaceWith","didTransition","gotoRoute","UnprotectedRouteMixin","ApplicationRouteMixin","onSessionInvalidationFailure","willTransition","postMessageRouteChange","transitionToEntityDetail","linkTo","targetName","performRecentSearch","recent","togglePanel","openPanel","closePanel","toggleCommunicationSidebarExpanded","ensureRouteVisibility","openChatRoom","startChatByJid","_arguments","launchVideoWithPersonById","startCallPersonById","startCallByNumber","originRoute","sessionAuthenticated","stateRestore","popRestoreState","sessionInvalidated","recordLogoutTime","CardDetailRoute","getUserId","person_id","isGuid","afterModel","sendPageData","helpPath","GroupDetailRoute","ModelRouteMixin","updateParentRoute","controller","group_id","currentModel","include","setupController","sidebar","IndexRoute","OAuth2LoginRoute","controllerName","authenticator","_authenticate","loadTranslations","resolvedModel","serializeRestoreState","rejectionDetails","authFailureReason","sensitive","LoginRoute","MaintenanceRoute","_unrecoverableAppFailure","_analytics","buildCommonTelemetryContext","intlService","reloadApp","_reloadApplication","EngageSupervisor","initialIntent","routing","generateURL","appsProblem","unknownApp","currAppName","appPool","app_id","buildStandaloneAppLogMsg","initPoolState","rejectionPoolState","routeAppId","targetRoute","refreshModel","redirectUrl","hashRoute","buildTag","currModel","DEFAULT_PARAMS","performSimpleKeywordSearch","suggest","queries","SEARCH_QUERY_OPERATORS","SEARCH_QUERY_TYPES","addQueries","addTagQuery","addAggregation","SEARCH_AGGREGATE_TYPES","aggregation","setTypes","setReturnFields","Service","resourceTypes","suggestEndpoint","_searchUrl","_suggestUrl","_docUrl","searchDocumentation","normObj","_this$requestBuilder$","defaultAggregations","entityRequest","facetsRequest","aggregateResults","processFacets","performSuggestSearch","orderKeys","RequestBuilder","_extractData","included","toRemove","OUR_COOL_REQUEST_TYPES","ApplicationSerializer","RESTSerializer","isNewSerializerAPI","primaryKey","isPrimaryType","primaryTypeClass","primaryModelClass","finalData","PurecloudSerializer","serialized","attrsToSerialize","changed","changedAttributes","JSONSerializer","convo","EMPTY_MODEL_OBJECTS","EmbeddedRecordsMixin","_normalizeContact","_getPojo","jsonProfile","normalizeDeleteRecordResponse","normalizedPayload","_fillEmptyPropertiesWithModelObjects","normalizeQueryResponse","filledEntities","contacts","externalcontacts/contacts","pageOffset","emptyModel","emptyOrgModel","EMPTY_ORGANIZATION_MODEL","getOwnPropertyNames","_fillPropertyIfNecessary","_step2","_iterator2","defaultData","payloadValue","Set","externalcontacts/external-organizations","_messageChannels","modelKeyFor","normalizeFindRecordResponse","jsonapiPayload","extractId","resourceHash","applyJabberIdFromChat","getJabberId","generateGroupLinkIds","orgGuid","search_key","groupLinks","uuid","generate","cleanFields","extractSectionData","_application","filterMissingFields","requireMediaHelper","extractMeta","payloadKeyFromModelName","serializeAttribute","wordCharsRegex","nonDigitRegex","removeLeadingPlusRegex","itemToFormat","formatFieldConfigEntry","subMsgType","getExtension","formatNumber","numberFormat","E164","addressParts","lookupAddressFormatResultId","fallback","displayText","existingRecord","resolveAddressFormatResult","isEntity","_addressFormat","formatSipAddressForDisplay","strict","formatRawNumber","RateLimitPromise","ObjectProxy","PromiseProxyMixin","isRateLimited","rateLimitResetTime","Symbol","shouldRetryRequest","retryStringToNumber","retryResetTime","headerRateLimit","AjaxService","_timers","enableRetryHeaderParsing","enableAPIDomainRewrites","trustedHosts","purecloudV2Host","_scheduleRequest","retryTime","scheduleTime","reqUrl","addApiDomainIfMissing","isRootAPIRequest","apiDomain","hostname","canParseHeaders","retryDisabled","promiseProxy","shouldRetry","_logPossibleRetryEvent","errorResponse","getAllResponseHeaders","generateDetailedMessage","urlObject","headerCorrelationId","foundKey","getHeader","payloadCorrelationId","commonCtxt","applicationVersion","uiLanguage","envName","isPopout","webDirAgent","platformJsBrowserName","PlatformJS","platformJsBrowserVersion","platformJsProduct","product","platformJsManufacturer","manufacturer","platformJsLayout","platformJsOperatingSystem","os","platformJsDescription","desktopOS","desktopVersion","BRIDGE_CONFIGURATION","deprecation","COOKIES","dragging","browserHidden","iframeFocused","urlprefix","orgspanBaseUri","purecloudBaseUri","realtimeScriptUri","hostedContext","isMobile","mobileQueryParameter","belowMobileThreshold","showLoader","trialSupportDisplayed","debugSettings","offerMobilePreference","offerMobilePreferenceRetreived","currentYear","orgShortName","checkForDebugMode","gatherEnvDetails","initIframeFocusListener","setVisibilityListener","sendEventToDesktop","hasRecentlyLostSubscriptions","_registerTopics","currentRouteClass","deprecatingAlias","systemLocale","setLocale","hidden","visibilityChange","mozHidden","msHidden","webkitHidden","pigeonUserSubscribed","loadStreamingService","authenticated","features","scriptUri","streamingService","getFeatureToggles","runAsMediaHelper","testMediaHelperMode","setupConnection","webrtcRelayOnly","signalIceConnected","disableEOCShortCircuit","referenceStanza","originAppName","APP_NAME","originAppVersion","originAppId","splitHawkAndRealtime","useServerSidePings","customHeaders","Genesys-App","streamingServiceConnect","adminUIContext","systemTopicType","notified","connect","csEnabled","csRunLater","checkContentSquare","csLoaderScript","crossOrigin","syncStreamingConnectionToAuthState","syncVideoChatStateToAdminContext","clearActiveRoomMessagesOnAppFocus","_delayedRefocusChatRoom","delay","refocusActiveRoom","displayTrialSupport","dismissTrialSupport","uvOptions","feedback_tab_name","primary_color","link_color","default_mode","forum_id","searchParams","publishMessage","postMessage","localGCBAUri","changePreferredLanguage","sendDiagnostics","_sendDiagnostics","sendFeedback","checkForMobile","isMobilePhone","showTinyNavMenu","showContextualHelp","isScreenRecordingPopout","isPef","isInteractionPopout","isAdminRoute","cast","setBridgeConfiguration","getQueryParams","debugCookie","buildDebugSettings","orgNameCookie","readOnlyCookie","masonryCookie","DirectoryNavHandler","routerService","canHandle","appApiCall","handle","_handleShowProfile","_handleShowGroup","_appApiCall$get","_appApiCall$get2","TOAST_MSG_PROPS","internalPropName","required","markdownMessage","showCloseButton","showNotificationEverywhere","TOAST_MSG_PROP_NAMES","REQUIRED_TOAST_MSG_PROP_NAMES","apiActionDetails","_this$_processToastPa","_processToastPayload","invalidProps","ignoredProps","validatedToastData","ignored","props","fullTag","requiredCount","filteredPickData","_pick","filteredData","_pickBy","_checkPropValid","_omit","_mapDataToInternalProperties","_mapKeys","isFinite","PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES","SHOW_PROFILE_APP_API_ACTION_NAME","SHOW_TOAST_APP_API_ACTION_NAME","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","currCategory","standaloneAppPool","standaloneAppPoolVisible","widgetAppPool","externalUrlExemptIntegrationTypeIds","standaloneMaxActivePoolSize","widgetMaxActivePoolSize","_bypassAppCache","globalApiHandlers","REMOTE_APPS_CACHE_TTL_MILLIS","localMsgListener","appsSupported","handleAppApiCall","apiCall","contextualApiHandlers","_handleApiCall","isTrustedApp","appInstance","buildValidInterapption","trustedProvider","buildInterapptionsLogMsg","normalizedConfig","properties","APP_DISPLAY_TYPES","propError","configKeys","currKey","currValue","currPropConfig","_buildApp","_isValidApp","_handleLocalMsg","_isLocalMsg","_appApiCall","parseMessage","parseError","buildApiLogMsg","msgSource","asyncHandlerPromise","availHandler","currHandler","_instrumentApiCall","msgFailureDetails","ApiCall","pcAppProtocol","APPS_API_PROTOCOL","pcAppProtocolAgentName","pcAppProtocolAgentVersion","_addPageAction","apiAction","currPool","_findAllStandaloneApps","_fetchAppsByType","_findAllWidgetApps","findAllInterapptions","_fetchAppsByTypeRemote","_remoteAppPromise","_remoteAppRequestTimestamp","allAppsPromise","lastRequestTs","_accumulateApps","app1","app2","localeCompare","currApp","appsUrl","primaryLocale","_getPrimaryLocale","validAppObjs","currIntegration","internallyHosted","_isInternallyHostedApp","integrationType","effective","intlLocale","intlIsoLocale","appProps","_parseLangTagProp","_parseMultiValueProp","_parseProp","APP_FEATURE_CATEGORIES","ucIntegrationKey","pbxPermission","getCurrentWindowOrigin","isNone","NO_SUPPORTED_COMMUNICATION_TYPE_FILTER","currAssetCategory","currAssetCategoryCfg","currVector","vector","currRasters","_extractRasterImgs","raster","assetCategory","basePath","imgs","currImgKey","parseResult","appType","_validateApp","logMessage","logMessageAppType","fullLogMsg","appUrl","internalAppPath","internalAppSubdomain","subdomainType","internalAppQuery","externalUrl","invalidUrl","integrationTypeId","validItems","propVal","_parseBooleanProp","separator","validatedItems","_langTagRegExps","baseProp","langTagRelProp","baseObj","lenientLangTag","langTagRegExp","langKey","_assetLoader","isJid","peopleQueue","groupQueue","checkCacheForEntity","queueEntity","cachedModel","possibleCache","possibleJid","isDirectoryId","scheduleQueues","_scheduleQueues","_handleQueues","clearQueue","processQueue","FL","resolveResults","missingIds","keyId","respondingTimeout","preferencePaths","mixins","BatchDataRequests","CacheChatRoomsMixin","MessageSplitting","supportedChatWidgets","_Ember$Service","applicationController","widgets","firstRoomChosen","responding","popoutRoom","activeEmpty","messagesPerHistoryRequest","maxHistoryRequestSize","dashboardRooms","mutedRooms","roomHistoryStack","replyMessage","collabChatShowChatSplat","canCorrectMessages","initializePreferences","mutedRoomsValue","preference","roomHistoryStackValue","_chatNotificationVolume","chatNotificationVolume","_interactionNotificationVolume","interactionNotificationVolume","_initNotificationVolumes","_setupRateLimitListener","_startWatchVideoParticipantCount","setMessageReply","_handleRateLimit","requestingJids","_notifyRosterRateLimit","saveMutedRooms","saveRoomHistoryStack","addResponder","respondingTimeoutId","removeResponder","sendChatState","toggleRoomMuted","getRecents","clearRoomUnreadMessages","addRoomToDashboard","messageFailedToSend","_d","sendMessageProxy","setActive","timeoutIdentifier","sendCallback","sendMessage","sendVideoProviderNotification","removeAttachment","fileDescriptor","joinScreenShareRoomViaHawk","rejoiningRoom","_timeoutPromise","checkJid","joinRoom","joinRoomEvent","syncPendingRoomWithStreamingService","changeActiveRoom","joinAcdRoom","leaveAcdRoom","leaveRoom","newRoom","addEmptyRoomObserver","len","roomIsDirty","addPersonToRoom","requestHistory","historyOptions","getMessages","markAsHistory","loadUsersForHistory","setRoomSubject","setPresence","setOrganizationPresenceId","presenceId","setStatus","openRoom","oldOpenRoom","openChatRoomWithVideoForPersonById","openChatRoomForPersonById","loadChatRoom","syncUserChatData","roster","syncAllRoomsLastMessageTime","getAllBadgeCounts","loadRoomHistory","getActiveChatsFromRealtime","_this21","getActiveChats","activeRooms","_this22","activeChatsFromRealtime","checkActiveRoomAgainstHistory","historyStack","lastActiveRoom","mostRecent","selectHighestAppearingActiveRoom","_this23","_args6","clearRoomNotificationCounts","newActive","previousActiveRoom","_this24","attemptRoomChange","removeRoomFromHistoryStack","addRoomToHistoryStack","setRoomDetails","closeRoomAndClearCounts","_this25","_this26","deactivateRoom","setRoomInactive","replacementRoomJid","selectRoomPromise","_this27","getNextRoomFromActiveSection","selectedRoom","updateVolumes","deviceVolumes","_this28","activeRoomJid","newRoomJid","activateRoom","trackRoomChange","focusRoom","setFocused","loadRecentHistoryForAllActiveRooms","loadRecentRoomHistory","loadRoomHistoryWithOptions","loadMoreRoomHistory","loadMoreRoomHistoryAfter","loadContextualRoomHistory","afterDate","_this29","beforePromise","requestRoomHistory","afterPromise","combinedMessages","_addHistoryMessages","_this30","_updateRoomStatus","_this31","_processHistoryResults","_this32","_resolveRealtimeDependentCalls","_this33","deleteParticipantFromChatRoom","_this34","_this35","getRoomInfo","getTargetRoomJid","arg","loadRoomAndUser","userJid","processNewChatMessage","_this36","parseMessageBody","messageModel","parseWidgetData","_this37","child","isActiveRoom","isActiveRoomJid","isRoomVisible","isChatVisible","popoutChatRoom","handleXMPPReferenceMention","_this38","personJid","referenceChildren","handleMentionEvent","_this39","handleCollaborateChatMessage","_this40","isMention","incrementUnreadGroupMessage","_clock","INTERACTION_TYPE","UriBuilder","ConversationMixin","validationWaitTime","getAllActiveConversations","getAllActive","communicationType","addCall","phoneColumn","callNumber","scheduleCallback","callbackUserName","routingData","postData","participantStatus","CONNECTED","disconnectParticipant","DISCONNECTED","unhold","recordingState","unpause","requestAcw","afterCallWorkRequired","skipAcw","disconnect","isDialerCampaign","isSkippingPreviewCampaign","hasPlacedCallsInCallback","communicationWrapupSkipped","park","PARKED","disconnectCall","getWrapUpCodes","getProvisionalACWNotes","provisional","loadParticipantPerson","getParticipantNotes","getAllHistoricalACWNotes","currentParticipantId","_x2","saveProvisionalACW","monitor","transfer","transferType","TERMINATED","cancelTransfer","attributeToMonitor","expectedValue","requestUri","VALIDATION_INTERVAL","VALIDATION_TIMEOUT","interactions","newInteraction","actionHasSucceeded","actualValue","valResolve","destroyObserver","checkForSuccessUpdate","formattedExpectedValues","lowercaseValues","formatExpectedValue","actionSucceeded","createObserver","initiateConsult","customerId","consultBoth","consultConference","consultDestination","consultObject","cancelConsult","initiateSessionShare","sessionCodeUrl","sourceCommunicationId","addCommunicationCode","toId","fromId","mediaRequestOptions","toCommunicationId","fromCommunicationId","expireSessionShareCode","disconnectMediaType","createEmail","toAddress","initializeDraft","emailId","discardDraft","autoFill","discard","loadSMSHistory","messageIds","sendSMSMessage","normalizedMessage","mime","stickerIds","mediaIds","textBody","stickers","createMediaAttachment","createMessage","useExistingConversation","requestOptions","toAddressMessengerType","useUserFromAddress","getMediaAttachment","getSMSDetails","smsIds","getMessageSupportedContent","integrationUri","getDeploymentConfig","deploymentConfigUri","getMessagingSettings","integrationIdConfigUri","createConversationSummaryFeedback","CookiesService","arrayComparerByDeviceId","otherArray","itemInOtherArray","diffListsByDeviceId","existingList","newList","itemsRemoved","itemsAdded","removed","sanitizeDeviceLabel","deviceLabel","sanitizedLabel","webrtcSettings","selectedProfileId","vanillaProfiles","profiles","microphone","outputDevice","notificationDevice","incomingInvitations","deviceUpdateDelay","deviceChanges","recentlyConnectedDevices","allowDisableProfileNotifications","profileSettingsPromise","allowDefaultProfiles","initProfiles","_fetchProfiles","currentMediaState","_handleMediaStateChange","_updateVolumes","selectedProfile","defaultProfileId","defaultExists","directorySettings","mediaState","camerasDiff","microphonesDiff","outputDevicesDiff","isInitialUpdate","hasMicPermissions","videoDevices","audioDevices","outputDevices","cameras","microphones","_updateProfileAvailability","_maybeFixSelectedProfile","_updateRecentlyConnectedDevices","_conditionallyShowToastForAddedDevices","canBeSelected","matchingCamera","matchingOutputDevice","matchingMicrophone","matchingNotificationDevice","_findMatchingDevice","profileCameraIsNotDefault","validWithoutCamera","setProfile","mic","currentProfile","hasOutputDeviceSupport","profileCamera","profileMic","profileOutputDevice","profileNotificationDevice","cameraValid","outputValid","notificationsValid","profileValid","cameraMatches","micMatches","outputDeviceMatches","notificationDeviceMatches","newDevices","_showNotificationForCurrentProfileNoLongerValid","setDevices","outputDeviceVolumes","notificationDeviceVolumes","_getVolumesForDevice","setCallVolume","defaults","volumes","ringerVolume","volumeSettings","_getActionHandler","profileToSet","createProfile","_openPhoneSettingsTab","deviceList","foundDevice","deviceA","_deviceMatches","deviceB","hasSameId","formattedNameA","formattedNameB","hasSameName","addedDevices","filteredSelectableProfiles","disableProfileNotifications","cur","yes","openPreference","no","hasNonDefaultDevices","selectableProfiles","deviceConfig","skipProfileSave","updateSetting","deleteProfile","profileObj","settingsService","saveAndSelectProfile","_callee15","savedProfile","_context15","updateSettings","clearRecentlyConnectedDevices","embeddedStatus","urlSearchParams","isLocallyIntegrated","integrationContext","EmbeddedEvents","ENVIRONMENTAL_DATA","NOTIFICATION","DISMISS_NOTIFICATION","SHOW_NOTIFICATION","PAGE_DATA","LAUNCH_VIDEO_WITH_PERSON_BY_ID","LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID","START_CHAT_WITH_PERSON_BY_ID","UPDATE_PROFILE_IMAGE","START_CHAT_BY_JID","FAVORITE_ENTITY_BY_ID","START_CALL_PERSON_BY_ID","START_CALL_BY_NUMBER","USER_GENERAL_FIELD_UPDATED","EMERGENCY_ADDR_UPDATED","STREAMING_TOPIC_SUBSCRIBE","STREAMING_TOPIC_UNSUBSCRIBE","LISTENERS","NOTIFICATION_ACTION","ENTITY_FAVORITE_ACTION","STREAMING_TOPIC_MESSAGE","STREAMING_TOPIC_SUBSCRIBE_ERROR","IframeClientTimeoutError","_classCallCheck","isEmbedded","getHostOrigin","_newrelicLegacy","setCustomAttribute","checkForHostRedirect","initializeFrame","initializeClient","client","environmentalDataListener","hostOrigin","addListener","hostRootUrl","custom","registerEventHandlers","messaging","toastAction","_event$payload","handleNotificationAction","entityFavoriteAction","handleEntityFavoriteAction","streamingTopicMessage","onMessage","streamingTopicSubscribeError","onSubscriptionError","requestNotification","publish","dismissNotification","showNotification","notifyAcdCount","ACDCOUNT_EVENT","sendSidebarEvent","panel","SIDEBAR_EVENT","requestNavigation","startChatWithPersonById","notifyEmergencyAddrUpdated","favoriteEntityById","entityGeneralFieldUpdated","emergencyAdrUpdated","emergencyAdr","EMERGENCY_ADR_UPDATED","streamingTopicSubscribe","streamingTopicUnsubscribe","emergencyLocationData","loadUserPrimaryNumber","primaryPhoneObject","loadELocationEligibility","supported","clearElocation","did","refreshEmergencyLocation","defaultMessage","startPolling","pollingIntervalInMinutes","pollCounter","pollingIntervalId","_refreshAllEmergencylocationInfo","setElocation","newAddress","eventsService","triggerEvent","EventsService","EXPANDED_PARTICIPANT_PURPOSES","_trackedContacts","oneWay","_handleContactChanged","interactionModel","participantsToExpand","_loop","_ret","currParticipant","rawParticipant","_getContact","delegateYield","generalMessage","errorData","getCanonicalExternalContact","_arguments2","getCanonicalContactSync","contactId","addContactChangeListenersForInteraction","ModelBuilder","prevRaw","currInteraction","prevInteraction","previousContactId","removeContactChangeListener","addContactChangeListener","removeContactChangeListenersForInteraction","contactData","cause","validateDonutPermission","createContactPojo","_watchContactForChanges","contactCallbackData","_updateTrackedContactsAndTopics","_unwatchContactForChanges","unRegisterPriorityTopic","_invokeCallbacks","trackedContactIds","trackedContacts","_trackedContacts$obje","trackedIds","staleContact","staleCanonicalId","freshContact","freshCanonicalId","freshCanonicalContact","eventData","_callbacks","flatMap","_ref6","initialized","_favorites","favoritePromise","loadFavoritesForSessionPerson","initFavorites","getFavorites","peopleAndGroups","_handleHiddenGroups","favoriteStatus","favoriteEntity","unfavoriteEntity","loadedIds","_payload","_feature","urlPath","presignedUrl","presignedUrlResponse","ownerType","ownerId","greetingType","faxUploadWithHeaders","isFullScreen","handleFullScreenChange","fullScreen","webkitIsFullScreen","mozFullScreen","msFullscreenElement","endFullScreen","startFullScreen","requestingElem","messengerElement","orgspanApp","appendTo","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","geoUtil","isEnabled","isSwitchedOn","intervalReference","isStarted","setContext","_lastReport","lastReport","isGeolocationAvailable","_desktopStart","prefs","requestDesktopPromise","cmd","permission_geolocation","t1","_reportCurrentPosition","resultPosition","fetchCurrentPostion","refreshPublicApiUser","_isPrimary","_onPositionSaved","_onErrorSavingPosition","changeCount","roleWithDivisions","incrementChangeCount","_headset","_iframeState","newRelicNamespace","presencePollIntervalSec","presenceIntervalTimers","presenceErrors","presencePollInterval","reducePresencePolling","getFeatureToggle","useIntegrationPresenceDirectorySearch","alreadyTriggeredPresenceInterval","triggerPresenceInterval","presenceUpdateInterval","pollingEnabled","_managePolling","removeAllPresenceIntervals","pollIntervalSec","presenceTimer","_handlePresenceInterval","hasSession","intervals","timerKey","removePresenceInterval","updateSessionData","sessionData","fetchedSession","currentDate","filteredUsers","integrationUsers","integrationUsersIds","batchedIds","authError","_isPresenceStale","_handleBatchPresenceRequest","_handleAuthError","idParams","ucIntegrationId","requestLatest","presenceUserList","presenceResponse","_handleIndividualPresenceResponse","hasShownError","groupedUsers","presenceSources","_groupUsersByIntegration","presenceSource","phoneIntegration","usersGroupedByIntegration","integrationKey","integrationConfig","getIntegration","sendNewRelicAction","diffInMS","_isGCOffline","_entityPresence","_interval","addServerPrefix","safeString","rtlLangs","INTL_LANGUAGES","localeCookieOptions","expires","IntlService","loadedPromise","baseLocale","supportedLocales","_window$navigator","userLanguage","navLocale","isRTL","intlTelInputGlobals","getCountryData","isoRegionalLocale","_this$get$split","_this$get$split2","noEscape","_initialLocale","authLocale","_normalizeLocale","localeRootFallback","rootLocale","getWithServerKey","replacements","suppressError","_missingMessage","locales","validLocales","l","setPreferredLanguage","safeLocale","dynamicCookieOptions","domain","getEnvCookieDomain","secure","_shouldSendSameSiteNone","isSameSiteNoneCompatible","sameSite","isLocale12Hour","_loadedResolve","loadLanguage","translations","cached","setupServerTranslations","defaultRequest","localeRequest","defaultTranslationsResult","localeTranslationsResult","defaultTranslations","localeTranslations","server_translations","currProvider","INTERNAL_VIDEO_PROVIDER_ID","defaultVideoProviders","activeProvider","getProvider","usingVideoProvider","zoomMeetingsEnabled","teamsEnabled","handleLogout","blockLogoutCb","providerName","userHasVideoMediaProviders","computedFromConfig","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","MomentService","defaultFormat","_getNamePart","namePart","_getNames","familyName","givenName","_this$_getNames","givenNameInitial","familyNameInitial","_this$_getNames2","optionalMiddleName","_notificationId","_actionHandles","_clickHandlers","nextNotificationId","currentNotificationId","_cleanUpHandlers","handles","clickHandlers","generatedIdentifier","clickHandlerFunction","handlers","_this$get2","_this$get3","dismiss","_notification","fetchOrgSettings","orgSettings","freeSeating","popoutAuthForIframes","isPermissionInList","targetList","inList","listItems","checkDonutPermission","permissionValue","allowedOrgPermissions","targetDivision","isAllowed","permissionsToValidate","targetDomain","targetEntity","targetAction","domainPermissionMap","isAllowedOrgPermission","actionSet","matchesEntity","matchesAction","matchesDivision","shouldAllowBasedOnDivision","rolePermissions","trusteeOrg","directoryPermissions","donutPermissions","validateAllPermissions","permissionsList","validateAnyPermissions","permissionsSet","hasDirectoryPermissions","hasDonutPermission","canDeleteGroups","canViewQueue","canViewQueueObservations","canViewAcdScreenShare","canViewAcdCoBrowseForCall","canViewAcdCoBrowseForChat","canViewBusinessChat","canViewCollaborateVideo","hasVoicemailAccess","canViewAnAgentsSchedule","hasAgentSupervisorAccess","hasExternalContactsViewContactAccess","legacyUnifiedCommunicationsPermission","canCall","conferenceEnabled","canCallForward","canRecord","isBusinessUserOrSupervisor","hasEngageAccess","hasContactCenter","canViewUsers","canViewGroups","canDeleteParticipantFromGroup","canViewZoomMeetings","canViewTeamsMeetings","canTargetUserSearchOutsideOfDivision","canTargetQueueSearchOutsideOfDivision","canViewIntegrationPresence","canViewUCIntegrations","canViewSummary","GENESYS_SEARCH_TAB","integrations","allApps","_isValidIntegrationTab","onAuthenticated","_fetchConfigs","configs","getIntegrationTabs","canViewThirdPartyPresence","getIntegrationFromSource","getIntegrationTransferTarget","addressObj","allConfigsPromise","_accumulateConfigs","configsUrl","_configs","validConfigObjs","_isValidIntegrationConfig","_mapIntegrationConfig","i10n","badgeIcons","light","dark","clientApp","hasUcIntegrationKey","permissionService","canViewPbxTab","AcdUtilitiesMixin","ActiveCallMixin","CallControlsMixin","CallForwardMixin","ConversationManagerMixin","EventsMixin","PhoneNotificationsMixin","StationMixin","UriBuilderMixin","_processingChain","_initializeProcessingChain","_process2","_process","interactionProcessingChain","QueuedProcessingChain","lifecycleContainer","setProcessingChain","process","eventSource","_getCallState","shouldUpdate","participantState","modelsToDestroy","buildModel","contactObserver","rawData","_onMyConversationEvent","enqueueEvent","_onPigeonConnect","fetchActiveCallConversations","convAPIVersion","onQueue","carrierPigeonConnected","phoneDisabled","phoneDisabledMessage","audioCallCapable","hasMicrophone","stationHasPersistentConnection","persistentConnectionActive","toggleBrowserAnswer","lastConversationError","lastIndexOf","logObject","table","isInteractionViewOpen","isShowCallControlsViewOpen","showFloatingCalls","showNavbarAlert","activeAcdCallState","hasIncomingNonAcdCalls","alertingCall","isAlertingCallACD","bootstrapPurecloudApiOnAuth","delayedNotification","handleMuteParticipants","muteAudio","unmuteAudio","transferToVoicemail","selectedUserUserId","voicemailPolicy","vmAdressString","topicPriority","conversationsummary","outofoffice","eventFromTopic","priorityTopics","customTopicNames","registerTopicsDebouncePeriod","prioritizedTopics","sortedTopics","topicA","topicB","getTopicPriority","priorities","publicApiUser","subscribeUrl","customName","customNames","registerTopic","unshiftObject","unRegisterTopic","_observeTopics","topicKeepAlive","triggerTopicEvent","eventName","carrierPigeonTopic","_emberCopy","topicName","namespaces","syncEnabled","deferredPersistRequests","settingsPath","registerNamespaces","localforage","storeName","getItem","_initializeNamespace","ready","_waitForAccessToken","_enableService","_disableService","_getPreference","persist","_setPreference","namespaceDelimiter","previousSet","setting","setItem","currentNamespaceObject","pendingSet","_safeSet","enableServicePromise","_isNotDead","_enableSync","settingsUrl","preferencesToSync","_saveSettingsFromServer","profileSyncSupport","userPreferences","allLocalPreferences","eventMap","trackedGuids","integrationpresence","events","subscribeToMyself","subscribeToConnection","_getPresenceDefinition","getPresence","getPresenceDefinition","testValue","_getTopicsForUser","_guidFromTopicName","StreamingService","streamingEvent","refreshPeopleActivityState","watchAuthForSubscribe","bulkSubscribeToPresence","callbackKey","previousCallback","newCallback","_alertDeletedPresence","removeDeletedPresence","changeRoutingStatus","doUserPresenceStatusChanged","statusUpdate","isSourceOnUsableList","existingPresenceIndex","existingPresenceObj","presenceListStored","doUserPrimaryPresenceSourceChanged","newSource","isThirdPartySource","handleIntegrationPresenceEvent","presenceEvent","startOfTime","rightAboutMeow","handleRoutingStatusError","conversationSummaryEvent","outOfOfficeEvent","outOfOfficeDef","routingStatusEvent","primaryPresenceEvent","geolocationEvent","_mapping","presenceDefinitions","outOfBandPresenceDefinitions","allPresences","secondary","allActivePresences","primaryPresences","secondaryPresences","allSecondaryPresences","secondaryPresenceDefinitions","loadPresences","definitions","loadAllPresenceDefinitions","definitionIds","currentId","loadPresenceDefinitions","handlePresenceData","presenceTimeout","testing","localizePresenceString","online","not_responding","meal","training","break","getPresenceMappings","presenceString","mapPresence","rawPresence","mapHasPresence","mapHasSystemPresence","getPresenceFallback","_intl","formatPresenceLanguageLabelLocale","languageLabel","presenceDef","_restoreState","inLogoutBounce","_isInLogoutBounce","_clearLogoutTime","baseLocation","searchString","internalRoute","prunedStateParamValue","firstChar","s3SafePathname","parsedStateParam","finalSearch","finalHash","cookieOptions","lastLogout","DEFAULT_ROUTE_MAP","relate-engine","organizations","VERIFICATION_RELEVANT_DATA_MESSAGE","command","adapterCache","isRelateActive","navigationRoute","navTree","helpURL","relateFrameOrigin","profileVerificationEventName","showProfileEventName","contactAssociationMap","contactDisassociationMap","registerSidebarState","getEngineHelp","contextHelpUrls","handleNavigation","navEvent","handleRedirect","propertyWillChange","propertyDidChange","registerNavEntries","navEntries","associateConversationWithInteraction","profileVerified","verificationInteractionData","displayNotification","shouldNotify","processFrameVerificationEvent","closeRelateFrame","isClosedInteraction","relateIframe","postVerificationRelevantDataV2","associatedContacts","hasActiveAssociation","verified","wasAutoVerified","verificationRelevantData","isVerified","activeProfileIsVerified","queryData","siz","errorType","interactionEnded","BrowserScreenRecordingError","ScreenMediaService","_getHostedContext","_isHosted","_stream","_track$getSettings","screens","metadatas","screen","_track","_debugScreenRecordingInBrowser","screenId","originX","originY","resolutionX","resolutionY","getShareableScreens","createMediaStream","getVideoTrackForScreenId","shareid","createTrackMetadata","attemptsRemaining","getHostedScreenMedia","screenInfo","isWindows","main","isMain","_scrollActivity","EsaSessionService","featureService","dataStore","roleNames","readWritePermissionsDeferred","enabledFeatures","products","authInProgress","logoutInProgress","singleSignOutInProgress","blockers","_timeAuthenticated","hasAppAccess","hasDirectoryUserViewPermission","perm","hasTrusteeAccess","hasDivision","hasDivisions","regEx","isPermission","isPermissionWithDivisions","permissionDivisions","foundPermission","useEmailDraftEvent","rewriteRootAPIRequests","createFieldConfigs","_Object$values","createPresences","loadAllowedOrgPermissions","loadOrgProducts","getOrganizationTranscriptSettings","transcriptSettings","settingsUri","forceDirectory","bootstrapStartTime","performance","_serialProcessingChain","executeChain","stepDesc","getFeatures","processSync","setThemeCookie","trusteeBootstrap","establishSession","setupCarrierPigeon","updateAppSession","hasAssistantsQueueViewPermission","loggingConfig","logMsgPrefix","bootstrapDuration","isChainStepFailure","origReason","legacyErrorCode","telemetryContext","loggableRequestFailureDetails","_request","getLoggableRequestFailureDetails","requestFailureDetails","setServerTimeOffset","setupStoreData","serverError","onLegacySessionInvalidation","LOGOUT_PROMISE_PROP_NAME","logoutPromise","addRemoveBlockers","blocker","proxyLogin","retrieveProxyLoginInfo","isFeatureEnabled","featureName","redirect","cookieProxyPerson","shouldReload","superPerson","hashIndex","forceUpdate","localFeatures","featureToggles","serverDate","t2","t3","clientSystemTimeSuspect","serverTimet1","clientTimet3","clientTimet0","offsetCalculated","subscription","xhrFields","withCredentials","baseExpands","resetPassword","newPassword","resetToken","currentPassword","oldPassword","verifyPassword","publicApiUserObserver","_setupSessionInvalidationFailed","_forwardSessionInvalidationFailedEvent","_teardownSessionInvalidationFailed","_isDesktop","_isDesktopUnifiedPreferences","supportsUnifiedPreferences","canShowChatPreference","canShowAgentGreeting","canShowGeneralPreference","canShowPasswordPreference","canShowNotificationsPreference","isIE","isDesktop","isUnified","canShowVoiceMailPinPreference","canShowDirectRoutingPreference","_commonPreferenceComponents","theme","direct_routing","agent_greeting","commonPreferences","components","canShow","getThemeList","commonPreferencesSortOrder","customPreferences","addPreference","existingPreference","newPreference","removePreference","otherPreferences","canOpenPreference","preferenceKey","openChatPreference","openGeneralPreference","openLanguagePreference","openNotificationsPreference","openPasswordPreference","openSoundPreference","openVideoPreference","openVoiceMailPinPreference","getUserVoicemailEmailNotification","_yield$_this2$get$aja","setUserVoicemailEmailNotification","_sound","GLOBAL_ERROR","SILENCED_ERRORS","statusText","lengthInUtf8Bytes","MAX_INTERNAL_LOG_ITEMS","internalLogs","logCounts","failureCount","_originalLogger","ExponentialIntervalGenerator","LOG_LEVELS","bindLogMethods","resetLogLimit","loggingOptions","serverLevel","localLevel","propertyToMatch","bufferLog","getOriginalLogger","restrictedTypeConverter","stack","currentRoute","timeSinceLogin","fullTypeConverter","createTrace","logItem","itemToLog","_restrictTraceData","clientTime","clientSessionId","allowedKeys","_itemToLog","keyFilter","_objects","extractRawData","maxDepth","_augmentSensitiveData","finalLogItem","wrappedSensitive","checkItemsAgainstOptions","logOption","itemsToLog","defaultAnswer","itemLogIndex","logResult","_len","_key","checkForSilence","SILENCED","silencedByStringMatch","silencedByRegex","silencedByMatcher","skipSumoSend","serverLogLevelIndex","logServer","logLocal","trace","shiftObject","decreaseLogLimit","currentLimit","maxTracesByteLength","getTracesToLog","logs","toLog","totalLogSize","logSize","saveLogs","_saveLogsTask","toSend","sendLogTraces","_resetLogsOnSuccessfulSave","fail","keepLatest","maxConcurrency","backOffTask","getInterval","batches","ApplicationStore","Store","GroupStoreMixin","SearchStoreMixin","applicationAdapter","promiseLabel","personResult","groupResult","latestCalls","batchLimit","batch","successfulRequests","failedRequests","mapLimit","bulkResults","didSaveRecord","internalModel","recordInfo","isSaving","updateGroup","connection","connectedV2","v2Deferred","v2Promise","connectionPromise","_textMeasurer","_userActivity","_userIdle","_jabraChrome","_jabraNative","_plantronics","_sennheiser","eventTypes","UserIdleService","IDLE_TIMEOUT","activeEvents","setListening","enableEvent","disableEvent","pendingSessions","conversationsToAutoAnswer","_instrumentSdkUsage","sdkFunction","pageActionName","_startParams","_devices","_volume","ensureVideoPermissions","ensureAudioPermissions","_params","rejectPendingSession","findRemainingSessionsBasedOnParams","_conversationId","_sessionType","endSession","_endSessionParams","_muteOptions","_heldOptions","getAllActiveSessions","defaultGeneralSettings","ringtoneSelection","advancedMicSettings","autoGain","noiseSuppression","defaultDirectorySettings","alwaysPopoutVideo","userSettingsPromise","failedSettingsFetch","_fetchSettingsPromise","_updatePromise","_fetchSettings","_checkAndFixSettings","_updateSettings","reallyWaitForToken","forceRefresh","retryOnFail","_settings","existingPromise","_this5$get","generalSettings","settingPath","pieces","topLevelKey","piece","_handleSettingsChanged","updatedSettings","_webrtc","BaseStore","LocalStorageStore","storageKey","currEnvDetails","storeProps","_xSelect","Transform","deserialize","deserialized","_json","_object","_maybe","_pigeon","assertNever","actionName","contactJSON","derived","hasMultipleCustomers","isCallOrCallback","communications","customerEndTime","lastParticipantEndTime","callsError","interactionMetadata","metadataClone","__interaction_metadata__","ALERTING","CONNECTING","CONTACTING","DIALING","OFFERING","TRANSMITTING","CHAT","EMAIL","VOICE","ABANDONED","ACW","ANSWERED","CUSTOMERS_WAITING","HANDLE","HELD","INTERACTING","IVR","OFFERED","OVERSLA","SERVICE_LEVEL","SERVICE_TARGET","TALK","TIME_IN_STATUS","TRANSFERRED","WAIT_TIME","ACTIVE_MEMBERS","queryParamSegments","keyValuePair","queryParamString","urlParams","interactionDetailPath","adminAgentSegment","_buildAppProviderComputed","providerConfig","_Ember","validProviders","validProvider","boolExpr","oldProvider","providerInstance","_booleanExpressions","buildSymbolMap","ft","keyName","evaluateProviderExpression","_buildProviderConfig","providerConfigMap","_boonJs","getEvaluator","currDependencies","_curr$value$split","_curr$value$split2","valueTag","portToValidate","defaultPort","portInt","isTrusted","renderedInstance","appDef","trustedDataPassing","isVisible","userVisible","_serviceDiscoveryWebInternal","isKnown","validationChecks","invalidReason","invalidReasons","validations","_validations","validation","validationConfig","SDK_REPO_URL","LOG_STANDALONE_APP_NAMESPACE","LOG_INTERAPPTIONS_NAMESPACE","LOG_ROOT_NAMESPACE","LOG_API_NAMESPACE","subNamespaces","currNamespace","_len2","_key2","_len3","_key3","buildStashLoggerDetails","logDetails","_objectSpread","remote","mask","buildViewId","isAppDefV2","isAppContext","buildV1IconAsset","asset","fromEntries","decorative","buildV2IconAsset","RASTER_PROP_PATTERN","rasterEntries","currProp","currRasterProp","currRasterValue","_images$","rej","symbolEvaluator","symbolMap","identifiers","currIdentifier","variable","nsSymbolEvaluator","expressionBuilder","_browser","_codeUtils","parseFloat","userUri","_debugBackburner","_debugRsvp","_displayGeolocation","API_ERROR_MESSAGES","messageType","smiles","defaultSkinTone","lightSkinTone","mediumLightSkinTone","mediumSkinTone","mediumDarkSkinTone","darkSkinTone","nature","objects","places","symbols","escapedString","k","isHTMLSafe","theString","HTMLChars","char","literal_string","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","CHANNEL_MODEL_TYPE","numberOfChanges","idPropertyName","setNewValuesInChannelRecord","channelRecordData","messagingChannelTypeFor","modelProperties","getIdFrom","contactChannelIds","notExcluded","CHANNEL_RECORD_PROPERTIES","updateChannelInfoPrompt","updateChannelInfoPromptPlural","updateAllChannelInfoPrompt","newChannelPrompt","pleaseWaitForFullContactInfo","propertyChanged","IDS","getIdentifier","getReverseWhitepagesLookupValue","getDisplayableName","displayOrScreenName","getDisplayOrScreenName","contactChannelIdValues","interactionIdValues","addedIds","newIdValues","idVal","addOrReplaceIdsInChannelRecord","acdHybridToastNoActiveQueue","acdSecurePause","acdTransferPermissions","ACT-1205","AGORA-137_connections-ui-contentsquare","ATLAS-536_EnableContentSquare","auraACWGadgets","comui-disable-legacy-api-url","conversationSummary3256","digitalFirstPURE2942","EC-760","enableUIAjaxRetryHeader","epcDecompPresenceLabel","gcucc-ui-PCUCC-3734","gcucc.ui.useIntegrationPresenceSourceDirectorySearch","groupProileNoIndividualsSave","hawkClientScreenShare","interactionNameQueueCallingQueue","notificationOutputPicker","PAUI-80.PeopleUiDecomposition","playRecordingFromSelectedOutput","PURE-3256_useConversationDetails","PURE-6186_Scripter_Gadget_GCUI","PURE-7064_search_favorites","PURE3301-dynamicGroups","qm.release.evaluation.assignee","qm.release.evaluation.disputes","relateDynamicSchema","showVideoInThumbnail","webrtcClientNetworkProbeAutoAdjust","webrtcDefaultDeviceProfile","webrtcDisableDeviceProfileNotifications","webrtcMMSDnsCheck","webrtcTrackBasedActions","webUiDarkTheme","_isSafeToFocus","currentSelectedElement","isSafe","GeolocationUtil","requiresNativeGeolocation","getCurrentPosition","watchPosition","onPositionChangedFn","onErrorFn","clearWatch","watcher","failure","Giphy","apiKey","api_key","rating","gsm7Chars","gsm7CharsExt","_applicationHasFocus","_hostType","_operatingSystem","_version","_hostRegion","_supportsRegions","_supportsUnifiedPreferences","_supportsJabra","_additionalPreferences","_requiresNativeGeolocation","previousPresence","isScreenLockedOrSleep","hasUserAlreadyReturn","desktopSleptAt","isHostedProp","getRegion","supportsRegions","supportsJabra","isMac","getAdditionalPreferences","doTerminateApplication","completion","_HostedContextFunctions","doesAppHaveFocus","showNativeNotification","setUnreadMessageCount","sendJabraEventToDesktop","deviceID","JABRA_EVENT","requestJabraDevices","getScreenMedia","matchedRegion","sCmd","cefQuery","persistent","onFailure","FILE_SIZE","MESSAGE_TYPE","CHARACTER_LIMIT","extraOptions","nationalMode","utilsScript","buildIntlTelInputI18n","I18N_FALLBACKS","translate","getLocalizedCountryName","fallbackName","DisplayNames","displayNames","of","buildSelectedCountryAriaLabel","selectedCountryLabel","countryName","selectedCountry","selectedFlag","selectedCountryAriaLabel","countryListAriaLabel","zeroSearchResults","oneSearchResult","multipleSearchResults","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","isAlphabet","isWhitespace","isEscape","isTab","fromCharCode","isApplicationRoute","defaultRender","md","renderer","link_open","renderToken","targetIndex","attrIndex","attrGet","isMailTo","attrPush","attrSet","markdown","render","hljs","configure","markdownit","linkify","typographer","highlightAuto","layoutId","LAYOUTS","getRawAddress","_externalContactMessaging","getNameFrom","getModelProperties","idProperties","getDisplayablePhoneNumberFrom","INTERNATIONAL","_getChannelPropertiesFromInteraction","channelType","displayableName","twitterHandle","getChannelPropertiesFromExternalContact","getChannelPropertiesFromInteraction","present","hasCrucialChannelInfo","displayNameFrom","getTwitterDisplayNameFrom","svgIconKey","scopedId","nestedIdProperty","oldIdValue","newIdValue","initialsSupported","OnlyLatinChars","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","getEnv","getDeploymentId","getRegionTranslationKey","getDesktopId","serviceDiscovery","getEnvironments","translationKey","envStatus","STABLE_PUBLIC_ENVS","parseRuntimeFromLocalPath","parseDeployedRuntime","_window","newrelic","actionNameType","attrType","reservedKeys","attrKey","keyType","persistType","ALLOWED_VALUE_TYPES","safeOptions","MAX_SAFE_INTEGER","excludeUnderscoreKeys","excludeEmberServices","excludeEmberApplications","valueFilter","inputType","myTypeOf","_extractRawDataHelper","contextStack","currStackItem","currLevel","currItem","currIndex","currStack","buildNewContextStack","customJsonValue","propertyName","wrappedJsonError","baseError","newStackItem","PHONE_NUMBER_REGEX","proxy","tap","MSG_NAMESPACE","_defaultLabel","_chain","_processingQueueMap","_buildErrorMessage","isValidProcessor","appendToChain","processor","_isLifecycleValid","workQueue","unshift","_checkForWork","emptyQueueIds","currQueueId","currQueue","activeWorkItem","_processEventThroughChain","_buildLoggerMessage","chainLabel","chainIndex","_chainHelper","processorResult","processorResultType","processorLabel","_safeLabel","AdapterError","adapterError","payloadDetails","statusInt","isUuid","getLoggableRequestFailureDetailsPartial","getAdapterErrorLoggableDetails","getAjaxErrorLoggableDetails","rawErrorResponse","UUID_REGEXP","_routingStatus","isSyncPromiseChainStep","chainLength","currChainStep","stepIndex","stepProgress","logPayload","SimpleCache","ttlMinutes","expirationTime","cachedItem","setupRecorder","clearStream","audioContext","suspend","mimeType","isTypeSupported","blobURL","getBlobUrl","loadEncoder","encoderPath","resume","_streamReady","_stoppedRecording","_onDataAvailable","initStream","resumeRecording","pauseRecording","createHowlFromBlob","blobUrl","_loadSoundRecorder","_loadWorker","getScript","currentTheme","_cookie$split","_cookie$split2","DEFAULT_THEME","_ref3$theme","THEME_CLASSES","LIGHT","_ref3$duration","_ref3$path","_ref3$protocol","_getCurrProtocol","_ref3$domain","_ref3$setCookie","setCookie","_setCookie","_ref3$userAgent","_getCurrUserAgent","cookieStmt","DARK","BASE","BASE_THEME_LIST","extraThemes","_ref2$theme","_ref2$element","NATIVE_PANELS","deprecatedConversationSummaryPanelIds","currPanelId","CONVERSATION_DETAILS_GADGET_PANEL_ID","WRAPUP_GADGET_PANEL_ID","transformationMaps","shouldTransformPanelSetting","panelSetting","transformPanelSetting","shouldTransformAppDefId","appDefId","addNativeProvider","transformAppDefId","dependentFeatureToggles","reverseDetails","reverseNotes","reverseWrapup","reverseResponses","reverseScheduleCallback","scripts","transformationDependentFeatureToggles","buildTransformationFtComputedDepKey","injectionPrefix","standardTransformationFtComputedDepKey","requiredTransform","srcNativePanelMatch","findNativePanel","toSearch","nativePanel","currNativePanel","includedNativeProvider","TtlCache","defaultTtl","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","paramReplace","getAppsDownloadUri","downloadId","_uuidGenerator","_videoFrameChecker","_alias","_belongsTo","_collection","_confirmation","_date","_dependent","_dsError","_exclusion","_format","_hasMany","_inclusion","_length","_messages","_number","_videoParticipantV","_videoParticipant","templateName","_webrtcConversation","runningTests","@purecloud/ember-purecloud-components","@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","tr","uk","zh-cn","zh-tw"],"mappings":"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SAAAmnC,GAGAr8B,OAAAC,eAAAo8B,EAAA,aAAA,CACAl5B,OAAA;ACJA,IAAMmyR,EACqB,8BADrBA,EAEW,uCAFXA,EAGW,eAHXA,EAIc,8BA0BL,CACXz2N,eAxBmB,SAAUzmD,EAAK83O,GAClC,IAAIl0L,EAAek0L,GAAkB;AAErC,GAAI93O,EAAIoR,SAAWpR,EAAIoR,QAAQvK,QAAS,CACpC,IAAMs2Q,EAAcn9Q,EAAIoR,QAAQvK;AAChC,OAAQs2Q,GACJ,KAAKD,EACDt5N,EAAe;AACf;AACJ,KAAKs5N,EACDt5N,EAAe;AACf;AACJ,KAAKs5N,EACDt5N,EAAe;AACf;AACJ,KAAKs5N,EACDt5N,EAAe,4CAI3B,OAAOA;;AC3BX,MAAuB,CACnBw5N,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJxtQ,OAAQ,CACJytQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACvgCR,MAAuB,CACnBluQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,MAEJ+tQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACxnBR,MAAuB,CACnBV,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJxtQ,OAAQ,CACJytQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;eCl+BRhhS,OAAA,6BAAA,CAAA,UAAA,2CAAA,SAAAmnC,EAAAi1G,GAGAtxI,OAAAC,eAAAo8B,EAAA,aAAA,CACAl5B,OAAA,IAEAnD,OAAAC,eAAAo8B,EAAA,UAAA,CACAtlB,YAAA,EACA3W,IAAA,WACA,OAAAkxI,EAAA/oI;ACHO,IAAMuvH,EAAsB/nG,EAAAA,QAAEg4L,KACjC,GAAGp4M,OAAOyc,EAAAA,mBAAmBzc,OAAO4oB,EAAAA,sBAAsB5oB,OAAOqoH,EAAAA;;AAG9D,IAAM64G,EAAK,CACdnlO,IAAK,CACDyf,GAAI2sG,EAAoBnzH,KAAK,MAEjCywB,MAAO,CACHjK,GAAIqxL,EAAAA,YAER7hK,OAAQxuB,EAAAA,YACRsM,SAAUunL,EAAAA;;;UClBC,CAAC,2YC6BD,SAASruE,EAAOxlI,GAC3B,GAAY,OAARA,GAA+B,mBAARA,EACvB,OAAO;AAEX,GAAmB,iBAARA,EAAkB,CACzB,IAAMgqR,EAAgBvtQ,MAAMwoB,WAAWC,MAAMC,iBAAiBnlC;AAE9D,OAAOgqR,EAAcx8Q,QAAQ,UAAtB,KAEX,GAAmB,WAAf3kB,EAAOmX,GACP,OAAOA;AAEX,IAAMhK,EAAQrI,KAAKC,MAAMD,KAAKE,UAAUmS;AAcxC,OAbAnM,OAAOwD,KAAKrB,GAAOvI,SAAQ,SAAAw8R,GACvBj0R,EAAMi0R,GAAKzkJ,EAAOxvI,EAAMi0R,OAG5Bp2R,OAAOwD,KAAK2I,GAAKvS,SAAQ,SAAAw8R,GAEjBxtQ,MAAMkB,OAAOusQ,WAAWlqR,EAAIiqR,MAC5Bj0R,EAAMi0R,GAAKjqR,EAAIiqR,GAAGjpR,YAElBnN,OAAOE,UAAUgT,eAAe3c,KAAK4V,EAAKiqR,SAAwB,IAAXjqR,EAAIiqR,KAC3Dj0R,EAAMi0R,QAAK55R,MAGZ2F,cAGJ,SAAkBgK,GACrB,GAAmB,iBAARA,EAAkB,CACzB,IAAImqR,EAAYnqR;AAOhB,OANAoqR,EAAU38R,SAAQ,SAAA48R,GApC1B,IAAsBC;AAuCVH,EAAYA,EAAU38Q,QAAQ,IAAIC,QAvCxB68Q,EAuC4CD,EAAK5sK,QAtC5D6sK,EAAe98Q,QAAQ,iCAAkC,SAsCa,KAAM68Q,EAAKA,SAG7EF,EAEP,OAAOnqR;AAnEf,IAAMoqR,EAAY,CACd,CACIC,KAAM,IACN5sK,QAAS,SAEb,CACI4sK,KAAM,IACN5sK,QAAS,QAEb,CACI4sK,KAAM,IACN5sK,QAAS,QAEb,CACI4sK,KAAM,IACN5sK,QAAS,UAEb,CACI4sK,KAAM,IACN5sK,QAAS;;ICrBXi5J,aACF,SAAAA,EAAY6T,GAAmC,IAAtBC,EAAsB5sR,UAAAvT,OAAA,QAAAgG,IAAAuN,UAAA,GAAAA,UAAA,GAAH;AAAG+iP,EAAAt3P,KAAAqtR,GAC3CrtR,KAAKohS,UAAY,EACjBphS,KAAKqhS,kBAAoBF,EACzBnhS,KAAKshS,uBAAyBJ,EAAcC;gCAGhD,WACInhS,KAAKohS,iCAGT,WACIphS,KAAKohS,UAAY,6BAGrB,WAQI,IAAIG,EAAkD,KAAnC78R,KAAK44I,IAAI,EAAGt9I,KAAKohS,WAAa,GAC7CI,EAAuB98R,KAAKC,IAAI48R,EAAavhS,KAAKshS,wBAIlDpnQ,EAAWl6B,KAAKqhS,kBAAoB38R,KAAKgT,SAAW8pR;AACxD,OAAOtnQ,0CAIAmzP;;;oLCWR,WACH,IACI,OAAOrxO,mBAAmBh8C,KAAK2X,YACjC,MAAOxX,GACL,MAAO,+JAIR,SAA8B0xJ,GACjC,OAAOA,GAAe4vI,EAA+B/tP,SAASguP,EAAiB7vI,eAoB5E,SAAiBtvJ,EAAIo/R,EAAe13M,GACvC,IAAKA,EACD,OAAO;AAEX,IAAM23M,EAAuBC,EAAAA,sBAAsB37R,MAAK,SAAA47R,GACpD,OAAOA,EAAIxgS,OAASqgS;AAExB,IAAKC,EACD,OAAO;AAGX,OAAOA,EAAqBG,QAAQH,EAAqBI,0BAA0B/3M,GAAkB1nF,2BA4HlG,SAAcoyB,EAAOk9H,EAAaowI,EAAsB3gS,EAAM+9M,EAAmBlsL,GACpF,IAmBI+uQ,EAnBJC,EAxCJ,SAA8B7gS,EAAM2gS,EAAsB5iF,EAAmBxtD,EAAa1+H,GACtF,IAAMivQ,EAAqBC,EAAsBxwI,EAAa1+H;AAC9D,IAAKivQ,EAED,MAAO;AAGX,IAAMR,EAAuBU,EAAsBhhS,GAC/C6pI,EAAa;AACb82J,GACAz3R,OAAOqE,OAAOs8H,EAAY82J,EAAqBr3R,IAAIg3R,EAAqBr3M;AAE5E,IAAMg4M,EAA+BH,EAAmBR,EAAqBr3M,UACvE+0H,GAAgBn0E,IAAeA,EAAWy2J,EAAqBliF;AACjEJ,IACAn0E,EAAai3J;AAEjBj3J,EAAW7pI,KAAOA,EAClB6pI,EAAWk0E,kBAAoBA,EAC/Bl0E,EAAWm0E,aAAeA,EAC1Bn0E,EAAWo0E,uBAAwB,EACnCp0E,EAAWq0E,wBAAyB;AACpC,IAAMmiF,EAAgBC,EAAqBtgS,KACrCkhS,EAAcZ,EAAqBliF,UACnC+iF,EACFR,EAAqBr3R,IAArB,GAAAuP,OAA4BwnR,EAA5B,OAAAxnR,OAA+CqoR,KAC/CD,EAA6BH,EAAmB1iF;AAEhDv0E,EAAW9yG,OAASoqQ;AAMxB,MAAO,CAAEt3J,WAAAA,EAAYm0E,aAAAA,EAAcijF,6BAAAA,GAMgCG,CAC/DphS,EACA2gS,EACA5iF,EACAxtD,EACA1+H,GALIg4G,EAARg3J,EAAQh3J,WAAYm0E,EAApB6iF,EAAoB7iF,aAAcijF,EAAlCJ,EAAkCI;AAOlC,IAAKp3J,EAED,OAAO;AAuCX,OA5BA/3G,MAAMgV,KAAI,WAEN85P,EAAgBvtQ,EAAM/vB,KAAK,CACvBkoB,KAAM,CACFvqB,GAAIsvJ,EAAYjnJ,IAAI,MACpBtJ,KAAMqhS,EAAAA,mBACNx3J,WAAYA,KAKpB+2J,EAAcU,gBAAkB,WAC5B,OAAOp4R,OAAOwD,KAAKk0R,EAAcrhE,qBAAqB7/N;AAI1D,IAAMs/B,EAAMiiQ,EAA6BjiQ,IAEnCuiQ,EAAiBviQ,EAAM91B,OAAOwD,KAAKsyB,EAAI,IAAI,GAAK;AACtDwiQ,EACIP,EACAjjF,EACA2iF,EACA5iF,EACAwjF,EACAX,MAGDA,qEAQJ,SAAyCA,EAAezmO,GAC3D,IAAKymO,EACD;AAGJ,IAAMa,EAAoBb,EAAcp1Q,KAClC+zM,EAAoBqhE,EAAcrhE,oBAClC+gE,GAAuB,EAAAp/D,EAAAwgE,yBAAwBD,EAAkBzhS,MACjEipF,EAAQ,GAAApwE,OAAMynR,EAAqBr3M,UACnC04M,EAAkBz4R,OAAOwD,KAAK4zR,EAAqBqB,kBAAkB14M;AAC3En3D,MAAMgV,IAAIj5B,MAAK,WACP4zR,EAAkBzjF,aAElB7jJ,EAAQhlD,IAAR,GAAA0D,OAAeowE,GAAYw4M,EAAiB,GAAA5oR,OAAIowE,KAGhD//E,OAAOwD,KAAK6yN,GAAmBz8N,SAAQ,SAAAqZ,GACnC,GA3QO,WA2QHA,EAAiB,CACjB,IAAM4hM,EAAiB,GAAAllM,OAAMynR,EAAqBr3M,SAA3B,KAAApwE,OAAuCynR,EAAqBliF;AAGnF,GAAIkiF,EAAqBiB,eAAgB,CAErC,IAAMtgS,EAAKq/R,EAAqBsB,UAAUriE,EAAkBpjN,GAAK,IAC3D0lR,EAAoB1nO,EAAQ7wD,IAAR,GAAAuP,OAAeklM;AACzC5jJ,EAAQhlD,IAAR,GAAA0D,OAAeklM,GAAqB,CAAC98M,GAAI4X,OAAOgpR,SAEhD1nO,EAAQhlD,IAAR,GAAA0D,OAAeklM,GAAqBuiF,EAAqBsB,UAAUriE,EAAkBpjN,GAAK,UAEvF2lR,EAAY3lR,IAAQwlR,EAAgBvvP,SAASj2B,IACpDg+C,EAAQhlD,IAAR,GAAA0D,OAAeowE,EAAf,KAAApwE,OAA2BsD,GAAOojN,EAAkBpjN,GAAK,OAMrE4lR,EAA0Bj/R,SAAQ,SAAA4oF,GACvBvxB,EAAQ7wD,IAAR,GAAAuP,OAAeowE,EAAf,KAAApwE,OAA2B6yE;YA1SrB,CACrBs2M,wBAAyB,yEACzBC,8BAA+B,+EAC/BC,2BAA4B,4EAC5BC,iBAAkB,kEAClBC,6BAA8B,8EAC9BC,gBAAiB;KAGH;AACX,IAAMC,EAAM;;UACI;AACvB,IAMaP,EAA4B,CALpB,OADO,oBAEL,eAEU,wBADC,yBAJX,SAcnBO,EAhBc;;AAqBX,MAAMnC,KACNI,EAAAA,sBAAsB10R,KAAI,SAAAy0R,GAAoB,OAAIA,EAAqBtgS;;;AAqBvE,SAASogS,EAAiB7vI,GAC7B,OAAOA,GAAeA,EAAYjnJ,IAAI,kBAGnC,SAASi5R,EAAchyI,GAC1B,IAAKA,EACD,OAAO;AAGX,IAAM+vI,GAAuB,EAAAp/D,EAAAwgE,yBAAwBtB,EAAiB7vI;AACtE,OAAO+vI,GAAwBA,EAAqBkC,gCAAgCjyI,GAGjF,SAASkyI,EAAmBlyI,GAC/B,OAAOA,GAAeA,EAAYjnJ,IAAI,8EAiBnC,SAAS03R,EAAsBX,GAClC,OAAOE,EAAAA,sBAAsB37R,MAAK,SAAA07R,GAC9B,OAAOA,EAAqBtgS,OAASqgS,KAMtC,SAASU,EAAsBxwI,GAA4B,IAAf1+H,EAAe5e,UAAAvT,OAAA,QAAAgG,IAAAuN,UAAA,GAAAA,UAAA,GAAN;AACxD,IAAKs9I,EACD,OAAO;AAEX,IAAMkZ,EAAgBlZ,EAAYjnJ,IAAI,MAChCg9L,EAAkB/1C,EAAYjnJ,IAAI,QAClC+2R,EAAgBD,EAAiB7vI,GACjC+vI,GAAuB,EAAAp/D,EAAAwgE,yBAAwBrB;AAErD,IAAKC,EAMD,OALIzuQ,GACAA,EAAO3b,MAAP,kFAAA2C,OACsF4wJ,EADtF,+BAAA5wJ,OACiIwnR,EADjI,mCAAAxnR,OACgLytL,EADhL,MAIG;AAEX,IAAMrlM,EAAKshS,EAAchyI,GACnBmyI,GAAsB,EAAAxhE,EAAAyhE,wBAAuBpyI,GAC7C69E,EAASq0D,EAAmBlyI;AAElC,OAAO+vI,EAAqBqB,gBAAgB1gS,EAAIyhS,EAAqBt0D,GAGlE,SAAS0zD,EAAY3lR,GACxB,OAAQ4lR,EAA0B3vP,SAASj2B,GAgBxC,SAASqlR,EACZP,EACAjjF,EACA7jJ,EACA4jJ,EACAwjF,EACAX,GAEA,IAAMN,GAAuB,EAAAp/D,EAAAwgE,yBAAwBd,EAAct3R,IAAI;AAEvEJ,OAAOwD,KAAKu0R,GAA8Bn+R,SAAQ,SAAAqZ,GAC9C,IAgKc9c,EAAGqnB,EAhKXuiE,EAAQ,GAAApwE,OAAMynR,EAAqBr3M,UACnC44M,GAAqB7jF,GAAgBskF,IAAQnmR,GAAOg+C,EAAQ7wD,IAAR,GAAAuP,OAAeowE,EAAf,KAAApwE,OAA2BsD;AACjFA,IAAQmmR,IAAQT,GAAqB7jF,GAkKjD,SAAwCujF,EAAgBX,EAAeE,EAAoBe,GAQvF,IAAMe,EAAyBf,EAAoBA,EAAkBh2R,KAAI,SAAA5K,GAAE,OAAIA,EAAGsgS,MAAmB,GAC/FsB,EAAsB/B,EAAmB9hQ,IAAInzB,KAAI,SAAA5K,GACnD,OAAOA,EAAGsgS,MAEVuB,GAAW,EACTC,EAAcF,EAAoBh3R,KAAI,SAAA49J,GACxC,IAAKm5H,EAAuBxwP,SAASq3H,GAEjC,OADAq5H,GAAW,EACJr5H;AAGf,GAAIq5H,EAAU,CAKV,IAAM9jQ,EAAM+jQ,EAAYl3R,KAAI,SAAAm3R,GAExB,IAAM/hS,EAAK;AAEX,OADAA,EAAGsgS,GAAkByB,EACd/hS;AAGX2/R,EAAczrR,IAAImtR,EAAKtjQ,IAhMnBikQ,CACI1B,EACAX,EACAK,EACAY,GAGA,OAAS1lR,EAGTykR,EAAczrR,IAjJP,SAiJoB8rR,EAA6B9kR,KAmJlD9c,EAlJcuhS,EAAct3R,IAAd,GAAAuP,OAAqBsD,IAkJhCuK,EAlJwCu6Q,EAA6B9kR,GAmJnFnZ,KAAKE,UAAU7D,KAAO2D,KAAKE,UAAUwjB,IAjJhCk6Q,EAAczrR,IAAd,GAAA0D,OAAqBsD,GAAO8kR,EAA6B9kR;UCnK1D,CACXwxJ,kCAAkC,EAClCu1H,6BAA6B,EAC7Bt8H,uBAAuB,EACvB79E,qBAAqB,EACrBo6M,gBAAgB,EAChBC,wBAAwB,EACxBC,YAAY,EACZC,0CAA0C,EAC1CC,iCAAiC,EACjCC,gBAAgB,EAChBC,gCAAgC,EAChCC,yBAAyB,EACzBC,sBAAsB,EACtBC,UAAU,EACVpzM,mBAAmB,EACnBqzM,yBAAyB,EACzBC,wBAAwB,EACxBC,uBAAuB,EACvBC,wDAAwD,EACxDC,8BAA8B,EAC9BC,uBAAuB,EACvBC,kCAAkC,EAClCC,0BAA0B,EAC1BC,iCAAiC,EACjCC,iCAAiC,EACjCC,oCAAoC,EACpCC,kCAAkC,EAClCC,8BAA8B,EAC9BC,0BAA0B,EAC1BC,kCAAkC,EAClCC,kCAAkC,EAClCC,qBAAqB,EACrBC,sBAAsB,EACtBzyE,uBAAuB,EACvB0yE,oCAAoC,EACpCC,4BAA4B,EAC5BC,yCAAyC,EACzCC,mBAAmB,EACnB96D,iBAAiB,EACjB+6D,yBAAyB,EACzBC,gBAAgB;aCzCM,CACtB,OACA,OACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,UACA,MACA,OACA;aAIsB,CACtB,MACA,MACA,OACA,OACA,MACA,OACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA;aAIsB,CACtB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,KACA,KACA,MACA,MACA,MACA,MACA,OACA,MACA;eAIwB,CAAC,MAAO,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,MAAO;WAG1D,CAAC;kBAGM,CAAC,MAAO,OAAQ,OAAQ;aAG7B,CAAC,OAAQ,kFCtFnC,SAASC,EAAe7wR,GACpB,IAAM8wR,EAAyBxzQ,MAAMoI,EAAE37B,OAAOqI,SAAS4qD;AAEvD,OAAQh9C,GACJ,IAAK,sCAML,IAAK,wCAML,IAAK,6CAED,QAAI8wR,GACOA,EAAuBn6P,SAASyuC,SAAS;AAGxD,QACI,OAAO,GAIZ,SAAS5Y,EAAQ9zD,EAAWsH,GAC/Bsd,MAAMgV,IAAImc,aAAa,cAAe/1C,GAAW,WAC7C,IAAM0X,EAAS1X,EAAUgtB,EAAE1lB;AACvBoQ,GACAA,EAAO8sC,uFAKZ,WAA+C,IAC9C6zO,EADqB15P,EAAyB54B,UAAAvT,OAAA,QAAAgG,IAAAuN,UAAA,GAAAA,UAAA,GAAjB6e,MAAOtd,EAAUvB,UAAAvT,OAAA,EAAAuT,UAAA,QAAAvN;AAElD,IACI6/R,EAASF,EAAe7wR,GAC1B,MAAO3V,GACL0mS,GAAS,EAGTA,GACAzzQ,MAAMgV,IAAIpC,MAAK,WACXs8B,EAAQn1B,EAAOr3B;AC/C3B,IAAMoxE,EAAc7gE,UAAU6gE,YAExB4/M,EAAkB1zQ,MAAM5oB,OAAOo6C,OAAO,CACxCykL,cAAe,KAEfg4B,WAHwC,SAG7B/sH,GACPt0I,KAAKqpO,cAAgB/0F,GAEzB2tH,oBANwC,WAOpC,IAAI3tH,EAAUt0I,KAAK4K,IAAI;AACvB,OAAgB,OAAZ0pI,GAAoBA,EAAQviG,YAAcuiG,EAAQyyJ,4BAC3CzyJ,EAAQqtH,sBAAsB,CAAEC,IAAK,2BAErC,IAAIxuO,MAAM0D,KAAKrmB,SAAQ,SAAUgB,EAASf,GAC7Cw2E,EAAY8/M,oBACR,SAAAlkP,GAAQ,OAAIrxC,EAAQqxC,MACpB,SAAAtrC,GAAK,OAAI9G,EAAO8G,UAMhCyvR,cApBwC,SAoB1BC,EAAqBC,EAAW/pR,GAC1C,OAAO8pE,EAAY+/M,cAAcC,EAAqBC,EAAW/pR,IAGrEgqR,WAxBwC,SAwB7BC,GACPngN,EAAYkgN,WAAWC,IAG3B7lC,uBA5BwC,WA6BpC,MAAO,gBAAiBn7O,WAG5B2gR,mBAhCwC,SAgCrB33L,EAASi4L,GACxB,OAAOpgN,EAAY8/M,mBAAmB33L,EAASi4L,QAIxCR;;;ICpCTS,aACF,SAAAA,EAAYnqR,iGAASk6O,CAAAt3P,KAAAunS,GACjBnqR,EAAUA,GAAW,GACrBpd,KAAKi/B,QAAU,gCACfj/B,KAAKwnS,OAASpqR,EAAQoqR,QAAU;kCAGpC,SAAO1xQ,EAAOQ,EAAOkC,GACjB,IAAMjvB,EAAG,GAAA4Q,OAAMna,KAAKi/B,QAAX,WACHnS,EAAO,CACT8Q,EAAG9H,EACH2xQ,QAASznS,KAAKwnS,OACdE,OAAQ,KACRtrR,IAAK,OACLka,MAAAA,EACAkC,OAAAA;AAEJ,OAAO,EAAAk8E,EAAA3hG,SAAQxJ,EAAK,CAAEujB,KAAAA,IAAQ3W,MAAK,SAAAmhB,GAAG,OAAK4K,MAAMC,QAAQ7K,EAAIxK,MAAQwK,EAAIxK,KAAO,4BAGpF,SAAOgJ,GACH,IAAMvsB,EAAG,GAAA4Q,OAAMna,KAAKi/B,QAAX,WACHnS,EAAO,CACTklC,IAAKl8B,EACL2xQ,QAASznS,KAAKwnS;AAElB,OAAO,EAAA9yL,EAAA3hG,SAAQxJ,EAAK,CAAEujB,KAAAA,IAAQ3W,MAAK,SAAAmhB,GAAG,OAAIA,GAAOA,EAAIxK,gDAI9C,IAAIy6Q,EAAM;;AClCzB,MAmIe,CAAEI,UAnIC,CACd,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAIwBC,aAFP,CAAC,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK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","file":"connections-ui.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\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    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\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 ('getDisplayMedia' in window.navigator) {\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    navigator.getDisplayMedia = function(constraints) {\n      return getSourceId(constraints)\n        .then(function(sourceId) {\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: constraints.video.frameRate || 3\n            }\n          };\n          return navigator.mediaDevices.getUserMedia(constraints);\n        });\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};\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 ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    navigator.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 navigator.mediaDevices.getUserMedia(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 Ember from 'ember';\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';\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: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    defaultSerializer: 'application',\n\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\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 = Ember.String.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        Ember.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 Ember.RSVP.reject(new Error('old style search has been removed. Please update to new search'));\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2();\n    },\n\n    findFavoritesPublicApiV2() {\n        const url = this.get('application').pcV2Uri('api/v2/users/favorites');\n        const deferred = Ember.RSVP.defer();\n        this._findFavoritesPublicApiV2(url)\n            .then(res => {\n                this._handleFavorites(res, [], deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error trying to find favorites:', error);\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    _findFavoritesPublicApiV2(url, page = 1) {\n        return this.ajax(url, 'GET', {\n            data: {\n                pageNumber: page,\n                pageSize: 25\n            },\n            cache: false\n        });\n    },\n\n    _handleFavorites(data, collection, deferred, url) {\n        const results = data.entities;\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = collection.concat(results);\n\n        const nextPage = data.page + 1;\n        return this._findFavoritesPublicApiV2(url, nextPage)\n            .then(data => {\n                return this._handleFavorites(data, collection, deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading favorites:', {\n                    error,\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.get('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 = Ember.RSVP.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.get('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 Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\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.get('host')}/${this.get('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 Ember from 'ember';\nimport ApplicationAdapter from './application';\nimport moment from '../utils/dates';\nimport _ from 'lodash';\n\nconst {\n    inject: { service }\n} = Ember;\n\nexport default ApplicationAdapter.extend({\n    session: service(),\n    application: service(),\n\n    useExternalContactExpand: true,\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        if (query.findLatestCalls) {\n            return this._fetchLatestCalls(...arguments);\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 Ember.RSVP.resolve([]);\n        }\n        const data = {\n            interval: `${moment().subtract(2, 'hours').toISOString()}/${moment().add(2, '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 Ember.RSVP.resolve([]);\n        }\n        const queryDefaults = this.get('queryDefaults');\n        const meta = _.merge(queryDefaults, query);\n        const paging = this.get('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        if (this.get('useExternalContactExpand')) {\n            return this.get('application').pcUri('api/v2/conversations/calls/history?expand=externalcontact');\n        }\n        return this.get('application').pcUri('api/v2/conversations/calls/history');\n    }\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nexport default ApplicationAdapter.extend({\n    findAll() {\n        return Ember.RSVP.resolve({\n            entities: [],\n            pageSize: 0,\n            pageNumber: 1,\n            total: 0,\n            firstUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            lastUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            selfUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            pageCount: 0\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    namespace: 'api/v2/authorization',\n    host: computed.reads('application.purecloudV2BaseUri'),\n    divisionLimit: null,\n\n    pathForType(modelName) {\n        return pluralize(modelName);\n    },\n\n    // custom findAll method sets pageSize equal to division limit\n    findAll(store, type, sinceToken, snapshotRecordArray) {\n        let objectCount = Ember.get(snapshotRecordArray, 'adapterOptions.objectCount');\n        let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n        const limitPath = 'api/v2/authorization/divisions/limit';\n        const limitUrl = this.get('application').pcV2Uri(limitPath);\n        return Ember.RSVP.resolve(\n            this.get('divisionLimit') ||\n                Ember.$.ajax({\n                    type: 'GET',\n                    url: limitUrl\n                })\n        ).then(divisionLimit => {\n            this.set('divisionLimit', divisionLimit);\n            return this.ajax(url, 'GET', {\n                data: {\n                    pageSize: divisionLimit,\n                    objectCount: objectCount ? true : false\n                }\n            });\n        });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nimport { addPageAction } from 'connections-ui/utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nconst { computed, inject } = Ember;\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 = 'connections-ui';\n\nexport default PurecloudAdapter.extend(LoggerMixin, RelateFeaturesMixin, {\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    relate: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n\n    namespace: 'api/v2',\n\n    defaultSerializer: 'externalcontacts/contact',\n\n    pathForType: function () {\n        return 'externalcontacts/contacts';\n    },\n\n    cannotViewExternalContacts: computed.not('permissions.hasExternalContactsViewContactAccess'),\n\n    createRecord(store, type, record) {\n        this.get('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 = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const addressFormat = this.get('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.get('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 Ember.RSVP.resolve({});\n        }\n\n        if (queryParams.useLookupService) {\n            // Use the \"reverse whitepages\" search endpoint\n            url = this.get('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.get('logger').error(\n                        `ACD: Attempted to send query larger than limit. From: ${originator} `,\n                        error\n                    );\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.get('relate').findMatchingExternalContacts(\n                searchTerm,\n                pageNumber,\n                pageSize,\n                expandField,\n                originator\n            );\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nconst EXPAND = 'externalDataSources';\n\nconst TIME_OUT = 10000;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend({\n    relate: Ember.inject.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.get('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 = `?${Ember.$.param({ expand: EXPAND })}`;\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.get('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.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n\n    urlForFindRecord() {\n        return this.get('application').pcV2Uri(`api/v2/geolocations/settings`);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\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 Ember.RSVP.resolve();\n        }\n\n        return this.ajax(url, 'PATCH', { data: data });\n    },\n\n    urlForUpdateRecord(id) {\n        return this.get('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 Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    createRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            dataType: 'text'\n        });\n    },\n\n    deleteRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'DELETE');\n    },\n\n    saveBulk(roleId, subjectIds, divisionIds) {\n        const path = `api/v2/authorization/roles/${roleId}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            data: {\n                subjectIds,\n                divisionIds\n            }\n        });\n    },\n\n    ajaxOptions(url, type, options) {\n        // get the default RESTAdapter 'ajaxOptions'\n        let hash = this._super(url, type, options);\n        if (type === 'DELETE' || type === 'POST') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    ajaxSuccess(jqXHR, data) {\n        if (typeof data === 'string') {\n            // return an empty object so the Serializer\n            // handles it correctly\n            return {};\n        } else {\n            return data;\n        }\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: `api/v2`,\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.get('host')}/${this.get('namespace')}/voicemail/groups/${guid}/policy`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n    store: Ember.inject.service(),\n\n    buildQuery() {\n        return {\n            fl: '*'\n        };\n    },\n\n    baseUrl() {\n        return this.get('application').pcV2Uri('api/v2/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.get('application').pcV2Uri('api/v2/profiles/groups');\n    },\n\n    urlForDeleteRecord(id) {\n        return `${this.baseUrl()}/${id}`;\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.get('store')\n                .findRecord('group-policy', data.group.guid)\n                .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        const hash = this._super(...arguments);\n        // Our apis are silly...\n        if (type && type.toLowerCase() === 'delete') {\n            hash.dataType = 'text';\n        }\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 Ember.RSVP.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 Ember.RSVP.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 PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/responsemanagement/libraries';\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { BASE_LOCATION_FIELDS } from '../models/location';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            expand: BASE_LOCATION_FIELDS.join(',')\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('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 Ember.RSVP.hash({\n            location: this.ajax(url, 'GET', { data: query }),\n            floors: this.ajax(this.urlForHasMany(id), 'GET', { data: query }).catch(() => Ember.RSVP.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        Ember.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 Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    urlForFindAll() {\n        const userId = this.get('session.person.guid');\n        return `${this.get('host')}/${this.get('namespace')}/users/${userId}/meetings`;\n    },\n\n    urlForFindRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (meeting) {\n            const meetingId = meeting.id;\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n    },\n\n    urlForQuery() {\n        return this.urlForFindAll();\n    },\n\n    urlForUpdateRecord(id, modelName, snapshot) {\n        if (!!Ember.get(snapshot, 'adapterOptions.updateSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n        const meetingId = snapshot.attr('meeting').id;\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    },\n\n    urlForCreateRecord() {\n        return `${this.get('host')}/${this.get('namespace')}/meetings`;\n    },\n\n    urlForDeleteRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (!meeting) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n\n        const meetingId = meeting.id;\n        if (!!Ember.get(snapshot, 'adapterOptions.deleteSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nimport { batchEntityIds } from '../services/store';\nimport { BASE_PERSON } from '../models/person';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    ajaxService: inject.service('ajax'),\n    session: inject.service(),\n    application: inject.service(),\n    integrationsPresenceSvc: inject.service('integrations-presence'),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('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.get('host')}/${this.get('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        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\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.ajax(url, 'GET', { 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        Ember.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 Ember.RSVP.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 Ember.RSVP.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            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\n                    .then(({ response }) => Ember.RSVP.resolve(response))\n                    .catch(({ response }) => Ember.RSVP.reject(response));\n            } else {\n                return this.ajax(url, 'GET', {\n                    data: requestData\n                });\n            }\n        });\n        return Ember.RSVP.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.get('host')}/${this.get('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 Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\nconst { computed, inject } = Ember;\n\nexport default PurecloudAdapter.extend({\n    session: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    host: computed.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.get('host')}/${this.namespace}/users/search/conversation/target`;\n        } else {\n            return `${this.get('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.get('host') ? this.get('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 PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    defaultSerializer: 'purecloud',\n\n    host: '/platform',\n    namespace: 'api',\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        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.get('namespace')}/${this.pathForType(modelName)}${objId}`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return url;\n    },\n\n    updateRecord(store, type, record) {\n        var data = this.serialize(record, {\n            includeId: true\n        });\n        var id = Ember.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 = Ember.get(record, 'id');\n        const url = this.buildURL(type.modelName, id);\n        return this.ajax(url, 'DELETE', { dataType: 'text' });\n    }\n});\n","import Ember from 'ember';\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\nconst { inject, computed, RSVP } = Ember;\n\nexport default PurecloudAdapter.extend({\n    application: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    host: computed.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        query.name = query.name ? query.name.toLowerCase() : '';\n\n        if (query.divisionAgnostic) {\n            path = this.buildURL('divisionAgnostic');\n            delete query.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 query.divisionAgnostic;\n        }\n\n        if (query.myQueuesOnly) {\n            path = `${this.buildURL('myQueues')}`;\n            fetchDivisions = false;\n        }\n\n        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                query.divisionId = divisionIds.join(',');\n            }\n        }\n\n        return this.ajax(path, 'GET', { data: query });\n    },\n\n    getDivisionLimits() {\n        const url = this.get('application').pcV2Uri(DIVISION_LIMIT_URL);\n        return RSVP.resolve(this.get('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.get('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","define(\"connections-ui/adapters/recording\", [\"exports\", \"ember-purecloud-components/adapters/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import PurecloudAdapter from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudAdapter.extend({\n    defaultSerializer: 'response',\n\n    pathForType: function () {\n        return 'v2/responsemanagement/responses';\n    },\n\n    query: function (store, type, query) {\n        return this.ajax(`${this.buildURL(type)}/query`, 'POST', { data: query });\n    },\n\n    findMany: function (store, type, ids, pageNumber, pageSize) {\n        const currentPage = pageNumber || 1,\n            currentPageSize = pageSize || 25;\n\n        const query = {\n            pageSize: currentPageSize,\n            pageNumber: currentPage,\n            libraryId: _.head(ids)\n        };\n\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default ApplicationAdapter.extend({\n    application: inject.service(),\n\n    buildURL(type, id) {\n        const modelEndpoint = this.pathForType(type);\n        const path = `api/v2/authorization/${modelEndpoint}` + id ? `/${id}` : '';\n        return this.get('application').pcV2Uri(path);\n    },\n\n    findAll() {\n        const initialPage = 1;\n        const pageSize = 100;\n        let records = [];\n        let aggregatePayload;\n        return this._getPage(initialPage, pageSize)\n            .then(result => {\n                aggregatePayload = result;\n                records.concat(result.entities);\n                let promises = [];\n                for (let page = 2; page <= result.pageCount; page++) {\n                    promises.push(this._getPage(page, pageSize));\n                }\n                return Ember.RSVP.all(promises);\n            })\n            .then(results => {\n                results.forEach(result => {\n                    aggregatePayload.entities = aggregatePayload.entities.concat(result.entities);\n                });\n                aggregatePayload.entities.sort(function (roleA, roleB) {\n                    if (roleA.name < roleB.name) {\n                        return -1;\n                    } else if (roleA.name > roleB.name) {\n                        return 1;\n                    } else {\n                        return 0;\n                    }\n                });\n                return aggregatePayload;\n            });\n    },\n\n    _getPage(pageNumber, pageSize) {\n        const path = `api/v2/authorization/roles?pageSize=${pageSize}&pageNumber=${pageNumber}&userCount=false`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'GET');\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 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 _ from 'lodash';\n\nimport { registerElements } from 'genesys-spark-components';\nregisterElements();\n\n// Polyfills for iframe-coordinator\nimport 'custom-event-polyfill/polyfill';\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/dist/loader';\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    Ember.run.backburner.DEBUG = true;\n}\n\nif (config.APP && config.APP.LOG_BINDINGS) {\n    Ember.LOG_BINDINGS = true;\n}\n\nconst { inject, Application } = Ember;\n\n// allows ember concurrency tasks to use withTestWaiter()\ndefineModifier();\n\nconst App = Application.extend(config.APP, {\n    cookies: inject.service('cookies'),\n    stashLogger: inject.service('stash-logger'),\n    applicationService: inject.service('application'),\n    customEvents: {\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    },\n\n    modulePrefix: config.modulePrefix,\n    podModulePrefix: config.podModulePrefix,\n    Resolver,\n\n    engines: {\n        emberEngineCustomFields: {\n            dependencies: {\n                services: [\n                    'application',\n                    'intl',\n                    'session',\n                    'stash-logger',\n                    'ajax',\n                    'store',\n                    'notification',\n                    'permissions',\n                    'schema'\n                ],\n                externalRoutes: {\n                    personDetail: 'person.detail',\n                    admin: 'admin'\n                }\n            }\n        }\n    },\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: Ember.computed('session.person.id', function () {\n        var proxyPersonId = this.get('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.get('semver'));\n\n        if (!Ember.ENV.LOG_VERSION) {\n            Ember.Logger.debug('PureCloud Collaborate', this.get('semver'));\n        }\n\n        const libs = this.libs || {};\n        _.forOwn(libs, (version, key) => {\n            Ember.libraries.register(key, version);\n            if (!Ember.ENV.LOG_VERSION) {\n                Ember.Logger.debug(key, version);\n            }\n        });\n    },\n\n    initContext() {\n        this.set('context', 'directory');\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","export default Ember.HTMLBars.template({\"id\":\"d+F87FRd\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"application-loading\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/application-loading/template.hbs\"}});","define(\"connections-ui/attach-media-stream/util\", [\"exports\", \"ember-webrtc-components/attach-media-stream/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _util.default;\n    }\n  });\n});\n","define(\"connections-ui/audio-visualizer/component\", [\"exports\", \"ember-audio-visualizer/components/audio-visualizer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Base from 'ember-simple-auth/authenticators/base';\nimport _ from 'lodash';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from '../services/session';\nimport { Client } from '@genesys/gc-mfe-auth';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { RSVP } = Ember;\n\nconst authLoginPath = '/oauth/authorize';\nconst oauthStoreParams = ['access_token', 'token_type', 'expires_in'];\nconst oauthStoreProps = [...oauthStoreParams, 'token_expiry_time_millis', 'token_expiry_time_iso_string'];\nconst authLogoutPath = '/logout';\n\nconst AUTH_COOKIE_NAME = 'ININ-Auth-Api';\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    cookies: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    purecloudOauth: Ember.inject.service(),\n    applicationService: Ember.inject.service('application'),\n\n    authClient: null,\n\n    // Check existing authentication\n    async restore(data) {\n        if (window === window.parent) {\n            // Not in an iframe. For the standalone mode for development.\n            var accessToken = null;\n            if (data && typeof data === 'object') {\n                accessToken = data.access_token;\n            }\n\n            if (!accessToken) {\n                throw new Error('No token');\n            } else {\n                await this._establishLocalSession(accessToken);\n                await _.pick(data, oauthStoreProps);\n            }\n        } else {\n            // In an iframe, in WebDirectory?\n            if (!this.authClient) {\n                const clientId = this.get('oauthProps.clientId');\n                this.authClient = new Client(clientId);\n            }\n\n            data.token_type = 'bearer';\n            try {\n                data.access_token = await this.authClient.getToken(); // Get the token from the host.\n            } catch (error) {\n                this.get('stashLogger').error(\n                    `Unable to get token from host iframe: ${error && error.message ? error.message : '?'}`\n                );\n                addPageAction('sessionBootstrapFailure', {\n                    failedStep: 'getTokenFailure'\n                });\n                throw error;\n            }\n            await this._establishLocalSession(data.access_token);\n            await _.pick(data, oauthStoreProps);\n        }\n    },\n\n    // Attempt user authentication\n    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.get('purecloudOauth').deserializeRestoreState(options.state);\n                        }\n\n                        /* pick oauth props from the url */\n                        const finalOptions = _.pick(options, oauthStoreParams);\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 (reason && reason.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\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 authUrl = this._buildAuthUrl(true, options ? options.state : undefined);\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                const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n                if (authorizer) {\n                    authorizer.deauthorizeAllDomainRequests();\n                }\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        this.get('cookies').clear(this.get('application.cookies.session'));\n    },\n\n    _establishLocalSession(accessToken) {\n        if (this.localSessionDeferred) {\n            return this.localSessionDeferred.promise;\n        }\n\n        this.localSessionDeferred = RSVP.defer();\n\n        const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n        if (authorizer) {\n            authorizer.authorizeAllDomainRequests({ access_token: accessToken });\n        } else {\n            Ember.Logger.error('Failed to locate authorizer in container');\n            this.localSessionDeferred.reject('missingAuthorizer');\n        }\n\n        this.set('session.accessToken', accessToken);\n        this.get('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                    Ember.Logger.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 ||\n                    (!details.legacyInvalidSessionToken && details.status !== 403)\n                ) {\n                    await this.ensureLogsSent();\n                }\n\n                this.set('session.hasAppAccess', false);\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n\n                authorizer.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.features.disassociate-redux')) {\n                    return this.get('ajax').ajaxGet('/api/v1/logout', { dataType: 'text' });\n                }\n            })\n            .finally(() => {\n                this.set('session.accessToken', 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\n        let redirectUri = window.location.origin;\n        if (!redirectUri) {\n            redirectUri = `${window.location.protocol}//${window.location.host}`;\n        }\n\n        /*\n         * Force pathname to include a trailing slash.  If not, safari will not\n         * recognize the hash params in the redirect.\n         *\n         * Good:                                   Bad:\n         * https://foo.com/#access_token=...       https://foo.com#access_token=...\n         * https://foo.com/bar/#access_token=...   https://foo.com/bar#access_token=...\n         *\n         * http://stackoverflow.com/questions/18663410/safari-ignoring-removing-hashatags-when-clicking-hyperlinks\n         * https://bugs.webkit.org/show_bug.cgi?id=24175\n         */\n        let pathname = window.location.pathname;\n        const lastIndex = pathname.length - 1;\n\n        if (lastIndex >= 0 && pathname.charAt(lastIndex) !== '/') {\n            pathname += '/';\n        }\n        redirectUri += pathname;\n        oauthParams.redirect_uri = redirectUri;\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 ? authLoginPath : authLogoutPath;\n\n        if (authUrl.indexOf('?') === -1) {\n            authUrl += '?';\n        } else {\n            authUrl += '&';\n        }\n\n        authUrl += Ember.$.param(oauthParams, true);\n\n        return authUrl;\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.get('cookies');\n        // Clean up any previously-set, now invalid cookies\n        cookies.clear(AUTH_COOKIE_NAME);\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/' });\n        cookies.clear(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.get('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","import Ember from 'ember';\nimport DirectoryAuthenticator from './directory';\n\nconst { RSVP } = Ember;\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 Ember from 'ember';\nimport netUtils from '../utils/net';\nimport config from '../config/environment';\nimport Base from 'ember-simple-auth/authorizers/base';\nimport _ from 'lodash';\nimport { isUnauthorizedError } from 'ember-ajax/errors';\nimport { REQUEST_TELEMETRY_APP_SUBSECTIONS } from 'connections-ui/services/ajax';\n\nconst HASH_LENGTH_LIMIT = 4976;\n\nconst SEMVER_PARSER = /^([^\\+]+)\\+(\\d+)-(.+)-([a-zA-Z0-9]+)$/;\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _authData: null,\n    _ajaxPrefilters: null,\n    _ajaxErrors: null,\n\n    appContextHeaderTokens: Ember.computed(\n        'application.semver',\n        'application.hostedContext.isHostedProp',\n        'application.isPopout',\n        function () {\n            // This is similar to our service name, directory-webui, with the `-`\n            // replaced by `_` since PAPI enums use java identifiers and can't include dashes.\n            const headerTokens = ['connections-ui-webui'];\n\n            // web-dir version\n            const semver = this.get('application.semver');\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().replaceAll('-', '_'))\n                            .filter(curr => curr)\n                            .join('-')\n                    );\n                } else {\n                    // Dev/Unparsable semver - just use it as is and truncated to 25 chars\n                    headerTokens.push(semver.trim().slice(0, 25));\n                }\n            }\n\n            // Desktop vs Browser\n            const isHosted = this.get('application.hostedContext.isHostedProp');\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 (this.get('application.isPopout')) {\n                headerTokens.push('popout');\n            }\n\n            return headerTokens;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this._ajaxPrefilters = $.Callbacks();\n        Ember.$.ajaxPrefilter('+*', this._ajaxPrefilters.fire);\n        this._ajaxErrors = $.Callbacks();\n        Ember.$(document).ajaxError(this._ajaxErrors.fire);\n    },\n\n    authorize: function (authData, fnToAuthorize) {\n        if (authData && authData.access_token) {\n            fnToAuthorize(this._buildHeaders(authData));\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(Ember.run.bind(this, '_handleUnauthorizedRequests'));\n    },\n\n    deauthorizeAllDomainRequests: function () {\n        this.set('_authData', null);\n\n        this._ajaxPrefilters.empty();\n        this._ajaxErrors.empty();\n    },\n\n    _addHeadersPrefilter(options, original, jqXHR) {\n        if (!options.crossDomain || this._isWhitelistedUrl(options.url) || this._isAbsPathOfProxiedEnv(options.url)) {\n            const excludeAuthHeader = this.isFaxUpload(options.url) || options.noAuthorizationHeader;\n            const headers = this._buildHeaders(this.get('_authData'));\n\n            if (excludeAuthHeader && headers.Authorization) {\n                // fax or others 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.get('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.get('logger').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.get('logger').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            jqXHR.setRequestHeader('Genesys-App', headerTokens.map(curr => curr.trim().replaceAll('/', '_')).join('/'));\n        }\n    },\n\n    _isWhitelistedUrl(url) {\n        return !!url && url.indexOf(this.get('application.purecloudV2BaseUri')) === 0;\n    },\n\n    _isGcPublicApiUrl(url) {\n        if (!url) {\n            return false;\n        }\n\n        const pubApiBase = this.get('application.purecloudV2BaseUri');\n        const pubApiProxyBase = this.get('application.purecloudBaseUri');\n        return [pubApiBase, pubApiProxyBase].some(currBase => {\n            return currBase && typeof currBase === 'string' && url.indexOf(currBase) === 0;\n        });\n    },\n\n    isFaxUpload(url) {\n        return !!url && url.indexOf('fax-uploads') > -1;\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('application.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    _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.get('session').invalidate({\n                    unauthorized: true\n                });\n            });\n        }\n    },\n\n    _buildHeaders(authData) {\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        if (authData && authData.access_token) {\n            headers['Authorization'] = `bearer ${authData.access_token}`;\n        }\n\n        /* eslint-enable dot-notation */\n        return headers;\n    },\n\n    _handleClientUnauthorizedError(clientId) {\n        let msg = `${clientId} reported invalid 401 event. Not logout will be triggered.`;\n        return this._sendErrorMessage({ message: msg }).catch(error => {\n            // Checking if the session is actually invalid.\n            if (isUnauthorizedError(error)) {\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            }\n        });\n    },\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        // Don't log to sumo in dev mode\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const correlationId = xhr.getResponseHeader('inin-correlation-id');\n\n        const data = JSON.stringify({\n            message,\n            correlationId\n        });\n\n        return this._sendErrorMessage(data);\n    },\n\n    _sendErrorMessage(messageData) {\n        const url = this.get('application').pcV2Uri('api/v2/diagnostics/trace');\n        return this.get('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: 'connections-ui-webui',\n                    appVersion: this.get('version')\n                },\n                traces: [\n                    {\n                        level: 'ERROR',\n                        time: new Date().toString(),\n                        message: messageData,\n                        topic: 'connections-ui.service:session'\n                    }\n                ]\n            })\n        });\n    }\n});\n","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ar\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n,n100=t0&&s[0].slice(-2);if(ord)return\"other\";return n==0?\"zero\":n==1?\"one\":n==2?\"two\":n100>=3&&n100<=10?\"few\":n100>=11&&n100<=99?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"السنة\",\"relative\":{\"0\":\"السنة الحالية\",\"1\":\"السنة التالية\",\"-1\":\"السنة الماضية\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} سنة\",\"one\":\"خلال سنة واحدة\",\"two\":\"خلال سنتين\",\"few\":\"خلال {0} سنوات\",\"many\":\"خلال {0} سنة\",\"other\":\"خلال {0} سنة\"},\"past\":{\"zero\":\"قبل {0} سنة\",\"one\":\"قبل سنة واحدة\",\"two\":\"قبل سنتين\",\"few\":\"قبل {0} سنوات\",\"many\":\"قبل {0} سنة\",\"other\":\"قبل {0} سنة\"}}},\"month\":{\"displayName\":\"الشهر\",\"relative\":{\"0\":\"هذا الشهر\",\"1\":\"الشهر التالي\",\"-1\":\"الشهر الماضي\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} شهر\",\"one\":\"خلال شهر واحد\",\"two\":\"خلال شهرين\",\"few\":\"خلال {0} أشهر\",\"many\":\"خلال {0} شهرًا\",\"other\":\"خلال {0} شهر\"},\"past\":{\"zero\":\"قبل {0} شهر\",\"one\":\"قبل شهر واحد\",\"two\":\"قبل شهرين\",\"few\":\"قبل {0} أشهر\",\"many\":\"قبل {0} شهرًا\",\"other\":\"قبل {0} شهر\"}}},\"day\":{\"displayName\":\"يوم\",\"relative\":{\"0\":\"اليوم\",\"1\":\"غدًا\",\"2\":\"بعد الغد\",\"-2\":\"أول أمس\",\"-1\":\"أمس\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} يوم\",\"one\":\"خلال يوم واحد\",\"two\":\"خلال يومين\",\"few\":\"خلال {0} أيام\",\"many\":\"خلال {0} يومًا\",\"other\":\"خلال {0} يوم\"},\"past\":{\"zero\":\"قبل {0} يوم\",\"one\":\"قبل يوم واحد\",\"two\":\"قبل يومين\",\"few\":\"قبل {0} أيام\",\"many\":\"قبل {0} يومًا\",\"other\":\"قبل {0} يوم\"}}},\"hour\":{\"displayName\":\"الساعات\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ساعة\",\"one\":\"خلال ساعة واحدة\",\"two\":\"خلال ساعتين\",\"few\":\"خلال {0} ساعات\",\"many\":\"خلال {0} ساعة\",\"other\":\"خلال {0} ساعة\"},\"past\":{\"zero\":\"قبل {0} ساعة\",\"one\":\"قبل ساعة واحدة\",\"two\":\"قبل ساعتين\",\"few\":\"قبل {0} ساعات\",\"many\":\"قبل {0} ساعة\",\"other\":\"قبل {0} ساعة\"}}},\"minute\":{\"displayName\":\"الدقائق\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} دقيقة\",\"one\":\"خلال دقيقة واحدة\",\"two\":\"خلال دقيقتين\",\"few\":\"خلال {0} دقائق\",\"many\":\"خلال {0} دقيقة\",\"other\":\"خلال {0} دقيقة\"},\"past\":{\"zero\":\"قبل {0} دقيقة\",\"one\":\"قبل دقيقة واحدة\",\"two\":\"قبل دقيقتين\",\"few\":\"قبل {0} دقائق\",\"many\":\"قبل {0} دقيقة\",\"other\":\"قبل {0} دقيقة\"}}},\"second\":{\"displayName\":\"الثواني\",\"relative\":{\"0\":\"الآن\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ثانية\",\"one\":\"خلال ثانية واحدة\",\"two\":\"خلال ثانيتين\",\"few\":\"خلال {0} ثوانِ\",\"many\":\"خلال {0} ثانية\",\"other\":\"خلال {0} ثانية\"},\"past\":{\"zero\":\"قبل {0} ثانية\",\"one\":\"قبل ثانية واحدة\",\"two\":\"قبل ثانيتين\",\"few\":\"قبل {0} ثوانِ\",\"many\":\"قبل {0} ثانية\",\"other\":\"قبل {0} ثانية\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"cs\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":i>=2&&i<=4&&v0?\"few\":!v0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"tento rok\",\"1\":\"příští rok\",\"-1\":\"minulý rok\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} roky\",\"many\":\"za {0} roku\",\"other\":\"za {0} let\"},\"past\":{\"one\":\"před {0} rokem\",\"few\":\"před {0} lety\",\"many\":\"před {0} rokem\",\"other\":\"před {0} lety\"}}},\"month\":{\"displayName\":\"měsíc\",\"relative\":{\"0\":\"tento měsíc\",\"1\":\"příští měsíc\",\"-1\":\"minulý měsíc\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} měsíc\",\"few\":\"za {0} měsíce\",\"many\":\"za {0} měsíce\",\"other\":\"za {0} měsíců\"},\"past\":{\"one\":\"před {0} měsícem\",\"few\":\"před {0} měsíci\",\"many\":\"před {0} měsícem\",\"other\":\"před {0} měsíci\"}}},\"day\":{\"displayName\":\"den\",\"relative\":{\"0\":\"dnes\",\"1\":\"zítra\",\"2\":\"pozítří\",\"-2\":\"předevčírem\",\"-1\":\"včera\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} den\",\"few\":\"za {0} dny\",\"many\":\"za {0} dne\",\"other\":\"za {0} dní\"},\"past\":{\"one\":\"před {0} dnem\",\"few\":\"před {0} dny\",\"many\":\"před {0} dnem\",\"other\":\"před {0} dny\"}}},\"hour\":{\"displayName\":\"hodina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} hodinu\",\"few\":\"za {0} hodiny\",\"many\":\"za {0} hodiny\",\"other\":\"za {0} hodin\"},\"past\":{\"one\":\"před {0} hodinou\",\"few\":\"před {0} hodinami\",\"many\":\"před {0} hodinou\",\"other\":\"před {0} hodinami\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutu\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minuty\",\"other\":\"za {0} minut\"},\"past\":{\"one\":\"před {0} minutou\",\"few\":\"před {0} minutami\",\"many\":\"před {0} minutou\",\"other\":\"před {0} minutami\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"nyní\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundu\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekundy\",\"other\":\"za {0} sekund\"},\"past\":{\"one\":\"před {0} sekundou\",\"few\":\"před {0} sekundami\",\"many\":\"před {0} sekundou\",\"other\":\"před {0} sekundami\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"da\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],t0=Number(s[0])==n;if(ord)return\"other\";return n==1||!t0&&(i==0||i==1)?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"næste år\",\"-1\":\"sidste år\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"for {0} år siden\",\"other\":\"for {0} år siden\"}}},\"month\":{\"displayName\":\"måned\",\"relative\":{\"0\":\"denne måned\",\"1\":\"næste måned\",\"-1\":\"sidste måned\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} måned\",\"other\":\"om {0} måneder\"},\"past\":{\"one\":\"for {0} måned siden\",\"other\":\"for {0} måneder siden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgen\",\"2\":\"i overmorgen\",\"-2\":\"i forgårs\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dage\"},\"past\":{\"one\":\"for {0} dag siden\",\"other\":\"for {0} dage siden\"}}},\"hour\":{\"displayName\":\"time\",\"relativeTime\":{\"future\":{\"one\":\"om {0} time\",\"other\":\"om {0} timer\"},\"past\":{\"one\":\"for {0} time siden\",\"other\":\"for {0} timer siden\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minutter\"},\"past\":{\"one\":\"for {0} minut siden\",\"other\":\"for {0} minutter siden\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"for {0} sekund siden\",\"other\":\"for {0} sekunder siden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"de\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Jahr\",\"relative\":{\"0\":\"dieses Jahr\",\"1\":\"nächstes Jahr\",\"-1\":\"letztes Jahr\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Jahr\",\"other\":\"in {0} Jahren\"},\"past\":{\"one\":\"vor {0} Jahr\",\"other\":\"vor {0} Jahren\"}}},\"month\":{\"displayName\":\"Monat\",\"relative\":{\"0\":\"diesen Monat\",\"1\":\"nächsten Monat\",\"-1\":\"letzten Monat\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Monat\",\"other\":\"in {0} Monaten\"},\"past\":{\"one\":\"vor {0} Monat\",\"other\":\"vor {0} Monaten\"}}},\"day\":{\"displayName\":\"Tag\",\"relative\":{\"0\":\"heute\",\"1\":\"morgen\",\"2\":\"übermorgen\",\"-2\":\"vorgestern\",\"-1\":\"gestern\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Tag\",\"other\":\"in {0} Tagen\"},\"past\":{\"one\":\"vor {0} Tag\",\"other\":\"vor {0} Tagen\"}}},\"hour\":{\"displayName\":\"Stunde\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Stunde\",\"other\":\"in {0} Stunden\"},\"past\":{\"one\":\"vor {0} Stunde\",\"other\":\"vor {0} Stunden\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Minute\",\"other\":\"in {0} Minuten\"},\"past\":{\"one\":\"vor {0} Minute\",\"other\":\"vor {0} Minuten\"}}},\"second\":{\"displayName\":\"Sekunde\",\"relative\":{\"0\":\"jetzt\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Sekunde\",\"other\":\"in {0} Sekunden\"},\"past\":{\"one\":\"vor {0} Sekunde\",\"other\":\"vor {0} Sekunden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"en-US\",\"parentLocale\":\"en\"},{\"locale\":\"en\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?\"one\":n10==2&&n100!=12?\"two\":n10==3&&n100!=13?\"few\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} year\",\"other\":\"in {0} years\"},\"past\":{\"one\":\"{0} year ago\",\"other\":\"{0} years ago\"}}},\"month\":{\"displayName\":\"month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} month\",\"other\":\"in {0} months\"},\"past\":{\"one\":\"{0} month ago\",\"other\":\"{0} months ago\"}}},\"day\":{\"displayName\":\"day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} day\",\"other\":\"in {0} days\"},\"past\":{\"one\":\"{0} day ago\",\"other\":\"{0} days ago\"}}},\"hour\":{\"displayName\":\"hour\",\"relativeTime\":{\"future\":{\"one\":\"in {0} hour\",\"other\":\"in {0} hours\"},\"past\":{\"one\":\"{0} hour ago\",\"other\":\"{0} hours ago\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} minute\",\"other\":\"in {0} minutes\"},\"past\":{\"one\":\"{0} minute ago\",\"other\":\"{0} minutes ago\"}}},\"second\":{\"displayName\":\"second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} second\",\"other\":\"in {0} seconds\"},\"past\":{\"one\":\"{0} second ago\",\"other\":\"{0} seconds ago\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"es\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"año\",\"relative\":{\"0\":\"este año\",\"1\":\"el próximo año\",\"-1\":\"el año pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} año\",\"other\":\"dentro de {0} años\"},\"past\":{\"one\":\"hace {0} año\",\"other\":\"hace {0} años\"}}},\"month\":{\"displayName\":\"mes\",\"relative\":{\"0\":\"este mes\",\"1\":\"el próximo mes\",\"-1\":\"el mes pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mes\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"hace {0} mes\",\"other\":\"hace {0} meses\"}}},\"day\":{\"displayName\":\"día\",\"relative\":{\"0\":\"hoy\",\"1\":\"mañana\",\"2\":\"pasado mañana\",\"-2\":\"anteayer\",\"-1\":\"ayer\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} día\",\"other\":\"dentro de {0} días\"},\"past\":{\"one\":\"hace {0} día\",\"other\":\"hace {0} días\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"hace {0} hora\",\"other\":\"hace {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"hace {0} minuto\",\"other\":\"hace {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"ahora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"hace {0} segundo\",\"other\":\"hace {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fi\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"vuosi\",\"relative\":{\"0\":\"tänä vuonna\",\"1\":\"ensi vuonna\",\"-1\":\"viime vuonna\"},\"relativeTime\":{\"future\":{\"one\":\"{0} vuoden päästä\",\"other\":\"{0} vuoden päästä\"},\"past\":{\"one\":\"{0} vuosi sitten\",\"other\":\"{0} vuotta sitten\"}}},\"month\":{\"displayName\":\"kuukausi\",\"relative\":{\"0\":\"tässä kuussa\",\"1\":\"ensi kuussa\",\"-1\":\"viime kuussa\"},\"relativeTime\":{\"future\":{\"one\":\"{0} kuukauden päästä\",\"other\":\"{0} kuukauden päästä\"},\"past\":{\"one\":\"{0} kuukausi sitten\",\"other\":\"{0} kuukautta sitten\"}}},\"day\":{\"displayName\":\"päivä\",\"relative\":{\"0\":\"tänään\",\"1\":\"huomenna\",\"2\":\"ylihuomenna\",\"-2\":\"toissa päivänä\",\"-1\":\"eilen\"},\"relativeTime\":{\"future\":{\"one\":\"{0} päivän päästä\",\"other\":\"{0} päivän päästä\"},\"past\":{\"one\":\"{0} päivä sitten\",\"other\":\"{0} päivää sitten\"}}},\"hour\":{\"displayName\":\"tunti\",\"relativeTime\":{\"future\":{\"one\":\"{0} tunnin päästä\",\"other\":\"{0} tunnin päästä\"},\"past\":{\"one\":\"{0} tunti sitten\",\"other\":\"{0} tuntia sitten\"}}},\"minute\":{\"displayName\":\"minuutti\",\"relativeTime\":{\"future\":{\"one\":\"{0} minuutin päästä\",\"other\":\"{0} minuutin päästä\"},\"past\":{\"one\":\"{0} minuutti sitten\",\"other\":\"{0} minuuttia sitten\"}}},\"second\":{\"displayName\":\"sekunti\",\"relative\":{\"0\":\"nyt\"},\"relativeTime\":{\"future\":{\"one\":\"{0} sekunnin päästä\",\"other\":\"{0} sekunnin päästä\"},\"past\":{\"one\":\"{0} sekunti sitten\",\"other\":\"{0} sekuntia sitten\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fr-CA\",\"parentLocale\":\"fr\",\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"Dans {0} an\",\"other\":\"Dans {0} ans\"},\"past\":{\"one\":\"Il y a {0} an\",\"other\":\"Il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"Dans {0} minute\",\"other\":\"Dans {0} minutes\"},\"past\":{\"one\":\"Il y a {0} minute\",\"other\":\"Il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}},{\"locale\":\"fr\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":\"other\";return n>=0&&n<2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} an\",\"other\":\"dans {0} ans\"},\"past\":{\"one\":\"il y a {0} an\",\"other\":\"il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} minute\",\"other\":\"dans {0} minutes\"},\"past\":{\"one\":\"il y a {0} minute\",\"other\":\"il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"he\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1);if(ord)return\"other\";return n==1&&v0?\"one\":i==2&&v0?\"two\":v0&&(n<0||n>10)&&t0&&n10==0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"שנה\",\"relative\":{\"0\":\"השנה\",\"1\":\"השנה הבאה\",\"-1\":\"השנה שעברה\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנה\",\"two\":\"בעוד שנתיים\",\"many\":\"בעוד {0} שנה\",\"other\":\"בעוד {0} שנים\"},\"past\":{\"one\":\"לפני שנה\",\"two\":\"לפני שנתיים\",\"many\":\"לפני {0} שנה\",\"other\":\"לפני {0} שנים\"}}},\"month\":{\"displayName\":\"חודש\",\"relative\":{\"0\":\"החודש\",\"1\":\"החודש הבא\",\"-1\":\"החודש שעבר\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד חודש\",\"two\":\"בעוד חודשיים\",\"many\":\"בעוד {0} חודשים\",\"other\":\"בעוד {0} חודשים\"},\"past\":{\"one\":\"לפני חודש\",\"two\":\"לפני חודשיים\",\"many\":\"לפני {0} חודשים\",\"other\":\"לפני {0} חודשים\"}}},\"day\":{\"displayName\":\"יום\",\"relative\":{\"0\":\"היום\",\"1\":\"מחר\",\"2\":\"מחרתיים\",\"-2\":\"שלשום\",\"-1\":\"אתמול\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד יום {0}\",\"two\":\"בעוד יומיים\",\"many\":\"בעוד {0} ימים\",\"other\":\"בעוד {0} ימים\"},\"past\":{\"one\":\"לפני יום {0}\",\"two\":\"לפני יומיים\",\"many\":\"לפני {0} ימים\",\"other\":\"לפני {0} ימים\"}}},\"hour\":{\"displayName\":\"שעה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד שעה\",\"two\":\"בעוד שעתיים\",\"many\":\"בעוד {0} שעות\",\"other\":\"בעוד {0} שעות\"},\"past\":{\"one\":\"לפני שעה\",\"two\":\"לפני שעתיים\",\"many\":\"לפני {0} שעות\",\"other\":\"לפני {0} שעות\"}}},\"minute\":{\"displayName\":\"דקה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד דקה\",\"two\":\"בעוד שתי דקות\",\"many\":\"בעוד {0} דקות\",\"other\":\"בעוד {0} דקות\"},\"past\":{\"one\":\"לפני דקה\",\"two\":\"לפני שתי דקות\",\"many\":\"לפני {0} דקות\",\"other\":\"לפני {0} דקות\"}}},\"second\":{\"displayName\":\"שנייה\",\"relative\":{\"0\":\"עכשיו\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנייה\",\"two\":\"בעוד שתי שניות\",\"many\":\"בעוד {0} שניות\",\"other\":\"בעוד {0} שניות\"},\"past\":{\"one\":\"לפני שנייה\",\"two\":\"לפני שתי שניות\",\"many\":\"לפני {0} שניות\",\"other\":\"לפני {0} שניות\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"hi\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":n==2||n==3?\"two\":n==4?\"few\":n==6?\"many\":\"other\";return n>=0&&n<=1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"वर्ष\",\"relative\":{\"0\":\"इस वर्ष\",\"1\":\"अगला वर्ष\",\"-1\":\"पिछला वर्ष\"},\"relativeTime\":{\"future\":{\"one\":\"{0} वर्ष में\",\"other\":\"{0} वर्ष में\"},\"past\":{\"one\":\"{0} वर्ष पहले\",\"other\":\"{0} वर्ष पहले\"}}},\"month\":{\"displayName\":\"माह\",\"relative\":{\"0\":\"इस माह\",\"1\":\"अगला माह\",\"-1\":\"पिछला माह\"},\"relativeTime\":{\"future\":{\"one\":\"{0} माह में\",\"other\":\"{0} माह में\"},\"past\":{\"one\":\"{0} माह पहले\",\"other\":\"{0} माह पहले\"}}},\"day\":{\"displayName\":\"दिन\",\"relative\":{\"0\":\"आज\",\"1\":\"कल\",\"2\":\"परसों\",\"-2\":\"बीता परसों\",\"-1\":\"कल\"},\"relativeTime\":{\"future\":{\"one\":\"{0} दिन में\",\"other\":\"{0} दिन में\"},\"past\":{\"one\":\"{0} दिन पहले\",\"other\":\"{0} दिन पहले\"}}},\"hour\":{\"displayName\":\"घंटा\",\"relativeTime\":{\"future\":{\"one\":\"{0} घंटे में\",\"other\":\"{0} घंटे में\"},\"past\":{\"one\":\"{0} घंटे पहले\",\"other\":\"{0} घंटे पहले\"}}},\"minute\":{\"displayName\":\"मिनट\",\"relativeTime\":{\"future\":{\"one\":\"{0} मिनट में\",\"other\":\"{0} मिनट में\"},\"past\":{\"one\":\"{0} मिनट पहले\",\"other\":\"{0} मिनट पहले\"}}},\"second\":{\"displayName\":\"सेकंड\",\"relative\":{\"0\":\"अब\"},\"relativeTime\":{\"future\":{\"one\":\"{0} सेकंड में\",\"other\":\"{0} सेकंड में\"},\"past\":{\"one\":\"{0} सेकंड पहले\",\"other\":\"{0} सेकंड पहले\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"it\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return n==11||n==8||n==80||n==800?\"many\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"anno\",\"relative\":{\"0\":\"quest’anno\",\"1\":\"anno prossimo\",\"-1\":\"anno scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} anno\",\"other\":\"tra {0} anni\"},\"past\":{\"one\":\"{0} anno fa\",\"other\":\"{0} anni fa\"}}},\"month\":{\"displayName\":\"mese\",\"relative\":{\"0\":\"questo mese\",\"1\":\"mese prossimo\",\"-1\":\"mese scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} mese\",\"other\":\"tra {0} mesi\"},\"past\":{\"one\":\"{0} mese fa\",\"other\":\"{0} mesi fa\"}}},\"day\":{\"displayName\":\"giorno\",\"relative\":{\"0\":\"oggi\",\"1\":\"domani\",\"2\":\"dopodomani\",\"-2\":\"l’altro ieri\",\"-1\":\"ieri\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} giorno\",\"other\":\"tra {0} giorni\"},\"past\":{\"one\":\"{0} giorno fa\",\"other\":\"{0} giorni fa\"}}},\"hour\":{\"displayName\":\"ora\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} ora\",\"other\":\"tra {0} ore\"},\"past\":{\"one\":\"{0} ora fa\",\"other\":\"{0} ore fa\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} minuto\",\"other\":\"tra {0} minuti\"},\"past\":{\"one\":\"{0} minuto fa\",\"other\":\"{0} minuti fa\"}}},\"second\":{\"displayName\":\"Secondo\",\"relative\":{\"0\":\"ora\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} secondo\",\"other\":\"tra {0} secondi\"},\"past\":{\"one\":\"{0} secondo fa\",\"other\":\"{0} secondi fa\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ja\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"翌年\",\"-1\":\"昨年\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 年後\"},\"past\":{\"other\":\"{0} 年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"今月\",\"1\":\"翌月\",\"-1\":\"先月\"},\"relativeTime\":{\"future\":{\"other\":\"{0} か月後\"},\"past\":{\"other\":\"{0} か月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今日\",\"1\":\"明日\",\"2\":\"明後日\",\"-2\":\"一昨日\",\"-1\":\"昨日\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 日後\"},\"past\":{\"other\":\"{0} 日前\"}}},\"hour\":{\"displayName\":\"時\",\"relativeTime\":{\"future\":{\"other\":\"{0} 時間後\"},\"past\":{\"other\":\"{0} 時間前\"}}},\"minute\":{\"displayName\":\"分\",\"relativeTime\":{\"future\":{\"other\":\"{0} 分後\"},\"past\":{\"other\":\"{0} 分前\"}}},\"second\":{\"displayName\":\"秒\",\"relative\":{\"0\":\"今すぐ\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 秒後\"},\"past\":{\"other\":\"{0} 秒前\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ko\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"년\",\"relative\":{\"0\":\"올해\",\"1\":\"내년\",\"-1\":\"작년\"},\"relativeTime\":{\"future\":{\"other\":\"{0}년 후\"},\"past\":{\"other\":\"{0}년 전\"}}},\"month\":{\"displayName\":\"월\",\"relative\":{\"0\":\"이번 달\",\"1\":\"다음 달\",\"-1\":\"지난달\"},\"relativeTime\":{\"future\":{\"other\":\"{0}개월 후\"},\"past\":{\"other\":\"{0}개월 전\"}}},\"day\":{\"displayName\":\"일\",\"relative\":{\"0\":\"오늘\",\"1\":\"내일\",\"2\":\"모레\",\"-2\":\"그저께\",\"-1\":\"어제\"},\"relativeTime\":{\"future\":{\"other\":\"{0}일 후\"},\"past\":{\"other\":\"{0}일 전\"}}},\"hour\":{\"displayName\":\"시\",\"relativeTime\":{\"future\":{\"other\":\"{0}시간 후\"},\"past\":{\"other\":\"{0}시간 전\"}}},\"minute\":{\"displayName\":\"분\",\"relativeTime\":{\"future\":{\"other\":\"{0}분 후\"},\"past\":{\"other\":\"{0}분 전\"}}},\"second\":{\"displayName\":\"초\",\"relative\":{\"0\":\"지금\"},\"relativeTime\":{\"future\":{\"other\":\"{0}초 후\"},\"past\":{\"other\":\"{0}초 전\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"nl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"jaar\",\"relative\":{\"0\":\"dit jaar\",\"1\":\"volgend jaar\",\"-1\":\"vorig jaar\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} jaar\",\"other\":\"over {0} jaar\"},\"past\":{\"one\":\"{0} jaar geleden\",\"other\":\"{0} jaar geleden\"}}},\"month\":{\"displayName\":\"maand\",\"relative\":{\"0\":\"deze maand\",\"1\":\"volgende maand\",\"-1\":\"vorige maand\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} maand\",\"other\":\"over {0} maanden\"},\"past\":{\"one\":\"{0} maand geleden\",\"other\":\"{0} maanden geleden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"vandaag\",\"1\":\"morgen\",\"2\":\"overmorgen\",\"-2\":\"eergisteren\",\"-1\":\"gisteren\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} dag\",\"other\":\"over {0} dagen\"},\"past\":{\"one\":\"{0} dag geleden\",\"other\":\"{0} dagen geleden\"}}},\"hour\":{\"displayName\":\"Uur\",\"relativeTime\":{\"future\":{\"one\":\"over {0} uur\",\"other\":\"over {0} uur\"},\"past\":{\"one\":\"{0} uur geleden\",\"other\":\"{0} uur geleden\"}}},\"minute\":{\"displayName\":\"minuut\",\"relativeTime\":{\"future\":{\"one\":\"over {0} minuut\",\"other\":\"over {0} minuten\"},\"past\":{\"one\":\"{0} minuut geleden\",\"other\":\"{0} minuten geleden\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} seconde\",\"other\":\"over {0} seconden\"},\"past\":{\"one\":\"{0} seconde geleden\",\"other\":\"{0} seconden geleden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"no\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} y\"},\"past\":{\"other\":\"-{0} y\"}}},\"month\":{\"displayName\":\"Month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} m\"},\"past\":{\"other\":\"-{0} m\"}}},\"day\":{\"displayName\":\"Day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} d\"},\"past\":{\"other\":\"-{0} d\"}}},\"hour\":{\"displayName\":\"Hour\",\"relativeTime\":{\"future\":{\"other\":\"+{0} h\"},\"past\":{\"other\":\"-{0} h\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"other\":\"+{0} min\"},\"past\":{\"other\":\"-{0} min\"}}},\"second\":{\"displayName\":\"Second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} s\"},\"past\":{\"other\":\"-{0} s\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return n==1&&v0?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i!=1&&(i10==0||i10==1)||v0&&(i10>=5&&i10<=9)||v0&&(i100>=12&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"w tym roku\",\"1\":\"w przyszłym roku\",\"-1\":\"w zeszłym roku\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} lata\",\"many\":\"za {0} lat\",\"other\":\"za {0} roku\"},\"past\":{\"one\":\"{0} rok temu\",\"few\":\"{0} lata temu\",\"many\":\"{0} lat temu\",\"other\":\"{0} roku temu\"}}},\"month\":{\"displayName\":\"miesiąc\",\"relative\":{\"0\":\"w tym miesiącu\",\"1\":\"w przyszłym miesiącu\",\"-1\":\"w zeszłym miesiącu\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} miesiąc\",\"few\":\"za {0} miesiące\",\"many\":\"za {0} miesięcy\",\"other\":\"za {0} miesiąca\"},\"past\":{\"one\":\"{0} miesiąc temu\",\"few\":\"{0} miesiące temu\",\"many\":\"{0} miesięcy temu\",\"other\":\"{0} miesiąca temu\"}}},\"day\":{\"displayName\":\"dzień\",\"relative\":{\"0\":\"dzisiaj\",\"1\":\"jutro\",\"2\":\"pojutrze\",\"-2\":\"przedwczoraj\",\"-1\":\"wczoraj\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} dzień\",\"few\":\"za {0} dni\",\"many\":\"za {0} dni\",\"other\":\"za {0} dnia\"},\"past\":{\"one\":\"{0} dzień temu\",\"few\":\"{0} dni temu\",\"many\":\"{0} dni temu\",\"other\":\"{0} dnia temu\"}}},\"hour\":{\"displayName\":\"godzina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} godzinę\",\"few\":\"za {0} godziny\",\"many\":\"za {0} godzin\",\"other\":\"za {0} godziny\"},\"past\":{\"one\":\"{0} godzinę temu\",\"few\":\"{0} godziny temu\",\"many\":\"{0} godzin temu\",\"other\":\"{0} godziny temu\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutę\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minut\",\"other\":\"za {0} minuty\"},\"past\":{\"one\":\"{0} minutę temu\",\"few\":\"{0} minuty temu\",\"many\":\"{0} minut temu\",\"other\":\"{0} minuty temu\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"teraz\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundę\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekund\",\"other\":\"za {0} sekundy\"},\"past\":{\"one\":\"{0} sekundę temu\",\"few\":\"{0} sekundy temu\",\"many\":\"{0} sekund temu\",\"other\":\"{0} sekundy temu\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pt-br\",\"parentLocale\":\"pt\"},{\"locale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n;if(ord)return\"other\";return t0&&n>=0&&n<=2&&n!=2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} ano\",\"other\":\"em {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} mês\",\"other\":\"em {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} dia\",\"other\":\"em {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"em {0} hora\",\"other\":\"em {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"em {0} minuto\",\"other\":\"em {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} segundo\",\"other\":\"em {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}},{\"locale\":\"pt-PT\",\"parentLocale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} ano\",\"other\":\"dentro de {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mês\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} dia\",\"other\":\"dentro de {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ru\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"год\",\"relative\":{\"0\":\"в этом году\",\"1\":\"в следующем году\",\"-1\":\"в прошлом году\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} год\",\"few\":\"через {0} года\",\"many\":\"через {0} лет\",\"other\":\"через {0} года\"},\"past\":{\"one\":\"{0} год назад\",\"few\":\"{0} года назад\",\"many\":\"{0} лет назад\",\"other\":\"{0} года назад\"}}},\"month\":{\"displayName\":\"месяц\",\"relative\":{\"0\":\"в этом месяце\",\"1\":\"в следующем месяце\",\"-1\":\"в прошлом месяце\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} месяц\",\"few\":\"через {0} месяца\",\"many\":\"через {0} месяцев\",\"other\":\"через {0} месяца\"},\"past\":{\"one\":\"{0} месяц назад\",\"few\":\"{0} месяца назад\",\"many\":\"{0} месяцев назад\",\"other\":\"{0} месяца назад\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сегодня\",\"1\":\"завтра\",\"2\":\"послезавтра\",\"-2\":\"позавчера\",\"-1\":\"вчера\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дня\",\"many\":\"через {0} дней\",\"other\":\"через {0} дней\"},\"past\":{\"one\":\"{0} день назад\",\"few\":\"{0} дня назад\",\"many\":\"{0} дней назад\",\"other\":\"{0} дня назад\"}}},\"hour\":{\"displayName\":\"час\",\"relativeTime\":{\"future\":{\"one\":\"через {0} час\",\"few\":\"через {0} часа\",\"many\":\"через {0} часов\",\"other\":\"через {0} часа\"},\"past\":{\"one\":\"{0} час назад\",\"few\":\"{0} часа назад\",\"many\":\"{0} часов назад\",\"other\":\"{0} часа назад\"}}},\"minute\":{\"displayName\":\"минута\",\"relativeTime\":{\"future\":{\"one\":\"через {0} минуту\",\"few\":\"через {0} минуты\",\"many\":\"через {0} минут\",\"other\":\"через {0} минуты\"},\"past\":{\"one\":\"{0} минуту назад\",\"few\":\"{0} минуты назад\",\"many\":\"{0} минут назад\",\"other\":\"{0} минуты назад\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"сейчас\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунды\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунды\"},\"past\":{\"one\":\"{0} секунду назад\",\"few\":\"{0} секунды назад\",\"many\":\"{0} секунд назад\",\"other\":\"{0} секунды назад\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"sv\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return(n10==1||n10==2)&&n100!=11&&n100!=12?\"one\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"nästa år\",\"-1\":\"i fjol\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"för {0} år sedan\",\"other\":\"för {0} år sedan\"}}},\"month\":{\"displayName\":\"månad\",\"relative\":{\"0\":\"denna månad\",\"1\":\"nästa månad\",\"-1\":\"förra månaden\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} månad\",\"other\":\"om {0} månader\"},\"past\":{\"one\":\"för {0} månad sedan\",\"other\":\"för {0} månader sedan\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgon\",\"2\":\"i övermorgon\",\"-2\":\"i förrgår\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dagar\"},\"past\":{\"one\":\"för {0} dag sedan\",\"other\":\"för {0} dagar sedan\"}}},\"hour\":{\"displayName\":\"timme\",\"relativeTime\":{\"future\":{\"one\":\"om {0} timme\",\"other\":\"om {0} timmar\"},\"past\":{\"one\":\"för {0} timme sedan\",\"other\":\"för {0} timmar sedan\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minuter\"},\"past\":{\"one\":\"för {0} minut sedan\",\"other\":\"för {0} minuter sedan\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"för {0} sekund sedan\",\"other\":\"för {0} sekunder sedan\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"th\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"ปี\",\"relative\":{\"0\":\"ปีนี้\",\"1\":\"ปีหน้า\",\"-1\":\"ปีที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ปี\"},\"past\":{\"other\":\"{0} ปีที่แล้ว\"}}},\"month\":{\"displayName\":\"เดือน\",\"relative\":{\"0\":\"เดือนนี้\",\"1\":\"เดือนหน้า\",\"-1\":\"เดือนที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} เดือน\"},\"past\":{\"other\":\"{0} เดือนที่ผ่านมา\"}}},\"day\":{\"displayName\":\"วัน\",\"relative\":{\"0\":\"วันนี้\",\"1\":\"พรุ่งนี้\",\"2\":\"มะรืนนี้\",\"-2\":\"เมื่อวานซืน\",\"-1\":\"เมื่อวาน\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วัน\"},\"past\":{\"other\":\"{0} วันที่ผ่านมา\"}}},\"hour\":{\"displayName\":\"ชั่วโมง\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ชั่วโมง\"},\"past\":{\"other\":\"{0} ชั่วโมงที่ผ่านมา\"}}},\"minute\":{\"displayName\":\"นาที\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} นาที\"},\"past\":{\"other\":\"{0} นาทีที่ผ่านมา\"}}},\"second\":{\"displayName\":\"วินาที\",\"relative\":{\"0\":\"ขณะนี้\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วินาที\"},\"past\":{\"other\":\"{0} วินาทีที่ผ่านมา\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"tr\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Yıl\",\"relative\":{\"0\":\"bu yıl\",\"1\":\"gelecek yıl\",\"-1\":\"geçen yıl\"},\"relativeTime\":{\"future\":{\"one\":\"{0} yıl sonra\",\"other\":\"{0} yıl sonra\"},\"past\":{\"one\":\"{0} yıl önce\",\"other\":\"{0} yıl önce\"}}},\"month\":{\"displayName\":\"Ay\",\"relative\":{\"0\":\"bu ay\",\"1\":\"gelecek ay\",\"-1\":\"geçen ay\"},\"relativeTime\":{\"future\":{\"one\":\"{0} ay sonra\",\"other\":\"{0} ay sonra\"},\"past\":{\"one\":\"{0} ay önce\",\"other\":\"{0} ay önce\"}}},\"day\":{\"displayName\":\"Gün\",\"relative\":{\"0\":\"bugün\",\"1\":\"yarın\",\"2\":\"öbür gün\",\"-2\":\"evvelsi gün\",\"-1\":\"dün\"},\"relativeTime\":{\"future\":{\"one\":\"{0} gün sonra\",\"other\":\"{0} gün sonra\"},\"past\":{\"one\":\"{0} gün önce\",\"other\":\"{0} gün önce\"}}},\"hour\":{\"displayName\":\"Saat\",\"relativeTime\":{\"future\":{\"one\":\"{0} saat sonra\",\"other\":\"{0} saat sonra\"},\"past\":{\"one\":\"{0} saat önce\",\"other\":\"{0} saat önce\"}}},\"minute\":{\"displayName\":\"Dakika\",\"relativeTime\":{\"future\":{\"one\":\"{0} dakika sonra\",\"other\":\"{0} dakika sonra\"},\"past\":{\"one\":\"{0} dakika önce\",\"other\":\"{0} dakika önce\"}}},\"second\":{\"displayName\":\"Saniye\",\"relative\":{\"0\":\"şimdi\"},\"relativeTime\":{\"future\":{\"one\":\"{0} saniye sonra\",\"other\":\"{0} saniye sonra\"},\"past\":{\"one\":\"{0} saniye önce\",\"other\":\"{0} saniye önce\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"uk\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2),i10=i.slice(-1),i100=i.slice(-2);if(ord)return n10==3&&n100!=13?\"few\":\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"рік\",\"relative\":{\"0\":\"цього року\",\"1\":\"наступного року\",\"-1\":\"торік\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} рік\",\"few\":\"через {0} роки\",\"many\":\"через {0} років\",\"other\":\"через {0} року\"},\"past\":{\"one\":\"{0} рік тому\",\"few\":\"{0} роки тому\",\"many\":\"{0} років тому\",\"other\":\"{0} року тому\"}}},\"month\":{\"displayName\":\"місяць\",\"relative\":{\"0\":\"цього місяця\",\"1\":\"наступного місяця\",\"-1\":\"минулого місяця\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} місяць\",\"few\":\"через {0} місяці\",\"many\":\"через {0} місяців\",\"other\":\"через {0} місяця\"},\"past\":{\"one\":\"{0} місяць тому\",\"few\":\"{0} місяці тому\",\"many\":\"{0} місяців тому\",\"other\":\"{0} місяця тому\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сьогодні\",\"1\":\"завтра\",\"2\":\"післязавтра\",\"-2\":\"позавчора\",\"-1\":\"учора\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дні\",\"many\":\"через {0} днів\",\"other\":\"через {0} дня\"},\"past\":{\"one\":\"{0} день тому\",\"few\":\"{0} дні тому\",\"many\":\"{0} днів тому\",\"other\":\"{0} дня тому\"}}},\"hour\":{\"displayName\":\"година\",\"relativeTime\":{\"future\":{\"one\":\"через {0} годину\",\"few\":\"через {0} години\",\"many\":\"через {0} годин\",\"other\":\"через {0} години\"},\"past\":{\"one\":\"{0} годину тому\",\"few\":\"{0} години тому\",\"many\":\"{0} годин тому\",\"other\":\"{0} години тому\"}}},\"minute\":{\"displayName\":\"хвилина\",\"relativeTime\":{\"future\":{\"one\":\"через {0} хвилину\",\"few\":\"через {0} хвилини\",\"many\":\"через {0} хвилин\",\"other\":\"через {0} хвилини\"},\"past\":{\"one\":\"{0} хвилину тому\",\"few\":\"{0} хвилини тому\",\"many\":\"{0} хвилин тому\",\"other\":\"{0} хвилини тому\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"зараз\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунди\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунди\"},\"past\":{\"one\":\"{0} секунду тому\",\"few\":\"{0} секунди тому\",\"many\":\"{0} секунд тому\",\"other\":\"{0} секунди тому\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"zh-cn\",\"parentLocale\":\"zh\"},{\"locale\":\"zh\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"明年\",\"-1\":\"去年\"},\"relativeTime\":{\"future\":{\"other\":\"{0}年后\"},\"past\":{\"other\":\"{0}年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"本月\",\"1\":\"下个月\",\"-1\":\"上个月\"},\"relativeTime\":{\"future\":{\"other\":\"{0}个月后\"},\"past\":{\"other\":\"{0}个月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今天\",\"1\":\"明天\",\"2\":\"后天\",\"-2\":\"前天\",\"-1\":\"昨天\"},\"relativeTime\":{\"future\":{\"other\":\"{0}天后\"},\"past\":{\"other\":\"{0}天前\"}}},\"hour\":{\"displayName\":\"小时\",\"relativeTime\":{\"future\":{\"other\":\"{0}小时后\"},\"past\":{\"other\":\"{0}小时前\"}}},\"minute\":{\"displayName\":\"分钟\",\"relativeTime\":{\"future\":{\"other\":\"{0}分钟后\"},\"past\":{\"other\":\"{0}分钟前\"}}},\"second\":{\"displayName\":\"秒钟\",\"relative\":{\"0\":\"现在\"},\"relativeTime\":{\"future\":{\"other\":\"{0}秒钟后\"},\"past\":{\"other\":\"{0}秒钟前\"}}}}},{\"locale\":\"zh-tw\",\"parentLocale\":\"zh\"}];","define(\"connections-ui/components/accessible-checkbox/component\", [\"exports\", \"ember-purecloud-components/components/accessible-checkbox/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { on, inject, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['admin-ui-modal'],\n\n    application: inject.service(),\n    session: inject.service(),\n    notification: inject.service(),\n\n    src: '',\n    name: 'admin-ui-modal',\n\n    sendClose() {\n        this.sendAction('closeAdminModal');\n    },\n\n    toast(data) {\n        let notificationType = 'info';\n        if (data.type === 'success' || data.type === 'error') {\n            notificationType = data.type;\n        }\n\n        this.get('notification')[notificationType](\n            data.title,\n            data.message,\n            Object.assign(\n                {},\n                {\n                    markdownToHtml: false,\n                    shouldShowPopup: true,\n                    shouldPlaySound: false\n                },\n                data\n            )\n        );\n    },\n\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            if (!event) {\n                return;\n            }\n            try {\n                const sameHost = Ember.get(event, 'originalEvent.source.document.location.host') === location.host;\n                const sameName = Ember.get(event, 'originalEvent.source.name') === this.get('name');\n                if (!(sameHost & sameName)) {\n                    return;\n                }\n                const message = Ember.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.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","export default Ember.HTMLBars.template({\"id\":\"lfPaatln\",\"block\":\"{\\\"statements\\\":[[11,\\\"iframe\\\",[]],[16,\\\"title\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"name\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"src\\\",[34,[[26,[\\\"src\\\"]]]]],[15,\\\"role\\\",\\\"presentation\\\"],[15,\\\"seamless\\\",\\\"\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/admin-ui-modal/template.hbs\"}});","define(\"connections-ui/components/alert-message/component\", [\"exports\", \"ember-purecloud-components/components/alert-message/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: 'analog-clock',\n    classNameBindings: ['_analogSupported:analog-supported:analog-unsupported', '_invalidTime:invalid-time'],\n    attributeBindings: ['_currTimeLabel:title', '_currTimeLabel:aria-label'],\n\n    intl: inject.service(),\n\n    // Attrs\n    utcOffset: null,\n    staticMoment: null,\n    showSecondHand: true,\n    autoIncrement: true,\n\n    _analogSupported: Modernizr.csstransforms,\n    _displayedMoment: null,\n    _invalidTime: computed.not('_displayedMoment'),\n    _currTimeLabel: null,\n    _pendingTick: null,\n\n    willRender() {\n        this._cancelTimers();\n\n        let time = moment(this.get('staticMoment') || undefined);\n        let formatStr = 'LTS';\n        let invalid = false;\n\n        try {\n            if (this.get('utcOffset')) {\n                time.utcOffset(this.get('utcOffset'));\n                formatStr += ' Z';\n            }\n        } catch (e) {\n            invalid = true;\n        }\n\n        if (invalid || isNaN(time) || !time.isValid()) {\n            this.set('_displayedMoment', null);\n            this.set('_currTimeLabel', this.get('intl').t('components.analogClock.invalidTime'));\n        } else {\n            this.set('_displayedMoment', time);\n            this.set('_currTimeLabel', time.format(formatStr));\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._cancelTimers();\n        this._super(...arguments);\n    },\n\n    didRender() {\n        this._super(...arguments);\n\n        let time = this.get('_displayedMoment');\n\n        if (time && this.get('_analogSupported')) {\n            const hourElement = this.$('.hour-hand')[0];\n            const minuteElement = this.$('.minute-hand')[0];\n\n            let hour = time.hour(),\n                minute = time.minute(),\n                second = time.second(),\n                secondAngle = second * 6,\n                minuteAngle = minute * 6 + secondAngle / 60,\n                hourAngle = ((hour % 12) / 12) * 360 + 90 + minute / 12,\n                hourRule = `rotate(${hourAngle}deg)`,\n                minuteRule = `rotate(${minuteAngle}deg)`,\n                secondRule = `rotate(${secondAngle}deg)`;\n\n            hourElement.style.transform = hourRule;\n            minuteElement.style.transform = minuteRule;\n            if (this.get('showSecondHand')) {\n                const secondElement = this.$('.second-hand')[0];\n                secondElement.style.transform = secondRule;\n            }\n        }\n\n        if (!this.get('staticMoment') && this.get('autoIncrement') && !this.get('_invalidTime')) {\n            this.set(\n                '_pendingTick',\n                Ember.run.later(\n                    this,\n                    () => {\n                        this.rerender();\n                    },\n                    1000\n                )\n            );\n        }\n    },\n\n    _cancelTimers() {\n        ['_pendingTick'].forEach(timerName => {\n            let currTimer = this.get(timerName);\n            if (currTimer) {\n                Ember.run.cancel(currTimer);\n                this.set(timerName, null);\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jPusaeLb\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"_analogSupported\\\"]],[33,[\\\"not\\\"],[[28,[\\\"_invalidTime\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clock-face\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hour-hand\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"minute-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSecondHand\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"second-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"_currTimeLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/analog-clock/template.hbs\"}});","import Ember from 'ember';\nimport { isValidEmailAddress } from 'ember-purecloud-components/utils/email';\n\nvar AnchorTagComponent = Ember.Component.extend({\n    tagName: 'span',\n\n    intl: Ember.inject.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    ariaLabelledBy: null,\n\n    init: function () {\n        this._super();\n\n        this.decorateLabel();\n    },\n\n    text: Ember.computed('value', 'label', function () {\n        var label = this.get('label');\n        if (label) {\n            return label;\n        }\n\n        var value = this.get('value'),\n            protocol = this.get('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.get('httpRegex'))) {\n            value = value.replace(this.get('httpRegex'), '$2');\n        }\n\n        if (protocol === 'map') {\n            value = Ember.String.htmlSafe(Ember.Handlebars.Utils.escapeExpression(value).replace(/\\n/g, '<br />'));\n        }\n\n        return value;\n    }),\n\n    anchor: Ember.computed('value', 'protocol', function () {\n        var value = this.get('value'),\n            protocol = this.get('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.get('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: Ember.observer('value', function () {\n        var value = this.get('value'),\n            protocol = this.get('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.get('intl').t('purecloud.acdInteraction.relate.validation.invalidEmail'));\n            }\n\n            this.set('label', value);\n        }\n    })\n});\n\nexport default AnchorTagComponent;\n","export default Ember.HTMLBars.template({\"id\":\"cDg6eSfO\",\"block\":\"{\\\"statements\\\":[[11,\\\"a\\\",[]],[16,\\\"href\\\",[26,[\\\"anchor\\\"]],null],[16,\\\"title\\\",[26,[\\\"title\\\"]],null],[16,\\\"target\\\",[26,[\\\"target\\\"]],null],[16,\\\"aria-labelledby\\\",[26,[\\\"ariaLabelledBy\\\"]],null],[13],[1,[26,[\\\"text\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/anchor-tag/template.hbs\"}});","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Component, computed, get } = Ember;\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                Ember.assert(`app-img Invalid titleMode: ${value}`);\n            }\n\n            return value;\n        }\n    }),\n\n    showTooltip: computed.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.get('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                Ember.assert(`Invalid app-img type ${value}`);\n            }\n        }\n    }),\n\n    imgWidth: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].width;\n    }),\n\n    imgHeight: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].height;\n    }),\n\n    _sortedRasterMultipliers: computed('app', 'imgType', function () {\n        let result = [];\n\n        let cfg = IMG_TYPE_CFG_MAP[this.get('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     * and if vector images are supported as img src in the current\n     * environment\n     */\n    _vectorImgUrl: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        if (app && Modernizr.svgasimg) {\n            result = Ember.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.get('_vectorImgUrl');\n        if (vectorImgUrl) {\n            return vectorImgUrl;\n        }\n\n        let result = null;\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n\n        let allRasters = this.get('_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.get('_vectorImgUrl');\n        let defaultImgUrl = this.get('defaultImgUrl');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasters = this.get('_sortedRasterMultipliers');\n\n        if (Modernizr.srcset && !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.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('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.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let classesPath = `${cfg.assetBasePath}.${CLASS_NAMES_PROP_NAME}`;\n\n            let classNames = app.get(classesPath);\n            if (classNames && Ember.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.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('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","export default Ember.HTMLBars.template({\"id\":\"jh1kqPQo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"defaultImgUrl\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"src\\\",[34,[[26,[\\\"defaultImgUrl\\\"]]]]],[16,\\\"srcset\\\",[34,[[26,[\\\"imgSrcSet\\\"]]]]],[16,\\\"alt\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"width\\\",[34,[[26,[\\\"imgWidth\\\"]]]]],[16,\\\"height\\\",[34,[[26,[\\\"imgHeight\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"imgClasses\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"imgClasses\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"svgSpriteHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"svg\\\",[]],[15,\\\"class\\\",\\\"svg-icon\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"use\\\",[]],[16,\\\"href\\\",[26,[\\\"svgSpriteHref\\\"]],null],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"guxIcon\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"icon-name\\\",[28,[\\\"guxIcon\\\",\\\"name\\\"]],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-external-apps-unknown\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showTooltip\\\"]],[28,[\\\"app\\\",\\\"name\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"targetOffset\\\"],[\\\"-10px 0\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[28,[\\\"app\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/app-img/template.hbs\"}});","define(\"connections-ui/components/audio-player-v2/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/participant/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/participant/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/timeline/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/timeline/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/waveform-graph/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/waveform-graph/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Howler from 'howler-but-with-updates';\n\nconst Howl = Howler.Howl;\n\nconst { get, inject, computed, observer, RSVP, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-player-v2'],\n\n    clock: inject.service(),\n    logger: inject.service('stash-logger'),\n    webrtc: inject.service(),\n    phone: inject.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    playFromSelectedOutput: computed.reads('webrtc.session.features.playRecordingFromSelectedOutput'),\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.get('sound') || !this.get('playFromSelectedOutput')) {\n            return;\n        }\n\n        let restartSound = false;\n        if (this.get('playing')) {\n            this.stopPlaying();\n            restartSound = true;\n        }\n\n        const newOutputDeviceId = this.get('selectedOutputDevice');\n        this.sound.setOutputDevice(newOutputDeviceId);\n\n        if (restartSound) {\n            this.sound.play();\n        }\n    }),\n\n    actions: {\n        togglePlay() {\n            if (this.get('playFromSelectedOutput')) {\n                const outputDeviceId = this.get('webrtc.defaultOutputDevice.deviceId');\n                if (outputDeviceId) {\n                    this.sound.setOutputDevice(outputDeviceId);\n                }\n\n                this.sound.volume(this.get('playbackVolume'));\n            }\n\n            if (this.get('playing')) {\n                this.sound.pause();\n            } else {\n                if (this.get('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.get('registerStopVoicemailHandler');\n        if (registerHandler && typeof registerHandler === 'function') {\n            registerHandler(this.stopPlaying.bind(this));\n        }\n\n        this.setupSound();\n    },\n\n    willDestroyElement() {\n        if (this.sound) {\n            this.sound.off();\n            this.sound.pause();\n        }\n\n        this._super(...arguments);\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                const useHtml5 = this.get('playFromSelectedOutput');\n\n                if (sources) {\n                    const options = this.get('howlOptions');\n                    options.src = sources;\n                    options.html5 = useHtml5;\n                    this.sound = new Howl(options);\n                } else {\n                    this.set('loading', false);\n                    this.set('loadingError', true);\n\n                    this.get('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.get('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        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.seek() * 1000);\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.get('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 Ember from 'ember';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['seek-bar', 'clickable'],\n\n    clock: inject.service(),\n\n    attrs: {\n        sound: null,\n        duration: null,\n        currentTime: null\n    },\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        this._super(...arguments);\n\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (newAttrs.currentTime.value !== oldAttrs.currentTime.value) {\n            const position = this.get('position');\n            let left = position * 100;\n            if (left > 100) {\n                left = 100;\n            }\n            Ember.run(() => {\n                this.$('.progress-bar').css('margin-left', `${left}%`);\n            });\n        }\n    },\n\n    click(event) {\n        const seek = event.offsetX / this.$().width();\n        const totalSeconds = this.getAttr('duration') / 1000;\n        this.sendAction('didSeek', seek * totalSeconds);\n    },\n\n    position: computed('sound', 'currentTime', 'duration', function () {\n        const sound = this.getAttr('sound');\n        if (!sound) {\n            return 0;\n        }\n\n        return this.getAttr('currentTime') / this.getAttr('duration');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"wuEWTVpp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"progress-bar\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/seek-bar/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SXvTXLcA\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loadingError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioPlayer.loadingError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link play-toggle\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"playing\\\"]],[33,[\\\"t\\\"],[\\\"common.pause\\\"],null],[33,[\\\"t\\\"],[\\\"common.play\\\"],null]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePlay\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"playing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-hold\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-play\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[1,[33,[\\\"audio-player/seek-bar\\\"],null,[[\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"didSeek\\\"],[[28,[\\\"sound\\\"]],[28,[\\\"duration\\\"]],[28,[\\\"currentTime\\\"]],\\\"seekSound\\\"]]],false],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"duration-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"current-time\\\",[28,[\\\"currentTime\\\"]]]]],false],[0,\\\"\\\\n            |\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"total-time\\\",[28,[\\\"duration\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/template.hbs\"}});","import Ember from 'ember';\n\nimport Recorder from '../../utils/sound-recorder';\nimport moment from '../../utils/dates';\n\nconst { run, inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-recorder'],\n\n    webrtc: inject.service(),\n\n    recorder: null,\n    startTime: null,\n    showOptions: false,\n\n    attrs: {\n        file: null, // comes from parent, used for notifications\n\n        uploadImmediately: false,\n        playerOptions: {},\n        reset: () => {},\n        audioFileReady: () => {}\n    },\n\n    actions: {\n        startRecording() {\n            this.get('recorder').reset();\n            this.get('recorder').startRecording();\n            this.set('startTime', moment());\n        },\n\n        stopRecording() {\n            this.get('recorder').stopRecording();\n            this.set('startTime', null);\n        },\n\n        reset() {\n            this.get('recorder').reset();\n            this.attrs.reset();\n        }\n    },\n\n    hasSupport: computed.and('webrtc.audioCallCapable', 'hasMediaRecorder'),\n\n    audioBlob: computed.reads('recorder.blob'),\n    audioSource: computed.reads('recorder.blobURL'),\n    recording: computed.reads('recorder.recording'),\n\n    hasMediaRecorder: computed(function () {\n        return window.MediaRecorder !== undefined;\n    }),\n\n    showUploadButton: computed('audioSource', 'uploadImmediately', function () {\n        return !!this.get('audioSource') && !this.get('uploadImmediately');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('hasSupport')) {\n            run.scheduleOnce('afterRender', this, this.setupRecording);\n        } else {\n            run.scheduleOnce('afterRender', this, this.set, 'loaded', true);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const recorder = this.get('recorder');\n        if (recorder) {\n            recorder.destroy();\n        }\n    },\n\n    didUpdateAttrs({ newAttrs }) {\n        if (newAttrs && newAttrs.file) {\n            if (!newAttrs.file.value) {\n                this.get('recorder').reset();\n            }\n        }\n    },\n\n    setupRecording() {\n        const recorder = Recorder.create(Ember.getOwner(this).ownerInjection());\n        this.set('recorder', recorder);\n\n        recorder.on('blobready', () => {\n            Ember.run(() => this.attrs.audioFileReady(this.get('audioBlob')));\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"X7NdLJyg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasSupport\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"recording-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"recording\\\"]],\\\"recording\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"stop-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"stopRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-stop\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"start-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"startRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-record\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"audioSource\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\"],[[28,[\\\"audioSource\\\"]],[28,[\\\"playerOptions\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"audio-source-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.recordingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"startTime\\\"],[[28,[\\\"startTime\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noAudio\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-support\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noSupport\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-recorder/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['auth-loading']\n});\n","export default Ember.HTMLBars.template({\"id\":\"hjOUEo9q\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-body\\\"],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-page-loading-spinner\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/auth-loading/template.hbs\"}});","define(\"connections-ui/components/basic-dropdown\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown\"], function (_exports, _basicDropdown) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDropdown.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content-element\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content-element\"], function (_exports, _contentElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _contentElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content\"], function (_exports, _content) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _content.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/trigger\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-entry'],\n    classNameBindings: ['hasChildren'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    person: null,\n\n    isChild: false,\n    isSuperior: false,\n\n    expand: false,\n\n    actions: {\n        toggleExpand() {\n            if (!this.get('isSuperior')) {\n                this.toggleProperty('expand');\n            }\n        }\n    },\n\n    loading: computed('children.isPending', 'superiors.isPending', function () {\n        return this.get('children.isPending') && this.get('superiors.isPending');\n    }),\n\n    children: computed('person', function () {\n        const children = this.get('person.directReports') || [];\n        const promise = Ember.RSVP.resolve(children);\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    superiors: computed('person', 'isChild', function () {\n        if (this.get('isChild')) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n        const superiors = this.get('person.superiors');\n        const promise = superiors.then(people => {\n            const orderedPeople = [];\n\n            return new Ember.RSVP.Promise(resolve => {\n                function getNextPerson(person) {\n                    if (person && person.get('id')) {\n                        orderedPeople.push(person);\n                        const manager = person.getFieldValue('relationships.manager');\n                        if (!manager) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        const nextPerson = people.find(p => {\n                            return p.get('id') === manager.guid;\n                        });\n\n                        if (!nextPerson) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        return getNextPerson(nextPerson);\n                    }\n\n                    resolve(orderedPeople);\n                }\n                this.get('person.manager')\n                    .then(getNextPerson)\n                    .catch(() => resolve(people));\n            });\n        });\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    hasChildren: computed.gt('children.content.length', 0),\n    hasSuperiors: computed.gt('superiors.content.length', 0),\n\n    directReportsLabel: computed('children.content.length', function () {\n        const intl = this.get('intl');\n        const directReports = this.get('children.content.length');\n        if (directReports > 1) {\n            return intl.lookup('components.cardTree.directReports', { directReports });\n        }\n        return intl.lookup('components.cardTree.directReport');\n    }),\n\n    showTotalReports: computed(\n        'person.totalReports.isFulfilled',\n        'person.totalReports.content',\n        'children.isFulfilled',\n        'children.content.length',\n        function () {\n            if (!this.get('person.totalReports.isFulfilled') || !this.get('children.isFulfilled')) {\n                return false;\n            }\n            const total = this.get('person.totalReports.content');\n            const direct = this.get('children.content.length');\n            return typeof total === 'number' && total > direct;\n        }\n    ),\n\n    totalReportsLabel: computed('person.totalReports.content', function () {\n        const intl = this.get('intl');\n        const totalReports = this.get('person.totalReports.content');\n        if (totalReports > 1) {\n            return intl.lookup('components.cardTree.totalReports', { totalReports });\n        }\n        return intl.lookup('components.cardTree.totalReport');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7YOgXSV/\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasSuperiors\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"isChild\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"superiors\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isSuperior\\\",\\\"expand\\\"],[[28,[\\\"superiors\\\",\\\"firstObject\\\"]],true,true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expander\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpand\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasChildren\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"isLinkable\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"size\\\"],[true,[28,[\\\"person\\\"]],true,true,true,[28,[\\\"canViewChat\\\"]],96]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                -\\\\n                \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasChildren\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"directReportsLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"direct-reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTotalReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        -\\\\n                        \\\"],[1,[26,[\\\"totalReportsLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"children\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSuperior\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[33,[\\\"await\\\"],[[28,[\\\"children\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isChild\\\"],[[28,[\\\"child\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"child\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/card-tree-entry/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    didInsertElement() {\n        this.attachTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this.removeTextInputListeners();\n    },\n\n    attachTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown', event => event.stopPropagation());\n    },\n\n    removeTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off('keydown');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"cLGJxA+O\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row heading\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.treeView\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"model\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"classNames\\\",\\\"expand\\\"],[[28,[\\\"model\\\"]],\\\"parent-entry\\\",true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { eventToString, isNavigation } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-detail-view'],\n\n    intl: inject.service(),\n    presenceSubscription: inject.service(),\n\n    entity: null,\n\n    canMove: true,\n\n    flipster: null,\n    currentPerson: null,\n    currentPersonId: computed.reads('currentPerson.id'),\n\n    selfAndSiblings: null,\n    currentPosition: 0,\n    reportTracker: {},\n\n    attrs: {\n        setCurrentPerson() {}\n    },\n\n    actions: {\n        moveToManager() {\n            const currentPersonManager = this.get('currentPerson.manager');\n            if (!currentPersonManager || !currentPersonManager.content) {\n                return;\n            }\n            currentPersonManager\n                .then(manager => {\n                    if (manager && manager.get) {\n                        var name = manager.get('name');\n                        var position = this.getPosition(this.get('currentPerson'));\n                        var tracker = this.get('reportTracker');\n\n                        if (tracker === null) {\n                            tracker = {};\n                        }\n                        tracker[name] = position;\n                        this.set('reportTracker', tracker);\n\n                        return this.setHierarchy(manager);\n                    }\n                })\n                .then(() => {\n                    this.set('didPeersLoad', true);\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        moveToReports(report) {\n            const currentPersonDirectReports = this.get('currentPerson.directReports');\n            if (!currentPersonDirectReports || !currentPersonDirectReports.content) {\n                return;\n            }\n            currentPersonDirectReports\n                .then(reports => {\n                    if (reports && !_.isEmpty(reports)) {\n                        var trackedReport = this.get('reportTracker')[this.get('currentPerson.name')];\n                        if (report) {\n                            return this.setHierarchy(report);\n                        } else if (trackedReport) {\n                            return this.setHierarchy(reports[trackedReport]);\n                        } else {\n                            return this.setHierarchy(reports[0]);\n                        }\n                    }\n                })\n                .then(() => {\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        setPerson(person) {\n            this.set('currentPerson', person);\n            this.attrs.setCurrentPerson(person);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachTextInputListeners();\n        this.attachNavigationListener();\n    },\n\n    willClearRender() {\n        this._super(...arguments);\n        this.removeTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeListeners();\n    },\n\n    allPeople: computed('entity', function () {\n        const entity = this.get('entity');\n        if (entity.id === this.get('currentPerson.id')) {\n            return { isFulfilled: true };\n        }\n        const promises = Ember.RSVP.all([\n            entity.get('directReports'),\n            entity.get('manager'),\n            entity.get('managerSiblings')\n        ]);\n        const promises2 = [this.setHierarchy(this.get('entity')), promises];\n        Ember.RSVP.all(promises2).then(() => {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                Ember.run.next(this, this.makeCoverFlow);\n            });\n        });\n        return DS.PromiseArray.create({\n            promise: promises\n        });\n    }),\n\n    haveScrolled: computed('currentPersonId', 'entity.id', function () {\n        return this.get('currentPersonId') === this.get('entity.id');\n    }),\n\n    peerCount: computed('currentPerson.selfAndSiblings.length', function () {\n        var count = this.get('currentPerson.selfAndSiblings.length') - 1;\n        if (count === -1) {\n            count = 0;\n        }\n        if (count === 1) {\n            return this.get('intl').lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return this.get('intl').lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    setHierarchy(person) {\n        this.set('didPeersLoad', false);\n\n        const promises = [person.get('selfAndSiblings'), person.get('directReports'), person.get('manager')];\n\n        return Ember.RSVP.all(promises).then(([siblings, directReports, manager]) => {\n            let selfAndSiblings = siblings;\n\n            if (_.isEmpty(siblings)) {\n                selfAndSiblings = [person];\n            }\n\n            if (_.isEmpty(directReports)) {\n                directReports = [];\n            }\n\n            this.set('currentPerson', person);\n            this.get('setCurrentPerson')(person);\n\n            this.set('currentPosition', this._getPosition(selfAndSiblings, person));\n            this.set('selfAndSiblings', selfAndSiblings);\n            this.set('didPeersLoad', true);\n\n            if (selfAndSiblings.length === 1 && directReports.length === 0 && _.isEmpty(manager)) {\n                this.set('canMove', false);\n            } else {\n                this.set('canMove', true);\n            }\n        });\n    },\n\n    makeCoverFlow() {\n        if (_.isEmpty(this.$('li')) || !this.$('.flipster')) {\n            return;\n        }\n\n        if (!_.isEmpty(this.$('.flipster__container'))) {\n            // if we already have flipster elements\n            this.$('.flip-content').contents().unwrap();\n        }\n\n        this.$('.flipster').removeClass('flipster--active');\n\n        const startPosition = this.get('currentPosition');\n\n        let flipster = this.$('.flipster').flipster({\n            itemContainer: 'ul',\n            itemSelector: 'li',\n            style: 'flat',\n            start: startPosition,\n            fadeIn: 0,\n            spacing: -0.3,\n            scrollwheel: false,\n            keyboard: false,\n            touch: false,\n            nav: false, // If true, flipster will insert an unordered list of the slides\n            buttons: false, // If true, flipster will insert Previous / Next buttons\n            onItemSwitch: function (to /*, from*/) {\n                Ember.run.debounce(this, this.changeCurrentPerson, to, 300);\n            }.bind(this)\n        });\n\n        this.set('flipster', flipster);\n    },\n\n    changeCurrentPerson(toElem) {\n        Ember.run.scheduleOnce('afterRender', () => {\n            const card = Ember.$(toElem).find('.card');\n            const entityId = card.data('entity-id');\n\n            if (entityId) {\n                const entity = this.get('selfAndSiblings').findBy('id', entityId);\n                this.set('currentPerson', entity);\n                this.attrs.setCurrentPerson(entity);\n            }\n        });\n    },\n\n    _getPosition(selfAndSiblings, person) {\n        if (_.isEmpty(selfAndSiblings)) {\n            return 0;\n        }\n        for (var position = 0; position < selfAndSiblings.length; position++) {\n            if (selfAndSiblings[position].get('id') === person.get('id')) {\n                return position;\n            }\n        }\n    },\n\n    getPosition(person) {\n        return this._getPosition(this.get('selfAndSiblings'), person);\n    },\n\n    attachNavigationListener() {\n        const event = `keydown.${this.elementId}`;\n        Ember.$(document).on(event, event => Ember.run(() => this.onKeyDownHandler(event)));\n    },\n\n    attachTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown' + ns, event => {\n            Ember.run(() => {\n                var key = eventToString(event);\n                if (key === 'DOWN_ARROW' || key === 'UP_ARROW' || key === 'RIGHT_ARROW' || key === 'LEFT_ARROW') {\n                    if (key === 'LEFT_ARROW' || key === 'RIGHT_ARROW') {\n                        event.stopPropagation();\n                    }\n                }\n            });\n        });\n        fields\n            .on('focus' + ns, () => {\n                Ember.run(() => this.set('canMove', false));\n            })\n            .on('focusout' + ns, () => {\n                Ember.run(() => this.set('canMove', true));\n            });\n    },\n\n    removeTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off(ns);\n        Ember.$(document).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    removeListeners() {\n        const ns = `.${this.elementId}`;\n        Ember.$(document).off(ns);\n        Ember.$(window).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    onKeyDownHandler(event) {\n        const key = eventToString(event);\n\n        if (Ember.$(event.target).is('textarea')) {\n            return;\n        }\n\n        if (isNavigation(event) && this.get('canMove')) {\n            if (key === 'LEFT_ARROW') {\n                this.get('flipster').flipster('prev');\n            } else if (key === 'RIGHT_ARROW') {\n                if (this.$('.flipster > ul > li:not(.empty)').length > 1) {\n                    this.get('flipster').flipster('next');\n                }\n            } else if (key === 'UP_ARROW') {\n                this.send('moveToManager');\n            } else if (key === 'DOWN_ARROW') {\n                this.send('moveToReports');\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"zKRAcuTd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"allPeople\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"manager-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"manager \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"managerCount\\\",\\\"action\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"siblings\\\",\\\"length\\\"]],\\\"moveToManager\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"cards \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"no-manager\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-up \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"peer-count\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"peerCount\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"didPeersLoad\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster\\\"],[15,\\\"id\\\",\\\"flipster\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"flip-items\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"selfAndSiblings\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-card\\\"],null,[[\\\"entity\\\",\\\"setPerson\\\",\\\"actionOpenChatRoom\\\",\\\"actionOpenVideoCall\\\"],[[28,[\\\"person\\\"]],\\\"setPerson\\\",[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\"],null],[33,[\\\"route-action\\\"],[\\\"openChatRoomWithVideo\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"selfAndSiblings\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-down \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\",\\\"content\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"action\\\"],[[28,[\\\"report\\\"]],[28,[\\\"entity\\\"]],\\\"moveToReports\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"report\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    tagName: 'p',\n    classNames: ['character-counter', 'small', 'help-block'],\n\n    intl: Ember.inject.service(),\n\n    model: null,\n    maxCount: 0,\n\n    charactersUsed: Ember.computed('model.length', function () {\n        const length = this.get('model.length') || 0;\n        if (length > 1) {\n            return this.get('intl').lookup('components.navMenu.feedback.charactersUsed', {\n                characterCount: length,\n                maxCount: this.get('maxCount')\n            });\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"C6bOpZUm\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"charactersUsed\\\"]],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/characters-used/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['chat-settings'],\n\n    activeRoom: null,\n\n    chat: Ember.inject.service(),\n\n    check: Ember.computed('activeRoom.jid', 'chat.mutedRooms.[]', function () {\n        const activeJid = this.get('activeRoom.jid');\n        const muted = this.get('chat.mutedRooms');\n\n        return activeJid && muted && muted.any(jid => jid === activeJid);\n    }),\n\n    actions: {\n        toggleRoomMute() {\n            const roomJid = this.get('activeRoom.jid');\n            if (roomJid) {\n                const areNotificationsDisabled = this.toggleProperty('check');\n                this.get('chat').setRoomMuted(roomJid, areNotificationsDisabled);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yvV8FFZW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-drop-down\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"notifications-description\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettings\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"check\\\"]],\\\"toggleRoomMute\\\"]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpText\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted mention-notifications\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpTextMentions\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/chat-settings/template.hbs\"}});","import ClickOutsideComponent from 'ember-click-outside/components/click-outside';\nexport default ClickOutsideComponent;\n","import Ember from 'ember';\nimport * as focusTrap from 'focus-trap';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':create-entity-menu', 'showMenu::hidden'],\n\n    application: inject.service(),\n    permissions: inject.service(),\n    showCreateGroup: false,\n\n    canInvitePeople: computed.reads('permissions.canInvitePeople'),\n    canCreateGroups: computed.reads('permissions.canCreateGroups'),\n\n    canCreateLocations: computed(() => false),\n\n    showMenu: computed.or('canInvitePeople', 'canCreateGroups', 'canCreateLocations'),\n\n    adminModalSrc: '/admin/#/directory/people/add',\n\n    trap: null,\n\n    actions: {\n        launchCreateGroup() {\n            this.set('showCreateGroup', true);\n        },\n\n        cancelCreateGroup() {\n            this.set('showCreateGroup', false);\n        },\n        showAdminModal() {\n            this.set('showAdminModal', true);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        }\n    },\n\n    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"WQbIfDVj\",\"block\":\"{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"create-entity-menu\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-add-call\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canInvitePeople\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-person\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAdminModal\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.person\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchCreateGroup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.group\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-location\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.location\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCreateGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"headerText\\\",\\\"confirmText\\\",\\\"cancel\\\"],[[33,[\\\"t\\\"],[\\\"groups.admin.newGroup\\\"],null],[33,[\\\"t\\\"],[\\\"common.create\\\"],null],\\\"cancelCreateGroup\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"new-group\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"disable\\\",\\\"setAttribute\\\"],[[28,[\\\"confirmAction\\\"]],\\\"cancelCreateGroup\\\",[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[28,[\\\"setAttribute\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\",\\\"setAttribute\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAdminModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"showFooter\\\",\\\"showHeader\\\"],[\\\"closeAdminModal\\\",false,false]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"admin-ui-modal\\\"],null,[[\\\"closeAdminModal\\\",\\\"src\\\"],[\\\"closeAdminModal\\\",[28,[\\\"adminModalSrc\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/create-entity-menu/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nvar minViewMode = {\n    days: 0,\n    months: 1,\n    years: 2\n};\n\nexport default Ember.Component.extend({\n    classNames: ['date-picker'],\n    label: null,\n    srOnly: false,\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    // now takes moment.js format\n    value: null,\n\n    placeholder: null,\n\n    minDate: null,\n    maxDate: null,\n\n    inputMode: false,\n\n    format: null,\n    minView: 'days', //months\n\n    isoLocale: Ember.computed.reads('intl.isoLocale'),\n\n    /**\n     * Some dates need to be displayed as just Month and Year.\n     * The ordering and separator depends on user's locale (e.g., Japanese (ja) should display YYYY/M and German (de) would prefer M.YYYY)\n     * Moment does not provide an api to do this.\n     */\n    monthYearLocaleFormat: Ember.computed('value', function () {\n        moment.locale(this.get('isoLocale'));\n        let now = moment();\n        let localeFormat = now.creationData().locale.longDateFormat('L');\n        const regex = /DD\\W|\\WDD/g;\n        localeFormat = localeFormat.replace(regex, '');\n        return localeFormat.replace(/MM/, 'M');\n    }),\n\n    // Used to populate the bootstrap datepicker in setupDatepicker below.\n    datepickerValue: Ember.computed('value', function () {\n        let monthYearLocaleFormat = 'L';\n        if (this.get('format') === 'monthYear') {\n            monthYearLocaleFormat = this.get('monthYearLocaleFormat');\n        }\n\n        let value = this.get('value');\n        let dateObject = moment();\n        if (!_.isEmpty(value)) {\n            const year = Ember.get(value, 'year');\n            const month = Ember.get(value, 'month') - 1;\n            const day = Ember.get(value, 'day');\n\n            // We don't chain calls in case year or month is empty/null\n            dateObject.year(year);\n            dateObject.month(month);\n            dateObject.date(day);\n        }\n\n        if (_.isEmpty(this.get('value'))) {\n            return '';\n        }\n\n        var view = this.get('minView');\n        if (view === 'months') {\n            return dateObject.format(monthYearLocaleFormat);\n        }\n        return dateObject.format(monthYearLocaleFormat);\n    }),\n\n    initDatepicker: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupDatepicker');\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$('.datepicker').datepicker('remove');\n    }),\n\n    didUpdateAttrs(changes) {\n        this._super(...arguments);\n\n        if (changes.newAttrs.entity.value !== changes.oldAttrs.entity.value) {\n            this.$('.datepicker').datepicker('update', this.get('datepickerValue'));\n        }\n    },\n\n    // This is called when editing the field. It initializes the bootstrap datepicker and passes in the values from the datepickerValue computed.\n    setupDatepicker() {\n        if (!this.get('inputMode')) {\n            return;\n        }\n\n        // lowercase because bootstrap datepicker expects mm instead of MM\n        let format = this.get('format') || moment.localeData()._longDateFormat.L.toLowerCase();\n        // if the format is monthYear then get the localized format and pass that to the datepicker\n        let monthYearLocaleFormat = format === 'monthYear' ? this.get('monthYearLocaleFormat').toLowerCase() : format;\n\n        let minView = Ember.get(minViewMode, this.get('minView'));\n\n        const language = this.get('intl.isoRegionalLocale');\n\n        let options = {\n            orientation: 'left bottom',\n            format: monthYearLocaleFormat,\n            minViewMode: minView,\n            todayHighlight: true,\n            clearBtn: true,\n            language: language,\n            container: `#${this.get('elementId')}`\n        };\n\n        let minDate = this.get('minDate');\n        if (minDate) {\n            options = Object.assign({}, options, {\n                startDate: moment(minDate).toDate()\n            });\n        }\n\n        let maxDate = this.get('maxDate');\n        if (maxDate) {\n            options = Object.assign({}, options, {\n                endDate: moment(maxDate).toDate()\n            });\n        }\n\n        // Some bootstrapper-datepicker languages do not include a\n        // translation for the \"Clear\" button\n        let dates = $.fn.datepicker.dates;\n        if (dates[language] && !dates[language].clear) {\n            const selectedLanguage = this.get('intl.isoLocale');\n            if (selectedLanguage == language) {\n                dates[language].clear = this.get('intl').t('common.clear');\n            }\n        }\n\n        // bootstrap datepicker is setup with datePickerValue from above.\n        this.$('.datepicker')\n            .datepicker(options)\n            .on('changeDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('clearDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('hide', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('show', () => {\n                Ember.run(() => {\n                    let classNames = this.get('classNames');\n                    let datepicker = this.$('.datepicker').data('datepicker');\n                    if (datepicker && datepicker.picker) {\n                        datepicker.picker.addClass(classNames.join(' '));\n                    }\n                });\n            })\n            .datepicker('update', this.get('datepickerValue'));\n\n        if (_.isEmpty(this.get('value')) || (!this.get('value.month') && !this.get('value.year'))) {\n            this.$('input').val('');\n        }\n    },\n\n    setData(event) {\n        let date;\n        let str = this.$('input').val();\n        moment.locale(this.get('intl.isoLocale'));\n        if (event.date && !_.isEmpty(str)) {\n            date = moment(event.date);\n        } else {\n            date = moment(str);\n\n            if (_.isEmpty(str) || isNaN(date.valueOf())) {\n                return this.clearValue();\n            }\n        }\n\n        let value = {};\n\n        let view = this.get('minView');\n\n        let day = date.date();\n        let month = date.month() + 1;\n        let year = date.year();\n\n        if (view === 'days') {\n            Ember.set(value, 'day', day);\n            Ember.set(value, 'month', month);\n        } else if (view === 'months') {\n            Ember.set(value, 'month', month);\n        }\n\n        Ember.set(value, 'year', year);\n\n        this.set('value', value);\n    },\n\n    clearValue() {\n        if (_.isEmpty(this.get('value'))) {\n            return;\n        }\n\n        if (this.get('outOfOffice')) {\n            // TODO: remove check for outOfOffice feature toggle when on in all environments\n            this.set('value', null);\n        } else {\n            this.set('value.day', null);\n            this.set('value.month', null);\n            this.set('value.year', null);\n        }\n    },\n\n    _placeholder: Ember.computed('placeholder', function () {\n        var placeholder = this.get('placeholder');\n        if (placeholder) {\n            return this.get('intl').lookup(placeholder, null, true).toString();\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"SED20YyW\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"label\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"class\\\",[34,[\\\"form-control datepicker \\\",[33,[\\\"if\\\"],[[28,[\\\"error\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"placeholder\\\",[26,[\\\"_placeholder\\\"]],null],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"class\\\",\\\"datepicker\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/date-picker/template.hbs\"}});","define(\"connections-ui/components/desktop-notification/component\", [\"exports\", \"ember-purecloud-components/components/desktop-notification/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import DocumentTitle from \"ember-document-title/components/document-title\";\n\nexport default DocumentTitle;\n","import Ember from 'ember';\n\nexport default Ember.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","export default Ember.HTMLBars.template({\"id\":\"22Vbwxkd\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-container/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-item'],\n    attributeBindings: ['draggable', 'ariaLabel'],\n    ariaLabel: Ember.computed(function () {\n        return this.get('intl').lookup('components.inbox.actions.selectCall');\n    }),\n    draggable: 'true',\n    dataType: 'text',\n\n    data: null,\n\n    intl: Ember.inject.service(),\n\n    dragStart(event) {\n        event.dataTransfer.setData(this.get('dataType'), this.get('data'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KQqsaW/F\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-item/template.hbs\"}});","define(\"connections-ui/components/drop-down/component\", [\"exports\", \"ember-purecloud-components/components/drop-down/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.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.get('elementId');\n        Ember.$(window).on(`click.${id}`, event => {\n            Ember.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        Ember.$(window).off(`.${this.get('elementId')}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"qyhLFnOs\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-purecloud\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleMenu\\\"],null]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[1,[26,[\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu list-unstyled \\\",[33,[\\\"if\\\"],[[28,[\\\"showMenu\\\"]],\\\"show\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/dropdown-menu/template.hbs\"}});","define(\"connections-ui/components/duration-format/component\", [\"exports\", \"ember-purecloud-components/components/duration-format/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Component.extend({\n    classNames: ['edit-profile-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    entity: null,\n    editing: false,\n    canUploadPicture: true,\n    canEditProfilePicture: true,\n    canEditInformalPicture: true,\n    canEditAgentImage: false,\n\n    showingProfile: true,\n    showingInformal: false,\n\n    openCaption: null,\n    currentInformal: null,\n\n    attrs: {\n        upload() {},\n        select() {},\n        delete() {},\n        changeType() {}\n    },\n\n    actions: {\n        showInformalPhotos: function () {\n            this.set('showingProfile', false);\n            this.set('showingInformal', true);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('informal');\n        },\n\n        showProfilePictures: function () {\n            this.set('showingProfile', true);\n            this.set('showingInformal', false);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('profile');\n        },\n\n        showAgentPhotos() {\n            this.set('showingProfile', false);\n            this.set('showingInformal', false);\n            this.set('showingAgent', true);\n\n            this.get('changeType')('agent');\n        },\n\n        uploadImage(type) {\n            this.get('upload')(type);\n        },\n\n        selectUploadedImage(type, image, active) {\n            this.get('select')(type, image, active);\n        },\n\n        deleteUploadedImage(type, image, active) {\n            this.get('delete')(type, image, active);\n        },\n\n        removeAgentImage() {\n            const entity = this.get('entity');\n\n            if (this.get('entity.type') === 'person') {\n                const userId = entity.id;\n                const imageId = this.get('entity.agent.profileImage.firstObject._id');\n                if (!imageId) return;\n\n                this.get('ajax')\n                    .delete(Ember.get(this, 'application').pcV2Uri(`api/v2/users/${userId}/images/${imageId}`))\n                    .then(() => {\n                        this.get('store')\n                            .findRecord('person', userId)\n                            .then(() => {\n                                entity.set('agent.profileImage', [], { overwrite: true });\n                            });\n                    })\n                    .catch(err => {\n                        const intl = this.get('intl');\n                        this.logger.error('failed to upload image', { error: err });\n                        this.get('notification').error(\n                            intl.lookup('notification.titles.profileSaveError').toString(),\n                            intl.lookup('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                        return;\n                    });\n            } else {\n                entity.set('agent.profileImage', [], { overwrite: true });\n                let section = entity.get('fieldConfig.agent');\n                entity.saveSection(section);\n            }\n        }\n    },\n\n    scrollActiveImageIntoView: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var activeImg = this.$('img.active'),\n                picturesContainer = this.$('.pictures');\n            if (activeImg.length > 0 && picturesContainer.length > 0) {\n                var target = activeImg[0],\n                    parent = picturesContainer[0];\n\n                parent.scrollTop = target.parentNode.offsetTop;\n            }\n        });\n    }),\n\n    setupTabListeners: Ember.on('didInsertElement', function () {\n        const component = this;\n\n        // Listen for guxactivetabchange event on gux-tabs element\n        this.$('gux-tabs').on('guxactivetabchange', function (event) {\n            Ember.run(function () {\n                const tabId = event.originalEvent.detail;\n\n                if (tabId === 'informal') {\n                    component.send('showInformalPhotos');\n                } else if (tabId === 'profile') {\n                    component.send('showProfilePictures');\n                } else if (tabId === 'agent') {\n                    component.send('showAgentPhotos');\n                }\n                // Set focus on the active tab\n                Ember.run.later(\n                    component,\n                    function () {\n                        const activeTab = component.$('.gux-tab.gux-active')[0];\n                        if (activeTab && activeTab.offsetParent !== null) {\n                            // Blur any currently focused element (likely the close button)\n                            if (document.activeElement) {\n                                document.activeElement.blur();\n                            }\n                            // Focus the active tab\n                            activeTab.focus();\n                        }\n                    },\n                    50\n                );\n            });\n        });\n    }),\n\n    teardownTabListeners: Ember.on('willDestroyElement', function () {\n        this.$('gux-tabs').off('guxactivetabchange');\n    }),\n\n    emptyProfilesText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyProfile';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyProfile';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyProfile';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    emptyInformalsText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyInformal';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyInformal';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyInformal';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    profileInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_profile_instructionText')) {\n            return this.get('intl').lookup('person_images_profile_instructionText').toString();\n        }\n        return '';\n    }),\n\n    informalInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_informal_instructionText')) {\n            return this.get('intl').lookup('person_images_informal_instructionText').toString();\n        }\n        return '';\n    }),\n\n    agentImage: Ember.computed('entity.agent.profileImage.@each.value', function () {\n        let image = this.get('entity').getFieldValue('agent.profileImage');\n        if (_.isEmpty(image) || _.isEmpty(image.value)) {\n            return null;\n        }\n\n        return image.value.x200 || image.value.x800 || image.value.x1024;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O7zPMaH7\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-tabs\\\",{\\\"attrs\\\":[[16,\\\"active-tab\\\",[26,[\\\"changeType\\\"]],null],[15,\\\"guxactivetabchange\\\",\\\"imageSelectTypeSwitchChange($event)\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-tab-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"class\\\",\\\"nav\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"profile-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"profile-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingProfile\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.uploads_images\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"informal-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"informal-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingInformal\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.images_informal\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"agent-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"agent-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingAgent\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.agent_profileImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current current-profile-picture\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"entity\\\"]],400]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-profile\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"profile\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.newImageBtn\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfilePicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"instructionText\\\"],[13],[1,[26,[\\\"profileInstructionText\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedProfilePictures\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],96,[28,[\\\"editing\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[26,[\\\"emptyProfilesText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"instruction-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"informalInstructionText\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"informal-button\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-informal\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"informal\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"pictures informal \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"center\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedInformalPhotos\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"type\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"showingInformal\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],150,\\\"informal\\\",[28,[\\\"editing\\\"]],[28,[\\\"canEditInformalPicture\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"emptyInformalsText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current agent-image current-agent-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-image\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[15,\\\"class\\\",\\\"full-width-image\\\"],[16,\\\"src\\\",[34,[[26,[\\\"agentImage\\\"]]]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"agent-buttons\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture upload-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"agent\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-danger remove-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeAgentImage\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"]]}],[0,\\\"\\\\n\\\"]]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/edit-profile-picture/template.hbs\"}});","define(\"connections-ui/components/ember-modal-dialog-positioned-container\", [\"exports\", \"ember-modal-dialog/components/positioned-container\"], function (_exports, _positionedContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _positionedContainer.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-basic-dialog\", [\"exports\", \"ember-modal-dialog/components/basic-dialog\"], function (_exports, _basicDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-in-place-dialog\", [\"exports\", \"ember-modal-dialog/components/in-place-dialog\"], function (_exports, _inPlaceDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inPlaceDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-dialog\"], function (_exports, _liquidDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-tether-dialog\"], function (_exports, _liquidTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/tether-dialog\"], function (_exports, _tetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-tether\", [\"exports\", \"ember-tether/components/ember-tether\"], function (_exports, _emberTether) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberTether.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-wormhole\", [\"exports\", \"ember-wormhole/components/ember-wormhole\"], function (_exports, _emberWormhole) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberWormhole.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\n\nconst { computed } = Ember;\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 Ember.Component.extend({\n    classNames: ['emergency-location'],\n    classNameBindings: ['saving:saving-emergency-location'],\n    intl: Ember.inject.service(),\n\n    editingElocation: false,\n    eLocation: computed.reads('emergencyLocationData.eLocation'),\n    showTitle: false,\n    showResetButton: false,\n    showTitleIcons: true,\n    showTitleInEditMode: true,\n    personId: null,\n    primaryVoice: computed.reads('emergencyLocationData.primaryVoice'),\n    saving: false,\n    countryOptions: Ember.A([]),\n\n    street1: computed.reads('updatedAddress.street1'),\n    street2: computed.reads('updatedAddress.street2'),\n    city: computed.reads('updatedAddress.city'),\n    state: computed.reads('updatedAddress.state'),\n    zipcode: computed.reads('updatedAddress.zipcode'),\n    country: computed('updatedAddress.country', 'countryOptions.[]', function () {\n        return this.get('updatedAddress.country') || '';\n    }),\n\n    street1ReadOnly: computed.reads('eLocation.address.street1'),\n    street2ReadOnly: computed.reads('eLocation.address.street2'),\n    cityReadOnly: computed.reads('eLocation.address.city'),\n    stateReadOnly: computed.reads('eLocation.address.state'),\n    zipcodeReadOnly: computed.reads('eLocation.address.zipcode'),\n    countryReadOnly: computed.reads('eLocation.address.country'),\n\n    isAddressEmpty(address) {\n        if (!address) {\n            return true;\n        }\n        return (\n            !Ember.get(address, 'street1') ||\n            !Ember.get(address, 'city') ||\n            !Ember.get(address, 'zipcode') ||\n            !Ember.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: computed.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.get('elementId')}`;\n    }),\n\n    toolTipHelpId: computed('elementId', function () {\n        return `help-id-${this.get('elementId')}`;\n    }),\n\n    toolTipAlertInfoId: computed('elementId', function () {\n        return `alert-info-id-${this.get('elementId')}`;\n    }),\n\n    isEligibleForE911: computed.reads('emergencyLocationData.isEligibleForE911'),\n    eLocationInlineWarning: computed.reads('emergencyLocationData.eLocationInlineWarning'),\n\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    actions: {\n        setField(field, event) {\n            if (!event || !event.target || (!event.target.value && !this.get(`${field}`))) return;\n            this.set(`updatedAddress.${field}`, event.target.value);\n\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(this.get('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.get('intl').lookup(entry.displayName).toString()\n            };\n        });\n        this.set('countryOptions', countryTranslated);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.get('setUpdatedAddress').perform();\n    },\n\n    setUpdatedAddress: task(function* () {\n        yield waitForQueue('actions');\n        if (this.get('eLocation') && this.get('editingElocation') && !this.get('saving')) {\n            const eLocationCopy = cloneDeep(this.get('previewAddress'));\n            this.set('updatedAddress', eLocationCopy);\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(cloneDeep(this.get('updatedAddress')));\n            }\n        }\n    }).restartable()\n});\n","export default Ember.HTMLBars.template({\"id\":\"p7JEF6x8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"edit-mode \\\",[33,[\\\"unless\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleInEditMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section-edit\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipAlertInfoId\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"alert-info-edit\\\"],[15,\\\"icon-name\\\",\\\"alert-info\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipAlertInfoId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.alertInfo\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"previewAddressIsEligible\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[15,\\\"name\\\",\\\"street1\\\"],[15,\\\"class\\\",\\\"address-street1\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street1\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address1Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street1\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address1Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[15,\\\"name\\\",\\\"street2\\\"],[15,\\\"class\\\",\\\"address-street2\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street2\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address2Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street2\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address2Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[15,\\\"name\\\",\\\"city\\\"],[15,\\\"class\\\",\\\"address-city\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"city\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.cityPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"city\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.cityLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[15,\\\"name\\\",\\\"state\\\"],[15,\\\"class\\\",\\\"address-state\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"state\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.statePlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"state\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.stateLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[15,\\\"name\\\",\\\"zipcode\\\"],[15,\\\"class\\\",\\\"address-zipcode\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"zipcode\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.zipPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"zipcode\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.zipLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-dropdown\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"country\\\"],null],null],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[15,\\\"name\\\",\\\"country\\\"],[15,\\\"class\\\",\\\"address-country\\\"],[16,\\\"value\\\",[26,[\\\"country\\\"]],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.countryPlaceholder\\\"],null]]]],[15,\\\"filterable\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"countryOptions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"country\\\",\\\"value\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[28,[\\\"country\\\",\\\"displayName\\\"]],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"country\\\"]},null],[0,\\\"                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.countryLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"previewAddressError\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"non-edit-mode \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipArrowId\\\"]]]]],[15,\\\"class\\\",\\\"edit-emergency-location-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"personId\\\"]],[33,[\\\"query-params\\\"],null,[[\\\"editEmergencyLocation\\\"],[\\\"true\\\"]]]],[[\\\"tabindex\\\",\\\"class\\\"],[\\\"0\\\",\\\"to-profile\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"edit\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipArrowId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.update\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipHelpId\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],null],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-help\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipHelpId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showNumberInTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-for-number\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.titleForNumber\\\"],[[\\\"number\\\"],[[28,[\\\"primaryVoice\\\",\\\"display\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street1\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street1ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street2\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street2ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field city-state-zip\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"cityReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"stateReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"zipcodeReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field country\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"countryReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showResetButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]]]],[15,\\\"accent\\\",\\\"tertiary\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"resetElocation\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/emergency-location/template.hbs\"}});","define(\"connections-ui/components/emoji-dom/component\", [\"exports\", \"ember-purecloud-components/components/emoji-dom/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","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 isEmpty from 'lodash.isempty';\nimport debounce from 'lodash.debounce';\nimport { inject as service } from '@ember/service';\nimport Ember from 'ember';\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-contact-group-v2'],\n    classNameBindings: ['compact'],\n    intl: service(),\n    session: service(),\n    application: service(),\n    canViewChat: true,\n    canViewVideo: true,\n    entity: null,\n    videoTooltipTitle: '',\n    linkProfile: false,\n    showFavorite: false,\n    showImages: true,\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    toggleFavorite() {},\n\n    useMediaProviders: false,\n\n    actions: {\n        makeCall: debounce(function () {\n            if (this.get('isGroup')) {\n                const groupNumber = this.get('entity.contactInfo.groupNumber.firstObject.value.number');\n                const groupExtension = this.get('entity.contactInfo.groupNumber.firstObject.value.extension');\n                const phoneNumber = groupNumber || groupExtension;\n                this.bubbleAction({\n                    action: 'startCallByNumber',\n                    actionContext: [phoneNumber]\n                });\n            } else {\n                this.bubbleAction({\n                    action: 'startCallPersonById',\n                    actionContext: [this.get('entity.id')]\n                });\n            }\n\n            this.get('onContact')();\n        }, 250),\n\n        startChat() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        sendLove() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'sendLove',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        launchWebrtc() {\n            if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                return;\n            }\n\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoomWithVideo',\n                actionContext: [entity.get('id'), this.get('useMediaProviders')]\n            });\n\n            this.get('onContact')();\n        },\n\n        showGallery() {\n            this.sendAction('viewLightGallery');\n\n            this.get('onContact')();\n        },\n\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    isPerson: equal('entity.type', 'person'),\n    isGroup: equal('entity.type', 'group'),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    isSelf: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    hasImages: computed(\n        'entity.uploadedInformalPhotos.[]',\n        'entity.images.informal.[]',\n        'entity.images.gallery.[]',\n        function () {\n            if (!this.get('showImages')) {\n                return false;\n            }\n\n            const personHasImage = this.get('entity.type') === 'person' && !!this.get('entity.images.informal.length');\n            const groupHasImage = this.get('entity.type') === 'group' && !!this.get('entity.images.gallery.length');\n            return personHasImage || groupHasImage;\n        }\n    ),\n\n    hasPhone: computed('entity.phone', 'entity.contactInfo.groupNumber', function () {\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('entity.contactInfo.groupNumber'));\n        }\n        return !isEmpty(this.get('entity.phone'));\n    }),\n\n    email: computed('entity.primaryContactInfo.email.firstObject.value.fieldId', 'isPerson', function () {\n        if (!this.get('isPerson')) {\n            return;\n        }\n        let entity = this.get('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.get('isPerson') && !this.get('isGroup')) {\n                return;\n            }\n            let entity = this.get('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.get('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.get('emailEnabled')) {\n            return `mailto:${this.get('email')}`;\n        }\n        return '';\n    }),\n\n    tel: computed('phone', function () {\n        const phone = this.get('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.get('phoneServiceEnabled') && this.get('phoneAvailable')) || !isEmpty(this.get('phone'));\n    }),\n\n    showPhone: computed('phoneServiceEnabled', 'phone', 'isGroup', function () {\n        if (!this.get('phoneServiceEnabled')) {\n            return false;\n        }\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('phone'));\n        } else {\n            return true;\n        }\n    }),\n\n    entityData: computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    didRender() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this._updateFavoriteAttributes);\n    },\n\n    _updateFavoriteAttributes() {\n        const entity = this.get('entity');\n        if (!entity) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        if (!intl) {\n            return;\n        }\n\n        const isFavorite = entity.get('isFavorite');\n        const name = entity.get('name') || '';\n        const title = isFavorite ? intl.t('common.unMarkFavorite', { name }) : intl.t('common.markFavorite', { name });\n\n        // Find the entity-favorite component in this component's DOM\n        const element = this.element;\n        if (!element) {\n            return;\n        }\n\n        // Find the button (it might be the root element or inside)\n        let favoriteButton = element.querySelector('button.entity-favorite, button.person-favorite');\n        if (!favoriteButton) {\n            const favoriteComponent = element.querySelector('.entity-favorite');\n            if (favoriteComponent) {\n                favoriteButton =\n                    favoriteComponent.tagName === 'BUTTON'\n                        ? favoriteComponent\n                        : favoriteComponent.querySelector('button');\n            }\n        }\n\n        if (favoriteButton && title) {\n            // Set title on the button element\n            favoriteButton.setAttribute('title', title);\n            favoriteButton.title = title;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+JHLGccX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showPhone\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"tel\\\"]]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"font-icon\\\"],null,[[\\\"class\\\"],[\\\"pc-moon pc-phone\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"isPerson\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.emailSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],null],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"mailto\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-email\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.email\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"isChatEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact chat\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-chat\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact webrtc \\\",[33,[\\\"if\\\"],[[28,[\\\"isVideoButtonEnabled\\\"]],\\\"enabled\\\",\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchWebrtc\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-video\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[26,[\\\"videoTooltipTitle\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isLoveEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact purelove\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.propsSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendLove\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-love\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.props\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasImages\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact gallery\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.goToGallerySr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showGallery\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToGallery\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"linkProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact profile\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"icon\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showFavorite\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"import-data\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.importLinkedinSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showLinkedInImport\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-linkedin\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.importLinkedin\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-favorite\\\"],null,[[\\\"entity\\\",\\\"toggleFavorite\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact-group-v2/template.hbs\"}});","define(\"connections-ui/components/entity-contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/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: Ember.inject.service(),\n    phoneService: Ember.inject.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.get('makingCall')) {\n                const person = this.get('otherParty.content') || this.get('person');\n\n                const queue = this.get('queue.content');\n                const phoneNumber = this.get('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.get('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.finally(() => {\n                    this.set('makingCall', false);\n                });\n            }\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport debounce from 'lodash.debounce';\n\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport * as focusTrap from 'focus-trap';\n\nvar EntityContactComponent = Ember.Component.extend(PromiseLoadingMixin, FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressformat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    showPhone: false,\n    showChat: false,\n    showEmail: false,\n    showFavorite: false,\n    shouldTether: false,\n    contact: null,\n    phoneNumber: null,\n    email: null,\n    callId: null,\n\n    shouldDisplayDropdown: true,\n    showDropdown: false,\n    callConnecting: false,\n    flaggingSupportEnabled: false,\n    isRedial: false,\n    _closingViaEscape: false,\n\n    tether: null,\n\n    trap: null,\n\n    actions: {\n        toggleFavorite: function () {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        },\n\n        toggleDropdown: function (skipFocus) {\n            this.toggleProperty('showDropdown');\n\n            if (this.get('showDropdown') && !skipFocus && !this.get('_closingViaEscape')) {\n                let tether = this.get('tether');\n                if (this.get('shouldTether') && !_.isEmpty(tether)) {\n                    Ember.run.scheduleOnce('afterRender', tether, tether.position);\n                }\n                // Focus first focusable element when dropdown opens\n                Ember.run.scheduleOnce('afterRender', this, function () {\n                    // Use a small delay to ensure tethered dropdown is positioned\n                    const focusTimer = Ember.run.later(\n                        this,\n                        function () {\n                            if (this.get('_closingViaEscape') || !this.get('showDropdown')) {\n                                return;\n                            }\n                            // Check both regular and tethered dropdown menus\n                            const dropdown =\n                                this.$('.dropdown-menu.show').length > 0\n                                    ? this.$('.dropdown-menu.show')\n                                    : Ember.$('.entity-contact-dropdown-menu.show');\n\n                            const firstFocusable = dropdown\n                                .find('a, button, [tabindex=\"0\"]')\n                                .filter(':visible')\n                                .first();\n\n                            if (firstFocusable.length > 0) {\n                                firstFocusable.focus();\n                            }\n                        },\n                        50\n                    );\n                    this.set('_focusTimer', focusTimer);\n                });\n            }\n        },\n\n        makeCall: debounce(function (address) {\n            if (this.get('session.features.digitalFirstPURE2942') && !this.get('permissions.phoneEnabled')) {\n                return;\n            }\n            this.set('showDropdown', false);\n\n            this.get('person').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                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [address]\n                    });\n                } else if (!_.isEmpty(person) && !(this.get('isExternalContact') || this.get('isGroup'))) {\n                    // Or call person by their guid\n                    // Calling a person back at their preferred number.\n                    this.bubbleAction({\n                        action: 'startCallPersonById',\n                        actionContext: [this.get('person.id')]\n                    });\n                } else {\n                    // Otherwise call person by specified phone number to the component.\n                    // (call-history-entry, active-call-entry components)\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [this.get('phoneNumber')]\n                    });\n                }\n            });\n        }, 250),\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                if (this.get('session.features.digitalFirstPURE2942')) {\n                    return;\n                }\n                window.top.location = 'tel:' + value.data.rel.e164;\n            }\n        },\n\n        startChat: function () {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [this.get('contact')]\n            });\n            this.set('showDropdown', false);\n        },\n\n        sendToProfile: function () {\n            this.get('person').then(person => {\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    entityData: Ember.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    isEntityFavoriteDecompEnabled: Ember.computed.readOnly('session.features.epcDecompEntityFavorite'),\n\n    callConnected: Ember.observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = Ember.get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.get('callId');\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    phoneNumberDetails: Ember.computed('phoneNumber', 'person', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.get('addressformat').formatAddressForDisplay(this.get('phoneNumber'));\n    }),\n\n    phoneServiceEnabled: Ember.computed('phone.{enabled,phoneDisabled,noStationSelected}', function () {\n        return this.get('phone.enabled') && !this.get('phone.noStationSelected') && !this.get('phone.phoneDisabled');\n    }),\n\n    phoneEnabled: Ember.computed('showPhone', 'isExternalContact', 'phoneNumber', 'phone.phoneDisabled', function () {\n        if (this.get('phone.phoneDisabled') || this.get('personIsDeleted')) {\n            return false;\n        }\n        return (\n            this.get('showPhone') ||\n            ((this.get('isExternalContact') || this.get('isGroup')) && !!this.get('phoneNumber'))\n        );\n    }),\n\n    chatEnabled: Ember.computed('showChat', 'isExternalContact', 'permissions.canViewBusinessChat', function () {\n        return this.get('permissions.canViewBusinessChat') && this.get('showChat') && !this.get('isExternalContact');\n    }),\n\n    emailEnabled: Ember.computed('showEmail', 'isExternalContact', 'email', function () {\n        return this.get('showEmail') || (this.get('isExternalContact') && !!this.get('email'));\n    }),\n\n    favoriteEnabled: Ember.computed('showFavorite', 'isExternalContact', 'favorites.enabled', function () {\n        return this.get('showFavorite') && !this.get('isExternalContact') && this.get('favorites.enabled');\n    }),\n\n    isExternal: Ember.computed('contact.participantType', function () {\n        if (this.get('contact.type') === 'person' || this.get('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: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'externalContact';\n    }),\n\n    isGroup: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'group';\n    }),\n\n    setExternalContactInfo: Ember.on('didInsertElement', function () {\n        if (this.get('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: Ember.on('didInsertElement', function () {\n        if (this.get('isGroup')) {\n            Ember.run.scheduleOnce('afterRender', this, this.setGroupNumber);\n        }\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        });\n    }),\n\n    person: Ember.computed('contact.{userId,type,id}', function () {\n        var type = this.get('contact.type');\n        var id = this.get('contact.id');\n        var userId = this.get('contact.userId');\n        if (type && id) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(this.get('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 Ember.RSVP.resolve({});\n    }),\n\n    personIsDeleted: Ember.computed.equal('person.state', 'deleted'),\n\n    hideChat: Ember.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: Ember.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: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.phone');\n        } else {\n            var promise = this.get('person').then(person => {\n                return this.getContactFieldValuesByType(person, 'voice');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    emails: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.email');\n        } else {\n            var promise = this.get('person').then(person => {\n                this.getContactFieldValuesByType(person, 'email');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    displayDropdown: Ember.computed('shouldDisplayDropdown', 'phones', 'emails', 'isExternalContact', function () {\n        var hasEmail = !_.isEmpty(this.get('emails'));\n        var hasPhone = !_.isEmpty(this.get('phones'));\n        var canDisplay = this.get('shouldDisplayDropdown');\n        var isContact = this.get('isExternalContact');\n\n        return canDisplay && (!isContact || hasEmail || hasPhone);\n    }),\n\n    callTitle: Ember.computed(function () {\n        return this.get('intl').t('tooltip.contactIcon.phone').toString();\n    }),\n\n    attachListeners: Ember.on('didInsertElement', function () {\n        var id = this.get('elementId');\n\n        Ember.$(window).on('click.' + id, Ember.run.bind(this, this.detectOutsideClick));\n        // Use keyup instead of keydown to avoid conflicts\n        Ember.$(document).on('keyup.' + id, Ember.run.bind(this, this.handleKeyDown));\n    }),\n\n    setupTether: Ember.on('didInsertElement', function () {\n        if (!this.get('shouldTether')) {\n            return;\n        }\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let tether = new window.Tether({\n                element: this.$('.dropdown-menu')[0],\n                target: this.$('.show-more')[0],\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    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    removeTether() {\n        let tether = this.get('tether');\n        if (tether) {\n            tether.destroy();\n            if (tether.element) {\n                tether.element.remove();\n            }\n        }\n    },\n\n    removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    willDestroyElement() {\n        this.removeListeners();\n        this.removeTether();\n\n        this._super(...arguments);\n    },\n\n    detectOutsideClick: function (event) {\n        var id = this.get('elementId');\n        var target = Ember.$(event.target);\n\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        // Check if click is outside component and outside tethered dropdown\n        const isOutsideComponent = id && !target.parents('#' + id).length;\n        const isOutsideTetheredDropdown = !target.closest('.entity-contact-dropdown-menu').length;\n\n        if (isOutsideComponent && isOutsideTetheredDropdown) {\n            Ember.run.once(this, this.set, 'showDropdown', false);\n        }\n    },\n\n    handleKeyDown: function (event) {\n        const key = event.key || event.keyCode;\n\n        // Close dropdown on Escape\n        if ((key === 'Escape' || key === 'Esc' || key === 27) && this.get('showDropdown')) {\n            // Cancel any pending focus timer\n            const focusTimer = this.get('_focusTimer');\n            if (focusTimer) {\n                Ember.run.cancel(focusTimer);\n                this.set('_focusTimer', null);\n            }\n\n            // Set flag to prevent auto-focus\n            this.set('_closingViaEscape', true);\n\n            // Store reference to toggle button\n            const toggleButton = this.$('.show-more');\n\n            // Close dropdown\n            this.set('showDropdown', false);\n\n            // Return focus to toggle button\n            if (toggleButton && toggleButton.length > 0) {\n                toggleButton.focus();\n            }\n\n            // Reset flag after a delay\n            Ember.run.later(() => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('_closingViaEscape', false);\n                }\n            }, 200);\n\n            return 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 Ember.get(item.data, '_id') === Ember.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.get('notification').show({\n            target: this.get('phone.applicationController'),\n            tag: 'callHistory',\n            message: this.get('intl').t(key),\n            type: 'error',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').t('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    setGroupNumber() {\n        const data = this.get('contact').getFieldValue('contactInfo.groupNumber');\n        if (!_.isEmpty(data)) {\n            const number = this.get('addressformat').format(data);\n            this.set('phoneNumber', `tel:${number}`);\n        }\n    }\n});\n\nexport default EntityContactComponent;\n","export default Ember.HTMLBars.template({\"id\":\"rqw6vXEG\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isRedial\\\"]],[33,[\\\"t\\\"],[\\\"components.callHistory.redial\\\"],null],[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone make-call \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disablePhoneButton\\\"]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPhoneSpinner\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[16,\\\"target\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-chat \\\",[33,[\\\"unless\\\"],[[28,[\\\"chatEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\",[28,[\\\"contact\\\"]]],null]]],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"emailEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"icon btn btn-link btn-email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[26,[\\\"email\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"favoriteEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"contact\\\",\\\"isFavorite\\\"]],[33,[\\\"t\\\"],[\\\"common.unMarkFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],[33,[\\\"t\\\"],[\\\"common.markFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.moreActionSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.more\\\"],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-dropdown show-more \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null],\\\"hide\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"shouldTether\\\"]],\\\"entity-contact-dropdown-menu\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.phone\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]],[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"phoneEnabled\\\"]]],null]],null],\\\"disable-call\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\",\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"data\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.email\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry email \\\",[33,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"email\\\",[28,[\\\"email\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entry email primary\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isExternalContact\\\"]]],null],[33,[\\\"or\\\"],[[28,[\\\"chatEnabled\\\"]],[28,[\\\"person\\\",\\\"id\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"action-buttons\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-default action-button \\\",[33,[\\\"if\\\"],[[28,[\\\"hideChat\\\"]],\\\"hidden\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.chat\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"personIsDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-deleted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"person.deleted\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],null],[15,\\\"class\\\",\\\"btn btn-default action-button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendToProfile\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.profile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-actions\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flagInteraction\\\",[33,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]],\\\"unflag\\\",\\\"flag\\\"],null]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"flagOperationInProcess\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"flag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact/template.hbs\"}});","define(\"connections-ui/components/entity-favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"/IJ0Gtoh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"saving\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"cancelling\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"hideFooterRemoveButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"remove-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmRemoveSection\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-footer/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"IcVORgWW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-header \\\",[33,[\\\"if\\\"],[[28,[\\\"showInstructionText\\\"]],\\\"show-instruction-text\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[28,[\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"class\\\",\\\"title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"3\\\"],[13],[1,[26,[\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEditAction\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-action\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.editObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"editSection\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showHeaderLock\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"lock\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lock\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAddNew\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/add-new\\\"],null,[[\\\"section\\\",\\\"fieldValues\\\",\\\"disableDropdown\\\",\\\"modal\\\",\\\"addNewEntry\\\",\\\"toggleAddValue\\\"],[[28,[\\\"section\\\"]],[28,[\\\"fieldValuesToAdd\\\"]],[28,[\\\"disableAddValueDropdown\\\"]],[28,[\\\"modal\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-header/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { on, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-new'],\n    classNameBindings: ['hide'],\n\n    attrs: {\n        section: null,\n\n        fieldValues: [],\n        disableDropdown: false,\n\n        toggleAddValue: null,\n        addNewEntry: () => {}\n    },\n\n    fieldValues: [],\n\n    showDropdown: false,\n\n    actions: {\n        addNewEntry(value) {\n            this.attrs.addNewEntry(value);\n            this.set('showDropdown', false);\n        },\n\n        toggleAddValue() {\n            if (this.get('disableDropdown')) {\n                this.attrs.toggleAddValue();\n            } else {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    hide: computed('fieldValues.[]', function () {\n        return _.isEmpty(this.get('fieldValues'));\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-new').length) {\n                    this.set('showDropdown', false);\n                }\n            });\n        });\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7sTvc25t\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"add-new-button\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null],null],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"disableDropdown\\\"]],[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],[33,[\\\"t\\\"],[\\\"fieldSection.selectTypeToAddToList\\\"],[[\\\"list\\\"],[[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.addNew\\\"],null],false],[0,\\\"\\\\n\\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu add-new-dropdown \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldValues\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entity-list-item\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"add-new-entity-\\\",[28,[\\\"fieldValue\\\",\\\"fieldPathClass\\\"]]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"fieldValue\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldValue\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/add-new/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport curry from 'lodash/curry';\nimport groupBy from 'lodash/groupBy';\nimport isEmpty from 'lodash/isEmpty';\nimport map from 'lodash/map';\nimport reject from 'lodash/reject';\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { rerunLayouts } from '../../utils/masonry';\nimport FieldData from '../entity-profile/profiles/field-data';\nimport Profile from '../entity-profile/profiles/profile';\n\nconst { on, run, inject, getOwner, computed, observer, Component } = Ember;\n\nconst EXCLUDE_TYPES = ['image', 'reference'];\n\nfunction filterExcludedField(excludedFields, field) {\n    if (!excludedFields) {\n        return true;\n    }\n    return EXCLUDE_TYPES.indexOf(field.type) === -1 && excludedFields.indexOf(field.key) === -1;\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['entity-field-section', 'content'],\n    classNameBindings: ['section.key', 'editing'],\n    attributeBindings: ['tabindex:tabindex', 'ariaLabelledby:aria-labelledby'],\n    tabindex: '-1',\n    ariaLabelledby: computed('section.key', function () {\n        const sectionKey = this.get('section.key');\n        return sectionKey ? `${sectionKey}-section` : null;\n    }),\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    // required\n    entity: null,\n    sectionInfo: null,\n\n    // public\n    hideHeader: false,\n    editingProfile: false,\n    scrollOnAddNew: true,\n    excludedFields: [],\n    excludedEditingFields: [],\n\n    attrs: {\n        entity: null,\n        sectionInfo: null,\n\n        hideHeader: false,\n        editingProfile: false,\n        excludedFields: [],\n        excludedEditingFields: [],\n\n        removeSection: () => {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n    sectionName: computed.reads('section.sectionName'),\n    sectionKey: computed.reads('sectionInfo.section.key'),\n    editingSection: computed.alias('sectionInfo.editingSection'),\n\n    editing: computed.and('editingSection', 'editingProfile'),\n\n    // others\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: computed.reads('permissions.canViewCollaborateVideo'),\n    saving: false,\n    showModal: false,\n    cancelling: false,\n    hideEmptyValues: true,\n    showInstructionText: false,\n    disableAddValueDropdown: false,\n\n    showRemoveSectionModal: false,\n\n    fallbackToEmptyLabel: false,\n\n    hideFooterRemoveButton: false,\n\n    timer: null,\n\n    // legacy support\n    isEditing: computed.alias('editing'),\n\n    actions: {\n        toggleInstructionText() {\n            this.toggleProperty('showInstructionText');\n        },\n\n        editSection() {\n            this.set('editingSection', true);\n            this.updateMasonry();\n\n            if (this.get('hideFooterRemoveButton')) {\n                return;\n            }\n\n            const key = this.get('section.key');\n            if (this.get('profile.writeableSections').includes(key)) {\n                const readableFields = this.get('profile').getReadableFieldPathsForSection(this.get('section'));\n                const writeableFields = this.get('profile').getEditableFieldPathsForSection(this.get('section'));\n\n                this.set('hideFooterRemoveButton', readableFields.length !== writeableFields.length);\n            }\n        },\n\n        saveSection() {\n            this.saveSection()\n                .then(() => {\n                    this.set('editingSection', false);\n                    this.updateMasonry();\n                })\n                .catch(err => {\n                    this.logger.error('Error saving field section:', { err });\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    Ember.run.once(this, 'reconcileNewFields');\n                    const focusTarget = '.add-section button:first';\n                    doFocus(Ember, focusTarget);\n                });\n        },\n\n        cancel() {\n            this.set('cancelling', true);\n\n            this.reset().finally(\n                Ember.run.bind(this, () => {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    this.set('editingSection', false);\n                    this.set('cancelling', false);\n\n                    if (this.cancelEditElocation) {\n                        this.cancelEditElocation();\n                    }\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n\n                        let top = this.$().position().top;\n                        Ember.$('#orgspan').animate(\n                            {\n                                scrollTop: top\n                            },\n                            600\n                        );\n\n                        this.updateMasonry();\n                        const focusTarget = '.add-section button:first';\n                        doFocus(Ember, focusTarget);\n                    });\n                })\n            );\n        },\n\n        addNewEntry(field) {\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n\n            entity.set(path, '');\n\n            const valueReference = [].concat(entity.get(path)).pop();\n\n            const fieldData = FieldData.create({\n                entity,\n                field,\n                valueReference,\n                session: this.get('session')\n            });\n\n            this.get('fieldData').pushObject(fieldData);\n            this.get('_newFields').pushObject(fieldData);\n\n            this.notifyPropertyChange('groupedFieldData');\n\n            if (this.get('scrollOnAddNew')) {\n                Ember.run.scheduleOnce('afterRender', this, this.scrollToNewField, fieldData);\n            }\n\n            this.updateMasonry();\n        },\n\n        removeEntry(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        removeContactSection(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        confirmRemoveSection() {\n            this.set('showRemoveSectionModal', true);\n            const focusTarget = '.remove-section-confirmation button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        cancelRemoveSection() {\n            this.set('showRemoveSectionModal', false);\n            const focusTarget = '.add-section button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        removeSection() {\n            let entity = this.get('entity');\n            let fieldList = this.get('section.fieldList');\n            fieldList.forEach(field => {\n                let path = field.get('fieldPath');\n                if (entity.get(path) && !field.get('required')) {\n                    entity.set(path, [], { overwrite: true });\n                }\n            });\n\n            return this.saveSection().then(() => {\n                this.set('sectionInfo.adding', false);\n                this.set('sectionInfo.editingSection', false);\n\n                if (isEmpty(fieldList.filterBy('required'))) {\n                    this.attrs.removeSection(this.get('sectionInfo'));\n                }\n\n                this.send('cancelRemoveSection');\n            });\n        },\n\n        toggleAddValue: () => {}\n    },\n\n    removeEntryFromFieldData(fieldData) {\n        let entity = this.get('entity');\n        let field = fieldData.get('field');\n        let entry = fieldData.get('entry');\n        let path = field.getFieldPath();\n\n        this.get('fieldData').removeObject(fieldData);\n        this.get('_newFields').removeObject(fieldData);\n\n        entity.getFieldValue(path).removeObject(entry);\n        this.updateMasonry();\n    },\n\n    _groupedFieldData: null,\n    _newFields: null,\n\n    init() {\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        // Ensure section exists\n        if (section && section.key) {\n            if (entity.get(section.key) === undefined) {\n                entity.set(section.key, {});\n            }\n\n            const sectionData = entity.get(section.key);\n            const fieldPath = this.get('field') && this.get('field.key');\n\n            if (fieldPath && !Ember.get(sectionData, fieldPath)) {\n                const fullPath = `${section.key}.${fieldPath}`;\n                Ember.run.once(entity, entity.set, fullPath, [], { overwrite: true });\n            }\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        Ember.run.cancel(this.timer);\n    },\n\n    setupCacheValues: on('init', function () {\n        this.setProperties({\n            _groupedFieldData: [],\n            _newFields: []\n        });\n    }),\n\n    instructionTextTooltipOnInsert: on('didInsertElement', function () {\n        this.timer = run.scheduleOnce('afterRender', this, 'setupInstructionText');\n    }),\n\n    isViewMode: computed.not('editingProfile'),\n\n    ownProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    filteredFields: computed('entity.id', 'section', 'excludedFields.[]', 'profile.readableSections.[]', function () {\n        let section = this.get('section');\n        let fieldList = section.get('fieldList');\n        let isSuper = this.get('session.user.isAdmin') && !this.get('session.user.personId');\n\n        let fields = [],\n            filteredFields = [];\n        let excludedFields = this.get('excludedFields');\n        let excludedFieldsFilter = curry(filterExcludedField)(excludedFields);\n\n        if (isSuper) {\n            filteredFields = fieldList.filter(excludedFieldsFilter);\n        } else {\n            let readableFieldPaths = this.get('profile').getReadableFieldPathsForSection(section);\n\n            filteredFields = fieldList\n                .filter(excludedFieldsFilter)\n                .filter(field => {\n                    let section = this.get('section');\n                    let fieldPath = field.get('fieldPath');\n                    if (!section) {\n                        return false;\n                    }\n                    return readableFieldPaths.indexOf(fieldPath) !== -1;\n                })\n                .filter(field => {\n                    return field.type !== 'group';\n                });\n        }\n\n        fields.addObjects(filteredFields);\n\n        return fields;\n    }),\n\n    fieldData: computed('entity.id', 'filteredFields.[]', 'editingSection', '_newFields.[]', function () {\n        const filteredFields = this.get('filteredFields');\n        return this.getFieldEntries(filteredFields);\n    }),\n\n    groupedFieldData: computed('fieldData.[]', 'fieldData.length', function () {\n        const fieldData = this.get('fieldData');\n        const groupedData = groupBy(fieldData, data => data.get('field.key'));\n        return map(groupedData, (data, key) => ({ key, fieldData: data }));\n    }),\n\n    instructionText: computed('intl.isoLocale', function () {\n        const intl = this.get('intl');\n        const section = this.get('section').getI18nKey();\n        const key = `${section}_instructionText`;\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('section.instructionText');\n        }\n    }),\n\n    fieldValuesToAdd: computed('filteredFields.[]', function () {\n        let fields = this.get('filteredFields');\n        return fields.filterBy('repeatable');\n    }),\n\n    fieldSectionHasData: computed('fields.@each.isEmpty', 'editing', function () {\n        if (this.get('editing')) {\n            return true;\n        }\n\n        const fields = this.get('fieldData') || [];\n        return fields.some(field => !field.get('isEmpty'));\n    }),\n\n    canEditSection: computed(\n        'editingProfile',\n        'entity.id',\n        'session.user.isAdmin',\n        'profile.writeableSections.[]',\n        function () {\n            let editingProfile = this.get('editingProfile');\n            let permissions = this.get('profile.writeableSections');\n\n            if (this.get('session.user.isAdmin') && editingProfile) {\n                return true;\n            }\n\n            return permissions.indexOf(this.get('section.key')) !== -1 && editingProfile;\n        }\n    ),\n\n    hideAddNew: computed('section.key', 'section.fieldList', function () {\n        const sections = ['location', 'education', 'bio'];\n        return (\n            !sections.includes(this.get('section.key')) && isEmpty(this.get('section.fieldList').filterBy('repeatable'))\n        );\n    }),\n\n    disableSave: computed('entity.type', 'fieldData.@each.{isValid,isEmpty}', function () {\n        const fieldData = this.get('fieldData');\n        const isGroup = this.get('entity.type') === 'group';\n        const validFields = fieldData.map(data => {\n            const emptyCheck = ['weblink', 'email'];\n\n            if (emptyCheck.includes(data.get('field.type')) && !isGroup) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return reject(validFields).length > 0;\n    }),\n\n    showEditAction: computed('canEditSection', 'editingProfile', 'editingSection', function () {\n        const canEditSection = this.get('canEditSection');\n        const editingProfile = this.get('editingProfile');\n        const editingSection = this.get('editingSection');\n\n        return canEditSection && editingProfile && !editingSection;\n    }),\n\n    showHeaderLock: computed('editingProfile', 'canEditSection', function () {\n        return this.get('editingProfile') && !this.get('canEditSection');\n    }),\n\n    showAddNew: computed('editing', 'hideAddNew', function () {\n        return this.get('editing') && !this.get('hideAddNew');\n    }),\n\n    onEditingChange: observer('editingProfile', function () {\n        Ember.run.once(this, 'handleEditingChange');\n    }),\n\n    onValidityChange: observer('disableSave', function () {\n        const disableModal = this.get('disableModal');\n        if (disableModal) {\n            Ember.run.once(this, disableModal, this.get('disableSave'));\n        }\n    }),\n\n    getFieldEntries(fields) {\n        return fields\n            .map(field => {\n                const entity = this.get('entity');\n                const path = field.get('fieldPath');\n                const repeatable = Ember.get(field, 'repeatable');\n\n                let values = this.get('entity').getFieldValue(path) || [];\n\n                if (isEmpty(values) && !this.get('hideEmptyValues')) {\n                    entity.set(path, '');\n                    values = entity.get(path);\n                }\n\n                if (repeatable) {\n                    return values.map(valueReference =>\n                        FieldData.create({\n                            entity,\n                            field,\n                            valueReference,\n                            session: this.get('session'),\n                            permissions: this.get('permissions')\n                        })\n                    );\n                }\n\n                return FieldData.create({\n                    entity,\n                    field,\n                    valueReference: values,\n                    session: this.get('session'),\n                    permissions: this.get('permissions')\n                });\n            })\n            .flat()\n            .filter(v => !!v);\n    },\n\n    handleEditingChange() {\n        this.set('editingSection', false);\n    },\n\n    reconcileNewFields() {\n        this.set('_newFields', []);\n    },\n\n    saveSection(reload = true) {\n        const intl = this.get('intl');\n        const notification = this.get('notification');\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        this.set('saving', true);\n\n        return entity\n            .saveSection(section)\n            .then(() => {\n                if (reload) {\n                    entity.reload();\n                }\n\n                if (Ember.get(section, 'key') === 'contactInfo' && this.get('session.features.emergencyLocation')) {\n                    return;\n                }\n                const title = intl.lookup('notification.titles.profileSave');\n                const message = intl.lookup('notification.fieldSection.saved');\n\n                notification.info(title, message, { markdownToHtml: false, tag: 'profile' });\n            })\n            .catch(response => {\n                const errors = response.errors || response.payload;\n                const error = !isEmpty(errors) && errors[0];\n\n                this.set('saving', false);\n\n                if (!error) {\n                    return Ember.RSVP.reject(response);\n                }\n\n                if (error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                    return Ember.RSVP.resolve();\n                }\n\n                const statusCode = error.code || error.status;\n                if (statusCode) {\n                    const errorTitle = intl.lookup('notification.titles.profileSaveError');\n                    let errorMessage =\n                        error && error.detail ? error.detail : intl.lookup('notification.fieldSection.error');\n                    if (statusCode === 403) {\n                        errorMessage = intl.lookup('notification.fieldSection.forbidden');\n                    } else if (statusCode === 500 || statusCode === 400) {\n                        const title = error.title || (error.details && error.details.title);\n                        if (title) {\n                            // Check if its a duplicate error and let the user know\n                            const regex = /Duplicate value (?:.*) (.*)=[\\S]+/;\n                            const match = title.match(regex);\n                            if (match && match[1]) {\n                                const field = match[1];\n                                if (field === 'contactInfo.email_main') {\n                                    errorMessage = intl.lookup('notification.fieldSection.duplicateEmailError');\n                                }\n                            }\n                        }\n                    }\n\n                    notification.error(errorTitle, errorMessage, { markdownToHtml: false, tag: 'profile' });\n\n                    this.reset();\n                }\n\n                return Ember.RSVP.reject(response);\n            });\n    },\n\n    reset() {\n        return this.get('entity')\n            .reload()\n            .then(() => {\n                this.notifyPropertyChange('section');\n\n                let entity = this.get('entity');\n                let fieldPaths = this.get('section.fieldList').mapBy('fieldPath');\n                fieldPaths.forEach(path => {\n                    let currentValue = entity.getFieldValue(path);\n                    if (Array.isArray(currentValue)) {\n                        const tempValues = currentValue.filter(value => !!value.tempId);\n                        if (tempValues.length && currentValue.length) {\n                            entity.set(path, [], { overwrite: true });\n                        } else if (tempValues.length) {\n                            tempValues.forEach(value => {\n                                currentValue.removeObject(value);\n                            });\n                        }\n                    } else if (currentValue.tempId && !currentValue._id) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n            });\n    },\n\n    scrollToNewField(fieldData) {\n        let elem = this.$().find(`[data-field-id=${fieldData.get('fieldId')}]`);\n        let parent = elem.parents('.field-section');\n        if (!isEmpty(elem)) {\n            let top = elem.position().top;\n            let parentTop = parent.position().top;\n            Ember.$('#orgspan').animate(\n                {\n                    scrollTop: top + parentTop\n                },\n                600\n            );\n        }\n    },\n\n    setupInstructionText() {\n        let text = this.get('instructionText');\n        if (text) {\n            this.$('.title').tooltip({\n                title: text,\n                placement: 'right'\n            });\n        }\n    },\n\n    _updateMasonry() {\n        rerunLayouts();\n    },\n\n    updateMasonry() {\n        Ember.run(() => Ember.run.scheduleOnce('afterRender', this, this._updateMasonry));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport EmergencyLocationUtil from 'connections-ui/utils/emergency-location-util';\n\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nimport ContactInfoGroup from './contact-info-group';\n\nconst { inject, computed } = Ember;\n\nfunction keyForField(field) {\n    let type = field.type;\n    let key = field.key;\n\n    if (_.includes(['email', 'phone', 'address'], type)) {\n        return type;\n    } else if (_.includes(['im', 'address'], key) || type === 'multiline-text') {\n        return key;\n    } else {\n        return 'other';\n    }\n}\n\nexport default EntityFieldSection.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    hideAddNew: false,\n    hideEmptyValues: true,\n    hideFooterRemoveButton: true,\n    updatedElocationAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressisEligible: false,\n\n    excludedFields: ['chat', 'voicemailEnabled'],\n\n    _groupedContactInfo: null,\n\n    actions: {\n        editSection() {\n            if (this.editElocation && this.get('session.features.emergencyLocation')) {\n                this.editElocation();\n            }\n            this._super(...arguments);\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const entity = this.get('entity');\n            const primaryContactSection = this.get('entity.fieldConfig.primaryContactInfo');\n            const latestPrimaryContactInfo = _.clone(this.get('entity.primaryContactInfo'));\n\n            this.set('saving', true);\n\n            this.saveSection(false)\n                .then(() => {\n                    // cant set non-existent fields as primary...so delay primary saving\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('saving', false);\n                        this.set('editingSection', false);\n                    }\n                    return this.reconcilePrimaryContact(latestPrimaryContactInfo);\n                })\n                .then(() => {\n                    return entity.saveSection(primaryContactSection);\n                })\n                .then(() => {\n                    const errorField = this.get('_newFields').find(field => {\n                        return !_.isEmpty(field.get('value.rel.errorCode'));\n                    });\n\n                    if (errorField) {\n                        const title = intl.lookup('notification.titles.profileContactInfoError');\n                        const message = intl.lookup('notification.fieldSection.contactInfoError');\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    entity.reload();\n\n                    Ember.run.once(this, 'reconcileNewFields');\n\n                    if (this.get('session.features.emergencyLocation')) {\n                        const isAddressEmpty =\n                            !this.get('updatedElocationAddress.city') &&\n                            !this.get('updatedElocationAddress.street1') &&\n                            !this.get('updatedElocationAddress.street2') &&\n                            !this.get('updatedElocationAddress.state') &&\n                            !this.get('updatedElocationAddress.zipcode');\n\n                        if (this.saveElocation && !isAddressEmpty) {\n                            return this.saveElocation(this.get('updatedElocationAddress'));\n                        } else if (this.refreshAllEmergencylocationInfo) {\n                            //Should run this in case user changes from a primary number that is not E911 capable to one that is.\n                            return this.refreshAllEmergencylocationInfo(true); //notify=true\n                        }\n                    } else {\n                        return Ember.RSVP.resolve();\n                    }\n                })\n                .then(() => {\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('notification.titles.profileSave');\n                        const message = intl.lookup('notification.fieldSection.saved');\n                        this.get('notification').info(title, message, { markdownToHtml: false, tag: 'profile' });\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                    }\n                })\n                .catch(errObject => {\n                    if (errObject.softError && !errObject.hardError) {\n                        //If only inline custom errors\n                        //softError are handled in the service\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                        return;\n                    }\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('emergencyLocation.errors.title');\n                        const hardErrorMessage = errObject.hardError ? errObject.hardError : '';\n                        const defaultErrorMessage = intl.lookup('emergencyLocation.errors.e911LocationSet');\n\n                        const message = hardErrorMessage || defaultErrorMessage;\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('editingSection', false);\n                    }\n                });\n        },\n\n        updateElocationOnChange(updatedAddress) {\n            this.set('updatedElocationAddress', updatedAddress);\n        },\n\n        addNewEntry(group) {\n            const field = group.get('field') || group.get('repeatableField') || group;\n            this._super(field);\n\n            // Move focus to the newly added entry's first focusable element\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                const groupKey = group.get('key');\n                const entries = this.$(`fieldset.contact-info-${groupKey}-type .group-values .field-entry`);\n                if (entries && entries.length) {\n                    const lastEntry = entries.last();\n                    const focusable = lastEntry.find('input, select, textarea, [tabindex=\"0\"]').first();\n                    if (focusable.length) {\n                        focusable.focus();\n                    }\n                }\n            });\n        },\n\n        removeContactSection(fieldData, group) {\n            _.forEach(fieldData, field => {\n                this._super(field);\n            });\n\n            const groupedFieldData = this.get('_groupedContactInfo');\n            if (groupedFieldData) {\n                groupedFieldData.removeObject(group);\n            }\n\n            // After removing a section, move focus to the next available group or the section heading\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                // Try to focus the next fieldset's first focusable element\n                const remainingFieldsets = this.$('fieldset.field-entries:not(.empty-group)');\n                if (remainingFieldsets && remainingFieldsets.length) {\n                    const focusable = remainingFieldsets\n                        .first()\n                        .find('input, select, textarea, button, [tabindex=\"0\"]')\n                        .first();\n                    if (focusable.length) {\n                        focusable.focus();\n                        return;\n                    }\n                }\n                // Fallback: focus the section itself\n                if (this.$()) {\n                    this.$().focus();\n                }\n            });\n        },\n\n        removeEntry(fieldData) {\n            let key = keyForField(fieldData.get('field'));\n            let group = this.get('groupedContactInfo').findBy('key', key);\n            if (group) {\n                group.get('fieldData').removeObject(fieldData);\n\n                if (fieldData.get('isPrimaryField')) {\n                    this.removePrimaryContact(fieldData);\n                }\n\n                this._super(...arguments);\n\n                // After removing, move focus to the group's \"Add New\" button or the next remaining entry\n                Ember.run.scheduleOnce('afterRender', this, function () {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n                    const groupFieldset = this.$(`fieldset.contact-info-${key}-type`);\n                    if (groupFieldset && groupFieldset.length) {\n                        // Try focusing the next remaining entry's remove button or input\n                        const remainingEntries = groupFieldset.find('.group-values .field-entry');\n                        if (remainingEntries.length) {\n                            const focusable = remainingEntries\n                                .last()\n                                .find('input, select, textarea, button, [tabindex=\"0\"]')\n                                .first();\n                            if (focusable.length) {\n                                focusable.focus();\n                                return;\n                            }\n                        }\n                        // Fallback: focus the \"Add New\" button for this group\n                        const addButton = groupFieldset.find('.add-new-value button');\n                        if (addButton.length) {\n                            addButton.focus();\n                            return;\n                        }\n                    }\n                    // Final fallback: focus the section itself\n                    if (this.$()) {\n                        this.$().focus();\n                    }\n                });\n            }\n        },\n        setPrimaryCallback(phoneNumber) {\n            if (!this.get('session.features.emergencyLocation')) {\n                return;\n            }\n            if (this.getEmergencyLocation) {\n                this.getEmergencyLocation(phoneNumber)\n                    .then(response => {\n                        this.set('previewAddressIsEligible', true);\n                        this.set('previewAddress', response.address);\n                    })\n                    .catch(err => {\n                        this.set('previewAddressIsEligible', false);\n                        this.set('previewAddress', {\n                            street1: '',\n                            street2: '',\n                            city: '',\n                            state: '',\n                            zipcode: '',\n                            country: ''\n                        });\n\n                        const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                        this.set('previewAddressError', errorMessage);\n                    });\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_groupedContactInfo', []);\n    },\n\n    didReceiveAttrs() {\n        const editingElocation = this.get('editingElocation');\n        if (this.get('session.features.emergencyLocation') && editingElocation) {\n            this.get('setEditingSection').perform(editingElocation);\n        }\n    },\n\n    setEditingSection: task(function* (editingElocation) {\n        yield waitForQueue('actions');\n        this.set('editingSection', editingElocation);\n        const phoneNumber =\n            this.get('emergencyLocationData.primaryVoice.number') ||\n            this.get('emergencyLocationData.primaryVoice.display');\n        if (phoneNumber) {\n            this.get('actions.setPrimaryCallback').call(this, phoneNumber);\n        }\n    }).restartable(),\n\n    groupedContactInfo: computed('entity.id', 'fieldData', 'fieldData.[]', 'fieldData.@each.', function () {\n        return this.handleData(this.get('fieldData'));\n    }),\n\n    missingData: computed('filteredFields.[]', 'fieldData.[]', function () {\n        let fields = this.get('filteredFields');\n        let fieldData = this.get('fieldData');\n        let missingFields = _.difference(fields, fieldData.mapBy('field'));\n        return _.reject(missingFields, field => {\n            let type = field.get('type');\n            return fieldData.filterBy('field.type', type).length > 0;\n        });\n    }),\n\n    fieldValuesToAdd: computed('missingData.[]', function () {\n        let fields = this.get('missingData');\n        return fields.filterBy('repeatable');\n    }),\n\n    disableSave: computed('groupedContactInfo.@each.disableSave', function () {\n        const fieldData = this.get('groupedContactInfo');\n        const disableSave = fieldData.mapBy('disableSave');\n        return _.filter(disableSave).length > 0;\n    }),\n\n    handleData(data) {\n        return _.chain(data)\n            .groupBy(fieldData => {\n                return keyForField(fieldData.get('field'));\n            })\n            .map((fieldData, key) => {\n                let data = {\n                    key,\n                    fieldData,\n                    section: this.get('section')\n                };\n\n                Ember.setOwner(data, Ember.getOwner(this));\n\n                return ContactInfoGroup.create(data);\n            })\n            .filter()\n            .value();\n    },\n\n    removePrimaryContact(fieldData) {\n        let entity = this.get('entity');\n        let type = fieldData.get('field.type');\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        entity.set(path, [], { overwrite: true });\n    },\n\n    reconcilePrimaryContact(latestPrimaryContactInfo) {\n        let fields = this.get('fieldData');\n        let entity = this.get('entity');\n        let primaryContactCollection = [];\n        fields.rejectBy('isEmpty').forEach(fieldData => {\n            let type = fieldData.get('field.type');\n            if (type === 'phone') {\n                type = 'voice';\n            }\n\n            let primary = Ember.get(latestPrimaryContactInfo, type);\n            this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            if (type === 'voice') {\n                // run the voice primary checks for SMS as well\n                type = 'sms';\n                primary = Ember.get(latestPrimaryContactInfo, type);\n                this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            }\n        });\n\n        return entity.reload().then(() => {\n            _.forEach(primaryContactCollection, contact => {\n                entity.setPrimaryContact(contact.type, contact.value, contact.fieldPath, contact.fieldData);\n            });\n        });\n    },\n\n    _storePrimary(primary, type, fieldData, collection) {\n        if (_.isEmpty(primary)) {\n            return;\n        }\n        let fieldPath = fieldData.get('field.fieldPath');\n        let fieldDataId = fieldData.get('fieldId');\n        primary = primary[0];\n\n        let equalFieldIds = primary.value.fieldId === fieldDataId;\n        let equalFieldPaths = primary.value.fieldPath === fieldPath;\n\n        // New fields also set to primary have a temp id generated using Ember.generateGuid\n        let isNewFieldValue = primary.value.fieldId.indexOf('ember') === 0;\n\n        // New fields will at least match the field path, if not the field id (different temp id)\n        if (isNewFieldValue && !equalFieldIds && equalFieldPaths) {\n            // Lets also check for value equal on extension or number\n            let value = fieldData.get('value.value');\n            let valueNumber = value.number;\n            let primaryNumber = primary.ref.number;\n\n            // Sometimes we will have formatting\n            if (valueNumber && valueNumber.replace) {\n                valueNumber = valueNumber.replace(/[-\\s]/gi, '');\n            }\n            if (primaryNumber && primaryNumber.replace) {\n                primaryNumber = primaryNumber.replace(/[-\\s]/gi, '');\n            }\n\n            if (primary.ref.extension === value.extension || primaryNumber === valueNumber) {\n                collection.push({\n                    type,\n                    fieldPath,\n                    fieldData,\n                    value: fieldData.get('value')\n                });\n            }\n        } else if (primary.value && equalFieldPaths && equalFieldIds) {\n            collection.push({\n                type,\n                fieldPath,\n                fieldData,\n                value: fieldData.get('value')\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['contact-group-choices'],\n\n    entity: null,\n\n    field: null,\n    entry: null,\n\n    showDropdown: false,\n\n    currentLabel: computed.reads('field.i18nLabel'),\n\n    fieldChoices: computed('field', 'entry', function () {\n        let keys = this.get('field.labelKeys');\n        let entity = this.get('entity');\n        let field = this.get('field');\n        let path = field.get('fieldPath').replace(/\\./gi, '_');\n        return _.map(keys, function (key) {\n            return {\n                field,\n                keyPath: `${entity.get('type')}_${path}_labelKey_${key}`\n            };\n        });\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"a/PgzvrS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"entity-field-section.entity-contact-info.contact-group-choices\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"menu-selector dropdown-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"choice\\\",\\\"keyPath\\\"]]],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    key: null,\n    field: null,\n    section: null,\n    fieldData: [],\n\n    label: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.name`);\n    }),\n\n    addNewLabel: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.addNew`);\n    }),\n\n    isEmpty: computed('fieldData', 'fieldData.@each.isEmpty', 'field', function () {\n        let emptyFields = this.get('fieldData').mapBy('isEmpty');\n        return emptyFields && _.reject(emptyFields).length === 0;\n    }),\n\n    containsRepeatable: computed('fieldData.[]', 'field', 'repeatableField', function () {\n        let field = this.get('field') || this.get('repeatableField');\n        if (field) {\n            return field.get('repeatable');\n        }\n\n        return this.get('fieldData').filterBy('field.repeatable').length > 0;\n    }),\n\n    repeatableField: computed('fieldData.[]', 'key', 'section', function () {\n        let key = this.get('key');\n        return this.get('section.fieldList')\n            .filterBy('repeatable')\n            .find(function (field) {\n                return field.get('key') === key || field.get('type') === key;\n            });\n    }),\n\n    disableSave: computed('fieldData.[]', 'fieldData.@each.isValid', function () {\n        const fieldData = this.get('fieldData');\n        let validFields = fieldData.map(data => {\n            let emptyCheck = ['weblink', 'email'];\n\n            if (_.includes(emptyCheck, data.get('field.type'))) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return _.reject(validFields).length > 0;\n    }),\n\n    isPhone: computed.equal('key', 'phone'),\n    isEmail: computed.equal('key', 'email'),\n    isIm: computed.equal('key', 'im'),\n    isAddress: computed.equal('key', 'address'),\n\n    showHeadings: computed('isPhone', 'isEmail', 'permissions.canEditProfiles', function () {\n        if (this.get('isEmail')) {\n            return this.get('permissions.canEditProfiles');\n        }\n        return this.get('isPhone');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ceACQLuN\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedContactInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries contact-info-\\\",[28,[\\\"group\\\",\\\"key\\\"]],\\\"-type\\\\n                    \\\",[33,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isEmpty\\\"]],\\\"empty-group\\\"],null],\\\"\\\\n                    \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"group\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label sr-only\\\"],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"group\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isIm\\\"]],[28,[\\\"group\\\",\\\"isAddress\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label remove-section clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"group\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeContactSection\\\",[28,[\\\"group\\\",\\\"fieldData\\\"]],[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"showHeadings\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"headings\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"primary\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-sms-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"accept-sms\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-values entry-values\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"fieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry\\\\n                                \\\",[28,[\\\"fieldData\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"fieldData\\\",\\\"fieldId\\\"]]]]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[33,[\\\"eq\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]],\\\"entity-fields/phone-field\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\",\\\"headingLevel\\\",\\\"setPrimaryCallback\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true,5,[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimaryCallback\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"and\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"repeatable\\\"]],[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"removable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"value\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\",\\\"i18nLabel\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"fieldData\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-value\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldData\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"containsRepeatable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-new-value\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-flat btn-sm add-new-value\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"+\\\"],[14],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"addNewLabel\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content emergency-location-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-group entries field-entries\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry text-field \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"emergency-location\\\"],null,[[\\\"emergencyLocationData\\\",\\\"editingElocation\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"showTitle\\\",\\\"showTitleIcons\\\",\\\"previewAddress\\\",\\\"previewAddressIsEligible\\\",\\\"previewAddressError\\\",\\\"saving\\\",\\\"updateElocationOnChange\\\"],[[28,[\\\"emergencyLocationData\\\"]],[28,[\\\"editingElocation\\\"]],false,[28,[\\\"personId\\\"]],true,false,[28,[\\\"previewAddress\\\"]],[28,[\\\"previewAddressIsEligible\\\"]],[28,[\\\"previewAddressError\\\"]],[28,[\\\"saving\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateElocationOnChange\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    layout: template,\n\n    disableAddValueDropdown: true,\n\n    fallbackToEmptyLabel: true,\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        }\n    },\n\n    canAddNew: computed('fieldData.[]', function () {\n        let fieldData = this.get('fieldData');\n        let empties = fieldData.filterBy('isEmpty', true);\n        return empties.length < 1;\n    }),\n\n    disableSave: computed('fieldData.@each.{isValid,isEmpty}', function () {\n        let fieldData = this.get('fieldData');\n        let validFields = fieldData.map(field => {\n            return field.get('isValid') && !field.get('isEmpty');\n        });\n\n        return _.reject(validFields).length > 0;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nconst { inject, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-groups'],\n\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        changeGroups(group) {\n            this.set('showMore', false);\n            this.set('activeKey', group);\n        },\n\n        toggleMore() {\n            this.toggleProperty('showMore');\n        },\n\n        navigateTo(routeType, routeId) {\n            this.get('application').navigateTo(routeType, routeId);\n        }\n    },\n\n    allKeys: null,\n    activeKey: null,\n\n    showMore: false,\n    flowTabsInline: true,\n\n    init() {\n        this._super(...arguments);\n\n        const entity = this.get('entity');\n        const fieldConfig = entity.get('fieldConfig');\n\n        const hasOfficialField = !!fieldConfig.getFieldByKey('groups.official');\n        const hasSocialField = !!fieldConfig.getFieldByKey('groups.social');\n\n        const allKeys = [];\n        if (hasOfficialField) {\n            allKeys.push('official');\n        }\n        if (hasSocialField) {\n            allKeys.push('social');\n        }\n\n        let activeKey = 'official';\n        if (!hasOfficialField) {\n            activeKey = hasSocialField ? 'social' : 'owned';\n        }\n\n        this.setProperties({\n            allKeys,\n            activeKey,\n            hasSocialField,\n            hasOfficialField\n        });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        let section = this.get('sectionInfo');\n        let promises = this.get('allKeys').map(key => this.getGroups(key));\n\n        Ember.RSVP.all(promises).then(function (results) {\n            let groups = _.flatten(results);\n            section.set('isEmpty', groups.length === 0);\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            const title = this.$('.title');\n            const tabs = this.$('.nav-tabs li');\n            if (title && !_.isEmpty(tabs)) {\n                const titleWidth = title.width();\n                const tabWidth = _.chain(tabs)\n                    .map(tab => Ember.$(tab).width())\n                    .reduce((acc, val) => val + acc, 0);\n                this.set('flowTabsInline', tabWidth + titleWidth < this.$().width());\n            }\n        });\n    },\n\n    canEditSection: computed(function () {\n        return false;\n    }),\n\n    activeGroups: computed('entity.id', 'activeKey', 'showMore', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            if (!this.get('showMore')) {\n                return _.slice(groups, 0, 4);\n            }\n            return groups;\n        });\n\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    section: computed('entity.fieldConfig.groups', function () {\n        return this.get('entity.fieldConfig.groups');\n    }),\n\n    shouldShowMore: computed('activeKey', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            return groups.length > 4;\n        });\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    getGroups(key) {\n        return this.get(`entity.${key}Groups`);\n    },\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"XzRWnkV8\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content tab-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs nav-tabs-flex\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasOfficialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-official active\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#official\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"official\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"official\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_official\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"hasSocialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-social\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#social\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"social\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"social\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_social\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owned\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owned\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"owned\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"owned\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owned\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"activeGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group \\\",[28,[\\\"group\\\",\\\"groupType\\\"]]]]],[16,\\\"title\\\",[28,[\\\"group\\\",\\\"name\\\"]],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"size\\\",\\\"entity\\\",\\\"isLinkable\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[96,[28,[\\\"group\\\"]],true,true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\",\\\"group\\\",[28,[\\\"group\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"group.detail\\\",[28,[\\\"group\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"name\\\"]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupMemberships\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"error\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message error\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.loadError\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message group-loading-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"shouldShowMore\\\"]],[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"show-more-less \\\",[33,[\\\"if\\\"],[[28,[\\\"showMore\\\"]],\\\"showing-more\\\",\\\"showing-less\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleMore\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-groups/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend(LoggerMixin, {\n    layout: template,\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    _cachedGroupFieldData: [],\n    _cachedLocations: [],\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        },\n\n        removeEntry(fieldData) {\n            let entity = this.get('entity');\n            let field = fieldData.get('field');\n            let entry = fieldData.get('entry');\n            let location = fieldData.get('_sectionLocation');\n            let path = field.getFieldPath();\n            let fields = this.get('fieldData');\n            let currentEntry = fields.findBy('_sectionLocation', location);\n\n            fields.removeObject(currentEntry);\n            entity.getFieldValue(path).removeObject(entry);\n        }\n    },\n\n    disableSave: computed(function () {\n        return false;\n    }),\n\n    getFieldEntries() {\n        const entries = this._super(...arguments);\n        return entries.filter(entry => {\n            const value = entry.get('value');\n            if (value.value) {\n                const location = value.value;\n                if (location && !location.locationId) {\n                    this.logger.warn('Location without id encountered. Removing.');\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport Profile from '../../entity-profile/profiles/profile';\nimport EntityFieldSection from '../component';\n\nimport { BASE_PERSON } from '../../../models/person';\n\nimport RelationshipGroup from './relationship-group';\n\nconst { inject, getOwner, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-relationships'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    viewingMore: { siblings: false, reports: false },\n\n    _relationships: null,\n\n    actions: {\n        toggleAddValue() {\n            const field = this.get('repeatableField');\n            this.send('addNewEntry', field);\n        },\n\n        addNewEntry(field) {\n            this._super(...arguments);\n\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n            const fieldValue = _.last(entity.get(path));\n\n            const count = this.get('otherRelationships.length');\n            const key = this.get('intl').t('person.relationships.relationship', { count: !!count ? count : count + 1 });\n\n            Ember.set(fieldValue, 'labelKey', key);\n            this.set('otherRelationships.lastObject.key', key);\n\n            this.notifyPropertyChange('otherRelationshipValues');\n        },\n\n        updatedField(relationshipGroup) {\n            let excludedFields = this.get('excludedFields');\n            let fieldPath = relationshipGroup.get('fieldPath');\n            if (!fieldPath || relationshipGroup.get('isOtherRelationship')) {\n                return;\n            }\n\n            let fieldKey = fieldPath.split('.')[1];\n            if (relationshipGroup.get('people.length') === 0) {\n                excludedFields.removeObject(fieldKey);\n            } else {\n                excludedFields.addObject(fieldKey);\n            }\n        },\n\n        removeSection() {\n            let reports = this.get('relationships').findBy('key', 'defaultReports');\n            let promise = Ember.RSVP.resolve();\n            if (reports && reports.get('promise')) {\n                promise = reports.get('promise').then(people => {\n                    if (people) {\n                        people.forEach(person => {\n                            reports.removePerson(person);\n                        });\n                    }\n                });\n            }\n\n            return promise.then(() => {\n                let entity = this.get('entity');\n                let fieldList = this.get('section.fieldList');\n                fieldList.forEach(field => {\n                    let path = field.get('fieldPath');\n                    if (entity.get(path)) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n\n                return this.saveReports()\n                    .then(() => this.saveSection())\n                    .then(() => {\n                        this.set('sectionInfo.adding', false);\n                        this.set('sectionInfo.editingSection', false);\n\n                        this.attrs.removeSection(this.get('sectionInfo'));\n\n                        this.send('cancelRemoveSection');\n                    });\n            });\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const notification = this.get('notification');\n\n            this.set('saving', true);\n\n            this.saveReports()\n                .then(() => this.saveSection())\n                .then(() => {\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n                })\n                .then(() => {\n                    // Cache bust!\n                    this.get('entity').clearDirectReportsCache();\n                })\n                .catch(err => {\n                    const title = intl.lookup('notification.titles.profileSaveError');\n                    const message = intl.lookup('notification.fieldSection.error');\n                    notification.error(title, message);\n\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n\n                    this.reset().then(() => {\n                        this.notifyPropertyChange('allRelationships');\n                    });\n\n                    return Ember.RSVP.reject(err);\n                });\n        },\n\n        updatedLabel() {\n            const fields = this.get('otherRelationships').filter(field => {\n                return _.isEmpty(field.get('label'));\n            });\n            this.set('disableSave', fields.length !== 0);\n        }\n    },\n\n    section: computed('entity.fieldConfig.relationships', function () {\n        return this.get('entity.fieldConfig.relationships');\n    }),\n\n    manager: computed.reads('entity.manager'),\n    management: computed.reads('entity.superiors'),\n    assistants: computed.reads('entity.adminAssistants'),\n    defaultReports: computed.reads('filteredReports'),\n    defaultSiblings: computed.reads('filteredSiblings'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_relationships', []);\n    },\n\n    relationships: computed('entity.id', 'otherRelationships.[]', 'assistants.[]', 'management.[]', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        const cachedGroups = this.get('_relationships');\n        if (cachedGroups && cachedGroups.length > 0) {\n            // Set relationship promise so that reloads can happen if necessary\n            cachedGroups.forEach(group => {\n                const key = group.get('key');\n                const promise = this.get(key);\n                group.set('promise', promise);\n            });\n            return cachedGroups;\n        }\n\n        const groups = relationshipKeys.map(key => {\n            let entity = this.get('entity');\n            let relationship = this.get(key);\n\n            if (!relationship) {\n                return;\n            }\n\n            let data = {\n                key: key,\n                entity: entity,\n                promise: relationship\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n\n        this.set('_relationships', groups);\n\n        return groups;\n    }),\n\n    otherRelationships: computed('otherRelationshipValues', function () {\n        const entity = this.get('entity');\n        const values = this.get('otherRelationshipValues');\n        return Object.keys(values).map(key => {\n            const value = values[key];\n            let promise = Ember.RSVP.resolve([]);\n            const ids = value.mapBy('value').reject(id => !id);\n            if (ids && !_.isEmpty(ids) && ids[0]) {\n                promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n            }\n\n            let data = {\n                key,\n                promise,\n                entity: entity\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n    }),\n\n    allRelationships: computed('otherRelationships.[]', function () {\n        return [].concat(this.get('relationships'), this.get('otherRelationships'));\n    }),\n\n    otherRelationshipValues: computed('entity.relationships.relationships.[]', function () {\n        const entity = this.get('entity');\n        const values = entity.getFieldValue('relationships.relationships');\n        // Fallback to incorrect form of \"labelkey\" due to directory bug\n        return _.groupBy(values, v => v.labelKey || v.labelkey);\n    }),\n\n    filteredReports: computed.reads('entity.directReports'),\n    filteredSiblings: computed('entity.siblings', function () {\n        let promise = this.get('entity.siblings').then(siblings => {\n            return siblings.filter(sibling => {\n                return sibling.get('id') !== this.get('entity.id');\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    readableFieldPaths: computed('entity.id', function () {\n        let profile = Profile.getProfileForModel(this.get('entity'), getOwner(this));\n        return profile.getReadableFieldPathsForSection(this.get('section'));\n    }),\n\n    repeatableField: computed('filteredFields.[]', function () {\n        return this.get('filteredFields')\n            .filter(field => {\n                return field.get('repeatable') && field.get('customLabels');\n            })\n            .find(field => {\n                const key = field.get('key');\n                return key === 'relationships';\n            });\n    }),\n\n    hideAddNew: computed('repeatableField', function () {\n        return _.isEmpty(this.get('repeatableField'));\n    }),\n\n    canAddMultiple: computed('repeatableField', function () {\n        return this.get('repeatableField.customLabels');\n    }),\n\n    excludedFields: computed('relationships.[]', function () {\n        return ['directReportCount'];\n    }),\n\n    saveReports() {\n        let promise = Ember.RSVP.resolve();\n        let reports = this.get('relationships').findBy('key', 'defaultReports');\n\n        if (reports && reports.get('reportsToSave')) {\n            let people = reports.get('reportsToSave');\n            let section = this.get('section');\n            let promises = people.map(person => {\n                // we have to load permissions before saving...this is unconventional\n                return person.get('readWritePermissions').then(() => person.saveSection(section));\n            });\n            promise = Ember.RSVP.all(promises);\n\n            reports.set('reportsToSave', []);\n        }\n\n        return promise;\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport forEachRight from 'lodash/forEachRight';\nimport isEmpty from 'lodash/isEmpty';\nimport uniqBy from 'lodash/uniqBy';\n\nconst { set, inject, computed, observer, Component } = Ember;\n\nconst LIMIT = 15;\n\nfunction getNextPerson(orderedPeople, people, person) {\n    if (person && person.get && person.get('id')) {\n        orderedPeople.pushObject(person);\n        const manager = person.getFieldValue('relationships.manager');\n        if (!manager) {\n            return;\n        }\n        const nextPerson = people.find(p => {\n            return p.get('id') === manager.guid;\n        });\n\n        if (!nextPerson) {\n            return;\n        }\n        return getNextPerson(orderedPeople, people, nextPerson);\n    }\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['field-component', 'relationship-field'],\n\n    intl: inject.service(),\n\n    entity: null,\n    editing: false,\n    relationship: null,\n    fieldValuesToAdd: [],\n\n    showingMore: false,\n\n    people: null,\n\n    attrs: {\n        onUpdateLabel: () => {},\n        onUpdateField: () => {}\n    },\n\n    actions: {\n        selectPerson(person) {\n            const relationship = this.get('relationship');\n            relationship.addPerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removePerson(person) {\n            const relationship = this.get('relationship');\n            relationship.removePerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removeRelationship() {\n            let shouldRemove = true;\n            if (this.get('relationship.people.length')) {\n                const message = this.get('intl').lookup('person.relationships.confirmRemove').toString();\n                shouldRemove = confirm(message);\n            }\n\n            if (shouldRemove) {\n                const relationship = this.get('relationship');\n                if (relationship.get('isOtherRelationship')) {\n                    const key = this.get('relationship.key');\n                    const values = this.get('entity.relationships.relationships');\n                    const valuesToRemove = values.filter(value => value.labelKey === key);\n                    values.removeObjects(valuesToRemove);\n                } else {\n                    const people = relationship.get('people');\n                    forEachRight(people, person => relationship.removePerson(person));\n                }\n\n                this.get('onUpdateField')(relationship);\n            }\n        },\n\n        toggleShowing() {\n            this.toggleProperty('showingMore');\n        },\n\n        onUpdateLabel(newLabel, oldLabel) {\n            const people = this.get('people');\n            const ids = people.mapBy('id');\n            const values = this.get('entity.relationships.relationships').filter(\n                value => (value.labelKey === oldLabel || value.labelkey === oldLabel) && ids.includes(value.value)\n            );\n\n            uniqBy(values, 'value').forEach(value => {\n                set(value, 'labelKey', newLabel);\n            });\n\n            this.get('onUpdateLabel')(...arguments);\n        }\n    },\n\n    canEdit: computed.and('editing', 'relationship.canEdit'),\n    canRemove: computed('canEdit', 'people.[]', 'manager', function () {\n        const canEdit = this.get('canEdit');\n        if (this.get('isManagerField')) {\n            return canEdit && !isEmpty(this.get('manager'));\n        }\n        return canEdit && !isEmpty(this.get('people'));\n    }),\n\n    manager: computed.reads('entity.manager.content'),\n    isManagerField: computed.equal('relationship.key', 'management'),\n\n    updatePeople: observer('relationship.people.[]', 'showingMore', 'isManagerField', function () {\n        const people = this.get('relationship.people') || Ember.A([]);\n\n        if (this.get('isManagerField')) {\n            const cachedPeople = this.get('people');\n            if (cachedPeople && people && cachedPeople.length > 0 && people.length === cachedPeople.length) {\n                return;\n            }\n            const orderedPeople = Ember.A([]);\n            this.get('entity.manager')\n                .then(getNextPerson.bind(this, orderedPeople, people))\n                .catch(err => {\n                    this.logger.error('Error loading managers:', { err });\n                    this.set('people', people);\n                })\n                .finally(() => this.set('people', orderedPeople));\n        }\n\n        if (this.get('showingMore')) {\n            this.set('people', people);\n            return;\n        }\n\n        this.set('people', people.slice(0, LIMIT));\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    hasMore: computed('relationship.people.[]', function () {\n        return this.get('relationship.people.length') > LIMIT;\n    }),\n\n    haveManager: computed('manager', function () {\n        return !isEmpty(this.get('manager'));\n    }),\n\n    hideSection: computed('editing', 'canEdit', 'relationship.people.[]', function () {\n        const editing = this.get('editing');\n        const canEdit = this.get('canEdit');\n        if (editing) {\n            return !canEdit;\n        }\n\n        return !this.get('relationship.people.length');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"t0ksefmz\",\"block\":\"{\\\"statements\\\":[[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group \\\",[28,[\\\"relationship\\\",\\\"key\\\"]],\\\"-relationship relationship-container \\\",[33,[\\\"if\\\"],[[28,[\\\"hideSection\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-entry field-entries\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-label\\\"],null,[[\\\"entity\\\",\\\"relationship\\\",\\\"editing\\\",\\\"onUpdateLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onUpdateLabel\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values field-value \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEdit\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-field-section/entity-relationships/relationship-search\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"select\\\",\\\"relationship\\\"],[[28,[\\\"entity\\\"]],\\\"person\\\",\\\"selectPerson\\\",[28,[\\\"relationship\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"isManagerRelationship\\\"]],\\\"is-manager\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"unless\\\"],[[33,[\\\"can-edit\\\"],[[28,[\\\"result\\\"]],\\\"relationships.manager\\\"],null],\\\"disabled\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canEdit\\\"]],[28,[\\\"isManagerField\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveManager\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"manager\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"manager\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"people\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"person\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"person\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isManagerField\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"divider-icon ion-ios-arrow-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"toggle-showing\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleShowing\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showingMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRemove\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-relationship\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"relationship\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRelationship\\\"]],[13],[0,\\\"                                        \\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n\n    key: null,\n    entity: null,\n    promise: null,\n    cache: null,\n\n    reportsToSave: [],\n\n    loading: computed('promise.isPending', 'people.[]', function () {\n        return this.get('promise.isPending') && this.get('people.length') === 0;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cache', []);\n    },\n\n    people: computed('promise', function () {\n        let cache = this.get('cache');\n        let promise = this.get('promise');\n\n        // Clear cache if promise changed\n        if (this._lastPromise !== promise) {\n            cache.clear();\n            this._lastPromise = promise;\n        }\n\n        promise.then(people => {\n            if (people) {\n                if (cache.length === 0 || cache.length !== people.length) {\n                    cache.clear();\n                    cache.addObjects(people);\n                }\n            }\n        });\n        return cache;\n    }),\n\n    label: computed('key', 'isOtherRelationship', function () {\n        const intl = this.get('intl');\n        const key = this.get('key');\n        if (this.get('isOtherRelationship')) {\n            const field = this.get('session.person.fieldConfig.relationships.relationships');\n            const fieldKey = field.getI18nKey();\n            const lookupKey = `${fieldKey}_labelKey_${key}`;\n            if (intl.query(lookupKey)) {\n                return intl.lookup(lookupKey);\n            }\n            return key;\n        }\n\n        return intl.lookup(`person.relationships.${key}`).toString();\n    }),\n\n    canEdit: computed('key', function () {\n        let key = this.get('key');\n        if (key === 'management' || key === 'assistants') {\n            return this.get('permissions.canEditProfiles');\n        } else if (_.includes(key.toLowerCase(), 'siblings')) {\n            return false;\n        }\n\n        return true;\n    }),\n\n    isManagerRelationship: computed.equal('key', 'management'),\n\n    isReportRelationship: computed('key', function () {\n        let key = this.get('key');\n        return _.includes(key.toLowerCase(), 'reports');\n    }),\n\n    isAssistantsRelationship: computed.equal('key', 'assistants'),\n\n    isOtherRelationship: computed('key', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        return !_.includes(relationshipKeys, this.get('key'));\n    }),\n\n    fieldPath: computed('key', 'isOtherRelationship', function () {\n        let key = this.get('key');\n        if (key === 'assistants') {\n            return 'relationships.administrativeAssistant';\n        } else if (_.includes(key, 'reports')) {\n            return 'children';\n        } else if (key === 'otherRelationships' || this.get('isOtherRelationship')) {\n            return 'relationships.relationships';\n        }\n    }),\n\n    values: computed('entity', 'fieldPath', function () {\n        let entity = this.get('entity');\n        let fieldPath = this.get('fieldPath');\n        if (fieldPath) {\n            return entity.getFieldValue(fieldPath);\n        }\n        return null;\n    }),\n\n    addPerson(person) {\n        const entity = this.get('entity');\n        const fieldPath = this.get('fieldPath');\n        const key = this.get('key');\n        const intl = this.get('intl');\n\n        if (this.get('isManagerRelationship')) {\n            this.addManager(entity, person);\n        } else {\n            this.get('people').addObject(person);\n            if (this.get('isReportRelationship')) {\n                const personId = person.get('id');\n                const currentManager = entity.getFieldValue('relationships.manager');\n                if (currentManager && currentManager.value === personId) {\n                    this.get('people').removeObject(person);\n                    this.get('notification').error(\n                        intl.lookup('notification.titles.profileDataError').toString(),\n                        intl.lookup('notification.person.managerReportError').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'relationship'\n                        }\n                    );\n                } else {\n                    this.addManager(person, entity);\n                    this.get('reportsToSave').addObject(person);\n                }\n            } else {\n                let fieldValue = _.find(entity.get(fieldPath), value => _.isEmpty(value.value));\n\n                if (_.isEmpty(fieldValue)) {\n                    entity.set(fieldPath, person.get('id'));\n                    fieldValue = _.last(entity.get(fieldPath));\n                } else {\n                    Ember.set(fieldValue, 'value', person.get('id'));\n                }\n\n                Ember.set(fieldValue, 'labelKey', key);\n            }\n        }\n    },\n\n    removePerson(person) {\n        let fieldPath = this.get('fieldPath');\n        if (this.get('isManagerRelationship')) {\n            this.removeManager(this.get('entity'));\n        } else {\n            this.get('people').removeObject(person);\n            let values = this.get('entity').getFieldValue(fieldPath);\n            if (!_.isEmpty(values)) {\n                let value = values.findBy('value', person.get('id'));\n                values.removeObject(value);\n            } else if (this.get('isReportRelationship')) {\n                this.removeManager(person);\n                this.get('reportsToSave').addObject(person);\n            }\n        }\n    },\n\n    addManager(person, newManager) {\n        this.removeManager(person);\n        person.set('relationships.manager', newManager.get('id'));\n    },\n\n    removeManager(person) {\n        if (!person) {\n            person = this.get('entity');\n        }\n\n        let manager = person.getFieldValue('relationships.manager');\n        if (!_.isEmpty(manager)) {\n            person.get('relationships.manager').removeObject(manager);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['relationship-label'],\n\n    intl: inject.service(),\n\n    attrs: {\n        onUpdateLabel: () => {}\n    },\n\n    entity: null,\n    editing: false,\n    relationship: null,\n\n    showLabelChoices: false,\n\n    actions: {\n        updateLabel(event) {\n            Ember.run(this, this.updateLabel, event.target.value);\n        },\n\n        focusInput() {\n            this.set('showLabelChoices', true);\n        },\n\n        selectLabel({ key }) {\n            this.updateLabel(key);\n            this.set('showLabelChoices', false);\n        },\n\n        toggleChoices() {\n            this.toggleProperty('showLabelChoices');\n            if (this.get('showLabelChoices')) {\n                this.$('input').trigger('focus');\n            }\n        },\n\n        hideChoices() {\n            this.set('showLabelChoices', false);\n        },\n\n        handleKeyDownOnDropdownArrow(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                this.send('toggleChoices');\n            }\n        },\n\n        handleKeyDownOnLabel(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        }\n    },\n\n    isOtherRelationship: computed.reads('relationship.isOtherRelationship'),\n\n    hasLabelChoices: computed.gt('labelChoices.length', 0),\n\n    canShowLabelChoices: computed.and('editing', 'showLabelChoices', 'isOtherRelationship', 'hasLabelChoices'),\n\n    field: computed(function () {\n        return this.get('entity.fieldConfig.relationships.relationships');\n    }),\n\n    labelChoices: computed('field.labelKeys.[]', function () {\n        const intl = this.get('intl');\n        const i18nKey = this.get('field.i18nKey');\n        const labelKeys = this.get('field.labelKeys');\n        return labelKeys.map(key => {\n            return {\n                key,\n                text: intl.lookup(`${i18nKey}_labelKey_${key}`)\n            };\n        });\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    didInsertElement() {\n        if (!this.get('isOtherRelationship')) {\n            return;\n        }\n\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                const target = Ember.$(event.target);\n                if (!target.parents(`#${this.elementId}`).length) {\n                    this.set('showLabelChoices', false);\n                }\n            });\n        });\n\n        this.$().on('focusout', () => {\n            Ember.run.later(() => {\n                if (!this.$().is(':focus-within')) {\n                    this.set('showLabelChoices', false);\n                }\n            }, 100);\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n        this.$().off('focusout');\n    },\n\n    updateLabel(newLabel) {\n        const relationship = this.get('relationship');\n        const oldLabel = relationship.get('key');\n\n        relationship.set('key', newLabel);\n\n        this.setLabelKey(newLabel, oldLabel);\n    },\n\n    setLabelKey(newLabel, oldLabel) {\n        this.attrs.onUpdateLabel(newLabel, oldLabel);\n        this.handleTooltip(newLabel);\n    },\n\n    handleTooltip(label) {\n        const message = this.get('intl').lookup('person.relationships.emptyLabel');\n        const input = this.$('input');\n        if (_.isEmpty(label)) {\n            input\n                .tooltip({\n                    title: message.toString(),\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n        } else {\n            input.tooltip('destroy');\n        }\n    },\n\n    focusOut() {\n        this.hideChoices();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPuRGndo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isOtherRelationship\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[16,\\\"value\\\",[34,[[28,[\\\"relationship\\\",\\\"label\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateLabel\\\"],null],null],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focusInput\\\"],null],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLabelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnDropdownArrow\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoices\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"label-choices \\\",[33,[\\\"unless\\\"],[[28,[\\\"canShowLabelChoices\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"label-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnLabel\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectLabel\\\",[28,[\\\"choice\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"choice\\\",\\\"text\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[14],[0,\\\"   \\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.hbs\"}});","import Ember from 'ember';\n\nimport EntitySearch from '../../../entity-search/component';\nimport layout from '../../../entity-search/template';\n\nconst { on, run, inject, RSVP } = Ember;\n\nexport default EntitySearch.extend({\n    classNames: ['relationship-search'],\n    layout,\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    entity: null,\n    relationship: null,\n    searchLimit: 6,\n\n    actions: {\n        selectResult(result) {\n            const isOtherRelationship =\n                this.get('relationship.isOtherRelationship') || this.get('relationship.isAssistantsRelationship');\n            const entity = this.get('entity');\n            let canEdit = this.get('permissions.canEditProfiles');\n            if (isOtherRelationship) {\n                canEdit = entity.get('id') === this.get('session.person.id') || canEdit;\n            }\n\n            if (canEdit) {\n                this.set('searchQuery', '');\n                this.set('userInput', '');\n\n                this.sendAction('select', result);\n            }\n        }\n    },\n\n    resultsLoaded: on('didRender', function () {\n        if (!this.get('currentSearchRequest.isFulfilled')) {\n            return false;\n        }\n\n        this.get('currentSearchRequest')\n            .then(([people]) => {\n                // Lets be safe...\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n\n                this.$('.disabled').tooltip('destroy');\n\n                return RSVP.all(people.map(person => person.get('readWritePermissions')));\n            })\n            .then(() => {\n                run.scheduleOnce('afterRender', this, function () {\n                    // ...doubly safe\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    if (this.get('relationship.isManagerRelationship')) {\n                        this.$('.disabled').tooltip({\n                            title: this.get('intl').lookup('person.relationships.cantModify').toString(),\n                            placement: 'top',\n                            trigger: 'hover',\n                            container: `#${this.elementId} .search-results`\n                        });\n                    }\n                });\n            });\n    }),\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n\n        if (nextSelected < entities.length) {\n            // Remove selected class from current\n            if (nowSelected >= 0) {\n                this.$('.result-container').eq(nowSelected).removeClass('selected');\n            }\n            // Add selected class to next\n            this.$('.result-container').eq(nextSelected).addClass('selected');\n\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected - 1;\n\n        if (previousSelected >= 0) {\n            // Remove selected class from current\n            this.$('.result-container').eq(nowSelected).removeClass('selected');\n            // Add selected class to previous\n            this.$('.result-container').eq(previousSelected).addClass('selected');\n\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MAcLLPE/\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"allRelationships\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-field\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"relationship\\\",\\\"componentUpdated\\\",\\\"onUpdateField\\\",\\\"onUpdateLabel\\\",\\\"sectionName\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedField\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedLabel\\\"],null],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"f95OPLsQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hideHeader\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-content \\\",[33,[\\\"if\\\"],[[28,[\\\"ownProfile\\\"]],\\\"own-profile\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedFieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries field-group-\\\",[28,[\\\"groupedData\\\",\\\"key\\\"]],\\\"\\\\n                    num-entries-\\\",[28,[\\\"groupedData\\\",\\\"fieldData\\\",\\\"length\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"sort-field-data\\\"],[[28,[\\\"groupedData\\\",\\\"fieldData\\\"]]],[[\\\"group\\\"],[[28,[\\\"groupedData\\\"]]]]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"isViewMode\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"fieldPathClass\\\"]],\\\"\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]],\\\"new-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]],\\\"repeatable\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"data\\\",\\\"fieldId\\\"]]]]],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entry-label\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"field\\\",\\\"entry\\\",\\\"writeable\\\",\\\"showHistoryYearRange\\\",\\\"fallbackToEmpty\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\",\\\"field\\\"]],[28,[\\\"data\\\",\\\"fieldValue\\\"]],[28,[\\\"data\\\",\\\"writeable\\\"]],false,[28,[\\\"fallbackToEmptyLabel\\\"]]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"allFieldData\\\",\\\"cancelAddNew\\\",\\\"componentUpdated\\\",\\\"sectionName\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\"],null],[28,[\\\"componentUpdated\\\"]],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n                                            \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"data\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupedData\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.scheduleOnce('afterRender', this, this.setValues);\n        }\n    }),\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"39ssHkh9\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"ariaLabelledBy\\\"],[\\\"map\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/address-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    didInsertElement() {\n        this._super(...arguments);\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entity = this.get('entity');\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n\n        if (_.isEmpty(entry) || entry.value === undefined) {\n            entity.set(path, false);\n        }\n\n        // Make sure things get bound correctly for input checkbox changes\n        this.set('entry', entity.getFieldValue(path));\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ZN7jpTBV\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"type\\\",\\\"id\\\",\\\"name\\\",\\\"checked\\\"],[\\\"checkbox\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],\\\"entry.value\\\",[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"label \\\",[33,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"label-success\\\",\\\"label-danger\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-check-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-true\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-false\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/boolean-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, observer, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.year', 'entry.value.month', 'entry.value.day'],\n\n    actions: {\n        selectDate(date) {\n            if (!date) {\n                this.set('entry.value', null);\n            } else {\n                const day = date.getDate();\n                const month = date.getMonth() + 1;\n                const year = date.getFullYear();\n                const value = { day, month, year };\n\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: observer('canEdit', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    value: computed('entry.value', function () {\n        let entry = this.get('entry');\n\n        if (!this.isComplexFieldEmpty()) {\n            let copy = Ember.copy(entry, true);\n            copy.value.month -= 1;\n\n            return moment(copy.value).toDate();\n        }\n\n        return null;\n    }),\n\n    formattedValue: computed('value', function () {\n        const date = this.get('value');\n        if (!date) {\n            return '';\n        }\n        return moment(date).format('L');\n    }),\n\n    options: computed('intl.locale', function () {\n        const localeData = moment.localeData();\n        return {\n            i18n: {\n                previousMonth: this.get('intl').t('chat.presence.outOfOffice.picker.previousMonth').toString(),\n                nextMonth: this.get('intl').t('chat.presence.outOfOffice.picker.nextMonth').toString(),\n                months: localeData._months,\n                weekdays: localeData._weekdays,\n                weekdaysShort: localeData._weekdaysShort\n            }\n        };\n    }),\n\n    dateFormat: computed('intl.iosLocale', function () {\n        let locale = this.get('intl.isoLocale');\n        if (locale === 'no') {\n            // moment uses nb as its Norwegian locale\n            locale = 'nb';\n        }\n        return moment.localeData(locale)._longDateFormat.L;\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n        const path = this.get('field.fieldPath');\n\n        if (_.isEmpty(entry)) {\n            entity.set(path, entry);\n        } else {\n            entity.set(path, [entry], { overwrite: true });\n        }\n\n        if (_.isEmpty(entry.value)) {\n            let value = {\n                year: null,\n                month: null,\n                day: null\n            };\n\n            Ember.set(entry, 'value', value);\n        }\n\n        this.set('entry', entity.getFieldValue(path));\n    },\n\n    isComplexFieldEmpty: function () {\n        let entry = this.get('entry');\n        if (!entry || !entry.value) {\n            return true;\n        }\n\n        return (\n            typeof entry.value.year !== 'number' &&\n            typeof entry.value.month !== 'number' &&\n            typeof entry.value.day !== 'number'\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"CiFxiWqE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"pikaday-input\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"format\\\",\\\"placeholder\\\",\\\"firstDay\\\",\\\"onSelection\\\",\\\"options\\\"],[[28,[\\\"value\\\"]],\\\"form-control\\\",[28,[\\\"dateFormat\\\"]],\\\"\\\",0,[33,[\\\"action\\\"],[[28,[null]],\\\"selectDate\\\"],null],[28,[\\\"options\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"formattedValue\\\"]],true],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty-value\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/date-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-value'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    currentTooltip: null,\n    isActive: false,\n    headingLevel: null,\n    hasError: computed.not('isValid'),\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        let empty;\n        if (!entry) {\n            empty = true;\n        } else {\n            empty = _.isEmpty(entry.value);\n        }\n\n        if (empty) {\n            const timer = Ember.run.scheduleOnce('afterRender', this, this.setValues);\n            this.timers.push(timer);\n        }\n    },\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', 'isEmpty', {\n        get() {\n            let entryId = this.get('entry._id');\n            let fieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n            return fieldId && fieldId === entryId && !this.get('isEmpty');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(\n                type,\n                this.get('entry'),\n                this.get('fieldData.field.fieldPath'),\n                this.get('fieldData')\n            );\n\n            return value;\n        }\n    }),\n\n    errorMessage: computed('isValid', 'entry.value', 'entity.type', function () {\n        const intl = this.get('intl');\n        const valid = this.get('isValid');\n        const empty = _.isEmpty(this.get('entry.value'));\n        const isGroup = this.get('entity.type') === 'group';\n\n        if (empty && !isGroup) {\n            return intl.lookup('tooltip.fields.email.blankError').toString();\n        }\n\n        if (!valid && !empty) {\n            return intl.lookup('tooltip.fields.email.invalidError').toString();\n        }\n    }),\n\n    canSetPrimary: computed.reads('permissions.canEditProfiles'),\n\n    focusOut() {\n        this.set('isActive', false);\n    },\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KvjQxAMU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"email-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"has-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\",\\\"focus-in\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"validation-error\\\"],null],\\\"focus\\\"]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[\\\"mailto\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"canSetPrimary\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\",\\\"ariaDescribedBy\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryMail\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/email-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNames: ['history'],\n\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: [\n        'entry.value.where',\n        'entry.value.startDate.month',\n        'entry.value.startDate.year',\n        'entry.value.endDate.month',\n        'entry.value.endDate.year'\n    ],\n\n    errors: null,\n    isActive: false,\n\n    actions: {\n        saveHistoryEntry() {\n            this.set('isNewField', false);\n            this.set('isEmpty', false);\n        },\n\n        cancelHistoryEntry() {\n            this.attrs.cancelAddNew(this.get('fieldData'));\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    focusOut: function () {\n        this.set('isActive', false);\n    },\n\n    showTooltip: computed('isValid', 'entry.value.where', 'isActive', function () {\n        let active = this.get('isActive');\n        let valid = this.get('isValid');\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        return !active && (empty || !valid);\n    }),\n\n    focusNewField() {\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        let added = this.get('entry.isAdded');\n\n        if (empty && !added) {\n            let $input = this.$('.where input');\n            this.set('entry.isAdded', true);\n            $input.trigger('focus');\n        }\n    },\n\n    ensureDateObjectsExist() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n\n        if (typeof entry.value !== 'object') {\n            Ember.set(entry, 'value', {});\n        }\n\n        if (!entry.value.endDate) {\n            Ember.set(entry, 'value.endDate', {\n                month: null,\n                year: null\n            });\n        }\n\n        if (!entry.value.startDate) {\n            Ember.set(entry, 'value.startDate', {\n                month: null,\n                year: null\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('errors', {\n            where: false,\n            date: false\n        });\n\n        Ember.run.once(this, this.ensureDateObjectsExist);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n        Ember.run.scheduleOnce('afterRender', this, this.focusNewField);\n        Ember.run.scheduleOnce('afterRender', this, this.calculateValidityOnInsert);\n    },\n\n    calculateValidityOnInsert() {\n        this.validityChanged();\n    },\n\n    resetData: on('willDestroyElement', function () {\n        this.cleanFieldForSave();\n    }),\n\n    section: computed.reads('fieldData.field.section'),\n    useEducationLabels: computed.equal('section.key', 'education'),\n\n    isNewField: computed('entry._id', 'entry.tempId', function () {\n        return !this.get('entry._id') && this.get('entry.tempId');\n    }),\n\n    where: computed('entry.value.where', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.where');\n    }),\n\n    what: computed('entry.value.what', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.what');\n    }),\n\n    notes: computed('entry.value.notes', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.notes');\n    }),\n\n    whereLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhere');\n        }\n        return intl.lookup('entity.fieldTypes.history.where').toString();\n    }),\n\n    datesLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationDates');\n        }\n        return intl.lookup('entity.fieldTypes.history.dates').toString();\n    }),\n\n    whatLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhat');\n        }\n        return intl.lookup('entity.fieldTypes.history.what').toString();\n    }),\n\n    notesLabel: computed(function () {\n        return this.get('intl').lookup('entity.fieldTypes.history.notes');\n    }),\n\n    validityChanged: observer('showTooltip', 'isEmpty', function () {\n        let isValid = this.get('isValid');\n        let isEmpty = this.get('isEmpty');\n\n        Ember.run.scheduleOnce('afterRender', this, this.whereErrorChanged, isEmpty);\n        Ember.run.scheduleOnce('afterRender', this, this.dateErrorChanged, !isValid);\n    }).on('init'),\n\n    whereErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n        let showTooltip = this.get('showTooltip');\n\n        var input = this.get('whereInput');\n        if (error && showTooltip) {\n            var elem = this.$('.where input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.whereError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('whereInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    dateErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n\n        var input = this.get('dateInput');\n        if (error) {\n            var elem = this.$('.from-date input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.dateError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('dateInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    isComplexFieldEmpty: function () {\n        // only required field is `where`\n        var where = this.get('entry.value.where');\n        return where === undefined || _.isEmpty(where.trim());\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PbnyqSd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]],\\\"new-field\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"field-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs where-and-dates\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-where\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"whereLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"focus-in\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-where\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"where\\\"]],\\\"form-control\\\",\\\"focus\\\",[33,[\\\"if\\\"],[[28,[\\\"errors\\\",\\\"where\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-range\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"datesLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-pickers\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-from-date-picker\\\"]]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.from\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"from-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-from\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"startDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minStartDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxStartDate\\\"]],[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-to-date-picker\\\"]]],[15,\\\"class\\\",\\\"to\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.to\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"to-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"placeholder\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-to\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"endDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minEndDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxEndDate\\\"]],\\\"entity.fieldTypes.history.toPlaceholder\\\",[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs what\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-what\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"whatLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-what\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"what\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs note\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-notes\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"notesLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-notes\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"notes\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete remove-new-field\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.historyEntry\\\"],null],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"cancelHistoryEntry\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[1,[26,[\\\"where\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"what\\\"],[13],[1,[26,[\\\"what\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"notes\\\"]]],null,{\\\"statements\\\":[[6,[\\\"expander-plugin\\\"],null,null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"notes\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dates\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"fallbackToEmpty\\\",\\\"showInstructionText\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],true,false]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/history-field/template.hbs\"}});","import TextField from '../text-field/component';\n\nexport default TextField.extend();\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n\n    location: null,\n    parentLocation: null,\n    floorLocation: null,\n\n    googleMapsHref: '',\n\n    showFloorplan: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('location', this.get('locationData'));\n        this.set('filterLocations', this.filterLocationsHelper.bind(this));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.focusFieldOnInsert);\n    },\n\n    focusFieldOnInsert() {\n        const input = this.$('input');\n        if (input) {\n            input.trigger('focus');\n        }\n    },\n\n    actions: {\n        selectParentLocation(location) {\n            this.set('parentLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', true);\n        },\n\n        selectFloorLocation(location) {\n            this.set('floorLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', false);\n        },\n\n        saveNewLocation() {\n            let parentLocation = this.get('parentLocation');\n            let floorLocation = this.get('floorLocation');\n            if (floorLocation) {\n                this.send('selectLocation', floorLocation);\n            } else {\n                this.send('selectLocation', parentLocation);\n            }\n        },\n\n        cancelNewLocation() {\n            this.get('cancelAddNew')(this.get('fieldData'));\n        },\n\n        selectLocation(location) {\n            let entry = this.get('entry');\n            let id = location.get('id');\n\n            let value = {\n                locationId: id,\n                coordinates: {},\n                notes: ''\n            };\n\n            if (location.get('floorplanImage') && location.get('floorplanImage.length') > 0) {\n                value.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', value);\n            this.set('location', this.get('locationData'));\n        },\n\n        removeNewParentLocation() {\n            this.set('parentLocation', null);\n        },\n\n        noop() {},\n\n        toggleFloorplan() {\n            Ember.run.once(this, this.toggleProperty, 'showFloorplan');\n        },\n\n        hideFloorplan() {\n            this.set('showFloorplan', false);\n            this.set('location', this.get('locationData'));\n        },\n\n        confirm() {\n            var location = this.get('location');\n            var entity = this.get('entity');\n\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            if (entity === undefined) {\n                entity = this.get('modal.entity');\n            }\n\n            return location\n                .then(() => entity.save())\n                .then(() => entity.reload())\n                .catch(resp => {\n                    if (resp.responseText) {\n                        var json = JSON.parse(resp.responseText);\n                        var code = Ember.get(json, 'payload.code');\n                        if (code === 'VERSION_MISMATCH') {\n                            this.bubbleAction({\n                                action: 'confirm'\n                            });\n                        }\n                    }\n                });\n        },\n\n        cancel() {\n            var location = this.get('location');\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            location.then(location => {\n                this.get('modal.controller.entity').reset();\n                location.reload();\n            });\n        }\n    },\n\n    parentLocationName: computed('location.parent.name', function () {\n        return this.get('intl').lookup('field.in', {\n            location: this.get('location.parent.name')\n        });\n    }),\n\n    isValid: computed('entry.value.locationId', 'parentLocation', function () {\n        var entry = this.get('entry');\n\n        var selectedFloor = !_.isEmpty(Ember.get(entry, 'value')) && !_.isEmpty(Ember.get(entry, 'value.locationId'));\n        var haveParent = !_.isEmpty(this.get('parentLocation'));\n\n        return haveParent || selectedFloor;\n    }),\n\n    haveFloor: computed('editing', 'location', 'locationData', 'parentLocation', 'selectedFloor', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        if (!this.get('editing')) {\n            return true;\n        }\n\n        if (this.get('parentLocation') && !this.get('selectedFloor')) {\n            return false;\n        }\n        return location || this.get('selectedFloor');\n    }),\n\n    locationData: computed('entry.value.locationId', 'editing', function () {\n        let id = this.get('entry.value.locationId');\n        let emptyPromise = DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n\n        if (this.get('parentLocation') && !this.get('floorLocation')) {\n            return emptyPromise;\n        } else if (id) {\n            return this.get('store').findRecord('location', id);\n        }\n\n        return emptyPromise;\n    }),\n\n    locationAddress: computed('location', 'locationData', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        let promise = location.then(location => {\n            if (!location) {\n                return '';\n            }\n\n            if (location.get('isFloor')) {\n                return location.get('parent.address');\n            }\n\n            return location.get('address');\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    isRichAddress: computed('locationAddress', function () {\n        let promise = this.get('locationAddress').then(address => {\n            return typeof address !== 'string';\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    parentLocations: computed(function () {\n        var promise = this.store.findAll('location').then(function (locations) {\n            return _.filter(\n                locations.content.map(x => x.getRecord()),\n                function (location) {\n                    return (\n                        location.get('state') !== 'deleted' &&\n                        location.get('type') !== 'floor' &&\n                        location.get('id') !== null\n                    );\n                }\n            );\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    canShowEdit: computed('editing', 'location', function () {\n        return this.get('editing') && !_.isEmpty(this.get('location.content.parent.content.sublocationOrder'));\n    }),\n\n    locationChoices: computed('parentLocation', function () {\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        return this.get('parentLocation.floors');\n    }),\n\n    choiceText: computed('parentLocation', function () {\n        const intl = this.get('intl');\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return intl.lookup('locations.selectLocation');\n        }\n\n        return `${intl.lookup('locations.selectFloor')}${parentLocation.get('name')}`;\n    }),\n\n    selectedParentLocation: computed('parentLocation', function () {\n        return !_.isEmpty(this.get('parentLocation'));\n    }),\n\n    editText: computed('location', 'location.isFloor', function () {\n        const intl = this.get('intl');\n        if (this.get('location.isFloor')) {\n            return intl.lookup('locations.selectOfficeShort');\n        }\n\n        return intl.lookup('locations.editLocation');\n    }),\n\n    attachmentId: computed('elementId', function () {\n        return `attachment-${this.elementId}`;\n    }),\n\n    setGoogleMapsLinkInfo: observer('location.parent', function () {\n        var parent = this.get('location.parent');\n\n        if (parent) {\n            parent.then(\n                Ember.run.bind(this, parentLocation => {\n                    if (this.get('_state') === 'inDOM') {\n                        var address;\n                        if (parentLocation) {\n                            address = parentLocation.get('address');\n                        } else if (!parentLocation) {\n                            address = this.get('location.address');\n                        }\n\n                        if (typeof address === 'string') {\n                            address = address.replace(/^\\s+|\\s+$/g, '').replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        } else if (address && typeof address === 'object') {\n                            let street1 = address.street1 || '';\n                            let street2 = address.street2 || '';\n                            let street = street1 && street2 ? `${street1} ${street2}` : street1;\n                            let city = address.city || '';\n                            let state = address.state || '';\n                            let zipcode = address.zipcode || '';\n                            let country = address.country || '';\n                            address = `${street} ${city}, ${state}, ${zipcode}, ${country}`\n                                .replace(/^\\s+|\\s+$/g, '')\n                                .replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        }\n                    }\n                })\n            );\n        }\n    }),\n\n    parentLocationUpdated: observer('parentLocation', function () {\n        if (this.get('parentLocation')) {\n            var dropdown = this.$('.dropdown-menu-view');\n\n            if (dropdown) {\n                dropdown.addClass('flash');\n\n                Ember.run.scheduleOnce('afterRender', this, this.toggleFlash, dropdown);\n            }\n        }\n    }),\n\n    filterLocationsHelper(data) {\n        let entity = this.get('entity');\n        let fieldPath = this.get('field.fieldPath');\n        let locationIds = entity.getFieldValue(fieldPath).mapBy('value.locationId');\n        let locations = _.filter(\n            locationIds.map(id => {\n                if (!id) {\n                    return;\n                }\n\n                let location = this.get('store').peekRecord('location', id);\n                if (!location) {\n                    return;\n                }\n                if (location.get('parent.id')) {\n                    return location.get('parent.content');\n                }\n                return location;\n            })\n        );\n\n        return _.reject(data, location => {\n            return _.includes(locations.mapBy('id'), location.get('id')) || location.get('isFloor');\n        });\n    },\n\n    toggleFlash(dropdown) {\n        Ember.run.later(\n            this,\n            function () {\n                dropdown.removeClass('flash');\n            },\n            150\n        );\n    },\n\n    showFloorPlan() {\n        this.set('showFloorplan', true);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yVVZmAiU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\"]],[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information location-details\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"parentLocationName\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationAddress\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"isRichAddress\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.address\\\"],[[\\\"street1\\\",\\\"street2\\\",\\\"city\\\",\\\"state\\\",\\\"country\\\",\\\"zipcode\\\"],[[28,[\\\"locationAddress\\\",\\\"street1\\\"]],[28,[\\\"locationAddress\\\",\\\"street2\\\"]],[28,[\\\"locationAddress\\\",\\\"city\\\"]],[28,[\\\"locationAddress\\\",\\\"state\\\"]],[28,[\\\"locationAddress\\\",\\\"country\\\"]],[28,[\\\"locationAddress\\\",\\\"zipcode\\\"]]]]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"locationAddress\\\",\\\"content\\\"]]],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"location\\\",\\\"floorplan\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat floorplan-action\\\"],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"id\\\",[34,[[26,[\\\"attachmentId\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleFloorplan\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-floor-plan\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.editFloor\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.floorplan\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"floorplan-popover\\\"],null,[[\\\"show\\\",\\\"attachmentId\\\",\\\"hidePopover\\\"],[[28,[\\\"showFloorplan\\\"]],[28,[\\\"attachmentId\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"hideFloorplan\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"floorplan-editor\\\"],null,[[\\\"entity\\\",\\\"location\\\",\\\"editing\\\",\\\"parentLocation\\\",\\\"field\\\",\\\"fieldData\\\",\\\"saveLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"locationData\\\",\\\"content\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]],[28,[\\\"field\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"googleMapsHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"map\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[16,\\\"href\\\",[26,[\\\"googleMapsHref\\\"]],null],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-map\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.map\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"parent-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"parentLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null],true],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"floorLocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"floor-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"floorLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"location-container dropdown\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"selectedParentLocation\\\"]],\\\"selected-parent\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"dropdown-menu\\\"],null,[[\\\"title\\\"],[[28,[\\\"choiceText\\\"]]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"parent-location floor-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFloorLocation\\\",[28,[\\\"location\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],96]]],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[11,\\\"strong\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"location\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"location\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.noFloors\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"filterFunction\\\",\\\"select\\\",\\\"class\\\"],[\\\"locations\\\",[28,[\\\"filterLocations\\\"]],\\\"selectParentLocation\\\",[33,[\\\"concat\\\"],[[33,[\\\"if\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null],\\\" \\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/location-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, run, set } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-text'],\n\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            run(() => {\n                const timer = run.once(this, this.setValues);\n                this.timers.pushObject(timer);\n            });\n        }\n    }),\n\n    isFieldEmpty() {\n        let field = this.get('field');\n        let entity = this.get('entity');\n\n        if (field && entity) {\n            let path = this.get('field').getFieldPath();\n            let value = this.get('entity').getFieldValue(path);\n\n            return _.isEmpty(value);\n        }\n    },\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pGASiGw8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxFieldWithLength\\\"],[[\\\"length\\\"],[[28,[\\\"field\\\",\\\"params\\\",\\\"maxLength\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],[[\\\"id\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/multiline-text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    actions: {\n        selectPersonFromPicker: function (person) {\n            this.set('entry.value', person.get('id'));\n        }\n    },\n\n    person: Ember.computed('entry.value', function () {\n        var value = this.get('entry.value');\n        if (value) {\n            return this.store.find('person', value);\n        }\n\n        return undefined;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"u4vyWJcp\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"personId\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/person-field/template.hbs\"}});","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { buildIntlTelInputOptions, setupIntlTelInputAccessibility } from '../../../utils/intl-tel-input-options';\n\nconst { get, inject, computed, observer, Component } = Ember;\n\nlet requireFields = ['contactInfo.phone_other'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isNumberError:invalid-value', 'hasErrorCode:has-error-code'],\n\n    intl: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.number', 'entry.value.extension', 'entry.value.acceptSMS'],\n\n    isActive: false,\n    headingLevel: null,\n\n    entry: computed.alias('fieldData.value'),\n\n    timers: null,\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n            if (\n                this.get('session.features.emergencyLocation') &&\n                this.get('entry.value.number') &&\n                this.setPrimaryCallback\n            ) {\n                this.setPrimaryCallback(this.get('entry.value.number'));\n            }\n        },\n\n        setPrimarySMS() {\n            this.set('isPrimarySMS', true);\n            this.set('entry.value.acceptsSMS', true);\n        },\n\n        toggleSMS(event) {\n            this.toggleProperty('entry.value.acceptsSMS');\n\n            if (event) {\n                event.stopPropagation();\n            }\n        },\n\n        makeCall: debounce(function () {\n            var phoneNumber = this.get('entry');\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [phoneNumber]\n            });\n        }, 250),\n\n        focus() {\n            this.set('isActive', true);\n        },\n\n        updateNumber(event) {\n            this.set('entry.value.number', event.target.value);\n        },\n\n        updateExtension(value) {\n            this.set('entry.value.extension', value);\n        }\n    },\n\n    init() {\n        this.set('timers', []);\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setupData);\n        this.get('timers').addObject(timer);\n    }),\n\n    addBehavior: observer('editing', function () {\n        let timer;\n        if (!this.get('editing')) {\n            timer = Ember.run.scheduleOnce('afterRender', this, this.setupTooltips);\n            this.get('timers').addObject(timer);\n\n            return;\n        }\n\n        timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n        this.get('timers').addObject(timer);\n    }).on('didInsertElement'),\n\n    dialableNumber: computed('entry.rel.e164', 'entry.value.{number,extension}', function () {\n        var e164 = this.get('entry.rel.e164');\n        if (e164) {\n            return e164;\n        }\n\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n\n        number = number ? number.replace(/\\D/g, '') : number;\n        extension = extension ? extension.replace(/\\D/g, '') : extension;\n\n        if (number) {\n            number = this.get('addressformat').formatAddress(number);\n            if (extension) {\n                return `${number};ext=${extension}`;\n            } else {\n                return number;\n            }\n        } else if (extension) {\n            return extension;\n        }\n    }),\n\n    isPrimarySMS: computed('entry._id', 'entity.primaryContactInfo.sms', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('sms');\n        },\n\n        set(key, value) {\n            const entity = this.get('entity');\n            const type = 'sms';\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.voice', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('voice');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    dialCode: computed('entry.value.number', function () {\n        let $input = this.get('$input');\n        let initialCountry = !_.isEmpty($input) ? $input.intlTelInput('getSelectedCountryData') : null;\n        if (_.isEmpty(initialCountry) && this.get('intl.iso2LocaleCountry')) {\n            initialCountry = this.get('intl.iso2LocaleCountry');\n        }\n        return initialCountry.dialCode;\n    }),\n\n    errorMsg: computed('entry.value.{number,extension}', function () {\n        const intl = this.get('intl');\n        const number = this.get('entry.value.number');\n        const extension = this.get('entry.value.extension');\n        const $input = this.get('$input');\n\n        let iso2LocaleCountry, initialCountry;\n\n        if (this.get('intl.iso2LocaleCountry')) {\n            iso2LocaleCountry = this.get('intl.iso2LocaleCountry.iso2');\n        }\n\n        if ($input.intlTelInput('getSelectedCountryData')) {\n            initialCountry = $input.intlTelInput('getSelectedCountryData').iso2;\n        }\n\n        if (!initialCountry) {\n            $input.intlTelInput('setCountry', iso2LocaleCountry);\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return null;\n        }\n\n        // https://github.com/Bluefieldscom/intl-tel-input/blob/master/lib/libphonenumber/src/utils.js#L175\n        let errorCode = $input.intlTelInput('getValidationError');\n        let message = '';\n        switch (errorCode) {\n            case intlTelInputUtils.validationError.INVALID_COUNTRY_CODE:\n                message = intl.lookup('entity.fieldTypes.phone.validation.invalidCountryCode');\n                break;\n            case intlTelInputUtils.validationError.TOO_SHORT:\n                message = intl.lookup('entity.fieldTypes.phone.validation.tooShort');\n                break;\n            case intlTelInputUtils.validationError.TOO_LONG:\n                // I don't understand this error.  This occurs on U.S. numbers as you type them in with an area code.  Using 'Not a number' instead of too long message.\n                // this.set('errorMsg', lookup('entity.fieldTypes.phone.validation.tooLong'));\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            case intlTelInputUtils.validationError.NOT_A_NUMBER:\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            default:\n                message = null;\n        }\n\n        return message;\n    }),\n\n    isRequiredPhone: computed('field', function () {\n        let path = this.get('field').getFieldPath();\n        return Ember.A(requireFields).includes(path);\n    }),\n\n    isRequiredError: computed('entry.value.{number,extension}', 'isRequiredPhone', function () {\n        if (!this.get('isRequiredPhone')) {\n            return false;\n        }\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    isNumberError: computed('entry.value.{number,extension}', '$input', 'isRequiredPhone', function () {\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        if (!this.get('isRequiredPhone') && _.isEmpty(number)) {\n            return false;\n        } else if (this.get('isRequiredPhone') && _.isEmpty(number) && !_.isEmpty(extension)) {\n            // Any extension is allowed because we dont know what the extension pool contains\n            return false;\n        }\n        const $input = this.get('$input');\n        if (!$input || !$input.intlTelInput) {\n            return false;\n        }\n        return !$input.intlTelInput('isValidNumber', false);\n    }),\n\n    errorClass: computed('isRequiredError', 'isNumberError', function () {\n        if (this.get('isRequiredError')) {\n            return 'has-error';\n        }\n        if (this.get('isNumberError')) {\n            return 'has-warning';\n        }\n        return '';\n    }),\n\n    isValid: computed('entry.value.{number,extension}', 'isRequiredError', function () {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return true;\n        }\n\n        const isRequiredError = this.get('isRequiredError');\n        const isValid = this.get('isRequiredPhone') ? !isRequiredError : true;\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setFieldDataValidity, isValid);\n        this.get('timers').addObject(timer);\n\n        return isValid;\n    }),\n\n    hasError: computed.not('isValid'),\n    hasErrorCode: computed('entry.rel.errorCode', function () {\n        return !_.isEmpty(this.get('entry.rel.errorCode'));\n    }),\n\n    errorMessage: computed('entry.rel.errorCode', function () {\n        const errorCode = this.get('entry.rel.errorCode');\n        const key = `purecloud.error.api.${errorCode}`;\n        return this.get('intl').lookup(key, null, errorCode.replace(/_/g, ' ')).toString();\n    }),\n\n    didUpdateAttrs({ newAttrs }) {\n        if (!get(newAttrs, 'editing.value') && !this.get('isValid')) {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    willDestroyElement() {\n        this.get('timers').forEach(timer => Ember.run.cancel(timer));\n\n        const $input = this.$('.phone-input');\n        if ($input.length && typeof $input.intlTelInput === 'function' && $input.parent().hasClass('iti')) {\n            $input.intlTelInput('destroy');\n        }\n\n        this._super(...arguments);\n    },\n\n    checkPrimaryForType(type) {\n        let entryId = this.get('entry._id');\n        let fieldId = this.get(`entity.primaryContactInfo.${type}.firstObject.value.fieldId`);\n        return fieldId && fieldId === entryId && !this.get('isEmpty');\n    },\n\n    focusOut() {\n        this._super(...arguments);\n\n        this.set('isActive', false);\n\n        const value = this.get('entry.value.number');\n        if (value === '+1') {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    focusNewField() {\n        let empty = this.get('isEmpty');\n        let added = this.get('entry.isAdded');\n\n        if (added) {\n            return;\n        }\n\n        this.set('entry.isAdded', true);\n        if (empty) {\n            this.$('.phone-input').trigger('focus');\n        }\n    },\n\n    cleanFieldForSave() {\n        if (this.get('entry.value') && this.get('$input')) {\n            var countryData = this.get('$input').intlTelInput('getSelectedCountryData');\n            if (countryData && countryData.iso2) {\n                this.set('entry.value.countryCode', countryData.iso2.toLocaleUpperCase());\n            }\n        }\n    },\n\n    isComplexFieldEmpty() {\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n        return (\n            ((typeof number === 'string' && number.length === 0) || number === undefined) &&\n            ((typeof extension === 'string' && extension.length === 0) || extension === undefined)\n        );\n    },\n\n    setupTooltips() {\n        this.$('[data-toggle=\"tooltip\"]').tooltip();\n    },\n\n    _setupData() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n        let entity = this.get('entity');\n        let emptyData = {\n            number: '',\n            extension: '',\n            acceptsSMS: false\n        };\n\n        if (_.isEmpty(entry) || (_.isEmpty(entry.value) && !this.get('field.repeatable'))) {\n            let path = this.get('field').getFieldPath();\n            entity.set(path, emptyData);\n            this.set('entry', _.last(entity.get(path)));\n        } else if (!_.isEmpty(entry) && _.isEmpty(entry.value)) {\n            Ember.set(entry, 'value', emptyData);\n        }\n    },\n\n    _setupInput() {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let $input = this.$('.phone-input');\n        if (!$input.length) {\n            // Input may not be in the DOM yet (e.g. canEdit still rendering) — retry a few times\n            const retries = this.get('_intlTelInputSetupRetries') || 0;\n            if (retries >= 5) {\n                return;\n            }\n            this.set('_intlTelInputSetupRetries', retries + 1);\n            const timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n            this.get('timers').addObject(timer);\n            return;\n        }\n        this.set('_intlTelInputSetupRetries', 0);\n\n        // Already initialised — still refresh accessible name (includes phone type)\n        if ($input.parent().hasClass('iti') || $input.closest('.iti').length) {\n            this.set('$input', $input);\n            setupIntlTelInputAccessibility($input, this.get('intl'), this.get('field.i18nLabel'));\n            return;\n        }\n\n        if (typeof $input.intlTelInput !== 'function') {\n            this.logger.error('intlTelInput jQuery plugin is not available');\n            return;\n        }\n\n        const orgCountryCode = this.get('session.org.orgDefaultCountryCode');\n        let countryCode = 'us';\n        if (orgCountryCode && typeof orgCountryCode === 'string') {\n            const normalized = orgCountryCode.toLowerCase();\n            // intl-tel-input expects an iso2 code; invalid values throw during init\n            if (/^[a-z]{2}$/.test(normalized)) {\n                countryCode = normalized;\n            }\n        }\n\n        try {\n            $input.intlTelInput(\n                buildIntlTelInputOptions(this.get('intl'), this.get('application'), {\n                    initialCountry: countryCode\n                })\n            );\n            setupIntlTelInputAccessibility($input, this.get('intl'), this.get('field.i18nLabel'));\n\n            $input.on('blur', function () {\n                //Let the Ember input binding know that the plugin updated the value after blur event.\n                $input.trigger('change');\n            });\n\n            this.set('$input', $input);\n            this.notifyPropertyChange('isValid');\n        } catch (err) {\n            this.logger.error('Failed to initialise intlTelInput', { err });\n        }\n    },\n\n    _setFieldDataValidity(value) {\n        this.set('fieldData.isValid', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pA8qbsDD\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"phone-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[26,[\\\"errorClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null]]]],[15,\\\"type\\\",\\\"tel\\\"],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]],[16,\\\"class\\\",[34,[\\\"phone-input form-control phone-number \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focus\\\"],[[\\\"on\\\"],[\\\"focus\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-extension\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extensionLabel\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"key-up\\\",\\\"classNames\\\",\\\"class\\\",\\\"placeholder\\\",\\\"type\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-extension\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"updateExtension\\\",\\\"form-control phone-extension\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-warning\\\"],null],[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],\\\"tel\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRequiredError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.validation.notANumber\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isNumberError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warn help-block\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.sms.errors.invalidNumberFormat\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasErrorCode\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[15,\\\"data-placement\\\",\\\"right\\\"],[15,\\\"data-trigger\\\",\\\"hover\\\"],[16,\\\"title\\\",[34,[[26,[\\\"errorMessage\\\"]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value-type \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"primary-phone-choice\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryPhone\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isPrimarySMS\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimarySMS\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type primary-sms-choice\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimarySMS\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimarySMS\\\"],null],\\\"primarySms\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading-indicator\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/phone-field/template.hbs\"}});","import Ember from 'ember';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: Ember.inject.service(),\n\n    choice: Ember.computed.alias('entry.value'),\n\n    actions: {\n        setValue(value) {\n            if (!value) {\n                value = this.get('defaultValue.id');\n            }\n\n            this.set('choice', value);\n            Ember.set(this, 'entry.value', value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: Ember.observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n\n        if (this.isFieldEmpty()) {\n            let value = this.get('field.params.allowedValues')[0];\n\n            if (!value) {\n                value = '';\n            }\n\n            if (!isEmpty(entry)) {\n                Ember.set(entry, 'value', value);\n                entity.set(path, [entry], { overwrite: true });\n            } else {\n                entity.set(path, value);\n            }\n\n            this.set('entry', entity.getFieldValue(path));\n        }\n    },\n\n    defaultValue: Ember.computed('content', 'entry.value', function () {\n        const value = this.get('entry.value');\n        if (!isEmpty(value)) {\n            const defaultValue = find(this.get('content'), 'id', value);\n            if (!isEmpty(defaultValue)) {\n                return defaultValue;\n            }\n        }\n\n        return this.get('content.0.id');\n    }),\n\n    content: Ember.computed('field.params.allowedValues', function () {\n        const allowedValues = this.get('field.params.allowedValues') || [];\n        return allowedValues.map(value => {\n            const label = this.translatedAllowedValue(value).toString();\n            return {\n                id: value,\n                label\n            };\n        });\n    }),\n\n    translatedValue: Ember.computed('entry.value', function () {\n        const value = this.get('entry.value');\n        if (value) {\n            const fieldKey = this.get('field').getI18nKey();\n            const valueKey = value.replace(/\\./g, '_');\n            const key = `${fieldKey}_value_${valueKey}`;\n\n            if (this.get('intl').query(key)) {\n                return this.get('intl').lookup(key);\n            }\n        }\n        return value;\n    }),\n\n    translatedAllowedValue(value) {\n        const fieldKey = this.get('field').getI18nKey();\n        const valueKey = value.replace(/\\./g, '_');\n        const key = `${fieldKey}_value_${valueKey}`;\n\n        if (this.get('intl').query(key)) {\n            return this.get('intl').lookup(key);\n        }\n\n        return valueKey;\n    },\n\n    isFieldEmpty() {\n        const field = this.get('field');\n        const entity = this.get('entity');\n\n        if (field && entity) {\n            const path = this.get('field').getFieldPath();\n            const value = this.get('entity').getFieldValue(path);\n\n            return isEmpty(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Qv4n7ECK\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-10\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"select\\\",[]],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setValue\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"content\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"option\\\",[]],[16,\\\"value\\\",[28,[\\\"item\\\",\\\"id\\\"]],null],[16,\\\"selected\\\",[33,[\\\"eq\\\"],[[28,[\\\"choice\\\"]],[28,[\\\"item\\\",\\\"id\\\"]]],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"item\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"item\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"translatedValue\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/select-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { rerunLayouts } from '../../../utils/masonry';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['tags'],\n    classNameBindings: ['field.fieldPathClass'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        addTag(tag) {\n            let tags = this.get('entry.value');\n            if (!_.isEmpty(tag) || (typeof tag === 'string' && !_.isEmpty(tag.trim()))) {\n                if (tags.indexOf(tag) !== -1) {\n                    this.send('showDuplicateError', tag);\n                }\n                tags.addObject(tag);\n                rerunLayouts();\n            }\n        },\n\n        removeTag(tag) {\n            this.get('entry.value').removeObject(tag);\n            rerunLayouts();\n        },\n\n        showDuplicateError(tag) {\n            let addTag = this.$('.add-tag');\n\n            addTag\n                .tooltip({\n                    title: this.get('intl').lookup('tooltip.fields.tags.duplicate', { tag }).toString(),\n                    placement: 'bottom',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n\n            Ember.run.later(function () {\n                addTag.tooltip('destroy');\n            }, 3000);\n        },\n\n        navigateToSearchTag(queryParams) {\n            this.get('application').navigateTo('search', undefined, queryParams.values);\n        }\n    },\n\n    linkable: computed('field.fieldPath', function () {\n        const fieldPath = this.get('field.fieldPath');\n        return _.includes(['skills.skills', 'skills.certs'], fieldPath);\n    }),\n\n    sortedTags: computed('entry.value.[]', function () {\n        let tags = this.get('entry.value') || [];\n        return _.sortBy(tags, tag => tag.toLowerCase());\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    ensurePopulatedField: Ember.on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const timer = Ember.run.once(this, this.setValues);\n        this.timers.pushObject(timer);\n    }),\n\n    setValues() {\n        let entry = this.get('entry');\n        let fieldPath = this.get('field').getFieldPath();\n        let entity = this.get('entity');\n\n        if (entity && (!entry || typeof entry.value !== 'object')) {\n            entity.set(fieldPath, [], { recordChange: true });\n            this.set('entry', entity.getFieldValue(fieldPath));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.remove-tag[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { on, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['tag-editor'],\n\n    ajax: inject.service(),\n    search: inject.service(),\n\n    attrs: {\n        field: null,\n        addTag() {}\n    },\n\n    tagValue: null,\n\n    currentRequest: null,\n\n    initTagInput: on('didInsertElement', function () {\n        let $typeahead = this.$('input').typeahead(\n            { highlight: true, hint: false },\n            {\n                name: 'tags',\n                async: true,\n                limit: 100,\n                displayKey: 'text',\n                source: Ember.run.bind(this, (query, syncResults, asyncResults) => {\n                    Ember.run.debounce(this, this.performSearch.bind(this, query, asyncResults), 300);\n                })\n            }\n        );\n\n        $typeahead.on('typeahead:selected', this.addTagFromTypeahead.bind(this));\n        $typeahead.on('typeahead:change', this.clearInput.bind(this));\n\n        this.$('input').on('blur', this.clearInput.bind(this));\n    }),\n\n    removeBehavior: on('willDestroyElement', function () {\n        this.$('input').typeahead('destroy');\n    }),\n\n    performSearch(query, cb) {\n        let type = 'purecloud.skills';\n        const fieldPath = this.get('field').getFieldPath();\n        if (fieldPath === 'skills.spokenLanguages') {\n            type = 'purecloud.languages';\n        }\n        const request = this.get('search').search({\n            types: ['tags'],\n            query: [\n                {\n                    type: 'TERM',\n                    value: type,\n                    fields: ['namespace']\n                },\n                {\n                    type: 'STARTS_WITH',\n                    value: query,\n                    fields: ['name']\n                }\n            ],\n            returnFields: ['key']\n        });\n        this.set('currentRequest', request);\n        return request\n            .then(data => {\n                let tags = data.results;\n                let suggestions = Ember.A(tags).map(function (tag) {\n                    return {\n                        value: tag.key,\n                        text: tag.key\n                    };\n                });\n\n                cb(suggestions);\n            })\n            .catch(() => {\n                cb([]);\n            });\n    },\n\n    addTagFromTypeahead(event, suggestion /*, dataset*/) {\n        Ember.run(() => {\n            this.attrs.addTag(suggestion.value);\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n        });\n    },\n\n    clearInput() {\n        Ember.run(() => {\n            if (!this.get('tagValue')) {\n                this.$('input').val('');\n            }\n        });\n    },\n\n    keyDown(event) {\n        if (eventToString(event) === 'ENTER') {\n            this.attrs.addTag(this.get('tagValue'));\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n\n            let currentRequest = this.get('currentRequest');\n            if (currentRequest && currentRequest.abort) {\n                currentRequest.abort();\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"c9aPS9VM\",\"block\":\"{\\\"statements\\\":[[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-tag-add\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.add\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[1,[33,[\\\"input\\\"],null,[[\\\"class\\\",\\\"id\\\",\\\"value\\\",\\\"placeholder\\\"],[\\\"form-control tag-editor-input\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-tag-add\\\"],null],[28,[\\\"tagValue\\\"]],[33,[\\\"t\\\"],[\\\"common.add\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"add\\\"],[13],[0,\\\"+\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/tag-editor/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'span',\n    classNames: ['tag', 'tag-label', 'label-default'],\n    classNameBindings: ['flash'],\n\n    flash: false,\n\n    timers: [],\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this.flashTag);\n        this.timers.pushObject(timer);\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    flashTag() {\n        this.set('flash', true);\n\n        const timer = Ember.run.later(\n            this,\n            () => {\n                this.set('flash', false);\n            },\n            500\n        );\n        this.timers.pushObject(timer);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"K7sP69JX\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-tag\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-fields/tag-field/tag-editor\\\"],null,[[\\\"field\\\",\\\"addTag\\\"],[[28,[\\\"field\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addTag\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-fields/tag-field/tag-wrapper\\\"],null,null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                        ×\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"linkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]]]]],[15,\\\"class\\\",\\\"tag tag-label label-default clickable\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateToSearchTag\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"search\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]],[[\\\"title\\\",\\\"classNames\\\"],[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]],\\\"tag tag-label label-default clickable\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"tag tag-label label-default\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                            ×\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport textValidator from '../../entity-fields/validators/text';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, observer, computed, Component } = Ember;\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['text-field'],\n    classNameBindings: ['canEdit:editing', 'onProfile:on-profile'],\n\n    intl: inject.service(),\n    embedded: inject.service(),\n\n    attrs: {\n        onProfile: false\n    },\n\n    onProfile: false,\n    isGeneralField: false,\n\n    actions: {\n        saveField(event) {\n            const value = event.target.value;\n            if (this.get('onProfile') && this.get('canEdit')) {\n                if (event.type === 'keyup' && event.keyCode !== 13) {\n                    return;\n                }\n                this.saveField(value);\n\n                if (this.get('isGeneralField')) {\n                    // notifyUserGeneralFieldUpdated will trigger a userGeneralFieldUpdated event to Web-Directory if entity is current user.\n                    const embedded = this.get('embedded');\n                    embedded.notifyUserGeneralFieldUpdated(this.get('entity.id'));\n                }\n            } else if (this.get('canEdit')) {\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    showPlaceholder: computed.reads('onProfile'),\n\n    isValid: computed('entry.value', function () {\n        let fieldData = this.get('fieldData');\n\n        if (fieldData) {\n            return fieldData.get('isValid');\n        } else {\n            let entry = this.get('entry');\n            let field = this.get('field');\n            return textValidator.isValid(entry, field);\n        }\n    }),\n\n    watchValidityToDisableModal: observer('isValid', function () {\n        const disable = this.get('disableModal');\n        if (typeof disable === 'function') {\n            Ember.run.next(null, disable, !this.get('isValid'));\n        }\n    }),\n\n    isEmpty: computed('entry.value', function () {\n        return this.isFieldEmpty();\n    }),\n\n    placeholderText: computed('showPlaceholder', function () {\n        if (this.get('showPlaceholder')) {\n            return this.get('field.i18nLabel');\n        }\n\n        return '';\n    }),\n\n    setMinWidth: observer('canEdit', 'entry.value', function () {\n        // self sizing behavior...\n        if (this.get('onProfile') && this.get('canEdit') && _.isEmpty(this.get('entry.value'))) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                let span = Ember.$('<span class=\"off-page\"></span>');\n                let placeholder = this.get('placeholderText');\n                span.text(placeholder);\n                this.$().append(span);\n                this.$('input').css('min-width', span.width() + 15);\n                span.remove();\n            });\n        }\n    }).on('didInsertElement'),\n\n    ensurePopulatedWhenEditing: observer('editing', 'canEdit', function () {\n        Ember.run.once(this, this.ensurePopulatedField);\n    }).on('didInsertElement'),\n\n    ensurePopulatedField() {\n        if ((!this.get('editing') || this.isDestroyed) && !this.get('isGeneralField')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.once(this, this.setValues);\n        }\n    },\n\n    setWidth: on('didRender', function () {\n        if (this.get('onProfile') && this.get('canEdit')) {\n            let span = this.$('span');\n            this.$('input').width(span.width() + 5);\n        }\n    }),\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    },\n\n    isFieldEmpty() {\n        let entry = this.get('entry');\n\n        if (!entry) {\n            return true;\n        }\n\n        return _.isEmpty(entry.value);\n    },\n\n    getFieldError() {\n        const intl = this.get('intl');\n        let value = this.get('entry.value');\n        let maxLength = this.get('field.params.maxLength');\n        let fieldPath = this.get('field.fieldPath');\n        if (_.isEmpty(value) && _.includes(requiredFieldPaths, fieldPath)) {\n            return intl.lookup('tooltip.fields.text.requiredError').toString();\n        }\n\n        return intl.lookup('tooltip.fields.text.lengthError', { length: maxLength }).toString();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"20qjoxwv\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\",\\\"writeable\\\",\\\"canEdit\\\",\\\"for\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"canEdit\\\"]],[28,[\\\"canEdit\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"placeholderText\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[1,[26,[\\\"placeholderText\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholderText\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"aria-describedby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.requiredField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"entry-value\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"off-page\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport email from './validators/email';\nimport tag from './validators/tag';\nimport history from './validators/history';\nimport text from './validators/text';\nimport location from './validators/location';\nimport date from './validators/date';\nimport phone from './validators/phone';\nimport boolean from './validators/boolean';\nimport address from './validators/address';\nimport select from './validators/select';\nimport multiline from './validators/multiline-text';\nimport person from './validators/person';\nimport weblink from './validators/weblink';\nimport image from './validators/image';\n\nconst { getOwner, computed } = Ember;\n\nexport default Ember.Object.extend({\n    fieldConfig: computed(function () {\n        return getOwner(this).lookup('field-config:person');\n    }),\n\n    default: {\n        isValid() {\n            return false;\n        },\n\n        isEmpty() {\n            return true;\n        }\n    },\n    tag,\n    text,\n    date,\n    email,\n    phone,\n    image,\n    person,\n    select,\n    history,\n    boolean,\n    address,\n    location,\n    weblink,\n    'multiline-text': multiline\n}).create();\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(entry, field) {\n        var maxLength = field.get('params.maxLength');\n        if (entry && _.isEmpty(entry.value)) {\n            return true;\n        }\n        return !!(entry && entry.value && Ember.get(entry, 'value.length') <= maxLength);\n    },\n\n    isEmpty(entry) {\n        let value = entry.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","export default {\n    isValid(bool) {\n        let value = bool.value;\n        return (value !== undefined && value !== null) || value === '';\n    },\n\n    isEmpty(bool) {\n        let value = bool.value;\n        return value === undefined || value === null || value === '';\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(date, field) {\n        if (field.get('required')) {\n            let value = date.value;\n            return !_.isEmpty(value) && value.day && value.month && value.year;\n        }\n\n        return true;\n    },\n\n    isEmpty(date) {\n        if (!date) {\n            return true;\n        }\n\n        let value = date.value;\n        return _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let value = Ember.get(entry, 'value');\n        let path = field.getFieldPath();\n\n        if (value) {\n            if (typeof value.year !== 'number') {\n                delete value.year;\n            }\n\n            if (typeof value.month !== 'number') {\n                delete value.month;\n            }\n\n            if (typeof value.day !== 'number') {\n                delete value.day;\n            }\n\n            if (!value.year && !value.month && !value.day) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            let data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidEmail(email) {\n    let reg =\n        /^(([^<>()\\[\\]\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\]\\.,;:\\s@\"]+\\.)+[^<>()[\\]\\.,;:\\s@\"]{2,})$/;\n    return email.match(reg);\n}\n\nfunction isEmpty(email) {\n    let value = email && email.value;\n    return !!(value === undefined || value === null || _.isEmpty(value));\n}\n\nexport default {\n    isEmpty,\n\n    isValid(entry, field) {\n        const isGroupField = field.get('section.fieldConfig.entityType') === 'group';\n        if (isEmpty(entry) && isGroupField) {\n            return true;\n        }\n        var maxLength = field.get('params.maxLength');\n\n        return !!(entry && entry.value && entry.value.length <= maxLength && !!isValidEmail(entry.value));\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\n\nexport default {\n    isValid(history) {\n        if (history && history.value) {\n            let startDate = history.value.startDate;\n            let endDate = history.value.endDate;\n\n            let haveStartDate = !!(startDate && startDate.month && startDate.year);\n            let haveEndDate = !!(endDate && endDate.month && endDate.year);\n\n            if (!haveStartDate && !haveEndDate) {\n                return true;\n            } else if (!haveStartDate && haveEndDate) {\n                return false;\n            } else if (haveStartDate && !haveEndDate) {\n                return true;\n            } else {\n                if (startDate.year < endDate.year) {\n                    return true;\n                } else if (startDate.year > endDate.year) {\n                    return false;\n                } else {\n                    return startDate.month <= endDate.month;\n                }\n            }\n        }\n\n        return history;\n    },\n\n    isEmpty(history) {\n        let value = history.value;\n        // only required field is `where`\n        var where = Ember.get(value, 'where');\n        return where === undefined || _.isEmpty(where.trim());\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let month, year, day;\n        let startDate = Ember.get(entry, 'value.startDate');\n        let endDate = Ember.get(entry, 'value.endDate');\n\n        if (moment.isMoment(startDate)) {\n            startDate = {\n                month: Ember.get(entry, 'value.startDate').format('M'),\n                year: Ember.get(entry, 'value.startDate').format('YYYY')\n            };\n        }\n\n        if (moment.isMoment(endDate)) {\n            endDate = {\n                month: Ember.get(entry, 'value.endDate').format('M'),\n                year: Ember.get(entry, 'value.endDate').format('YYYY')\n            };\n        }\n\n        if (startDate) {\n            day = parseInt(startDate.day);\n            month = parseInt(startDate.month);\n            year = parseInt(startDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete startDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete startDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete startDate.year;\n            }\n        } else if (startDate === undefined) {\n            startDate = {};\n        }\n\n        if (endDate) {\n            day = parseInt(endDate.day);\n            month = parseInt(endDate.month);\n            year = parseInt(endDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete endDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete endDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete endDate.year;\n            }\n        } else if (endDate === undefined) {\n            endDate = {};\n        }\n\n        if (entry.value) {\n            Ember.set(entry, 'value.startDate', startDate);\n            Ember.set(entry, 'value.endDate', endDate);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text !== undefined;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(location) {\n        if (!location) {\n            return false;\n        }\n\n        let value = location.value;\n        return !_.isEmpty(value.locationId);\n    },\n\n    isEmpty(location) {\n        if (!location) {\n            return true;\n        }\n\n        let value = location.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if (maxLength && text.value) {\n            return text.value.length <= maxLength;\n        }\n\n        if (field.get('required')) {\n            return !_.isEmpty(text);\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text;\n    },\n\n    isEmpty(person) {\n        if (!person) {\n            return true;\n        }\n        let value = person.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst requireFields = ['contactInfo.phone_other'];\n\nfunction isEmptyValue(value) {\n    return value === undefined || value === null || _.isEmpty(value.trim());\n}\n\nexport default {\n    isValid(entry, field, intl, $input) {\n        if (arguments.length !== 4 || !entry || !field || !$input || !intl) {\n            return true;\n        }\n\n        const path = field.getFieldPath();\n        const params = Ember.get(field, 'params');\n        const number = Ember.get(entry, 'value.number');\n        const extension = Ember.get(entry, 'value.extension');\n\n        const isRequired = _.includes(requireFields, path);\n        if (_.isEmpty(number) && _.isEmpty(extension)) {\n            return !isRequired;\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return true;\n        }\n\n        let isValid = number.length <= params.numberMaxLength;\n\n        if (extension && extension.length) {\n            isValid = isValid && extension.length <= params.extensionMaxLength && !!number;\n        }\n\n        return isValid;\n    },\n\n    isEmpty(phone) {\n        if (!phone || !phone.value) {\n            return true;\n        }\n\n        let value = phone.value;\n        let number = Ember.get(value, 'number');\n        let extension = Ember.get(value, 'extension');\n        return isEmptyValue(number) && isEmptyValue(extension);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (value) {\n            if (_.isEmpty(value.number)) {\n                delete value.number;\n            }\n\n            if (_.isEmpty(value.extension)) {\n                delete value.extension;\n            }\n\n            if (!value.number && !value.extension) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(select) {\n        if (!select) {\n            return false;\n        }\n\n        return !!(select && select.value);\n    },\n\n    isEmpty(select) {\n        let value = select.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        if (!entry) {\n            return;\n        }\n\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid() {\n        return true;\n    },\n\n    isEmpty(tags) {\n        let value = tags.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nfunction isEmpty(text) {\n    if (typeof text === 'string') {\n        return _.isEmpty(text);\n    } else {\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n}\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if ((maxLength && text.value && text.value.length > maxLength) || (!text.value && text.length > maxLength)) {\n            return false;\n        }\n\n        if ((field.get('required') || _.includes(requiredFieldPaths, field.getFieldPath())) && isEmpty(text)) {\n            return false;\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        return isEmpty(text);\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidUrl(url) {\n    var reg =\n        /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/;\n    return reg.test(url);\n}\n\nexport default {\n    isValid(url) {\n        if (url && Object.prototype.hasOwnProperty.call(url, 'value')) {\n            url = url.value;\n        }\n\n        return _.isEmpty(url) || isValidUrl(url);\n    },\n\n    isEmpty(url) {\n        let value = url.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nimport validator from '../validators/weblink';\n\nconst { inject, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['web-link'],\n\n    intl: inject.service(),\n\n    tooltip: null,\n\n    labelChoices: Ember.computed(function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(\n            this.get('field.labelKeys'),\n            function (labelKey) {\n                return {\n                    id: labelKey,\n                    label: this._s(`${baseKey}_labelKey_${labelKey}`)\n                };\n            },\n            this\n        );\n    }),\n\n    customLabel: Ember.computed(function () {\n        return '<i class=\"ion-link\"></i>';\n    }),\n\n    isValid: Ember.computed('entry.value', function () {\n        let entry = this.get('entry');\n        return entry && this.isValidUrl(entry);\n    }),\n\n    validityChanged: observer('isValid', 'isEmpty', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupTooltips');\n    }).on('didInsertElement'),\n\n    isValidUrl(url) {\n        return validator.isValid(url);\n    },\n\n    isFieldEmpty() {\n        return _.isEmpty(this.get('entry.value'));\n    },\n\n    setupTooltips() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let input = this.$('input');\n        if (this.get('isValid') && !this.get('isEmpty')) {\n            input.tooltip('destroy');\n            this.set('tooltip', null);\n        } else {\n            if (this.get('tooltip')) {\n                return;\n            }\n\n            let title = this.get('intl').lookup('tooltip.fields.weblink.error');\n            let tooltip = input\n                .attr('title', title)\n                .tooltip({\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('fixTitle')\n                .tooltip('show');\n            this.set('tooltip', tooltip);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"hik8w8PJ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-link\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.webLink.name\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-link\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"url\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/weblink-field/template.hbs\"}});","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 $ from 'jquery';\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.get('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        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials'\n    ],\n\n    feature: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n    session: service(),\n    application: service(),\n\n    entity: null,\n    user: null,\n    size: 200,\n    self: null,\n    hoverParent: null,\n    type: 'profile',\n    applicationUrlPrefix: '',\n    showFavorite: true,\n    isPlaceholderImage: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    microCard: false,\n    showMiniCard: false,\n    showQueueToggle: false,\n    showPresenceDropdown: false,\n    showLogOffButton: 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    toggleFavorite() {},\n    callEntity() {},\n\n    actions: {\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(() => this.set('showMiniCard', false));\n        },\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._attachListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\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    tetherSelector: computed('elementId', function () {\n        return `#${this.get('elementId')}`;\n    }),\n\n    tetherElementId: computed('elementId', function () {\n        return `entity-mini-card-${this.get('elementId')}`;\n    }),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-mini-card`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    cardImageUrl: computed(\n        'entity',\n        'entity.isLoaded',\n        'entity.profilePicture',\n        'entity.profilePictureSizes',\n        function () {\n            if (this.get('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.get('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.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('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    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\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.get('entity'));\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('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.get('showMiniCard') && this.get('_state') === 'inDOM' && this.get('enableMiniCard')) {\n            this.set('showMiniCard', true);\n            scheduleOnce('afterRender', this, function () {\n                this._createPopper();\n\n                const image = new Image();\n                image.src = this.get('cardImageUrl');\n                image.onload = () => {\n                    this.set('imageLoadError', false);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n                image.onerror = () => {\n                    this.set('imageLoadError', true);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n            });\n        }\n    },\n\n    onHoverChanged() {\n        const hoverTimeout = 800;\n        const isHovering = this.get('isHovering');\n        let timer = this.get('hoverTimer');\n\n        cancel(timer);\n\n        if (isHovering) {\n            if (!this.get('enableMiniCard')) {\n                return;\n            }\n\n            timer = later(() => {\n                this._displayHoverCard();\n            }, hoverTimeout);\n        } else {\n            timer = later(() => {\n                if (!this.get('isHovering') && this.get('_state') === 'inDOM') {\n                    scheduleOnce('afterRender', this, () => {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                    });\n                }\n            }, hoverTimeout);\n        }\n\n        this.set('hoverTimer', timer);\n    },\n\n    _attachListeners() {\n        let id = this.get('uniqueId');\n\n        $(window).on(\n            'click.' + id,\n            bind(this, function (event) {\n                if (!event) {\n                    return;\n                }\n                let target = $(event.target);\n\n                let clickedHoverCard = target.parents('#' + id).length || target.parents('.entity-mini-card').length;\n                let checkHoverState = !clickedHoverCard;\n\n                if (checkHoverState) {\n                    if (this.get('showMiniCard')) {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                        event.preventDefault();\n                    }\n                }\n            })\n        );\n    },\n\n    _removeListeners() {\n        const id = this.get('elementId');\n        const uniqueId = this.get('uniqueId');\n        this.$().off(`.${id}`);\n        $(window).off(`.${uniqueId}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Bw0eX6lh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"mini-card-component-wrapper\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerShowMiniCard\\\"]],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"enableMiniCard\\\"]],[28,[\\\"showMiniCard\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entity-mini-card visible\\\\n        \\\",[26,[\\\"tetherElementId\\\"]],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"microCard\\\"]],\\\"micro-card\\\"],null],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"imageLoadError\\\"]],\\\"image-load-error\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseEnterCard\\\"],[[\\\"on\\\"],[\\\"mouseEnter\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseLeaveCard\\\"],[[\\\"on\\\"],[\\\"mouseLeave\\\"]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"arrow\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"left-bar chat-presence \\\",[26,[\\\"chatPresenceClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"image-link\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"entityIsGroup\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"wrap\\\",\\\"showStatus\\\",\\\"isChatEnabled\\\"],[[28,[\\\"entity\\\"]],true,false,[28,[\\\"isChatEnabled\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"isGeolocationEnabled\\\"]],\\\"entity-geolocation align-center\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-selector-dropdown\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-bar\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"name-header\\\"],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasChatStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"presence-label-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-quote-left blockquote-start\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showQueueToggle\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]],[28,[\\\"isOnline\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"queue-toggle-switch\\\"],null,[[\\\"dataOn\\\",\\\"dataOff\\\",\\\"entity\\\",\\\"continueOnQueue\\\"],[\\\"toggle.onQueue\\\",\\\"toggle.offQueue\\\",[28,[\\\"entity\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showLogOffButton\\\"]],[28,[\\\"permissions\\\",\\\"canLogOffAgents\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"logoff-link\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isSelfEntity\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"linkProfile\\\",\\\"showFavorite\\\",\\\"compact\\\",\\\"showImages\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"onContact\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entityDeleted\\\"]]],null],[28,[\\\"showFavorite\\\"]],true,false,[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isOneToOneOfflineOrBusy\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onContact\\\"],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"useMediaProviders\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"user\\\"]],[28,[\\\"useMediaProviders\\\"]],[28,[\\\"mediaProviderComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"mediaProviderComponent\\\"]]],[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-hover-card-v2/template.hbs\"}});","define(\"connections-ui/components/entity-hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","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 $ from 'jquery';\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.get('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        'showPresenceAndChatEnabled: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    showFavorite: true,\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    toggleFavorite() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.on('load', () => {\n                const func = this.get('componentUpdated');\n                if (func && typeof func === 'function') {\n                    run(() => this.get('componentUpdated')());\n                }\n            });\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removePresenceSubscription();\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.off();\n        }\n\n        if (this.get('_animationRun')) {\n            cancel(this.get('_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('showPresenceAndChatEnabled', 'showStatusQuote', 'entity.hasChatStatus'),\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-image`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    imageUrl: computed('entity', 'entity.isLoaded', 'entity.profilePicture', 'entity.profilePictureSizes', function () {\n        if (this.get('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.get('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.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    _animationRun: null,\n    _currentPresence: null,\n    isStatusAnimating: false,\n    animateOnPresenceChange: observer('chatPresence', function () {\n        const nextPresence = this.get('chatPresence');\n        const prevPresence = this.get('_currentPresence');\n        this.set('_currentPresence', nextPresence);\n        if (nextPresence !== prevPresence) {\n            this.set('isStatusAnimating', true);\n            const animationPeriod = 1250;\n            if (this.get('_animationRun')) {\n                cancel(this.get('_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    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('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.get('entity'));\n    },\n\n    modifyPlaceholderImage(value) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        this.set('isPlaceholderImage', value);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('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.get('subscribeToPresence')) {\n            this.get('presenceSubscription').autoSubscribe(null, this);\n        }\n    },\n\n    _managePresenceSubscription() {\n        if (this.get('subscribeToPresence') && this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"N/zSf8dm\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"hoverParent\\\",\\\"showFavorite\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"showPresenceDropdown\\\",\\\"showLogOffButton\\\",\\\"showQueueToggle\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"elementId\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"enableMiniCard\\\"]],[28,[\\\"isOneToOneOffline\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"applicationUrlPrefix\\\"]],[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"showLogOffButton\\\"]],[28,[\\\"showQueueToggle\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayStatusQuote\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc-moon pc-quote-right status-quote \\\",[26,[\\\"chatPresence\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isLinkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"enableMiniCard\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"external-contact-icon\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"top\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"center\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"bottom\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"isStatusAnimating\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-status\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-radiate chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-pulse chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-image-v2/template.hbs\"}});","define(\"connections-ui/components/entity-image/component\", [\"exports\", \"ember-purecloud-components/components/entity-image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-location/component\", [\"exports\", \"ember-purecloud-components/components/entity-location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini'],\n    classNameBindings: ['entityTypeClass', 'isClickable:clickable'],\n\n    intl: Ember.inject.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: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    actions: {\n        sendToProfile: function () {\n            let person = this.get('entity');\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [person]\n            });\n        }\n    },\n\n    phoneTooltip: Ember.computed(function () {\n        return this.get('intl').lookup('tooltip.contactIcon.phone');\n    }),\n\n    entityTypeClass: Ember.computed('entity.type', function () {\n        if (!this.get('entity.type')) {\n            return 'empty-type';\n        }\n\n        return Ember.String.dasherize(this.get('entity.type'));\n    }),\n\n    entityIsPerson: Ember.computed.equal('entity.type', 'person'),\n\n    entityIsQueue: Ember.computed.equal('entity.type', 'queue'),\n\n    entityIsMe: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityIsGroup: Ember.computed.equal('entity.type', 'group'),\n\n    entityIsContact: Ember.computed.equal('entity.type', 'externalContact'),\n\n    canContactEntity: Ember.computed('entityIsGroup', 'entityIsPerson', 'entityIsContact', function () {\n        return this.get('entityIsPerson') || this.get('entityIsGroup') || this.get('entityIsContact');\n    }),\n\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    useInitials: Ember.computed.reads('entityIsContact'),\n\n    showOrganization: Ember.computed('entityIsContact', function () {\n        return this.get('entityIsContact') && !!this.get('entity.organization');\n    }),\n\n    entityRoutePath: Ember.computed('entity.type', function () {\n        let type = this.get('entity.type');\n        if (type === 'floor') {\n            type = 'location';\n        }\n\n        return `${type}.detail`;\n    }),\n\n    isClickable: Ember.computed('entity._entity', 'entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'floor' || type === 'location' || type === 'externalContact') {\n            return false;\n        }\n        const entity = this.get('entity._entity');\n        return entity !== 'locations' && this.get('clickToProfile');\n    }),\n\n    _subscribePresence: Ember.computed('showPresence', 'subscribeToPresence', function () {\n        const subscribe = this.get('subscribeToPresence');\n        if (subscribe === undefined) {\n            return this.get('showPresence');\n        }\n\n        return subscribe;\n    }),\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    click: function (event) {\n        if (!this.get('isClickable')) {\n            return;\n        }\n        const target = Ember.$(event.target);\n        if (target.is('a') || target.is('i') || target.parents().is('.entity-contact')) {\n            // Defer to link-to or primary contact icon action\n            //event.stopPropagation();\n            //event.preventDefault();\n            return;\n        }\n\n        if (this.get('isSearchResult')) {\n            // When this is a search result, only allow the link-to elements for transitioning due to the extra realestate.\n            return false;\n        }\n\n        if (!target.is('a')) {\n            this.send('sendToProfile');\n        }\n    },\n    eLocation: Ember.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: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.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: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            if (!this.get('entity')) return;\n\n            return {\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                eActivityPresenceClass: Ember.get(this.entity, 'activityPresenceClass'),\n                totalCalls: Ember.get(this.entity, 'activityValues.calls'),\n                totalChats: Ember.get(this.entity, 'activityValues.chats'),\n                totalEmails: Ember.get(this.entity, 'activityValues.emails'),\n                totalMessages: Ember.get(this, 'totalMessages'),\n                totalSocialExpression: Ember.get(this, 'totalSocialExpression'),\n                presenceLabel: Ember.get(this.entity, 'presenceLabel'),\n                eChatStatus: Ember.get(this.entity, 'chatStatus'),\n                isShowingActivitySummary: Ember.get(this.entity, 'showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport ViewportMixin from '../../../mixins/viewport';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend(ViewportMixin, {\n    classNameBindings: ['enteredViewport:in-viewport:outside-viewport', 'hasRequiredPermission::no-permission'],\n\n    session: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    presenceSubscription: Ember.inject.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: Ember.computed(\n        'requiredPermission.[]',\n        'entity.extends.authorization.permissions',\n        function () {\n            const requiredPermission = this.get('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\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    willDestroyElement() {\n        this._unsubscribeFromPresence();\n        this._super(...arguments);\n    },\n\n    _subscribeToPresence() {\n        if (this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    },\n\n    _unsubscribeFromPresence() {\n        this.get('presenceSubscription').autoSubscribe(null, this);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"gyhZ7ZGJ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showFavorite\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],[28,[\\\"isSearchResult\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"chat\\\",\\\"enabled\\\"]],[28,[\\\"showFavorite\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/default/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.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    isPresenceLabelToggleEnabled: false,\n    subscribeToPresence: false,\n    canContactEntity: false,\n    useInitials: false,\n    isClickable: false,\n    entity: null,\n    entityLocationData: null,\n    presenceLabelData: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"cu2qwlzH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]],\\\"external-contact-image\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isClickable\\\"]],\\\"not-clickable\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"useInitialsPlaceholder\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"_subscribePresence\\\"]],[28,[\\\"useInitials\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"information \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"is-me\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"showActions\\\"]],\\\"actions-hide\\\"],null]]]],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]],\\\"-1\\\",\\\"0\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[18,\\\"default\\\",[\\\"details\\\"]],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showDepartment\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"organization\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"description\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"description\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"group-type \\\",[28,[\\\"entity\\\",\\\"groupType\\\"]]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"groupType\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasGeolocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"geolocation-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-geolocation\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"item\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/entity-details/template.hbs\"}});","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport default Ember.Component.extend(RelateFeaturesMixin, {\n    classNames: ['external-contact'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    externalContact: null,\n    showPhones: true,\n    showEmails: false,\n    showAcceptsSMS: true,\n    acdOutboundWhatsApp: true,\n\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 this.get('acdOutboundWhatsApp') ? /.*Phone$|whatsAppId/.test(modelKey) : /.*Phone$/.test(modelKey);\n        });\n    },\n\n    dropdownTitle: Ember.computed('phones', function () {\n        return this.get('intl').t('purecloud.acdInteraction.relate.titles.selectPhone');\n    }),\n\n    externalContactHasNoEmailAddresses: Ember.computed.not('externalContact.hasEmailAddresses'),\n\n    phones: Ember.computed(function () {\n        if (!this.get('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.get('intl').t(\n                    `purecloud.acdInteraction.relate.phoneTypes.${phoneType}`\n                );\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 (\n                this.get('acdOutboundWhatsApp') &&\n                this.get(`externalContact.${phoneType}.phoneNumber.display`)\n            ) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const typeName = phoneType.replace(/Id/, '').toLowerCase();\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.channelTypes.${typeName}`\n                );\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: Ember.computed.empty('phones'),\n\n    emails: Ember.computed(function () {\n        if (!this.get('showEmails')) {\n            return [];\n        }\n        return this._getEmailTypes().reduce((email, emailType) => {\n            if (this.get(`externalContact.${emailType}`)) {\n                return email.concat({\n                    type: this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`),\n                    address: this.get(`externalContact.${emailType}`)\n                });\n            }\n            return email;\n        }, []);\n    }),\n\n    hasMultipleEmails: Ember.computed.gt('emails.length', 1),\n\n    hasMultiplePhoneRecords: Ember.computed.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.get('onSelectEmail') === 'function') {\n                this.get('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.get('onSelectPhone') === 'function') {\n                this.get('onSelectPhone')(phoneNumber, phoneType, event);\n            }\n        },\n\n        onPreventClick(event) {\n            event.stopPropagation();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Ao/YabLy\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-mini external-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profileImage\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"defaultWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"initials\\\"],[13],[1,[28,[\\\"externalContact\\\",\\\"initials\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information contactWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"onPreventClick\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"viewDetails\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[[28,[\\\"contactRoute\\\"]],[28,[\\\"externalContact\\\"]]],[[\\\"bubbles\\\"],[[28,[\\\"preventExternalContactDefault\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.viewExternalContactDetails\\\"],null],null],[15,\\\"class\\\",\\\"fa fa-arrow-up\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canShowCustomFields\\\"]],[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"schema-title\\\"],[13],[1,[33,[\\\"await\\\"],[[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"externalContact\\\",\\\"externalOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.relateExternalContactDetails.atOrg\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"externalContact\\\",\\\"externalOrganization\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information phones phonesWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phones\\\"]],[28,[\\\"showPhones\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"externalContactHasNoPhoneNumbers\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phonesExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"canUseNonE164\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithPhone\\\",[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"number\\\"]]],null],[28,[\\\"phone\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phone\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number-container\\\"],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phone\\\",\\\"acceptsSMS\\\"]],[28,[\\\"showAcceptsSMS\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"keepInWindow\\\",\\\"setPin\\\",\\\"side\\\",\\\"target\\\"],[true,true,\\\"top\\\",[33,[\\\"concat\\\"],[\\\"#list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon-container\\\"],[13],[0,\\\"\\\\n                                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[\\\"list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]]],[15,\\\"class\\\",\\\"svg-icon accept-sms\\\"],[15,\\\"icon-name\\\",\\\"device-cellphone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"div\\\",[]],[13],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"phone\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showPhones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information emails emailsWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emailsExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithEmail\\\",[28,[\\\"email\\\",\\\"address\\\"]],[28,[\\\"email\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emailType\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"type\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"email ellipsis\\\"],[16,\\\"tooltip\\\",[34,[[28,[\\\"email\\\",\\\"address\\\"]]]]],[15,\\\"tooltip-popup-delay\\\",\\\"500\\\"],[15,\\\"tooltip-placement\\\",\\\"bottom\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noEmails\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.emailNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/external-contact/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini-queue'],\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    queueService: Ember.inject.service('queue'),\n    permissions: Ember.inject.service(),\n\n    makingCall: false,\n    isDetailsLoaded: false,\n    isDetailsLoading: false,\n\n    queue: null,\n    clickToProfile: false,\n    showActions: false,\n\n    canViewQueueDetails: Ember.computed.bool('permissions.canViewQueueObservations'),\n\n    actions: {\n        getQueueData: function () {\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                    waitTimePromise: this.get('queueService').getQueueEstimatedWaitTime(id, this.get('interactionType'))\n                };\n\n                Ember.RSVP.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\n                            const wait = moment.duration(bestWaitTime * 1000); // convert from sec to ms\n\n                            const intl = this.get('intl');\n                            let hr = wait.hours(),\n                                min = wait.minutes(),\n                                sec = wait.seconds();\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","export default Ember.HTMLBars.template({\"id\":\"9e9+NV5j\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"isSearchResult\\\"],[[28,[\\\"queue\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],false,false,false,false]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"details\\\"],null],[28,[\\\"canViewQueueDetails\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin loading-icon\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoaded\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.agents\\\"],[[\\\"ratio\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"agentData\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.waitingCount\\\"],null],false],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callbackCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"chatCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"roster-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"emailCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"messageCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"sms-message-icon\\\"],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.estimatedWait\\\"],[[\\\"wait\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"get-queue-data\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"getQueueData\\\",[28,[\\\"entity\\\"]]],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.view\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact-queue\\\"],null,[[\\\"queue\\\"],[[28,[\\\"queue\\\"]]]]],false],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/queue/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"s3GYSE14\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"entityRoutePath\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showActions\\\"]],[28,[\\\"canContactEntity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"actions \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\",[\\\"actions\\\"]],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport const imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        profileInstructionText: 'images.profile',\n        informal: 'images.informal',\n        activeProfilePictureSection: 'images'\n    },\n\n    group: {\n        profile: 'images.profilePictures',\n        profileInstructionText: 'images.activeProfilePicture',\n        informal: 'images.gallery',\n        activeProfilePictureSection: 'images'\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['entity-picture-content'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    embedded: Ember.inject.service(),\n\n    attrs: {\n        open() {},\n        close() {},\n\n        entity: null,\n        askToDelete: false\n    },\n\n    type: 'profile', // or 'informal'\n\n    askToDelete: false,\n    showUploadModal: false,\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        },\n\n        uploadPicture() {\n            this.attrs.close();\n\n            this.set('showUploadModal', true);\n        },\n\n        confirmUpload() {\n            let type = this.get('type');\n            let entity = this.get('entity');\n\n            entity.notifyPropertyChange('uploadedProfilePictures');\n            entity.notifyPropertyChange('uploadedInformalPhotos');\n\n            const pictures = entity.get('uploadedProfilePictures');\n            const picture = pictures[pictures.length - 1];\n            if (!picture) {\n                return;\n            }\n\n            if (type === 'profile') {\n                this.send('selectUploadedImage', type, picture, false);\n            }\n\n            this.send('cancelUploadModal');\n        },\n\n        selectUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityJid = entity.get('jid');\n            const tag = 'profile-success';\n            const edit = this.get('canEditProfilePicture');\n            let section = entity.get('fieldConfig.images');\n\n            if (!edit || active) {\n                return;\n            }\n\n            type = type || this.get('type');\n\n            if (entity.type === 'person') {\n                // When adding and remove images using the public API it updates the group.\n                // Each time it updates the group its version number increases, we go out and get the group\n                // to make sure we have the latest version.  Once venue is release we will not\n                // need to do this since it doesn't require a version like directory did.\n                entity\n                    .reload()\n                    .then(user => {\n                        section['version'] = user.version;\n                        if (type === 'profile') {\n                            entity.setProfilePicture(image);\n                            section = entity.get('fieldConfig.images');\n                        }\n                        return section;\n                    })\n                    .then(updatedSection => {\n                        entity.saveSection(updatedSection);\n                    })\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = _.head(errors);\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            } else {\n                if (type === 'profile') {\n                    entity.setProfilePicture(image);\n                }\n                return entity\n                    .saveSection(section)\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = errors.firstObject;\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            }\n        },\n\n        deleteUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityType = entity.get('type');\n\n            let promise = Ember.RSVP.resolve();\n\n            if (active) {\n                const images = entity.get('uploadedImages');\n\n                if (!_.isEmpty(images)) {\n                    const newImage = images[0];\n\n                    if (newImage) {\n                        const profilePictureSection = entity.get(\n                            `fieldConfig.${imageMappings[entityType].activeProfilePictureSection}`\n                        );\n                        entity.setProfilePicture(newImage);\n                        promise = entity.saveSection(profilePictureSection);\n                    }\n                }\n            }\n\n            const fieldPath = imageMappings[entityType][type];\n            const path = `entity.${fieldPath}`;\n\n            this.get(path).removeObject(image);\n            if (entityType === 'person') {\n                return this.entity.reload();\n            }\n\n            promise\n                .then(() => {\n                    const sectionKey = fieldPath.split('.')[0];\n                    const section = entity.get(`fieldConfig.${sectionKey}`);\n                    return entity.saveSection(section);\n                })\n                .catch(() => this.get(path).addObject(image));\n        },\n\n        cancelUploadModal() {\n            this.set('showUploadModal', false);\n            this.attrs.open();\n        },\n\n        cancelDeleteModal() {\n            this.set('askToDelete', false);\n            this.set('showing', false);\n        },\n\n        changeType(type) {\n            this.set('type', type);\n        },\n\n        doneDeleting() {\n            this.set('askToDelete', false);\n            this.set('showing', true);\n        }\n    },\n\n    _showing: false,\n    showing: computed('canEditProfilePicture', {\n        get() {\n            return this._showing;\n        },\n\n        set(key, value) {\n            this._showing = value;\n            return value;\n        }\n    }),\n\n    canUploadPicture: Ember.computed(\n        'session.user.isAdmin',\n        'entity.{readWritePermissions,type}',\n        'entity.uploadedImages.[]',\n        'entity.fieldConfig.uploads.images.maxRepeat',\n        'type',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            return this.hasAccessToPicture('uploads.images');\n        }\n    ),\n\n    canEditProfilePicture: Ember.computed(\n        'session.{user.isAdmin,features,person}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditInformalPicture: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditAgentImage: Ember.computed(\n        'entity.{readWritePermissions,id}',\n        'entity.fieldConfig.agent.profileImage',\n        'permissions.hasEngageAccess',\n        function () {\n            let field = this.get('entity.fieldConfig.agent.profileImage');\n            if (_.isEmpty(field)) {\n                return false;\n            }\n\n            return this.hasAccessToPicture('agent.profileImage') && this.get('permissions.hasEngageAccess');\n        }\n    ),\n\n    hasAccessToPicture(path) {\n        let isSelf = this.get('session.person.id') === this.get('entity.id');\n        let canEditProfiles = this.get('permissions.canEditProfiles');\n        if (path === 'agent.profileImage') {\n            return canEditProfiles;\n        }\n        if (path === 'uploads.images') {\n            return isSelf || canEditProfiles;\n        }\n        return isSelf;\n    }\n});\n","import Ember from 'ember';\n\nimport { imageMappings } from '../component';\n\nconst { set, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['delete-pictures'],\n\n    type: null,\n    entity: null,\n\n    confirm: () => {},\n    disable: () => {},\n    done: () => {},\n\n    actions: {\n        selectImage(upload) {\n            const current = upload.selected;\n            set(upload, 'selected', !current);\n\n            const limit = this.get('number');\n            const total = this.get('uploads.length');\n            const currentSelection = this.get('currentSelected.length');\n\n            this.attrs.disable(currentSelection < total - limit);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.disable(true);\n        this.set('confirm', this.deleteImages.bind(this));\n    },\n\n    number: computed(function () {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const imageType = this.get('type');\n        const field = entity.get(`fieldConfig.${imageMappings[entityType][imageType]}`);\n        return field.get('maxRepeat');\n    }),\n\n    uploads: computed('entity.uploadedImages.[]', function () {\n        const images = this.get('entity.uploadedImages') || [];\n        return images.map(image => {\n            return {\n                image,\n                selected: false\n            };\n        });\n    }),\n\n    currentSelected: computed('uploads.@each.selected', function () {\n        return this.get('uploads').filterBy('selected');\n    }),\n\n    imagesToSave: computed('uploads.@each.selected', function () {\n        return this.get('uploads').rejectBy('selected');\n    }),\n\n    deleteImages() {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const type = this.get('type');\n        const fieldPath = imageMappings[entityType][type];\n        const images = this.get('imagesToSave').mapBy('image');\n        entity.set(fieldPath, images, { overwrite: true });\n        return entity.save().then(() => {\n            this.attrs.done();\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Nb8kFlFf\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"explain\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.delete.explanation\\\"],[[\\\"number\\\"],[[28,[\\\"number\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"images\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"uploads\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"upload\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"isActive\\\",\\\"type\\\",\\\"canEdit\\\",\\\"editing\\\",\\\"size\\\",\\\"select\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"upload\\\",\\\"image\\\"]],[28,[\\\"upload\\\",\\\"selected\\\"]],[28,[\\\"type\\\"]],true,true,96,[33,[\\\"action\\\"],[[28,[null]],\\\"selectImage\\\",[28,[\\\"upload\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"upload\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/delete-pictures/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"1F/33ouu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showing\\\"]],[33,[\\\"not\\\"],[[28,[\\\"askToDelete\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"targetAttachment\\\"],[\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.done\\\"],null],[28,[\\\"targetAttachment\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"edit-profile-picture\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"canUploadPicture\\\",\\\"canEditProfilePicture\\\",\\\"canEditInformalPicture\\\",\\\"canEditAgentImage\\\",\\\"changeType\\\",\\\"upload\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],true,[28,[\\\"canUploadPicture\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[28,[\\\"canEditInformalPicture\\\"]],[28,[\\\"canEditAgentImage\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"changeType\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"uploadPicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"askToDelete\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[\\\"cancelDeleteModal\\\",[33,[\\\"t\\\"],[\\\"images.delete.title\\\"],null],[33,[\\\"t\\\"],[\\\"common.delete\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-picture-content/delete-pictures\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"confirm\\\",\\\"disable\\\",\\\"done\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"doneDeleting\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showUploadModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null],\\\"cancelUploadModal\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"upload-picture\\\"],null,[[\\\"entity\\\",\\\"uploadType\\\",\\\"confirm\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/template.hbs\"}});","import Ember from 'ember';\nimport { doFocus } from 'connections-ui/utils/focus-management';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-section'],\n\n    addingSection: false,\n\n    attrs: {\n        sections: null,\n        emptySections: null,\n\n        addSection() {}\n    },\n\n    actions: {\n        toggleAddingSection() {\n            this.toggleProperty('addingSection');\n            if (this.get('addingSection')) {\n                const focusTarget = '.add-section .name a:first';\n                Ember.run.later(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            }\n        },\n\n        addSection() {\n            this.attrs.addSection(...arguments);\n\n            this.set('addingSection', false);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachHandler);\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n\n        this._super(...arguments);\n    },\n\n    attachHandler() {\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-section').length) {\n                    this.set('addingSection', false);\n                }\n            });\n        });\n\n        Ember.$(window).on(`keydown.${this.elementId}`, event => {\n            if (event.key === 'Escape' && this.get('addingSection')) {\n                // ESC key when new-sections is displayed\n                Ember.run(() => {\n                    this.set('addingSection', false);\n                });\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"XG0aXktB\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"add-new-section \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddingSection\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSection\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"new-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emptySections\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/section-icon\\\"],null,[[\\\"sectionInfo\\\",\\\"addSection\\\"],[[28,[\\\"sectionInfo\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSectionEmpty\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/add-section/template.hbs\"}});","import Ember from 'ember';\nimport isEmpty from 'lodash/isEmpty';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport Profile from './profiles/profile';\n\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { deregisterLayout, registerLayout } from '../../utils/masonry';\nimport { isPurecloudSource } from '../../utils/presence-utils';\nimport ProfilePermissionsMixin from './permissions';\nimport { hasSupplementalVideoProvider } from 'connections-ui/services/media-providers';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nconst { run, inject, getOwner, computed, observer, Component } = Ember;\n\nexport default Component.extend(EntityControllerMixin, ProfilePermissionsMixin, {\n    classNames: ['entity-profile', 'person-detail', 'profile', 'entity'],\n    classNameBindings: ['isEditingSection:editing-section', 'onOwnProfile:own-profile', 'compactLayout:compact-layout'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    mediaProviders: inject.service(),\n    favorites: Ember.inject.service(),\n\n    resizeDetector: inject.service(),\n    application: inject.service(),\n    emergencyLocation: Ember.inject.service('emergency-location'),\n    emergencyLocationOn: Ember.computed.reads('session.features.emergencyLocation'),\n    editEmergencyLocation: false,\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    eLocation: Ember.computed.reads('emergencyLocation.eLocation'),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    canViewChat: computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: computed.bool('permissions.canViewCollaborateVideo'),\n    attrs: {\n        entity: null,\n\n        setEditingSection() {}\n    },\n\n    entity: null,\n    lastEntity: null,\n\n    editing: false,\n    showCardView: false,\n\n    compactLayout: false,\n\n    excludedContactFields: ['chat'],\n\n    excludedEditingFields: ['chat'],\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            return {\n                wrap: true,\n                showStatus: false,\n                showActivity: true,\n                eActivityPresenceClass: this.entity.get('activityPresenceClass'),\n                totalCalls: this.entity.get('activityValues.calls'),\n                totalChats: this.entity.get('activityValues.chats'),\n                totalEmails: this.entity.get('activityValues.emails'),\n                totalMessages: this.get('totalMessages'),\n                totalSocialExpression: this.get('totalSocialExpression'),\n                presenceLabel: this.entity.get('presenceLabel'),\n                eChatStatus: this.entity.get('chatStatus'),\n                isShowingActivitySummary: this.entity.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n    location: Ember.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: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.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: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('location', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('location'),\n            selfLocation: this.get('selfLocation'),\n            iconHoverText: this.get('intl').t('components.navMenu.userDropdown.setViaGeolocation')\n        };\n    }),\n\n    scrollToBottom() {\n        const parentNode = this.get('element.parentNode');\n        parentNode.scrollTop = parentNode.scrollHeight; //Scroll to very bottom\n    },\n\n    actions: {\n        toggleEditProfile() {\n            const editing = this.get('editingProfile');\n\n            if (editing) {\n                if (!this.get('entity.isSaving')) {\n                    this.get('entity').reload();\n                }\n            }\n\n            this.toggleProperty('editingProfile');\n\n            if (\n                this.get('emergencyLocationOn') &&\n                !this.get('editingProfile') &&\n                this.get('emergencyLocation').cancelEditElocation\n            ) {\n                this.get('emergencyLocation').cancelEditElocation();\n            }\n            this.updateMasonry();\n        },\n\n        editProfilePicture: function (event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            if (this.get('editingProfile') && this.get('canEditProfilePicture')) {\n                this.set('editingPictures', true);\n            }\n        },\n\n        editContactInfo() {\n            this.get('contactInfoSection').send('showModal');\n        },\n\n        setContactInfo(section) {\n            this.set('contactInfoSection', section);\n        },\n\n        addSection(sectionInfo) {\n            sectionInfo.set('adding', true);\n\n            run.scheduleOnce('afterRender', this, function () {\n                let key = sectionInfo.get('section.key');\n                let $section = this.$(`.${key}`);\n                let top = $section.position().top;\n                Ember.$('#orgspan').animate(\n                    {\n                        scrollTop: top\n                    },\n                    600\n                );\n                this.updateMasonry();\n                const focusTarget = this.$(`.${key}:first`);\n                run.debounce(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            });\n        },\n\n        removeSection(sectionInfo) {\n            this.get('fieldSections').removeObject(sectionInfo);\n            this.updateMasonry();\n        },\n\n        toggleCardView() {\n            this.toggleProperty('showCardView');\n        },\n\n        componentUpdated() {\n            this.updateMasonry();\n        },\n\n        noop() {},\n\n        resize(data) {\n            Ember.run.once(this, this.handleResize, data);\n        },\n\n        saveElocation(updatedElocationAddress) {\n            return this.get('emergencyLocation').saveElocation(updatedElocationAddress);\n        },\n        editElocation() {\n            this.set('editEmergencyLocation', true);\n        },\n        cancelEditElocation() {\n            this.set('editEmergencyLocation', false);\n        },\n        refreshAllEmergencylocationInfo(notify) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').refreshAllEmergencylocationInfo(notify);\n            }\n        },\n        getEmergencyLocation(phoneNumber) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').getEmergencyLocation(phoneNumber);\n            }\n        }\n    },\n\n    allSections: computed.reads('profile.profileSections'),\n    canEditStatus: computed.and('onOwnProfile', 'isPurecloudSource'),\n\n    isPurecloudSource: computed(\n        'session.features.acdHybridToastNoActiveQueue',\n        'session.user.presence.source',\n        function () {\n            if (this.get('session.features.acdHybridToastNoActiveQueue')) {\n                return isPurecloudSource(this.get('session.user.presence.source'));\n            }\n            return true;\n        }\n    ),\n    editingProfile: computed('editing', 'canEditProfile', {\n        get() {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n            return this.get('editing');\n        },\n\n        set(key, value) {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n\n            return value;\n        }\n    }),\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    emptySections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => sectionInfo.get('isEmpty') && !sectionInfo.get('adding'));\n    }),\n\n    fieldSections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => !sectionInfo.get('isEmpty') || sectionInfo.get('adding'));\n    }),\n\n    emptyWriteableSections: computed('emptySections.[]', 'profile.writeableSections.[]', function () {\n        let sections = this.get('emptySections');\n        let sectionKeys = this.get('profile.writeableSections');\n        return sections.filter(sectionInfo => sectionKeys.includes(sectionInfo.get('section.key')));\n    }),\n\n    isEditingSection: computed('fieldSections.@each.editingSection', 'editEmergencyLocation', function () {\n        if (this.get('editEmergencyLocation')) {\n            return true;\n        }\n        return !isEmpty(this.get('fieldSections').findBy('editingSection', true));\n    }),\n\n    showStatus: computed('editingProfile', 'onOwnProfile', 'entity.hasChatStatus', 'chatService.enabled', function () {\n        if (!this.get('chatService.enabled')) {\n            return false;\n        }\n\n        return (this.get('editingProfile') && this.get('onOwnProfile')) || this.get('entity.hasChatStatus');\n    }),\n\n    videoProviders: computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'));\n    }),\n\n    haveVideoMediaProviders: computed('videoProviders.@each.haveAccess', function () {\n        return hasSupplementalVideoProvider(this.get('videoProviders'));\n    }),\n\n    entityData: Ember.computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('favorites').toggleFavorite(this.get('entity'));\n        });\n        this.notifyPropertyChange('entityData');\n    }),\n\n    profileChanged: observer('entity.id', function () {\n        Ember.run.once(this, 'handleProfileChange');\n    }),\n\n    editingSectionChange: observer('isEditingSection', function () {\n        Ember.run.once(this, 'handleEditingSectionChange');\n    }),\n\n    handleProfileChange() {\n        let lastId = this.get('lastEntity.id');\n        if (this.get('entity.id') !== lastId) {\n            this.set('lastEntity', this.get('entity'));\n        }\n    },\n\n    handleEditingSectionChange() {\n        if (this.get('editEmergencyLocation')) {\n            Ember.run.later(() => {\n                this.scrollToBottom();\n            }, 800);\n        }\n\n        if (this.get('setEditingSection')) {\n            this.get('setEditingSection')(this.get('isEditingSection'));\n        }\n    },\n\n    // masonry configuration\n    masonryEl: null,\n\n    _useMasonry() {\n        const debug = this.get('application.debug');\n        const enableMasonry = this.get('application.debugSettings.masonry');\n        return !debug || enableMasonry;\n    },\n\n    _masonryId() {\n        return `entity-profile-${this.get('elementId')}`;\n    },\n\n    _isInDOM() {\n        return this.get('_state') === 'inDOM';\n    },\n\n    fieldSectionsUpdate: Ember.observer('fieldSections.[]', function () {\n        if (isEmpty(this.get('fieldSections'))) {\n            return;\n        }\n\n        Ember.run.scheduleOnce('afterRender', () => {\n            this.updateMasonry();\n        });\n    }),\n\n    attachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.$('.masonry-container');\n            masonryEl.masonry({\n                itemSelector: '.field-section',\n                columnWidth: '.field-section',\n                fitWidth: true\n            });\n            masonryEl.on('click submit', () => Ember.run(() => this.updateMasonry()));\n            this.set('masonryEl', masonryEl);\n\n            registerLayout(this._masonryId(), this);\n        }\n    },\n\n    _updateMasonry() {\n        if (this._useMasonry()) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                const masonryEl = this.get('masonryEl');\n                if (masonryEl && this._isInDOM()) {\n                    masonryEl.masonry('reloadItems').masonry();\n                }\n            });\n        }\n    },\n\n    rerun() {\n        // ^ this method is required for the utils/masonry#rerunLayouts()\n        Ember.run(() => this.updateMasonry());\n    },\n\n    updateMasonry() {\n        Ember.run.throttle(this, this._updateMasonry, 500, false);\n    },\n\n    detachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.get('masonryEl');\n            this.set('masonry', null);\n            if (masonryEl) {\n                masonryEl.masonry('destroy');\n                masonryEl.off('click submit');\n            }\n\n            deregisterLayout(this._masonryId());\n        }\n    },\n\n    startMasonry: Ember.on('didInsertElement', function () {\n        this.attachMasonry();\n    }),\n\n    stopMasonry: Ember.on('willDestroyElement', function () {\n        this.detachMasonry();\n    }),\n\n    handleResize(data) {\n        if (!data.width) {\n            return;\n        }\n\n        if (data.width < 500) {\n            this.set('compactLayout', true);\n        } else {\n            this.set('compactLayout', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nconst { Mixin, inject, computed } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    canEditProfile: computed.or('onOwnProfile', 'profile.canEditProfile', 'session.person.isAdmin'),\n\n    canEditName: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditTitle: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditDepartment: computed('editingProfile', 'permissions.canEditProfiles', function () {\n        if (!this.get('editingProfile')) {\n            return false;\n        }\n        return this.get('permissions.canEditProfiles');\n    }),\n\n    canReadHR: computed.reads('permissions.canReadProfile'),\n\n    onOwnProfile: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: Ember.computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    canReadGroups: Ember.computed('entity.groups.{social,official}', function () {\n        let groupsFieldConfig = this.get('entity.fieldConfig')\n            ? this.get('entity.fieldConfig').getSectionByKey('groups')\n            : null;\n        let groups = this.get('entity.groups');\n        if (!groupsFieldConfig || _.isEmpty(groups)) {\n            return false;\n        }\n        return Ember.get(groups, 'social.length') || Ember.get(groups, 'official.length');\n    }),\n\n    canEditProfilePicture: Ember.computed('canEditProfile', function () {\n        return this.get('canEditProfile');\n    }),\n\n    canEditGeneralInfo: Ember.computed('onOwnProfile', function () {\n        var promise = new Ember.RSVP.Promise(resolve => {\n            resolve(this.get('onOwnProfile'));\n        });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    canEditContactInfo: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.readWritePermissions',\n        'onOwnProfile',\n        function () {\n            var promise = new Ember.RSVP.Promise(resolve => {\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewLocations: Ember.computed(\n        'ownOwnProfile',\n        'entity.readWritePermissions',\n        'session.{user.isAdmin,features}',\n        'entity.fieldConfig.location.location',\n        function () {\n            var locationsField = this.get('entity.fieldConfig.location.location');\n            var promise = new Ember.RSVP.Promise(resolve => {\n                if (_.isEmpty(locationsField)) {\n                    return resolve(false);\n                }\n                if (this.get('session.user.isAdmin')) {\n                    return resolve(true);\n                }\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewInformals: Ember.computed('canEditProfilePicture', 'entity.images.informal', function () {\n        var photos = this.get('entity.images.informal');\n\n        if (photos && photos !== undefined) {\n            return photos.length > 0;\n        }\n        return false;\n    })\n});\n","import Ember from 'ember';\n\nimport Validators from '../../entity-fields/validators';\nimport { BUILTIN_SECTIONS, customSectionKeys } from './profile';\n\nconst { computed } = Ember;\n\nconst PERMISSIONED_FIELD_PATHS = [\n    'contactInfo.email_main',\n    'contactInfo.phone_work',\n    'contactInfo.voicemaileEnabled',\n    'general.title',\n    'hr.empId',\n    'hr.empType',\n    'hr.hireDate',\n    'hr.officialName',\n    'relationships.manager',\n    'relationships.administrativeAssistant',\n    'purecloud.defaultStationId',\n    'purecloud.siteId',\n    'purecloud.skills',\n    'purecloud.languages',\n    'purecloud.acdAutoAnswer',\n    'agent.name',\n    'agent.profileImage',\n    'primaryContactInfo.email'\n];\n\nconst POSSIBLE_INTEGRATION_FIELDS = ['contactInfo.phone_other'];\n\nexport default Ember.Object.extend({\n    session: null,\n    permissions: null,\n    entity: null,\n    field: null,\n    valueReference: null,\n\n    value: computed('fieldPath', 'entity.{fieldPath}.[]', 'entity.{fieldPath}.@each._id', function () {\n        const id = this.get('valueReference._id');\n        const tempId = this.get('valueReference.tempId');\n        const fieldPath = this.get('fieldPath');\n        const entity = this.get('entity');\n        const data = entity ? entity.get(fieldPath) : null;\n\n        let location = this.get('_sectionLocation');\n        let value = {};\n\n        if (Array.isArray(data) && data.length) {\n            if (location === null || location === undefined || location >= data.length || location < 0) {\n                if (tempId) {\n                    location = data.findIndex(d => d.tempId === tempId);\n                } else if (id) {\n                    location = data.findIndex(d => d._id === id);\n                } else {\n                    location = 0;\n                }\n\n                this.set('_sectionLocation', location);\n            } else if (id != null) {\n                location = data.findIndex(d => d._id === id);\n                this.set('_sectionLocation', location);\n            }\n\n            if (location != null && location >= 0) {\n                value = data[location];\n            } else {\n                // if no location found or negative index then we assume its at the top\n                value = data[0];\n            }\n        }\n\n        // if the value does not have an id or tempId then its a new addition and we need to assign a tempId for ui tracking\n        if (!value.id && !value.tempId) {\n            value.tempId = Ember.generateGuid();\n        }\n\n        return value;\n    }),\n\n    _sectionLocation: null,\n\n    // Legacy support\n    entry: computed.reads('value'),\n    fieldValue: computed.reads('value'),\n\n    sectionKey: computed('field', function () {\n        return this.get('field.section.key');\n    }),\n\n    fieldPath: computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: computed('fieldPath', function () {\n        const fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    fieldId: computed('value._id', 'value.tempId', function () {\n        return this.get('value._id') || this.get('value.tempId');\n    }),\n\n    writeable: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return true;\n        }\n\n        const canEditProfiles = this.get('permissions.canEditProfiles');\n        const path = this.get('fieldPath');\n\n        // Integration fields have their own editing requirements\n        if (this.get('integrationManaged')) {\n            return false;\n        }\n\n        if (Ember.A(PERMISSIONED_FIELD_PATHS).includes(path)) {\n            // Only admins can edit core contact fields\n            return canEditProfiles;\n        }\n\n        if (Ember.A(BUILTIN_SECTIONS).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        const myOwnProfile = this.get('session.person.id') === this.get('entity.id');\n        const customKeys = customSectionKeys(this.get('entity.fieldConfig.sections'));\n        if ((myOwnProfile || canEditProfiles) && Ember.A(customKeys).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * @deprecated\n     * This computed value is deprecated. Please use `removable` instead.\n     */\n    removeable: computed(function () {\n        Ember.Logger.warn(\n            '`components/entity-profile/profiles/field-data.js` - The use of the computed value `removeable` is deprecated. Please update to use `removable` on this class instead.'\n        );\n        return this.get('removable');\n    }),\n\n    removable: computed('integrationManaged', 'field.repeatable', function () {\n        const repeatable = this.get('field.repeatable');\n        return repeatable && !this.get('integrationManaged');\n    }),\n\n    integrationManaged: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return false;\n        }\n\n        const path = this.get('fieldPath');\n        if (Ember.A(POSSIBLE_INTEGRATION_FIELDS).includes(path)) {\n            let value = this.get('value');\n            return value && value.value && !!value.value.integration;\n        }\n\n        return false;\n    }),\n\n    isEmpty: computed('field.type', 'value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isEmpty(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isValid: computed('value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isValid(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isPrimaryField: computed('value._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', function () {\n        const primaryFieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n        return this.get('value._id') === primaryFieldId;\n    }),\n\n    isNewValue: computed('value._id', 'value.tempId', {\n        get() {\n            return !this.get('value._id');\n        },\n\n        set(path, value) {\n            return value;\n        }\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport SectionInfo from './section-info';\n\nconst { inject, computed } = Ember;\n\nconst PROFILE_CACHE = {};\n\nconst EXCLUDED_SECTIONS = [\n    'status',\n    'general',\n    'primaryContactInfo',\n    'images',\n    'uploads',\n    'cic',\n    'scs',\n    'custserv',\n    'device',\n    'purecloud',\n    'preferences',\n    'externalContacts'\n];\n\nexport const BUILTIN_SECTIONS = ['general', 'contactInfo', 'skills', 'location', 'bio', 'education', 'hr'];\n\nexport const ADMIN_SECTIONS = ['relationships', 'agent'];\n\nexport function customSectionKeys(sections) {\n    const builtins = [...BUILTIN_SECTIONS, ...ADMIN_SECTIONS, ...EXCLUDED_SECTIONS];\n    const keys = Ember.A(sections).mapBy('key');\n    return keys.filter(key => !Ember.A(builtins).includes(key));\n}\n\nlet Profile = Ember.Object.extend({\n    _cache: PROFILE_CACHE,\n\n    session: inject.service('session'),\n    permissions: inject.service('permissions'),\n\n    model: null,\n    readWritePermissions: null,\n\n    writeableSections: null,\n    readableSections: null,\n\n    sections: computed.reads('model.fieldConfig.sections'),\n    canEditProfiles: computed.reads('permissions.canEditProfiles'),\n    canReadProfiles: computed.reads('permissions.canReadProfiles'),\n\n    init() {\n        this._super(...arguments);\n\n        let writeableSections = [];\n        const customKeys = customSectionKeys(this.get('sections'));\n        let readableSections = [...BUILTIN_SECTIONS, 'relationships', 'groups', ...customKeys];\n\n        if (this.get('model.id') === this.get('session.person.id')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys];\n        }\n\n        if (this.get('canEditProfiles')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys, ...ADMIN_SECTIONS];\n        }\n        if (this.get('canReadProfiles')) {\n            readableSections = readableSections.concat(ADMIN_SECTIONS);\n        }\n\n        this.setProperties({\n            readWritePermissions: {\n                write: [],\n                read: []\n            },\n            writeableSections,\n            readableSections\n        });\n    },\n\n    profileSections: computed('session.person', 'model', 'readableSections.[]', function () {\n        let data = [];\n        let sections = this.get('sections');\n        let isSuper = this.get('session.person.isAdmin') && !this.get('session.user.personId');\n        if (isSuper) {\n            data = _.filter(sections, section => {\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1;\n            });\n        } else {\n            data = _.filter(sections, section => {\n                let readableSections = this.get('readableSections');\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n            });\n        }\n\n        return _.map(data, section => {\n            return SectionInfo.create({\n                section: section,\n                entity: this.get('model')\n            });\n        });\n    }),\n\n    canEditProfile: computed('writeableSections.[]', function () {\n        return this.get('writeableSections.length') > 0;\n    }),\n\n    canEditProfilePictures: computed('model.id', 'session.person.id', 'canEditProfiles', function () {\n        if (this.get('model.id') === this.get('session.person.id')) {\n            return true;\n        }\n        return this.get('canEditProfiles');\n    }),\n\n    canEditSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canEditProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('writeableSections');\n        return _.includes(sections, section.key);\n    },\n\n    canReadSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canReadProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('readableSections');\n        return _.includes(sections, section.key);\n    },\n\n    getReadableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    },\n\n    getEditableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    }\n});\n\nProfile.reopenClass({\n    getProfileForModel(model, owner) {\n        let id = model.get('id');\n        if (PROFILE_CACHE[id]) {\n            return PROFILE_CACHE[id];\n        }\n        let profile = Profile.create(\n            {\n                model: model\n            },\n            owner.ownerInjection()\n        );\n        PROFILE_CACHE[id] = profile;\n        return profile;\n    }\n});\n\nexport default Profile;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nlet customSections = ['groups', 'relationships', 'contactInfo', 'location', 'education'];\n\nexport default Ember.Object.extend({\n    entity: null,\n    section: null,\n\n    adding: false,\n    editingSection: false,\n\n    init() {\n        this._super(...arguments);\n\n        // consume computed...\n        this.get('groupSectionChange');\n    },\n\n    componentName: computed('section.key', function () {\n        let key = this.get('section.key');\n        if (_.includes(customSections, key)) {\n            let name = Ember.String.dasherize(key);\n            return `entity-field-section/entity-${name}`;\n        }\n\n        return 'entity-field-section';\n    }),\n\n    hasCustomComponent: computed('section.key', function () {\n        return _.includes(customSections, this.get('section.key'));\n    }),\n\n    isEmpty: computed(\n        'entity',\n        'section',\n        'adding',\n        'entity.groups.official.[]',\n        'entity.groups.social.[]',\n        'entity.directReports.content',\n        {\n            get() {\n                let entity = this.get('entity');\n                let section = this.get('section');\n\n                if (section.get('fieldList.length') === 0) {\n                    return true;\n                }\n\n                let emptyFields = _.filter(section.get('fieldList'), field => {\n                    let fieldPath = field.get('fieldPath');\n                    let values = entity.get(fieldPath);\n\n                    // Work-around weird direct reports relationship...\n                    if (section.get('key') === 'relationships' && field.get('key') === 'directReportCount') {\n                        return !entity.get('directReports.content.length');\n                    }\n\n                    if (!_.isEmpty(values)) {\n                        let emptyValues = _.filter(values, value => {\n                            if (_.isEmpty(value._id) && _.isEmpty(value.guid)) {\n                                return true;\n                            }\n\n                            return _.isEmpty(value.value);\n                        });\n\n                        return !_.isEmpty(emptyValues);\n                    }\n\n                    return true;\n                });\n\n                return !_.isEmpty(emptyFields) && emptyFields.length === section.get('fieldList.length');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['section-icon', 'clickable'],\n    classNameBindings: ['section.key'],\n\n    attrs: {\n        sectionInfo: null,\n        addSection() {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n\n    icon: computed('section.key', function () {}),\n\n    click() {\n        this.attrs.addSection(this.get('sectionInfo'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"r2fmlELA\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[1,[28,[\\\"section\\\",\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/section-icon/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lCPY4TyH\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"resize-detector\\\"],[\\\".entity-profile .banner\\\"],[[\\\"on-resize\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"resize\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h1\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingEditMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingViewMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content banner-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-profile\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleEditProfile\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-edit-profile\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"button-text-removal\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewPublicProfile\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewEditMode\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"favorite links \\\",[33,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tree-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"\\\"],[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],\\\"clickable\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-camera camera\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"showStatus\\\",\\\"wrap\\\"],[[28,[\\\"entity\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"class\\\",\\\"entity\\\",\\\"locationHoverText\\\"],[\\\"entity-geolocation\\\",[28,[\\\"entity\\\"]],[33,[\\\"t\\\"],[\\\"components.navMenu.userDropdown.setViaGeolocation\\\"],null]]]],false],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]],[28,[\\\"name\\\"]],[28,[\\\"canEditName\\\"]],true,true]]],false],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"general \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"department\\\",\\\"value\\\"]]],null],\\\"show-divider\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]],[28,[\\\"title\\\"]],[28,[\\\"canEditTitle\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]],[28,[\\\"department\\\"]],[28,[\\\"canEditDepartment\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showStatus\\\"]],[33,[\\\"or\\\"],[[28,[\\\"isPurecloudSource\\\"]],[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entity\\\",\\\"editable\\\",\\\"onProfile\\\",\\\"showPlaceholder\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"and\\\"],[[28,[\\\"canEditStatus\\\"]],[28,[\\\"editingProfile\\\"]]],null],true,true]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"user\\\",\\\"useMediaProviders\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"user\\\"]],[28,[\\\"haveVideoMediaProviders\\\"]],false,\\\"viewLightGallery\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveVideoMediaProviders\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"media-providers/video-dropdown\\\"],null,[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"main-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/add-section\\\"],null,[[\\\"entity\\\",\\\"sections\\\",\\\"emptySections\\\",\\\"addSection\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"fieldSections\\\"]],[28,[\\\"emptyWriteableSections\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"sections profile-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"masonry-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldSections\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section \\\",[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-labelledby\\\",[34,[[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]],\\\"entity-field-section/entity-contact-info\\\"],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"editingElocation\\\",\\\"emergencyLocationOn\\\",\\\"showResetButton\\\",\\\"onOwnProfile\\\",\\\"emergencyLocationData\\\",\\\"removeSection\\\",\\\"componentUpdated\\\",\\\"saveElocation\\\",\\\"cancelEditElocation\\\",\\\"editElocation\\\",\\\"refreshAllEmergencylocationInfo\\\",\\\"getEmergencyLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[28,[\\\"emergencyLocationOn\\\"]],false,[28,[\\\"onOwnProfile\\\"]],[28,[\\\"emergencyLocation\\\",\\\"emergencyLocationData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"saveElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"editElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"refreshAllEmergencylocationInfo\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"getEmergencyLocation\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"removeSection\\\",\\\"componentUpdated\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"card-view-container \\\",[33,[\\\"unless\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"profile\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editingPictures\\\"]],[28,[\\\"profile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { ThenableSearchMixin } from '../../mixins/search';\nimport { pluralize } from 'ember-inflector';\n\nconst UP = 38;\nconst DOWN = 40;\nconst ESCAPE = 27;\nconst ENTER = 13;\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(ThenableSearchMixin, {\n    classNames: ['entity-search'],\n\n    currentSelected: -1,\n\n    intl: Ember.inject.service(),\n    search: Ember.inject.service(),\n\n    select: '',\n    type: 'all',\n    filterFunction: null,\n\n    searchQuery: '',\n    userInput: null,\n    searchLimit: 10,\n    debouncedScheduleQueryUpdate: null,\n    relationship: null,\n    disabled: false,\n\n    init() {\n        this._super(...arguments);\n        this.ensurePluralType();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachClickListener();\n        this.debouncedScheduleQueryUpdate = _.debounce(this._scheduleSearchQueryUpdate, 250, { maxWait: 500 });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    },\n\n    keyDown(event) {\n        switch (event.keyCode) {\n            case UP:\n                return this.selectPrevious();\n            case DOWN:\n                return this.selectNext();\n            case ESCAPE:\n                return this.cancelInput();\n            case ENTER:\n                if (this.get('wrappedSearchResults')) {\n                    return this.chooseSelected();\n                }\n                break;\n            default:\n                this.debouncedScheduleQueryUpdate();\n                this.set('currentSelected', -1);\n                break;\n        }\n    },\n\n    actions: {\n        setUserInput(event) {\n            Ember.run.debounce(this, this._updateSearchQuery, event.target.value, 250);\n        },\n\n        submit() {\n            this.notifyPropertyChange('searchQuery');\n        },\n\n        selectResult(entity) {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            this.sendAction('select', entity);\n        },\n\n        clearSearch() {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            return this.set('currentSelected', -1);\n        }\n    },\n\n    entityFilter: computed.reads('type'),\n\n    results: computed('searchQuery', function () {\n        if (!this.get('isEmpty')) {\n            const search = this.get('search');\n            const entities = this.get('type').split(',');\n\n            return DS.PromiseArray.create({\n                promise: search.performSearch(this.get('searchQuery'), 0, entities).then(({ results }) => {\n                    return this._buildResults(results);\n                })\n            });\n        }\n        return Ember.RSVP.resolve(Ember.A([]));\n    }),\n\n    wrappedSearchResults: Ember.computed('results', function () {\n        let searchResults = this.get('results');\n        return DS.PromiseArray.create({\n            promise: searchResults.then(searchResults => {\n                return _.map(searchResults, function (entity) {\n                    Ember.set(entity, 'selected', false);\n                    return entity;\n                });\n            })\n        });\n    }),\n\n    loading: computed('wrappedSearchResults.isFulfilled', function () {\n        return !this.get('wrappedSearchResults.isFulfilled');\n    }),\n\n    haveResults: computed('results.[]', function () {\n        return !_.isEmpty(this.get('results'));\n    }),\n\n    placeholder: computed('type', function () {\n        let map = {\n            all: 'components.entitySearch.search',\n            people: 'components.personSearch.search',\n            groups: 'components.groupSearch.search',\n            locations: 'components.locationSearch.search'\n        };\n\n        let key = map[this.get('type')];\n        if (key) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        return '';\n    }),\n\n    isEmpty: computed('searchQuery', function () {\n        return _.isEmpty(this.get('searchQuery'));\n    }),\n\n    noResultsKey: computed('type', function () {\n        if (this.get('type') !== 'locations') {\n            return 'components.entitySearch.noResults';\n        }\n\n        return 'components.entitySearch.noResultsLocation';\n    }),\n\n    ensurePluralType() {\n        let type = this.get('type');\n        if (!_.isEmpty(type) && type !== 'all') {\n            let plural = pluralize(type);\n            this.set('type', plural);\n        }\n    },\n\n    attachClickListener() {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.entity-search').length) {\n                    this.set('searchResults', []);\n                }\n            });\n        });\n    },\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n        if (nowSelected + 1 < entities.length) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[nextSelected]) {\n                entities[nextSelected].set('selected', true);\n            }\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults');\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected + 1;\n        if (nowSelected - 1 >= 0) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[previousSelected]) {\n                entities[previousSelected].set('selected', true);\n            }\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    },\n\n    scrolling(next) {\n        const areaScroll = this.$('.scrollable-area').scrollTop();\n        const entityHeight = this.$('.scroll-entity').height();\n        if (next) {\n            if (this.currentSelected !== 0) {\n                this.$('.scrollable-area').scrollTop(areaScroll + entityHeight);\n            }\n        } else {\n            this.$('.scrollable-area').scrollTop(areaScroll - entityHeight);\n        }\n    },\n\n    clearInputs() {\n        this.set('searchQuery', null);\n        this.set('currentSelected', -1);\n    },\n\n    cancelInput() {\n        if (this.get('searchQuery')) {\n            this.clearInputs();\n        } else {\n            this.sendAction('cancel');\n            this.clearInputs();\n        }\n    },\n\n    chooseSelected() {\n        const entities = this.get('wrappedSearchResults.content');\n        let chosen = entities[this.currentSelected];\n        if (entities.length === 1) {\n            chosen = entities[0];\n        }\n        if (chosen && !chosen.disabled) {\n            this.send('selectResult', chosen);\n        }\n    },\n\n    _buildResults(results) {\n        let filterFunction = this.get('filterFunction');\n        _.each(results, function (result) {\n            if (result.selected) {\n                Ember.set(result, 'selected', false);\n            }\n        });\n        if (results && filterFunction) {\n            return filterFunction(results);\n        }\n        return results;\n    },\n\n    _scheduleSearchQueryUpdate() {\n        Ember.run.join(() => {\n            this._updateSearchQuery();\n        });\n    },\n\n    _updateSearchQuery(value) {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        value = value || this.get('userInput');\n        this.set('searchQuery', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"HBSzv/yj\",\"block\":\"{\\\"statements\\\":[[11,\\\"form\\\",[]],[15,\\\"class\\\",\\\"input-form\\\"],[15,\\\"autocomplete\\\",\\\"off\\\"],[16,\\\"aria-labelledby\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"submit\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[0,\\\" - \\\"],[1,[26,[\\\"placeholder\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[16,\\\"value\\\",[34,[[26,[\\\"userInput\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setUserInput\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"search-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-spin pc-loading\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"loading\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-container scrollable-area\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"wrappedSearchResults\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[18,\\\"default\\\",[[28,[\\\"result\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\"],null]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"noResultsKey\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"noResultsKey\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nconst isEnter = event => eventToString(event) === 'ENTER';\n\nconst MAX_STATUS_LENGTH = 50;\nconst stripHtml = str => str.replace(/(<([^>]+)>)/gi, '');\n\nexport default Component.extend({\n    classNames: ['entity-status'],\n    classNameBindings: ['editable'],\n    layoutName: 'components/entity-status',\n\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    presence: inject.service(),\n\n    entity: null,\n    editable: false,\n    onProfile: false,\n    showPlaceholder: false,\n    savedStatus: null,\n    isLoading: false,\n    maxLength: MAX_STATUS_LENGTH,\n\n    debounceTime: 1000,\n\n    init() {\n        this._super(...arguments);\n        this.set('savedStatus', this.get('status'));\n    },\n\n    showStatus: computed.or('entity.hasChatStatus', 'editable', 'showPlaceholder'),\n\n    status: computed('entity.chatStatus', {\n        get() {\n            return this.get('entity.chatStatus');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    isInvalid: computed('status', function () {\n        const status = this.get('status');\n        return !_.isEmpty(status) && status.length > MAX_STATUS_LENGTH;\n    }),\n\n    actions: {\n        changeStatus(event) {\n            if (event && event.target && isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                event.preventDefault();\n                this.updateStatus();\n            }\n        },\n\n        changeStatusEventually(event) {\n            if (event && event.target && !isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                Ember.run.debounce(this, this.updateStatus, this.debounceTime);\n            }\n        }\n    },\n\n    updateStatus() {\n        if (this.get('isInvalid')) {\n            return;\n        }\n        const status = this.get('status');\n        Ember.Logger.debug(`STATUS-MSG: updateStatus(${status})`);\n        this.set('isLoading', true);\n\n        this.get('presence')\n            .setUsersStatus(this.get('session.person'), status)\n            .then(() => {\n                this.set('savedStatus', status);\n            })\n            .catch(response => {\n                const message = stripHtml(response.message || '');\n                this.showUpdateError(message);\n                this.set('status', this.get('savedStatus'));\n            })\n            .finally(() => {\n                this.set('isLoading', false);\n            });\n    },\n\n    showUpdateError(message) {\n        const title = this.get('intl').t('chat.statusError');\n        const options = { hideAfter: 5 };\n        this.get('notification').error(title, message, options);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"OEYdL51E\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"h6\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"person.status\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-left\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-left\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editable\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"form\\\",[]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"id\\\",\\\"statusPlaceHolderLabel\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"textarea\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"status-input form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"isInvalid\\\"]],\\\" invalid\\\"],null],[33,[\\\"if\\\"],[[28,[\\\"isLoading\\\"]],\\\" loading\\\"],null]]]],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null]]]],[16,\\\"maxlength\\\",[34,[[26,[\\\"maxLength\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatusEventually\\\"],null],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],null],null],[16,\\\"value\\\",[34,[[26,[\\\"status\\\"]]]]],[15,\\\"aria-labelledby\\\",\\\"statusPlaceHolderLabel\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flair-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],[[\\\"hideIfText\\\"],[true]]],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPlaceholder\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text placeholder\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"onProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-right\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-right\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-status/template.hbs\"}});","define(\"connections-ui/components/entity-v2/activity-indicator/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/activity-indicator/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/image/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/location/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-indicator-dot/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-indicator-dot/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { rerunLayouts } from 'connections-ui/utils/masonry';\n\nvar ExpanderPluginComponent = Ember.Component.extend({\n    tagName: 'div',\n    classNames: ['expander'],\n\n    intl: Ember.inject.service(),\n\n    init: function () {\n        this._super();\n    },\n\n    addBehavior: Ember.on('didInsertElement', function () {\n        const intl = this.get('intl');\n        var expandText = intl.lookup('common.more').toString().toLowerCase();\n        var collapseText = intl.lookup('common.less').toString().toLowerCase();\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var $el = this.$();\n            if ($el) {\n                $el.expander({\n                    expandText: expandText + ' &raquo;',\n                    userCollapseText: '&laquo; ' + collapseText,\n                    afterExpand: rerunLayouts,\n                    afterCollapse: rerunLayouts\n                });\n            }\n        });\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$().expander('destroy');\n    })\n});\nexport default ExpanderPluginComponent;\n","export default Ember.HTMLBars.template({\"id\":\"+M2hHWWk\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/expander-plugin/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend({\n    classNameBindings: ['field.customLabels:custom-label', 'editing', ':label-component'],\n\n    intl: inject.service(),\n\n    field: null,\n    entry: null,\n    entity: null,\n\n    editing: false,\n    isEmpty: false,\n    fallbackToEmpty: true,\n    showHistoryYearRange: true,\n    showInstructionText: true,\n\n    choices: null,\n    choicesHidden: true,\n\n    customLabelText: null,\n\n    attributeBindings: ['for'],\n\n    labelFor: null,\n\n    actions: {\n        toggleChoicesView: function () {\n            this.toggleProperty('choicesHidden');\n        },\n\n        selectChoice: function (id) {\n            this.set('customLabelText', null);\n            this.set('entry.labelKey', id);\n            this.set('choicesHidden', true);\n        }\n    },\n\n    setupCustomLabelText: on('init', function () {\n        if (this.hasCustomLabelKey()) {\n            this.set('customLabelText', this.get('entry.labelKey'));\n        }\n    }),\n\n    canEdit: computed('editing', 'writeable', 'writeable.isFulfilled', function () {\n        const editing = this.get('editing');\n        const writeable = this.get('writeable');\n        if (writeable && typeof writeable === 'object') {\n            return editing && writeable.content;\n        }\n        return editing && writeable;\n    }),\n\n    label: computed('entry.labelKey', 'editing', 'entry.{value.startDate.year,value.endDate.year}', function () {\n        // isEmpty is set by the display-field.hbs template\n        if (this.get('isEmpty')) {\n            return this.get('field.i18nLabel');\n        }\n\n        if (!this.get('editing')) {\n            if (this.get('field.type') === 'history' && this.get('showHistoryYearRange')) {\n                return this.labelForHistoryField();\n            }\n        }\n\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n\n        // A custom label is not configured for this field.\n        // Or custom labels are in use, but no label key is found, then this is a label key for an empty value.\n        // Or group link field\n        if (!this.get('field.customLabels') || !labelKey || this.get('field.fieldPath') === 'general.links') {\n            return this.get('field.i18nLabel');\n        }\n\n        var key = `${baseKey}_labelKey_${labelKey}`;\n\n        // If there is a translation for the custom label key, use it.\n        if (!this.hasCustomLabelKey()) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        // Otherwise return the label key as it was typed in.\n        return labelKey;\n    }),\n\n    customLabels: computed('field.{customLabels,fieldPath}', 'isEmpty', function () {\n        return (\n            this.get('field.customLabels') && !this.get('isEmpty') && this.get('field.fieldPath') !== 'general.links'\n        );\n    }),\n\n    labelChoices: computed('entry', function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(this.get('field.labelKeys'), labelKey => {\n            return {\n                id: labelKey,\n                label: this.get('intl').lookup(`${baseKey}_labelKey_${labelKey}`).toString()\n            };\n        });\n    }),\n\n    instructionText: computed('field.instructionText', function () {\n        let field = this.get('field').getI18nKey();\n        let key = `${field}_instructionText`;\n\n        const intl = this.get('intl');\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('field.instructionText');\n        }\n    }),\n\n    _placeholder: computed(function () {\n        return this.get('intl').lookup('common.label').toString();\n    }),\n\n    customLabelTextChanged: observer('customLabelText', function () {\n        let label = this.get('customLabelText');\n        let entry = this.get('entry');\n        if (!entry) {\n            return;\n        }\n\n        if (label) {\n            this.set('entry.labelKey', label);\n        } else if (_.isEmpty(this.get('labelChoices'))) {\n            this.set('entry.labelKey', '');\n        } else {\n            this.set('entry.labelKey', this.get('labelChoices')[0].id);\n        }\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        var clickId = this.get('elementId');\n        Ember.$(document).on('click.' + clickId, event => {\n            Ember.run(() => {\n                var pickerParent = $(event.target).parents('.picker'),\n                    containerParent = $(event.target).parents(`#${clickId}`);\n                if (!pickerParent.length || !containerParent.length) {\n                    this.set('choicesHidden', true);\n                }\n            });\n        });\n    }),\n\n    attachTooltip: on('didInsertElement', function () {\n        if (this.get('instructionText') && this.get('showInstructionText')) {\n            this.$('.picker .btn').tooltip({\n                html: true,\n                title: () => {\n                    return this.get('instructionText');\n                },\n                placement: 'right',\n                trigger: 'hover'\n            });\n        }\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n        this.$('i.instruction-text').tooltip('destroy');\n    }),\n\n    keyPress(event) {\n        if (this.$('input').is(':focus') && event.keyCode === 13) {\n            this.set('customLabelText', this.get('customLabelText'));\n            this.send('toggleChoicesView');\n        }\n    },\n\n    keyDown(event) {\n        const target = event.target;\n        if ((event.keyCode === 13 || event.keyCode === 32) && target.classList.contains('current-entry')) {\n            event.preventDefault();\n            this.send('toggleChoicesView');\n            return false;\n        }\n        if (\n            (event.keyCode === 13 || event.keyCode === 32) &&\n            event.target.closest('li[id]') &&\n            event.target.closest('.choices')\n        ) {\n            event.preventDefault();\n            const choiceId = event.target.closest('li').id;\n            this.send('selectChoice', choiceId);\n            return false;\n        }\n    },\n\n    // Returned from label computed above if the label is a history field. Label is not like a form label here.\n    // It's the value of the thing from entry.value\n    labelForHistoryField() {\n        moment.locale(this.get('intl.isoLocale'));\n        var startDate = this.get('entry.value.startDate');\n        var endDate = this.get('entry.value.endDate');\n\n        if (_.isEmpty(startDate) && _.isEmpty(endDate)) {\n            if (this.get('fallbackToEmpty')) {\n                return '';\n            }\n            return this.get('field.i18nLabel');\n        }\n\n        var hasStartDate = Ember.get(startDate, 'year');\n        var hasEndDate = endDate ? Ember.get(endDate, 'year') : false;\n\n        if (!hasStartDate && !hasEndDate) {\n            return this.get('field.i18nLabel');\n        }\n\n        let now = moment();\n        const regex = /DD\\W|\\WDD/g;\n        let localeFormat = now._locale._longDateFormat.L;\n        localeFormat = localeFormat.replace(/MM/, 'M');\n        let monthYearLocaleFormat = localeFormat.replace(regex, '');\n\n        var monthYearFmt = monthYearLocaleFormat; // cannot hardcode this to a particular format because then we can't adjust based on locale\n        var yearFmt = 'YYYY';\n\n        var startDateFmt = yearFmt;\n        var endDateFmt = yearFmt;\n\n        if (hasStartDate && startDate.month) {\n            startDate = _.clone(startDate);\n            startDate.month = startDate.month - 1;\n            startDateFmt = monthYearFmt;\n        } else if (hasStartDate) {\n            startDate = _.clone(startDate);\n            startDate.month = 0;\n        }\n\n        if (hasEndDate && endDate.month) {\n            endDate = _.clone(endDate);\n            endDate.month = endDate.month - 1;\n            endDateFmt = monthYearFmt;\n        } else if (hasStartDate && hasEndDate) {\n            endDate = _.clone(endDate);\n            endDate.month = new Date().getMonth();\n        }\n\n        var result;\n        if (!startDate && endDate) {\n            result = moment(endDate).format(endDateFmt);\n        } else {\n            var mStartDate = moment(startDate);\n            var mEndDate = endDate ? moment(endDate) : moment();\n            if (endDate && endDate.month) {\n                mEndDate = mEndDate.endOf('month');\n            }\n\n            var difference = mEndDate.diff(mStartDate);\n            var duration = moment.duration(difference).humanize();\n\n            let placeholder = this.get('intl').lookup('entity.fieldTypes.history.toPlaceholder');\n            let formattedStartDate = mStartDate.format(startDateFmt);\n            let formattedEndDate = hasEndDate ? mEndDate.format(endDateFmt) : placeholder.toString();\n            result = `${formattedStartDate}&ndash;${formattedEndDate}<div class=\"duration label label-default\">${duration}</div>`;\n        }\n\n        return Ember.String.htmlSafe(result);\n    },\n\n    hasCustomLabelKey() {\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n        return !this.get('intl').query(`${baseKey}_labelKey_${labelKey}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"nM312VbL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"customLabels\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"writeable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picker custom-labels is-editing\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-entry btn btn-default\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoicesView\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[1,[26,[\\\"label\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"choicesHidden\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"choices list-unstyled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-choice\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.labels.customLabel\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"placeholder\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-choice\\\"],null],[28,[\\\"customLabelText\\\"]],[28,[\\\"_placeholder\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[16,\\\"id\\\",[28,[\\\"choice\\\",\\\"id\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectChoice\\\",[28,[\\\"choice\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"choice\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"custom-labels not-editing\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"no-custom-labels\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/field-label/template.hbs\"}});","define(\"connections-ui/components/fixtable-column-header\", [\"exports\", \"fixtable-ember/components/fixtable-column-header\"], function (_exports, _fixtableColumnHeader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnHeader.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-column-label\", [\"exports\", \"fixtable-ember/components/fixtable-column-label\"], function (_exports, _fixtableColumnLabel) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnLabel.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-empty-state\", [\"exports\", \"fixtable-ember/components/fixtable-empty-state\"], function (_exports, _fixtableEmptyState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableEmptyState.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-footer\", [\"exports\", \"fixtable-ember/components/fixtable-footer\"], function (_exports, _fixtableFooter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableFooter.default;\n    }\n  });\n});\n","import FixtableGrid from 'fixtable-ember/components/fixtable-grid';\n\nexport default FixtableGrid.extend({\n    classNames: ['fixtable-grid']\n});\n","define(\"connections-ui/components/fixtable-row-toggle\", [\"exports\", \"fixtable-ember/components/fixtable-row-toggle\"], function (_exports, _fixtableRowToggle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRowToggle.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-row\", [\"exports\", \"fixtable-ember/components/fixtable-row\"], function (_exports, _fixtableRow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRow.default;\n    }\n  });\n});\n","define(\"connections-ui/components/flashy-webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/flashy-webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-editor'],\n\n    store: inject.service('store'),\n    session: inject.service(),\n\n    entity: null,\n    fieldData: null,\n    field: null,\n\n    location: null,\n    parentLocation: null,\n\n    editing: true,\n\n    saveLocation: () => {},\n\n    coordinates: {},\n    coordinatesRatio: {},\n\n    type: 'edit',\n\n    selectFloorplan: true,\n\n    entry: computed.alias('fieldData.value'),\n\n    actions: {\n        setCurrentFloor(floor) {\n            let entry = this.get('entry');\n\n            let data = {\n                coordinates: {},\n                locationId: floor.get('id'),\n                notes: ''\n            };\n\n            let floorplans = floor.get('floorplanImages');\n            floorplans = floor.get('floorplanImage');\n            if (floorplans) {\n                data.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', data);\n\n            let currentLocation = this.get('location');\n            let floors = this.get('floors');\n\n            this.set('location', floor);\n            this.send('showFloorplan');\n\n            if (currentLocation.get('isFloor')) {\n                floors.addObject(currentLocation);\n            }\n\n            floors.removeObject(floor);\n\n            floors = floors.sortBy('name');\n            this.set('floors', floors);\n        },\n\n        showFloorplan() {\n            if (this.get('floorplanImageUrl')) {\n                this.set('selectFloorplan', true);\n            }\n        },\n\n        saveFloorplan() {},\n\n        closeFloorplan: function () {\n            this.set('selectFloorplan', false);\n        }\n    },\n\n    loadInitialPinLocation: on('didRender', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let coordinates = this.get('entry.value.coordinates');\n            let img = this.$('.floorplan-image img');\n            if (!img) {\n                return;\n            }\n\n            img.one('load', () => {\n                let coords = this.getRatioCoordinates(coordinates, img[0], function (a, b) {\n                    return a * b;\n                });\n\n                this.attachPinForXY(coords.x, coords.y);\n            });\n        });\n    }),\n\n    floorplanImageUrl: computed('location.floorplanImage', function () {\n        let images = this.get('location.floorplanImage');\n        if (images && images.length > 0) {\n            let image = images.find(image => image.resolution === 'x800');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    showFloorplan: computed('floorplanImageUrl', 'selectFloorplan', function () {\n        return this.get('floorplanImageUrl') && this.get('selectFloorplan');\n    }),\n\n    floors: computed('location.floors.[]', 'parentLocation.floors.[]', 'location.{id,isFloor}', function () {\n        let locationFloors = this.get('location.floors');\n        let parentFloors = this.get('parentLocation.floors');\n        let floors = [];\n        if (locationFloors && locationFloors.length > 0) {\n            floors = locationFloors;\n        }\n        if (parentFloors && parentFloors.length > 0) {\n            floors = parentFloors;\n        }\n        // Remove yourself\n        if (this.get('location.isFloor') && floors.length > 0) {\n            floors = floors.filter(floor => floor.get('id') !== this.get('location.id'));\n        }\n        return floors;\n    }),\n\n    loadFloors() {\n        return;\n    },\n\n    updateCoordinatesRatio: observer('coordinates', function () {\n        let coordinates = this.get('coordinates');\n        if (!!coordinates) {\n            let img = this.$('.floorplan-image img')[0];\n            let coords = this.getRatioCoordinates(coordinates, img, function (a, b) {\n                return a / b;\n            });\n\n            if (img) {\n                this.set('coordinatesRatio', {\n                    x: coords.x,\n                    y: coords.y\n                });\n            }\n        } else {\n            this.set('coordinatesRatio', {});\n        }\n    }),\n\n    updateCoordinatesOnLocation: observer('coordinatesRatio', function () {\n        let ratio = this.get('coordinatesRatio');\n        let entry = this.get('entry');\n\n        let value = entry.value;\n        value.coordinates = ratio;\n\n        Ember.set(entry, 'value', value);\n    }),\n\n    click(event) {\n        let target = Ember.$(event.target);\n\n        if (target.parent().is('.floorplan-image') && target.is('img') && this.get('editing')) {\n            let x = event.offsetX || event.clientX - $(event.target).offset().left + window.pageXOffset;\n            let y = event.offsetY || event.clientY - $(event.target).offset().top + window.pageYOffset;\n\n            this.attachPinForXY(x, y);\n\n            this.set('coordinates', {\n                x: x,\n                y: y\n            });\n        }\n    },\n\n    getRatioCoordinates(coordinates, image, operation) {\n        if (!image) {\n            return { x: 0, y: 0 };\n        }\n\n        let naturalHeight = image.naturalHeight;\n        let naturalWidth = image.naturalWidth;\n        let heightDiff = naturalHeight - image.height;\n        let widthDiff = naturalWidth - image.width;\n\n        let x = operation(coordinates.x, naturalWidth - widthDiff);\n        let y = operation(coordinates.y, naturalHeight - heightDiff);\n\n        return { x: x, y: y };\n    },\n\n    attachPinForXY(x, y) {\n        let icon = $('<i class=\"pin pc pc-location\"></i><i class=\"pin shadow pc pc-location\"></i>').css({\n            position: 'absolute',\n            left: x - 12,\n            top: y - 12\n        });\n\n        let currentPin = this.$('i.pin');\n        if (currentPin) {\n            this.$('i.pc-location').remove();\n        }\n\n        const image = this.$('.floorplan-image');\n        if (image) {\n            image.append(icon);\n        }\n    },\n\n    floorSorter(a, b) {\n        let init = [a.get('name'), b.get('name')];\n        let sorted = init.sort();\n        if (sorted[0] === a.get('name')) {\n            return 1;\n        } else {\n            return -1;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"xheP5PK6\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"locations\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.floors\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"isFloor\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-location\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"location\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"floors\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"setCurrentFloor\\\",[28,[\\\"floor\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"floor\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"floor\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showFloorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.selectOffice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-image\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[26,[\\\"floorplanImageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"locations.noFloorplan\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-editor/template.hbs\"}});","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nconst { on, Component, run } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-popover'],\n    classNameBindings: ['show::hide'],\n\n    show: false,\n    attachmentId: '',\n    hidePopover: () => {},\n\n    tetherConstraints: {\n        pin: ['left', 'right']\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        const show = this.get('show');\n        if (show) {\n            run.scheduleOnce('afterRender', this, this._createPopper);\n        } else {\n            run.scheduleOnce('afterRender', this, this._destroyPopper);\n        }\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _createPopper() {\n        if (this._popper) {\n            return;\n        }\n\n        const targetEl = document.querySelector(`#${this.get('attachmentId')}`);\n        const popoverEl = this.element;\n        if (!targetEl || !popoverEl) {\n            return;\n        }\n\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        run.later(() => {\n            this.$('img').on(\n                'load',\n                Ember.run.bind(this, () => {\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                })\n            );\n        }, 10);\n    },\n\n    attachClickHandler: on('didInsertElement', function () {\n        Ember.$(document).on(\n            `click.${this.get('elementId')}`,\n            Ember.run.bind(this, event => {\n                if (!this.get('show')) {\n                    return;\n                }\n\n                let target = Ember.$(event.target);\n\n                if (\n                    target.parents('.floorplan-action').length ||\n                    target.parents('.floorplan-popover').length ||\n                    target.parent('.location-name').length ||\n                    target.parent('.mini-card-component-wrapper').length\n                ) {\n                    return;\n                } else {\n                    this.get('hidePopover')();\n                }\n            })\n        );\n    }),\n\n    removeHandlers: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"j0uG/gql\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popover-content\\\"],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-popover/template.hbs\"}});","define(\"connections-ui/components/font-icon/component\", [\"exports\", \"ember-purecloud-components/components/font-icon/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport {\n    buildIntlTelInputOptions,\n    setupIntlTelInputAccessibility,\n    updateSelectedCountryAriaLabel\n} from 'connections-ui/utils/intl-tel-input-options';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nlet GroupContactModalComponent = Ember.Component.extend({\n    classNames: ['group-contact-form'],\n    classNameBindings: ['group-ring-voicemail'],\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    entity: Ember.computed.reads('model'),\n\n    attrs: {\n        close: () => {},\n        disableModal: () => {}\n    },\n\n    saveContactInfo: () => {},\n\n    number: null,\n    extension: null,\n    originalExtension: null,\n\n    voicemailFile: null,\n    showVoicemailOptions: false,\n    // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n    resetGreeting: false,\n\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n\n    actions: {\n        saveForm() {\n            this.saveContactInfo();\n        },\n\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n            }\n        },\n\n        toggleVoicemail() {\n            this.toggleProperty('voicemailOn');\n        },\n\n        toggleEmailNotification() {\n            this.toggleProperty('emailNotificationOn');\n        },\n\n        toggleOptions() {\n            this.toggleProperty('showVoicemailOptions');\n        },\n        // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n        cancel() {\n            this.attrs.close();\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableModal(key, value) {\n            this.set(key, value);\n            this.attrs.disableModal(value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n        Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n    },\n\n    numberOfRotations: Ember.computed('entity.numberOfRotations', 'entity.numberOfRotations.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.numberOfRotations.content');\n        }\n    }),\n\n    rotateCallSeconds: Ember.computed('entity.rotateCallSeconds', 'entity.rotateCallSeconds.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.rotateCallSeconds.content');\n        }\n    }),\n\n    _voicemailOn: false,\n    voicemailOn: Ember.computed(\n        'entity.voicemailEnabled',\n        'entity.voicemailEnabled.{content,isFulfilled}',\n        'editingVoicemailDisabled',\n        {\n            get() {\n                if (this.get('entity.isSaving')) {\n                    return this._voicemailOn;\n                }\n\n                if (this.get('editingVoicemailDisabled')) {\n                    this._voicemailOn = false;\n                    return false;\n                }\n\n                const value =\n                    this.get('entity.voicemailEnabled.isFulfilled') && this.get('entity.voicemailEnabled.content');\n\n                this._voicemailOn = value;\n                return value;\n            },\n\n            set(key, value) {\n                this._voicemailOn = value;\n\n                return value;\n            }\n        }\n    ),\n\n    emailNotificationOn: Ember.computed(\n        'entity.emailNotificationEnabled',\n        'entity.emailNotificationEnabled.{content,isFulfilled}',\n        {\n            get() {\n                return this.get('entity.emailNotificationEnabled');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    ),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if ((originalExtension && extension !== originalExtension) || this.get('entity.isSaving')) {\n            return false;\n        }\n\n        return !!this.get('entity.number.rel.errorCode');\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        function () {\n            const number = this.get('number');\n            const ext = this.get('extension');\n\n            if (_.isEmpty(number) && _.isEmpty(ext)) {\n                return true;\n            }\n\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (!number) {\n                return !this.get('invalidExtension');\n            }\n\n            return !this.get('invalidPhoneNumber');\n        }\n    ),\n\n    isInvalid: Ember.computed.not('isValid'),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (this.get('invalidExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidExtension').toString();\n        } else if (this.get('invalidPhoneNumber')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidPhoneNumber').toString();\n        } else if (this.get('haveNumberAndExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.numberAndExtension').toString();\n        }\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        const elem = this.$('.group-ring-phone-input');\n        if (elem) {\n            return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber', false);\n        }\n        return false;\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    showGroupEmail: Ember.computed(function () {\n        return false; // maybe true in the future...\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting.content');\n        return !!greeting;\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.audioFile.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    showEmailNotification: Ember.computed.not('session.org.hasHipaaEnabled'),\n    // ^^^ This corresponds to `emailNotifications.show` in `group-profile/group-contact-panel/*`.\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        this.attrs.disableModal(!this.get('isValid'));\n    }),\n\n    setupInput() {\n        const $input = this.$('.group-ring-phone-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n        $input.intlTelInput(buildIntlTelInputOptions(this.get('intl'), this.get('application')));\n        setupIntlTelInputAccessibility($input, this.get('intl'), fieldName);\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n\n        if (!_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(inputElem.intlTelInput('getNumber'))) {\n                inputElem.intlTelInput('setNumber', info.number);\n            }\n\n            if (_.isEmpty(extElem.val())) {\n                extElem.val(info.extension);\n            }\n\n            this.set('number', info.number);\n            this.set('extension', info.extension);\n\n            this.set('originalExtension', info.extension);\n        }\n\n        updateSelectedCountryAriaLabel(inputElem, this.get('intl'), fieldName);\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('entity.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('entity.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    save() {\n        const entity = this.get('entity');\n        const ajax = this.get('ajax');\n        const notification = this.get('notification');\n        const application = this.get('application');\n\n        const { voicemailOn, numberOfRotations, rotateCallSeconds, emailNotificationOn } = this.getProperties(\n            'voicemailOn',\n            'numberOfRotations',\n            'rotateCallSeconds',\n            'emailNotificationOn'\n        );\n\n        this.setNumberData();\n\n        const promise = entity.save();\n        let showExtensionErrorNotification = false;\n\n        // Reset since we are saving\n        this.set('originalExtension', null);\n\n        promise\n            .then(() => {\n                const haveError = !!entity.get('number.rel.errorCode');\n\n                if (!this.get('isEmpty') && !haveError) {\n                    return entity.get('policy').then(policy => {\n                        policy.setProperties({\n                            enabled: voicemailOn,\n                            rotateCallsSecs: rotateCallSeconds,\n                            stopRingingAfterRotations: numberOfRotations,\n                            sendEmailNotifications: emailNotificationOn\n                        });\n                        return policy.save();\n                    });\n                }\n\n                showExtensionErrorNotification = haveError;\n            })\n            .then(() => {\n                const resetGreeting = this.get('resetGreeting');\n                if (resetGreeting) {\n                    return this.get('entity.greeting').then(greeting => {\n                        let path = greeting.selfUri;\n                        if (_.head(path) === '/') {\n                            path = path.substring(1);\n                        }\n                        const url = application.pcV2Uri(path);\n                        return ajax.delete(url);\n                    });\n                } else {\n                    let file = this.get('recordingFile');\n                    if (!file) {\n                        file = this.get('voicemailFile');\n                    }\n\n                    return this.uploadGreeting(file);\n                }\n            })\n            .then(() => {\n                entity.notifyPropertyChange('greeting');\n            });\n\n        return promise\n            .then(() => {\n                let title = this.get('entity.name');\n                let message = this.get('intl').lookup('notification.group.general');\n                let handler = notification.info.bind(notification);\n\n                if (showExtensionErrorNotification) {\n                    handler = notification.error.bind(notification);\n\n                    const isExtensionResourceInUse = this.get('isExtensionResourceInUse');\n                    const isExtensionNotInPool = this.get('isExtensionNotInPool');\n\n                    if (isExtensionNotInPool) {\n                        title = this.get('intl').lookup('notification.group.extensionNotInPoolError.title');\n                        message = this.get('intl').lookup('notification.group.extensionNotInPoolError.message');\n                    } else if (isExtensionResourceInUse) {\n                        title = this.get('intl').lookup('notification.group.resourceInUseError.title');\n                        message = this.get('intl').lookup('notification.group.resourceInUseError.message');\n                    } else {\n                        title = this.get('intl').lookup('notification.group.groupRingExtensionError.title');\n                        message = this.get('intl').lookup('notification.group.groupRingExtensionError.message');\n                    }\n                }\n\n                handler(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n            })\n            .catch(err => {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.saveError');\n                notification.error(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                Ember.Logger.error(message, err);\n            })\n            .finally(() => {\n                this.attrs.close();\n                entity.reload();\n            });\n    },\n\n    setNumberData() {\n        var number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        var extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('entity.contactInfo'))) {\n                this.set('entity.contactInfo', {});\n            }\n\n            var valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            var emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('entity.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('entity.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('entity.contactInfo.groupNumber.firstObject.value.extension', extension);\n    }\n});\n\nexport default GroupContactModalComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {},\n        disableModal: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableModal(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"rA8lkHhw\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"dNb/ur5f\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showGroupEmail\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"email\\\"],[15,\\\"id\\\",\\\"group-email\\\"],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],null],[16,\\\"value\\\",[26,[\\\"email\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number phone-field\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[15,\\\"class\\\",\\\"group-ring-phone-input form-control\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"group-ring-extension-input form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"call-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRingNotice\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"rotateCallSeconds\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"numberOfRotations\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.voicemail\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"voicemailEnabled\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemailOn\\\"]],[28,[\\\"editingVoicemailDisabled\\\"]],\\\"toggleVoicemail\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingVoicemailDisabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"haveExtensionError\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionResourceInUse\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inUseError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionNotInPool\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.extensionError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.genericError\\\"],null],false],[0,\\\"\\\\n                        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.editingVoicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemailOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"greeting\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleOptions\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEmailNotification\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotification\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotificationOn\\\"]],\\\"toggleEmailNotification\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotificationOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotificationHelpText\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport DS from 'ember-data';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport FieldSection from '../../field-config/field-section';\n\nimport { BASE_PERSON } from '../../models/person';\n\nconst { Component, run, inject, RSVP } = Ember;\n\nlet jobEndpoint = function (id) {\n    return `/api/v2/jobs/${id}`;\n};\n\nlet GroupProfileComponent = Component.extend(EntityControllerMixin, {\n    classNames: ['group-profile', 'entity'],\n    classNameBindings: ['chatEnabled'],\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    favorites: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    phoneEnabled: Ember.computed.bool('permissions.phoneEnabled'),\n    chatEnabled: Ember.computed.alias('chatService.enabled'),\n    model: null,\n\n    showDropdown: false,\n\n    isEditing: false,\n    showContactInfo: false,\n    saves: [],\n\n    groupRoom: null,\n    showMembers: true,\n    showLinkDropdown: false,\n    displayIndices: false,\n\n    hasLinks: false,\n    hasInformals: false,\n\n    isLoading: false,\n\n    displayWarningModal: false,\n\n    activeTab: 'members',\n    shouldFocusToggle: false,\n\n    excludedFieldSections: ['general', 'images', 'membership', 'membershipDraft', 'privacy', 'owners'],\n\n    excludedMembershipFields: ['includeOwners', 'exclusions', 'inclusions'],\n\n    excludedEditingFields: ['compiledQuery'],\n\n    view: Ember.$('<div class=\"center-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>'),\n\n    toggleLoading: Ember.observer('isLoading', function () {\n        if (this.get('_state') === 'inDOM' && this.get('isLoading')) {\n            this.$('.field-section .content').append(this.get('view'));\n        } else if (this.$()) {\n            this.$('.center-indicator').remove();\n        }\n    }),\n\n    generalExcludedEditingFields: ['groupType'],\n\n    actions: {\n        selectTab(tab) {\n            this.set('activeTab', tab);\n        },\n\n        toggleCallsEnabled() {\n            if (!this.get('callsEnabled') && this.get('hasRules')) {\n                this.set('displayWarningModal', true);\n            } else {\n                this.set('shouldFocusToggle', true);\n                this.toggleProperty('callsEnabled');\n                this.saveCallsEnabledState();\n            }\n            this.set('isEditing', false);\n        },\n\n        toggleEditing() {\n            if (!this.get('isEditing')) {\n                this.get('model').reload();\n            }\n            this.toggleProperty('isEditing');\n        },\n\n        changeEditingMode(editing) {\n            this.set('isEditing', editing);\n        },\n\n        editGeneralInfo() {\n            this.set('isShowingGeneralModal', true);\n        },\n\n        editContactInfo() {\n            this.set('showContactInfo', true);\n        },\n\n        cancelEditContactInfo() {\n            this.set('showContactInfo', false);\n        },\n\n        editPrivacyRules() {\n            this.set('isShowingPrivacyModal', true);\n        },\n\n        toggleLinks() {\n            this.toggleProperty('showLinkDropdown');\n        },\n\n        goToLink(href) {\n            if (href.indexOf('http://') !== -1 || href.indexOf('https://') !== -1) {\n                window.open(href, '_blank');\n            } else {\n                window.open('http://' + href, '_blank');\n            }\n        },\n\n        confirmGeneral() {\n            const notification = this.get('notification');\n            const group = this.get('model');\n            group\n                .save()\n                .then(data => {\n                    Ember.Logger.debug('GROUP-PROFILE: group saved', data);\n                    this.closeAllModals();\n                    if (!_.isEmpty(data)) {\n                        if (data.job) {\n                            this.handleJob(data.job);\n                        }\n                    }\n\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.general');\n                    notification.info(title, message, {\n                        forceBrowserNotification: true,\n                        hideAfter: 5\n                    });\n                })\n                .catch(e => {\n                    Ember.Logger.error('group save failed', { error: e });\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.saveError');\n                    notification.error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    group.reload();\n                });\n\n            this.send('setHasLinks');\n        },\n\n        cancelGeneral() {\n            this.get('model').reload();\n            this.closeAllModals();\n        },\n\n        confirm() {\n            const notification = this.get('notification');\n            let model = this.get('model');\n            if (model.get('owners.owners.length') === 0) {\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('notification.group.noOwners').toString();\n                notification.info(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                model.reload();\n            } else {\n                this.set('isLoading', true);\n\n                model.save().then(() => {\n                    const title = this.get('model.name');\n                    const message = this.get('intl').lookup('notification.group.general').toString();\n                    notification.show(title, message, {\n                        hideAfter: 8\n                    });\n\n                    var job = this.store.metadataFor('group').job;\n                    this.handleJob(job);\n                    this.set('isLoading', false);\n                });\n            }\n\n            return false;\n        },\n\n        noop() {},\n\n        deleteGroup() {\n            this.set('isShowingDeleteModal', true);\n        },\n\n        cancelDelete() {\n            this.closeAllModals();\n        },\n\n        confirmDelete() {\n            const notification = this.get('notification');\n            const model = this.get('model');\n            const id = model.get('id');\n            const groupType = model.get('groupType');\n            const person = this.get('session.person');\n\n            model.deleteRecord();\n            model\n                .save()\n                .then(group => {\n                    Ember.Logger.debug('GROUP-PROFILE: Deleted Group: ', group);\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleting');\n                    notification.info(title, message, {\n                        icon: '',\n                        hideAfter: 8\n                    });\n                    this.closeAllModals();\n                    window.history.back();\n                })\n                .then(function () {\n                    if (groupType) {\n                        const type = groupType.toLowerCase();\n                        const groups = person.get(`groups.${type}`) || [];\n                        const groupData = groups.findBy('value', id);\n                        groups.removeObject(groupData);\n                    }\n                })\n                .catch(e => {\n                    Ember.Logger.error('GROUP-PROFILE: Error deleting group', {\n                        error: e\n                    });\n\n                    model.set('state', 'active');\n\n                    const title = model.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleteError');\n                    notification.error(title, message, {\n                        icon: ''\n                    });\n                });\n        },\n\n        setHasLinks() {\n            let links = this.get('model.general.links');\n            if (links && links !== undefined) {\n                this.set('hasLinks', links.length > 0 && links[0].value !== '');\n            } else {\n                this.set('hasLinks', false);\n            }\n        },\n\n        makeCall: debounce(function () {\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [this.get('phoneNumber')]\n            });\n        }, 250),\n\n        confirmWarningModal() {\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n            this.set('displayWarningModal', false);\n            this.set('shouldFocusToggle', true);\n            this.set('callsEnabled', true);\n            this.saveCallsEnabledState();\n        },\n\n        closeWarningModal() {\n            this.set('displayWarningModal', false);\n        },\n\n        toggleGroupProfileEditPopover(status) {\n            this.set('showDropdown', !status);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('model') && !this.get('model.uniqueRoleCount')) {\n            const group = this.get('model');\n            group.getGrants();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.setupToggleAccessibility();\n        this.setupKeyboardHandlers();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.teardownKeyboardHandlers();\n    },\n\n    setupKeyboardHandlers() {\n        this._handleEscapeKey = event => {\n            if (event.key === 'Escape' && this.get('showDropdown')) {\n                this.set('showDropdown', false);\n                // Return focus to the edit button that opened the popover\n                run.scheduleOnce('afterRender', this, function () {\n                    const editButton = this.$('#group-profile-edit');\n                    if (editButton && editButton.length) {\n                        editButton.focus();\n                    }\n                });\n            }\n        };\n        document.addEventListener('keydown', this._handleEscapeKey);\n    },\n\n    teardownKeyboardHandlers() {\n        if (this._handleEscapeKey) {\n            document.removeEventListener('keydown', this._handleEscapeKey);\n        }\n    },\n\n    // Observer to reapply accessibility attributes when toggle state changes\n    callsEnabledObserver: Ember.observer('callsEnabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupToggleAccessibility');\n        // Focus the toggle in the newly displayed template if it was triggered by user action\n        if (this.get('shouldFocusToggle')) {\n            run.scheduleOnce('afterRender', this, 'focusToggleAfterSwitch');\n        }\n    }),\n\n    // Observer to handle conditional voicemail-related toggles\n    voicemailStateObserver: Ember.observer('model.policy.enabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupConditionalToggleAccessibility');\n    }),\n\n    setupToggleAccessibility() {\n        // Fix accessibility issue with toggle switch\n        run.schedule('afterRender', this, function () {\n            const toggleInput = this.$('.toggle-switch-wrapper .switch-input');\n            const innerLabel = this.$('.toggle-switch-wrapper .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.groupRing.enableCalls');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', this.get('callsEnabled') ? 'toggleLabel' : 'membershipToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n            // Map of label IDs to their corresponding toggle switch selectors (always visible)\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input',\n                    innerLabelSelector: '.backup-container .toggle-switch[title]'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input',\n                    innerLabelSelector: '.group-voicemail .toggle-switch[title]'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n\n            // Handle conditional toggles that appear when voicemails are enabled\n            this.setupConditionalToggleAccessibility();\n        });\n    },\n\n    setupConditionalToggleAccessibility() {\n        // Handle toggles that are conditionally rendered when voicemails are enabled\n        run.schedule('afterRender', this, function () {\n            const conditionalToggleMappings = [\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input',\n                    innerLabelSelector: '.email-notification .toggle-switch[title]'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input',\n                    innerLabelSelector: '.email-notification-pii .toggle-switch[title]'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input',\n                    innerLabelSelector: '.voicemail-transcription .toggle-switch[title]'\n                }\n            ];\n\n            conditionalToggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n        });\n    },\n\n    focusToggleAfterSwitch() {\n        // Focus the toggle in the newly displayed template\n        // Use a small delay to ensure the DOM has fully rendered after the conditional template switch\n        run.later(\n            this,\n            function () {\n                const callsEnabled = this.get('callsEnabled');\n                let toggleSelector;\n\n                if (callsEnabled) {\n                    // When callsEnabled is true, the group-contact-panel is shown with toggle in group-header\n                    toggleSelector = '.group-header .header-right .toggle-switch-wrapper .switch-input';\n                } else {\n                    // When callsEnabled is false, the membership-listing is shown with toggle in membership-header\n                    toggleSelector = '.membership-header .header-right .toggle-switch-wrapper .switch-input';\n                }\n\n                const toggleInput = this.$(toggleSelector);\n                if (toggleInput.length) {\n                    toggleInput.focus();\n                }\n\n                // Reset the flag\n                this.set('shouldFocusToggle', false);\n            },\n            50\n        );\n    },\n\n    closeAllModals() {\n        this.setProperties({\n            isShowingDeleteModal: false,\n            isShowingPrivacyModal: false,\n            isShowingGeneralModal: false\n        });\n    },\n\n    ensureCorrectLinksState: Ember.on('init', function () {\n        run.scheduleOnce('afterRender', this, function () {\n            this.send('setHasLinks');\n        });\n    }),\n\n    membersTabSelected: Ember.computed.equal('tabSelected', 'members'),\n\n    settingsTabSelected: Ember.computed.equal('tabSelected', 'settings'),\n\n    generalFieldConfigSection: Ember.computed('groupRingVisible', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [\n            config.get('general.name'),\n            config.get('general.groupType'),\n            config.get('general.description'),\n            config.get('general.links'),\n            config.get('membership.includeOwners'),\n            config.get('contactInfo.email')\n        ];\n\n        let fieldSection = FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: this.get('model.fieldConfig'),\n            instructionText: null,\n            fieldList: fields\n        });\n\n        // Override setting general section on non-general fields\n        fieldSection.get('includeOwners').set('section', config.get('membership'));\n        fieldSection.get('email').set('section', config.get('contactInfo'));\n\n        return fieldSection;\n    }),\n\n    privacyFieldConfigSection: Ember.computed(function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('privacy.groupVisibility'), config.get('privacy.membershipVisible')];\n\n        return FieldSection.create({\n            key: 'privacy',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    linksFieldSection: Ember.computed('model.general.links.@each.value', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('general.links')];\n\n        return FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    callsEnabled: Ember.computed('model.contactInfo.allowCallConfiguration.firstObject.value', 'phoneEnabled', {\n        get() {\n            return this.get('phoneEnabled') && this.get('model.contactInfo.allowCallConfiguration.firstObject.value');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    phoneNumber: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        return this.get('model.contactInfo.groupNumber.firstObject');\n    }),\n\n    dialableNumber: Ember.computed('phoneNumber', function () {\n        return this.get('addressformat').format(this.get('phoneNumber'));\n    }),\n\n    phoneRef: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        var number = this.get('model.contactInfo.groupNumber.firstObject.rel.e164');\n        return `tel:#${number}`;\n    }),\n\n    name: Ember.computed('model.general.name.@each.value', function () {\n        return this.get('model').getFieldValue('general.name');\n    }),\n\n    description: Ember.computed('model.general.description.@each.value', function () {\n        return this.get('model').getFieldValue('general.description');\n    }),\n\n    groupType: Ember.computed('model.general.groupType.@each.value', function () {\n        return this.get('model').getFieldValue('general.groupType');\n    }),\n\n    groupVisibility: Ember.computed('model.privacy.groupVisibility.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.groupVisibility');\n    }),\n\n    membershipVisible: Ember.computed('model.privacy.membershipVisible.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.membershipVisible');\n    }),\n\n    includeOwners: Ember.computed('model.membership.includeOwners.@each.value', function () {\n        return this.get('model').getFieldValue('membership.includeOwners');\n    }),\n\n    email: Ember.computed('model.contactInfo.email.@each.value', function () {\n        return this.get('model').getFieldValue('contactInfo.email');\n    }),\n\n    groupTypeIcon: Ember.computed('model.general.groupType', function () {\n        let groupType = this.get('model').getFieldValue('general.groupType').value;\n        let icon = 'pc pc-official-group';\n\n        if (groupType === 'groups.social') {\n            icon = 'pc pc-social-group';\n        }\n\n        return icon;\n    }),\n\n    groupOwners: Ember.computed('model.owners.owners.[]', function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let promise = RSVP.resolve([]);\n\n        if (owners) {\n            promise = this.store.findMany('person', owners.mapBy('guid'), BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    membershipHeader: Ember.computed('model.memberCount', function () {\n        const count = this.get('model.memberCount');\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    groupRolesHeader: Ember.computed('model.uniqueRoleCount', function () {\n        const count = this.get('model.uniqueRoleCount');\n        return this.get('intl').lookup('groups.roles.rolesWithCount', { count }).toString();\n    }),\n\n    sections: Ember.computed('fieldSections', function () {\n        return this.get('fieldSections');\n    }),\n\n    canEditLeftRailInfo: Ember.computed.alias('canEditInformation'),\n    canEditProfilePicture: Ember.computed.alias('canEditInformation'),\n    canEditInformation: Ember.computed(\n        'model.owners.owners.[]',\n        'session.person',\n        'session.person.isAdmin',\n        'permissions.canEditGroups',\n        function () {\n            let namedPermissions = this.get('session.namedPermissions') || [];\n            let isOwner = this.get('model').isPersonOwner(this.get('session.person'));\n            let canEditGroups = this.get('permissions.canEditGroups');\n\n            return (\n                isOwner ||\n                canEditGroups ||\n                this.get('session.person.isAdmin') ||\n                _.includes(namedPermissions, 'group_administration')\n            );\n        }\n    ),\n\n    canEditGroupTelephonySettings: Ember.computed.readOnly('permissions.canEditGroupTelephonySettings', function () {\n        return this.get('permissions.canEditGroupTelephonySettings');\n    }),\n    disableToggleCalls: Ember.computed.not('canEditGroupTelephonySettings'),\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        const hasRolesView = this.get('session').hasPermissionAndDivision('authorization:role:view');\n        const hasGrantsEdit = this.get('session').hasPermissionAndDivision('authorization:grant:add');\n        return hasRolesView.hasPermission && hasGrantsEdit.hasPermission;\n    }),\n\n    canDeleteGroup: Ember.computed.reads('permissions.canDeleteGroup'),\n\n    updateLinksChange: Ember.observer('model.general.links.@each.value', function () {\n        this.send('setHasLinks');\n    }),\n\n    setHasInformals: Ember.observer('model.images.gallery', 'model.images.gallery.length', function () {\n        let informals = this.get('model.images.gallery');\n        if (informals && informals !== undefined) {\n            this.set('hasInformals', informals.length > 0);\n        } else {\n            this.set('hasInformals', false);\n        }\n    }),\n\n    checkMembers: Ember.observer('model.membership', function () {\n        let exclusions = this.get('model.membership.exclusions') !== undefined;\n        let inclusions = this.get('model.membership.inclusions') !== undefined;\n        let canEdit = this.get('canEditMembership.labelKey') === 'owners' || this.get('session.person.isAdmin');\n\n        let value = exclusions || inclusions || canEdit;\n        this.set('showMembers', value);\n    }),\n\n    canEditMembership: Ember.computed(function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let isOwner = _.find(owners, owner => owner.value === this.get('session.person.id'));\n\n        return isOwner || this.get('session.person.isAdmin');\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    saveCallsEnabledState() {\n        const model = this.get('model');\n        const callsEnabled = this.get('callsEnabled');\n        if (!callsEnabled) {\n            model.set('contactInfo.groupNumber', [], { overwrite: true });\n        }\n        model.set('contactInfo.allowCallConfiguration', callsEnabled);\n        return model\n            .save()\n            .then(() => {\n                model.get('policy').then(policy => {\n                    if (!this.get('callsEnabled')) {\n                        this.get('store').unloadRecord(policy);\n                        this.get('store')\n                            .findRecord('group-policy', model.get('guid'))\n                            .then(policy => {\n                                this.set('policy', policy);\n                            });\n                    }\n                });\n            })\n            .catch(() => {\n                this.toggleProperty('callsEnabled');\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('groups.groupRing.enableCallsError');\n                this.get('notification').error(title, message, {\n                    forceBrowserNotification: true\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    },\n\n    handleJob(job) {\n        if (job) {\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 2000);\n        }\n    },\n\n    getJobData(job) {\n        return this.get('ajax')\n            .request(jobEndpoint(job.jobId))\n            .then(data => {\n                data = data.res;\n\n                let 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                        this.get('model').reload();\n                    }\n                }\n            })\n            .catch(() => {\n                window.clearInterval(job.interval);\n\n                this.get('model').reload();\n            });\n    },\n\n    commitRevertHandler(data) {\n        let model = this.get('model');\n        model.set('version', data.res.version);\n\n        // Ember-Data is doing something weird and not marking as saved, so we do this manually\n        model.save().then(function (group) {\n            group.adapterDidCommit();\n        });\n    }\n});\nexport default GroupProfileComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-acd-expressions'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    notification: inject.service('notification-proxy'),\n\n    group: null,\n    showSaveModal: false,\n    showCancelModal: false,\n    loading: false,\n    previewValue: null,\n\n    expressionDisplay: computed('group.expression.@each.{display,opAnd}', 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.get('intl').t('groups.expressions.empty');\n        }\n\n        conditions.forEach(con => {\n            if (con.display === null || con.display === undefined) {\n                valid = false;\n                return;\n            }\n\n            display += con.display;\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    //last rule\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n        });\n\n        const empty = display.replace(/[()]/g, '').trim().length === 0;\n        if (empty) {\n            display = this.get('intl').t('groups.expressions.empty');\n        } else if (!valid) {\n            display = this.get('intl').t('groups.expressions.invalid');\n        }\n\n        return display;\n    }),\n\n    saveDisabled: computed('group.expression.@each.display', 'loading', function () {\n        const invalid = this.get('group.expression').filterBy('display', null).length > 0;\n        const loading = this.get('loading');\n        return invalid && !loading;\n    }),\n\n    maximumExpressions: computed('group.expression.length', 'group.expression.@each.length', function () {\n        //we have a limit of 3 skills total\n        const skills = this.get('group.expression').mapBy('rules');\n        return _.flatten(skills).length >= 3;\n    }),\n\n    numberPreview: computed('previewValue', function () {\n        return isNaN(this.get('previewValue')) ? this.get('intl').t('purecloud.unknown') : this.get('previewValue');\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.selectTab(tab);\n        },\n        addCondition() {\n            if (!this.get('maximumExpressions')) {\n                if (this.get('group.expression') && this.get('group.expression').length > 0) {\n                    let exp = this.get('group.expression');\n                    exp.forEach(condition => {\n                        Ember.set(condition, 'lastCondition', false);\n                        if (condition.operation === null) {\n                            Ember.set(condition, 'operation', 'AND');\n                            Ember.set(condition, 'opAnd', true);\n                        }\n                    });\n                    exp.pushObject({\n                        lastCondition: true,\n                        operation: 'OR',\n                        opAnd: false,\n                        display: null,\n                        rules: [\n                            {\n                                skill: null,\n                                comparator: null,\n                                proficiency: null,\n                                operation: 'OR',\n                                lastRule: true,\n                                opAnd: false\n                            }\n                        ]\n                    });\n                    Ember.set(exp, 'lastObject.lastCondition', true);\n                } else {\n                    this.set('group.expression', [\n                        {\n                            lastCondition: true,\n                            operation: 'OR',\n                            opAnd: false,\n                            display: null,\n                            rules: [\n                                {\n                                    skill: null,\n                                    comparator: null,\n                                    proficiency: null,\n                                    operation: 'OR',\n                                    lastRule: true,\n                                    opAnd: false\n                                }\n                            ]\n                        }\n                    ]);\n                }\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('groups.expressions.maxConditionsTitle'),\n                    this.get('intl').t('groups.expressions.maxConditionsMessage')\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                Ember.A(exp).removeAt(index);\n                exp.forEach(condition => {\n                    Ember.set(condition, 'lastCondition', false);\n                });\n                exp.set('lastObject.lastCondition', true);\n                exp.set('lastObject.operation', 'OR');\n                exp.set('lastObject.opAnd', false);\n                this.set('group.expression', exp);\n            }\n        },\n        conditionOperation(condition, op) {\n            Ember.set(condition, 'operation', op);\n            Ember.set(condition, 'opAnd', op == 'AND');\n        },\n        save() {\n            // use new endpoints to save our changed inclusions\n            this.set('loading', true);\n            let saveData = this.prepareExpression(this.get('group.expression'));\n            let success = true;\n            const payload = {\n                data: {\n                    skillConditions: saveData\n                }\n            };\n            const groupId = this.get('group.guid');\n            const path = `api/v2/groups/${groupId}/dynamicsettings`;\n            const url = this.get('application').pcV2Uri(path);\n\n            this.get('ajax')\n                .put(url, payload)\n                .then(() => {\n                    this.get('group').reload();\n                })\n                .catch(error => {\n                    success = false;\n                    this.get('notification').error(\n                        this.get('intl').t('groups.expressions.saveErrorTitle'),\n                        this.get('intl').t('groups.expressions.saveErrorMessage')\n                    );\n                    this.get('logger').error('Error trying to save dynamic expression to group', {\n                        error\n                    });\n                    this.set('loading', false);\n                })\n                .finally(() => {\n                    if (success) {\n                        this.set('group.lastSavedExpression', saveData);\n\n                        // use the preview endpoint to show the new expected number of group members\n                        this.get('notification').info(\n                            this.get('intl').t('groups.expressions.saveTitle'),\n                            this.get('intl').t('groups.expressions.saveMessage')\n                        );\n                        const previewPath = `api/v2/groups/dynamicsettings/preview`;\n                        const previewUrl = this.get('application').pcV2Uri(previewPath);\n                        this.get('ajax')\n                            .post(previewUrl, payload)\n                            .then(preview => {\n                                this.set('previewValue', preview.userCount);\n                            })\n                            .catch(e => {\n                                this.get('logger').error('Error trying to get preview for dynamic group', {\n                                    e\n                                });\n                            })\n                            .finally(() => {\n                                this.set('loading', false);\n                                this.set('showSaveModal', true);\n                            });\n                    }\n                });\n        },\n        openCancelModal() {\n            this.set('showCancelModal', true);\n        },\n        closeCancelModal() {\n            this.set('showCancelModal', false);\n        },\n        cancel() {\n            this.set('showCancelModal', false);\n            const group = this.get('group');\n            group.reload();\n\n            if (this.get('group.lastSavedExpression')) {\n                group.set('expression', group.parseExpression(group.get('lastSavedExpression')));\n            } else {\n                group.set('expression', group.parseExpression(group.get('_expression.content.skillConditions')));\n            }\n            this.selectTab('members');\n        },\n        closeSaveModal() {\n            this.set('previewValue', null);\n            this.set('showSaveModal', false);\n            this.selectTab('members');\n        }\n    },\n\n    prepareExpression(input) {\n        let output = [];\n        input.forEach(con => {\n            let save = {\n                routingSkillConditions: [],\n                languageSkillConditions: []\n            };\n\n            let parent = null;\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                    // we're making this rule the current parent skill\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent = newObj;\n                    save[skillPropName].pushObject(newObj);\n                    save.operation = con.operation;\n                    if (input.length === 1) {\n                        save.operation = rule.operation;\n                    }\n                } else {\n                    // we're adding this skill as a childCondition\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent.childConditions[skillPropName].pushObject(newObj);\n                    parent = newObj;\n                }\n            });\n\n            output.pushObject(save);\n        });\n\n        return output;\n    }\n});\n","import Ember from 'ember';\n\nconst { observer, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['condition-display'],\n\n    intl: inject.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('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        this.get('condition.rules').forEach(rule => {\n            // check to see if we're starting fresh\n            if (rule.comparator === null) return;\n\n            // set comparators to proper objects\n            const compPlace = this.get('comparators').mapBy('op').indexOf(rule.comparator.op);\n            if (compPlace >= 0) {\n                Ember.set(rule, 'comparator', this.get('comparators')[compPlace]);\n            } else {\n                Ember.set(rule, 'comparator', null);\n            }\n\n            if (!isNaN(rule.proficiency.value)) {\n                Ember.set(rule, 'proficiency', this.get('values')[rule.proficiency.value]);\n            }\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.set('condition.display', this.display());\n        });\n    },\n\n    updateConditionDisplay: observer(\n        'condition',\n        'condition.rules.@each.{skill,comparator,proficiency,opAnd,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.get('condition').rules;\n            rules.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            rules.set('lastObject.operation', 'OR');\n            rules.set('lastObject.opAnd', false);\n            rules.pushObject({\n                skill: null,\n                comparator: null,\n                proficiency: null,\n                operation: 'OR',\n                lastRule: true,\n                opAnd: false\n            });\n        },\n        removeRule(index) {\n            let con = this.get('condition').rules;\n            Ember.A(con).removeAt(index);\n            con.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            con.set('lastObject.lastRule', true);\n            con.set('lastObject.operation', 'OR');\n            con.set('lastObject.opAnd', false);\n            this.set('condition.rules', con);\n        },\n        ruleOperation(rule, op) {\n            Ember.set(rule, 'operation', op);\n            Ember.set(rule, 'opAnd', op == 'AND');\n        },\n        skillChanged(rule, skill, value) {\n            if (value) {\n                Ember.set(rule, skill, value);\n            }\n        }\n    },\n\n    /**\n     * This is the same function found in `/components/skillgroup-profile/dynamic-rules/condition-display` component.\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        let orWrap = false;\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            if (!rule.skill || !rule.comparator || !rule.proficiency) {\n                valid = false;\n                return;\n            }\n\n            display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n            if (rule.lastRule) {\n                display += ')';\n            } else if (!rule.opAnd) {\n                display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                orWrap = true;\n            } else {\n                display += ` ${this.get('intl').t('groups.expressions.and')} `;\n            }\n        }\n\n        if (orWrap) {\n            display = `(${display})`;\n        }\n\n        return valid ? display : null;\n    }\n});\n","import Ember from 'ember';\nconst { computed, Component, inject } = Ember;\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['skill-search'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.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.get('skillResults').concat(this.get('languageResults'));\n    }),\n\n    placeHolder: computed('skill', function () {\n        return this.get('skill') ? this.get('skill.name') : this.get('intl').t('groups.expressions.defaultSkill');\n    }),\n\n    skillSelected: computed('skill', function () {\n        return !!this.get('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        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.skill-search').length) {\n                    this.reset();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('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            Ember.run.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.get('application').pcV2Uri(`api/v2/routing/skills`);\n        this.get('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.get('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.get('application').pcV2Uri(`api/v2/routing/languages`);\n        this.get('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.get('logger').error('Error trying to fetch routing languages', {\n                    error\n                });\n                this.set('languageResults', []);\n            });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"wU85NT0e\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.searchSkill\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"if\\\"],[[28,[\\\"skillSelected\\\"]],\\\"selected\\\"],null]]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeHolder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"clearfix \\\",[28,[\\\"result\\\",\\\"class\\\"]],\\\" \\\",[28,[\\\"result\\\",\\\"type\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"pAm/MlNF\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"condition\\\",\\\"rules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"rule\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display/skill-search\\\"],null,[[\\\"skill\\\"],[[28,[\\\"rule\\\",\\\"skill\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-comparator\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"comparator\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"comparator\\\"],null],\\\"form-control comparator-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultComparator\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"comparators\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"op\\\"]],[28,[\\\"op\\\",\\\"class\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"op\\\",\\\"label\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"op\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-proficiency\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"proficiency\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"proficiency\\\"],null],\\\"form-control proficiency-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultValue\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"values\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"val\\\"]],[28,[\\\"val\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"val\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"val\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"lastRule\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addRule\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rule-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"condition\\\",\\\"rules\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRule\\\",[28,[\\\"rIndex\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-minus\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\",\\\"rIndex\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SdJHLOQh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dynamic-expression-builder\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-arrow-left\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.title\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"subtitle\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.subtitle\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-preview\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-builder\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"expression\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.condition\\\"],[[\\\"index\\\",\\\"display\\\"],[[33,[\\\"add\\\"],[[28,[\\\"cIndex\\\"]],1],null],[28,[\\\"condition\\\",\\\"display\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeCondition\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.removeCondition\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-rules\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display\\\"],null,[[\\\"condition\\\",\\\"group\\\",\\\"maximumExpressions\\\"],[[28,[\\\"condition\\\"]],[28,[\\\"group\\\"]],[28,[\\\"maximumExpressions\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-footer-line\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"footer-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"lastCondition\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"condition-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"condition\\\",\\\"cIndex\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"first-condition-line\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-action\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Primary\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[15,\\\"class\\\",\\\"save-button\\\"],[16,\\\"disabled\\\",[26,[\\\"saveDisabled\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"save\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Tertiary\\\"],[15,\\\"accent\\\",\\\"tertiary\\\"],[15,\\\"class\\\",\\\"cancel-button\\\"],[16,\\\"disabled\\\",[26,[\\\"loading\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openCancelModal\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-screen\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSaveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"noCancel\\\",\\\"confirm\\\",\\\"headerText\\\"],[\\\"preview-modal\\\",true,[33,[\\\"action\\\"],[[28,[null]],\\\"closeSaveModal\\\"],null],[33,[\\\"t\\\"],[\\\"groups.expressions.previewHeader\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"preview-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.previewText\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start name-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entityStrings.group\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-expression\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start expression-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.expression\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-number\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start number-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.number\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"numberPreview\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCancelModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\"],[\\\"cancel-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"closeCancelModal\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.cancelDisclaimer\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport request from 'ember-ajax';\n\nexport const LIST_TYPES = {\n    OWNERS: 'owners',\n    MEMBERS: 'members'\n};\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-contact-panel'],\n    classNameBindings: ['slideInList'],\n\n    //---- SERVICES ----//\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    group: null,\n    editing: false,\n    loading: false,\n    disableSave: false,\n    slideInList: true,\n    personSearch: false,\n    saves: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    listType: LIST_TYPES.OWNERS,\n\n    routeSelection: Ember.computed.reads('group.policy.groupAlertType'),\n\n    ringRotations: Ember.computed.reads('group.policy.stopRingingAfterRotations'),\n\n    isSequential: Ember.computed.equal('routeSelection', 'SEQUENTIAL'),\n\n    isRotary: Ember.computed.equal('routeSelection', 'ROUND_ROBIN'),\n\n    displayIndices: Ember.computed.or('isSequential', 'isRotary'),\n\n    disabled: Ember.computed.or('disableSave', 'loading'),\n\n    reasons: Ember.computed('orgVoicemailPolicy', 'group.policy', function () {\n        return {\n            org: {\n                isMissing: _.isEmpty(this.get('orgVoicemailPolicy'))\n            },\n            group: {\n                isMissing: _.isEmpty(this.get('group.policy'))\n            }\n        };\n    }).readOnly(),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        this.set('saves', []);\n        if (this.get('canEditGroupTelephonySettings')) {\n            this.loadOrgVoicemailPolicy();\n        }\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n        this.scheduleRemoveAnimation();\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        appendSave(func) {\n            this.get('saves').addObject(func);\n        },\n\n        removeSave(func) {\n            this.get('saves').removeObject(func);\n        },\n\n        disableSave(value) {\n            this.set('disableSave', value);\n        },\n\n        save() {\n            if (!this.get('loading')) {\n                this.save();\n            }\n        },\n\n        cancel() {\n            this.sendAction('toggleEditing');\n            this.set('personSearch', false);\n            this.get('group').rollbackAttributes();\n        },\n\n        changeListType(type) {\n            this.set('listType', type);\n        }\n    },\n\n    async loadOrgVoicemailPolicy() {\n        try {\n            //---- Try Loading Data ----//\n\n            const url = this.get('application').pcV2Uri(`api/v2/voicemail/policy`);\n            const data = await this.get('ajax').request(url);\n            this.set('orgVoicemailPolicy', data);\n\n            //------------//\n        } catch (err) {\n            //---- Handle Error ----//\n\n            // Log the error.\n            const errorPath = 'components/group-profile/group-contact-panel';\n            const errorMessage = \"Couldn't load organization's voicemail policy.\";\n            this.get('logger').error(`${errorPath}: ${errorMessage}`, {\n                error: err,\n                remoteData: {\n                    voicemailGroupId: this.get('group.id')\n                }\n            });\n\n            // Show the user a toast.\n            const toastTitle = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastTitle');\n            const toastMessage = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastMessage');\n            this.get('notification').error(toastTitle, toastMessage);\n\n            // Clean up.\n            this.set('orgVoicemailPolicy', null);\n\n            //------------//\n        }\n    },\n\n    scheduleRemoveAnimation() {\n        Ember.run.later(\n            this,\n            () => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    if (this._state !== 'destroying' && this._state !== 'destroyed') {\n                        this.set('slideInList', false);\n                    }\n                });\n            },\n            500\n        );\n    },\n\n    save() {\n        const saveData = this.get('saves').map(save => save());\n        const greetingData = _.filter(saveData, { type: 'group-ring-settings' })[0];\n        const ringSequenceData = _.filter(saveData, { type: 'ring-sequence' })[0];\n\n        this.set('loading', true);\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.saveModelData(ringSequenceData)\n                .then(() => {\n                    if (!!this.get('group.number.rel.errorCode')) {\n                        return reject({\n                            title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                            message: this.get('intl').lookup('notification.group.groupRingError.message')\n                        });\n                    }\n\n                    this.get('group.policy').then(policy => {\n                        if (policy.get('languagePreference') === '' || !policy.get('languagePreference')) {\n                            // default the language preference\n                            policy.set('languagePreference', 'en-us');\n                        }\n                        this.savePolicy(policy, true)\n                            .then(() => {\n                                this.saveGreeting(greetingData)\n                                    .then(() => {\n                                        resolve({\n                                            title: this.get('group.name'),\n                                            message: this.get('intl').lookup('notification.group.groupRingSuccess')\n                                        });\n                                    })\n                                    .catch(err => {\n                                        Ember.Logger.error('Error saving greeting', { err });\n\n                                        reject({\n                                            title: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.title'\n                                            ),\n                                            message: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.message'\n                                            )\n                                        });\n                                    });\n                            })\n                            .catch(err => {\n                                Ember.Logger.error('Error saving policy', { err });\n\n                                reject({\n                                    title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                                    message: this.get('intl').lookup('notification.group.groupRingError.message')\n                                });\n                            });\n                    });\n                })\n                .catch(err => {\n                    Ember.Logger.error('Error saving model data', { err });\n\n                    reject({\n                        title: this.get('group.name'),\n                        message: this.get('intl').lookup('notification.group.saveError')\n                    });\n                });\n        });\n\n        promise\n            .then(param => {\n                this.get('group').reload();\n                this.get('notification').success(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                this.sendAction('toggleEditing');\n                greetingData.callback(true);\n            })\n            .catch(param => {\n                this.get('notification').error(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                greetingData.callback(false);\n                return Ember.RSVP.reject();\n            })\n            .finally(() => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.set('loading', false);\n                });\n            });\n    },\n\n    savePolicy(policy, retry = false) {\n        return policy.save().catch(err => {\n            if (err && err.errors && err.errors.length > 0) {\n                let error = err.errors[0];\n                if (retry && error.status === 400 && error.title.indexOf('Referenced key') >= 0) {\n                    return new Ember.RSVP.Promise((resolve, reject) => {\n                        Ember.run.later(() => {\n                            this.savePolicy(policy, false).then(resolve).catch(reject);\n                        }, 750);\n                    });\n                }\n            }\n            return Ember.RSVP.reject(err);\n        });\n    },\n\n    saveGreeting(greetingData) {\n        return this.get('group.greeting')\n            .then(greeting => {\n                if (!greetingData.resetGreeting) {\n                    return Ember.RSVP.resolve();\n                }\n\n                let path = greeting.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').delete(url, { dataType: 'text' });\n            })\n            .then(() => {\n                let file = greetingData.recordingFile;\n                if (!file) {\n                    file = greetingData.voicemailFile;\n                }\n\n                return this.uploadGreeting(file);\n            })\n            .then(() => {\n                this.get('group').notifyPropertyChange('greeting');\n            });\n    },\n\n    saveModelData(ringSequenceData) {\n        const number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        const extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('group.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('group.contactInfo'))) {\n                this.set('group.contactInfo', {});\n            }\n\n            const valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            const emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('group.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('group.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('group.contactInfo.groupNumber.firstObject.value.extension', extension);\n\n        const group = this.get('group');\n\n        if (!group.get('individuals')) {\n            group.set('individuals', {});\n        }\n\n        if (!group.get('owners')) {\n            group.set('owners', {});\n        }\n\n        const { individuals, owners } = ringSequenceData;\n        return Ember.RSVP.all([individuals, owners]).then(([individuals, owners]) => {\n            group.set('owners.owners', [], { overwrite: true });\n            const orgIndividuals = group.get('individuals.individuals').map(i => {\n                return i.guid;\n            });\n            group.set('individuals.individuals', [], { overwrite: true });\n\n            const addedDelta = individuals.filter(i => !orgIndividuals.includes(i));\n            const removedDelta = orgIndividuals.filter(i => !individuals.includes(i));\n\n            individuals.forEach(id => {\n                group.set('individuals.individuals', id);\n            });\n            owners.forEach(id => {\n                group.set('owners.owners', id);\n            });\n\n            if (this.get('session.features.groupProileNoIndividualsSave')) {\n                return this.get('group')\n                    .save()\n                    .then(() => this.addIndividuals(group, addedDelta, this.get('application')))\n                    .then(() => this.deleteIndividuals(group, removedDelta, this.get('application')));\n            } else {\n                return this.get('group').save();\n            }\n        });\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('group.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('group.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    addIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'delete');\n    },\n\n    individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        let url;\n        if (this.get('session.features.groupProileNoIndividualsSave')) {\n            url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n            if (method.toLowerCase() === 'post') {\n                return this.get('ajax')\n                    .post(url, {\n                        dataType: 'json',\n                        data: {\n                            memberIds: individuals,\n                            version: group.get('version')\n                        }\n                    })\n                    .then(() => {\n                        return group;\n                    });\n            } else if (method.toLowerCase() === 'delete') {\n                url = url.concat('?ids=', individuals);\n                return this.get('ajax')\n                    .delete(url)\n                    .then(() => {\n                        return group;\n                    });\n            }\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = Ember.get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport {\n    buildIntlTelInputOptions,\n    setupIntlTelInputAccessibility,\n    updateSelectedCountryAriaLabel\n} from 'connections-ui/utils/intl-tel-input-options';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nconst DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE = 'en-us';\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-ring-settings'],\n\n    //---- SERVICES ----//\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    store: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressFormat: Ember.inject.service('addressformat'),\n\n    //---- CONTEXT & STATES ----//\n\n    entity: null,\n    number: null,\n    extension: null,\n    originalNumber: null,\n    originalExtension: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    voicemailFile: null,\n    showVoicemailGreetingOptions: false,\n    resetGreeting: false,\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n    pigeonEventHandler: null,\n\n    disableReplaceOverflowBtn: Ember.computed.not('canEditGroupTelephonySettings'),\n\n    disableRingInputs: Ember.computed('editing', 'canEditGroupTelephonySettings', function () {\n        return !this.get('editing') || !this.get('canEditGroupTelephonySettings');\n    }),\n\n    hasExtension: Ember.computed.notEmpty('extension'),\n\n    hasNumber: Ember.computed.notEmpty('number'),\n\n    numberOfRotations: Ember.computed.alias('entity.policy.stopRingingAfterRotations'),\n\n    rotateCallSeconds: Ember.computed.alias('entity.policy.rotateCallsSecs'),\n\n    forwardingOn: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            return DS.PromiseObject.create({\n                promise: this.get('overflowGroup').then(overflowGroup => !!overflowGroup)\n            });\n        },\n\n        set(key, value) {\n            return DS.PromiseObject.create({ promise: Ember.RSVP.resolve(value) });\n        }\n    }),\n\n    routeSelection: Ember.computed('entity.policy.groupAlertType', {\n        get() {\n            return this.get('entity.policy.groupAlertType') !== null\n                ? this.get('entity.policy.groupAlertType')\n                : 'RANDOM';\n        },\n\n        set(key, value) {\n            return this.set('entity.policy.groupAlertType', value);\n        }\n    }),\n\n    overflowGroup: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            let promise;\n            if (!this.get('entity.policy.overflowGroupId')) {\n                promise = Ember.RSVP.resolve(null);\n            } else {\n                promise = this.get('store').findRecord('group', this.get('entity.policy.overflowGroupId'));\n            }\n            return DS.PromiseObject.create({ promise });\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        'haveExtensionError',\n        'duplicateNumberError',\n        function () {\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (this.get('isEmpty')) {\n                return false;\n            }\n\n            if (!this.get('hasNumber')) {\n                return !(this.get('invalidExtension') || this.get('haveExtensionError'));\n            }\n\n            return !this.get('invalidPhoneNumber') && !this.get('duplicateNumberError');\n        }\n    ),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (!this.get('isValid')) {\n            if (this.get('isEmpty')) {\n                return this.get('intl').t('purecloud.callForwarding.missingNumberAndExtension');\n            } else if (this.get('haveNumberAndExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.numberAndExtension');\n            } else if (this.get('invalidExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.invalidExtension');\n            } else if (this.get('haveExtensionError')) {\n                if (this.get('isExtensionNotInPool')) {\n                    return this.get('intl').t('groups.groupRing.extensionError');\n                }\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('duplicateNumberError')) {\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('invalidPhoneNumber')) {\n                return this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidNumberFormat');\n            }\n        }\n    }),\n\n    duplicateNumberError: Ember.computed('entity.number.rel.errorCode', 'number', 'originalNumber', function () {\n        let number = this.get('number');\n        let originalNumber = this.get('originalNumber');\n\n        if (originalNumber && number !== originalNumber) {\n            return false;\n        }\n\n        return this.get('entity.number.rel.errorCode') === 'DUPLICATE_VALUE';\n    }),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if (originalExtension && extension !== originalExtension) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return !!code && code !== 'DUPLICATE_VALUE';\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        if (this.get('hasNumber')) {\n            const elem = this.$('.group-ring-phone-input');\n            if (!_.isEmpty(elem.val())) {\n                return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber', false);\n            }\n        }\n        return false;\n    }),\n\n    inputErrorClass: Ember.computed('haveNumberAndExtension', 'isEmpty', 'invalidPhoneNumber', function () {\n        if (this.get('haveNumberAndExtension') || this.get('isEmpty')) {\n            return 'field-error';\n        }\n\n        if (this.get('invalidPhoneNumber')) {\n            return 'field-warning';\n        }\n\n        return '';\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    routeTypes: Ember.computed(function () {\n        return [\n            {\n                value: 'RANDOM',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.broadcast')\n            },\n            {\n                value: 'SEQUENTIAL',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.sequential')\n            },\n            {\n                value: 'ROUND_ROBIN',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.rotary')\n            }\n        ];\n    }),\n\n    routeSelectionType: Ember.computed('routeSelection', function () {\n        switch (this.get('routeSelection')) {\n            case 'RANDOM':\n                return 'broadcast';\n            case 'SEQUENTIAL':\n                return 'sequential';\n            case 'ROUND_ROBIN':\n                return 'rotary';\n            default:\n                return 'broadcast';\n        }\n    }),\n\n    routeDescription: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeDescriptions.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    selectedRouteType: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeTypes.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    rotateCallsDisplayText: Ember.computed('rotateCallSeconds', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.rotateCalls', { value: this.get('rotateCallSeconds') });\n    }),\n\n    stopRingingDisplayText: Ember.computed('numberOfRotations', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.stopRinging', { value: this.get('numberOfRotations') });\n    }),\n\n    searchText: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.groupSearch');\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.content', {\n        get() {\n            const greeting = this.get('entity.greeting.content');\n            return !!greeting;\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                path = path.concat('/media');\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    displaySpinner: Ember.computed('entity.greeting.isFulfilled', 'waitingOnGreeting', function () {\n        return !this.get('entity.greeting.isFulfilled') || this.get('waitingOnGreeting');\n    }),\n\n    reasons: Ember.computed(\n        'entity.policy.{enabled,sendEmailNotifications,disableEmailPii}',\n        'orgVoicemailPolicy',\n        'session.org',\n        ///\n        function () {\n            return {\n                org: {\n                    isMissing: _.isEmpty(this.get('orgVoicemailPolicy')),\n                    enablesHipaa: this.get('session.org.hasHipaaEnabled'),\n                    // disablesVoicemails: !this.get('orgVoicemailPolicy.enabled'),\n                    // ^^^ NOTE(as-of-writing): This will always be `true` but we ignore it.\n                    disablesEmailNotifications: !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications: this.get('orgVoicemailPolicy.disableEmailPii'),\n                    disablesVMTranscription: !this.get('orgVoicemailPolicy.includeEmailTranscriptions')\n                },\n                group: {\n                    isMissing: _.isEmpty(this.get('entity.policy')),\n                    disablesVoicemails: !this.get('entity.policy.enabled'),\n                    disablesEmailNotifications:\n                        !this.get('entity.policy.sendEmailNotifications') ||\n                        !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications:\n                        this.get('entity.policy.disableEmailPii') || this.get('entity.policy.disableEmailPii')\n                }\n            };\n        }\n    ),\n\n    // NOTE(as-of-writing):\n    //   The property `orgVoicemailPolicy.enabled` exists, but it is unused, uneditable,\n    //   and its default value is `false`. Unless/until the org's setting affects\n    //   group policies or permissions for voicemails, we should ignore it.\n    voicemails: Ember.computed(\n        'entity.policy.enabled',\n        'reasons',\n        ///\n        function () {\n            let show;\n            // Always show it.\n            show = true;\n\n            let disable;\n            if (this.get('reasons.org.isMissing')) {\n                // Disable it if the org's policy is missing.\n                disable = true;\n            } else if (this.get('reasons.group.isMissing')) {\n                // Disable it if the group's policy is missing.\n                disable = true;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                // Disable it if the user cannot edit telephony settings\n                // Should not make it this far as the org policy will be missing\n                disable = true;\n            } else {\n                // Use the inverse of `show`.\n                disable = !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                // Default to `false` if it is disabled.\n                // only default the state to false when disabled and user has access to telephony settings\n                // if user does not have access to telephony settings, we will want to show the actual value\n                // of the voicemail toggle while it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.enabled');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionToggle: Ember.computed(\n        'entity.policy.includeEmailTranscriptions',\n        'reasons',\n        'emailNotifications.state',\n        ///\n        function () {\n            const show = this.get('emailNotifications.state');\n            let disable = false;\n            if (\n                this.get('reasons.org.enablesHipaa') ||\n                this.get('reasons.org.disablesPiiInEmailNotifications') ||\n                this.get('reasons.group.disablesPiiInEmailNotifications') ||\n                this.get('reasons.org.disablesVMTranscription') ||\n                !this.get('canEditGroupTelephonySettings')\n            ) {\n                disable = true;\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.includeEmailTranscriptions');\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionDropDown: Ember.computed(\n        'entity.policy.languagePreference',\n        'reasons',\n        'transcriptionToggle',\n        ///\n        function () {\n            const show = !this.get('transcriptionToggle.disable') && this.get('transcriptionToggle.state');\n            const disable = !this.get('canEditGroupTelephonySettings');\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (!this.get('entity.policy.languagePreference')) {\n                state = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n            } else {\n                state = this._getLanguagePreference(this.get('entity.policy'));\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionLanguages: Ember.computed(\n        'intl.languages',\n        ///\n        function () {\n            const languagesObj = this.get('intl').get('languages');\n            // Populate lanaguagesArr with languages and make the selected language the transcriptionDropDown state\n            return Object.keys(languagesObj).map(key => {\n                return {\n                    key: key,\n                    value: languagesObj[key]\n                };\n            });\n        }\n    ),\n\n    emailNotifications: Ember.computed(\n        'entity.policy.sendEmailNotifications',\n        'reasons',\n        'voicemails',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesVoicemails')) {\n                // Hide it if the group disables voicemails.\n                show = false;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                show = false;\n            } else {\n                // Inherit `voicemails.show`.\n                show = this.get('voicemails.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.disablesEmailNotifications')) {\n                // Disable it if the org disables email notifications.\n                disable = true;\n            } else {\n                // Inherit `voicemails.disable` or use the inverse of `show`.\n                disable = this.get('voicemails.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.sendEmailNotifications');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    piiInEmailNotifications: Ember.computed(\n        'emailNotifications',\n        'entity.policy.disableEmailPii',\n        'reasons',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesEmailNotifications')) {\n                // Hide it if the group disables email notifications.\n                show = false;\n            } else {\n                // Inherit `emailNotifications.show`.\n                show = this.get('emailNotifications.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.enablesHipaa')) {\n                // Disable it if the org enables HIPAA.\n                disable = true;\n            } else if (this.get('reasons.org.disablesPiiInEmailNotifications')) {\n                // Disable it if the org disables PII in email notifications.\n                disable = true;\n            } else {\n                // Inherit `emailNotifications.disable` or use the inverse of `show`.\n                disable = this.get('emailNotifications.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = !this.get('entity.policy.disableEmailPii');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n        this.get('disableSave')(!this.get('isValid'));\n        this.pigeonEventHandler = this.handlePigeonEvent.bind(this);\n        this.registerToPigeonTopic();\n        this.get('pigeon').on('greetings', this, this.pigeonEventHandler);\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        this._setupInputs();\n        this._setupToggleAriaLabels();\n    },\n\n    didUpdateAttrs(...args) {\n        this._super(...args);\n\n        this._setupInputs();\n    },\n\n    willDestroyElement(...args) {\n        this._super(...args);\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n        this.get('pigeon').off('greetings', this.pigeonEventHandler);\n    },\n\n    _getLanguagePreference(policy) {\n        let value = policy.get('languagePreference');\n        if (value === 'en_US') {\n            // backend stores it as en_US but we use en-us\n            value = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n        }\n        return value;\n    },\n\n    // `_setupInputs` is a helper method used exclusively in the lifecycle methods.\n    _setupInputs() {\n        const previousEntity = this.get('_entity');\n        const entity = this.get('entity');\n\n        if (entity !== previousEntity) {\n            Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n            Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n\n            this.set('_entity', entity);\n        }\n    },\n\n    // Set aria-labelledby attributes on toggle switches after DOM is rendered\n    _setupToggleAriaLabels() {\n        Ember.run.once(this, () => {\n            // Map of label IDs to their corresponding toggle switch selectors\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input'\n                },\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                }\n            });\n        });\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n                if (this.attrs.rotationsChanged) {\n                    this.attrs.rotationsChanged(number);\n                }\n            }\n        },\n\n        toggleCallForwarding() {\n            this.set('forwardingOn', !this.get('forwardingOn.content'));\n            if (!this.get('forwardingOn.content')) {\n                this.set('overflowGroup', null);\n            }\n        },\n\n        selectOverflowGroup(group) {\n            this.set('overflowGroup', group);\n        },\n\n        replaceOverflowGroup() {\n            this.set('overflowGroup', null);\n        },\n\n        toggleVoicemails() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.enabled');\n        },\n\n        toggleEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.sendEmailNotifications');\n        },\n\n        togglePiiInEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.disableEmailPii');\n        },\n\n        toggleTranscriptions() {\n            return this.toggleProperty('entity.policy.includeEmailTranscriptions');\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        selectTranscriptionLanguage(event) {\n            this.set('entity.policy.languagePreference', event.target.value);\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableSave(key, value) {\n            this.set(key, value);\n            this.get('disableSave')(value);\n        }\n    },\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        if (!this.get('isValid')) {\n            let badNumber = this.get('invalidPhoneNumber') || this.get('duplicateNumberError');\n            let badExtension =\n                this.get('invalidExtension') || this.get('haveExtensionError') || this.get('haveNumberAndExtension');\n            let isEmpty = this.get('isEmpty');\n            if (badExtension || isEmpty) {\n                this.get('disableSave')(true);\n            } else if (badNumber) {\n                // Don't disable save if the only issue is a bad number\n                this.get('disableSave')(false);\n            } else {\n                // Fall through to disable save\n                this.get('disableSave')(true);\n            }\n        } else {\n            this.get('disableSave')(false);\n        }\n    }),\n\n    editingObserver: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            this.set('voicemailFile', null);\n            this.set('recordingFile', null);\n            this.notifyPropertyChange('overflowGroup');\n            this.notifyPropertyChange('forwardingOn');\n            this.initNumber();\n        }\n    }),\n\n    registerToPigeonTopic() {\n        const groupId = this.get('entity.guid');\n        const groupTopic = `v2.groups.${groupId}.greetings`;\n        this.get('pigeon').registerPriorityTopic(groupTopic);\n    },\n\n    handlePigeonEvent() {\n        this.get('entity').notifyPropertyChange('greeting');\n        this.set('waitingOnGreeting', false);\n    },\n\n    setupInput() {\n        const $input = this.$('.group-ring-phone-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n        $input.intlTelInput(buildIntlTelInputOptions(this.get('intl'), this.get('application')));\n        setupIntlTelInputAccessibility($input, this.get('intl'), fieldName);\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n\n        const number = info && info.number ? info.number : '';\n        const extension = info && info.extension ? info.extension : '';\n\n        inputElem.intlTelInput('setNumber', number);\n        extElem.val(extension);\n        updateSelectedCountryAriaLabel(inputElem, this.get('intl'), fieldName);\n\n        this.set('number', number);\n        this.set('extension', extension);\n\n        this.set('originalNumber', number);\n        this.set('originalExtension', extension);\n    },\n\n    save() {\n        const overflowGroupId = this.get('overflowGroup') === null ? null : this.get('overflowGroup.guid');\n        this.set('entity.policy.overflowGroupId', overflowGroupId);\n\n        this.set('originalExtension', this.get('extension'));\n        if (this.get('voicemailFile') || this.get('recordingFile')) {\n            this.set('waitingOnGreeting', true);\n        }\n\n        if (overflowGroupId === null) {\n            this.set('forwardingOn', false);\n        }\n\n        return {\n            type: 'group-ring-settings',\n            isExtensionResourceInUse: this.get('isExtensionResourceInUse'),\n            isExtensionNotInPool: this.get('isExtensionNotInPool'),\n            recordingFile: this.get('recordingFile'),\n            voicemailFile: this.get('voicemailFile'),\n            resetGreeting: this.get('resetGreeting'),\n            isEmpty: this.get('isEmpty'),\n            callback: this.finishedSaving.bind(this)\n        };\n    },\n\n    finishedSaving(succeeded) {\n        if (succeeded) {\n            this.set('resetGreeting', false);\n        } else {\n            this.set('waitingOnGreeting', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setAriaLabel);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableSave(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    },\n\n    setAriaLabel() {\n        const input = this.$('input');\n\n        if (input && input.length) {\n            // Find the closest parent with contact-info-group class for better context\n            const contactInfoGroup = input.closest('.contact-info-group');\n\n            if (contactInfoGroup && contactInfoGroup.length) {\n                // If contact-info-group doesn't have an ID, create one\n                let groupId = contactInfoGroup.attr('id');\n                if (!groupId) {\n                    groupId = `${this.get('elementId')}-contact-group`;\n                    contactInfoGroup.attr('id', groupId);\n                }\n                input.attr('aria-labelledby', groupId);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MFx2gQuC\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"RL11fJHe\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"number phone-field \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[16,\\\"class\\\",[34,[\\\"group-ring-phone-input form-control \\\",[26,[\\\"inputErrorClass\\\"]]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"extension \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasExtension\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"input\\\",[]],[16,\\\"class\\\",[34,[\\\"group-ring-extension-input form-control\\\\n                        \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"invalidExtension\\\"]],[28,[\\\"haveNumberAndExtension\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"field-error\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[15,\\\"maxLength\\\",\\\"9\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"error-message \\\",[26,[\\\"inputErrorClass\\\"]]]]],[13],[1,[26,[\\\"errorMessage\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-type contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label\\\"],[15,\\\"for\\\",\\\"route-select\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.routeType\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-route-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"selectedRouteType\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\",\\\"disabled\\\",\\\"action\\\"],[\\\"route-select\\\",\\\"form-control\\\",[28,[\\\"routeSelection\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"routeSelection\\\"]]],null]],null]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"routeTypes\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"type\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"type\\\",\\\"translation\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"type\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"routeDescription\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"rotateCallsDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"stopRingingDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflow\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container backup-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-label\\\"],[15,\\\"id\\\",\\\"forward-call-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.forwardCall\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"forwardingOn\\\",\\\"content\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],\\\"toggleCallForwarding\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"forwardingOn\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"overflowGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"disabled\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"groups\\\",[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[28,[\\\"searchText\\\"]],\\\"selectOverflowGroup\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"has-group-number\\\"],[[28,[\\\"result\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowGroupNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-selected\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"overflowGroup\\\"]],false,false]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"disableReplaceOverflowBtn\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"replaceOverflowGroup\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.replace\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"overflow-notice\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowNotice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowDisabled\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"voicemails--input-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"voicemails-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemails.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]],[28,[\\\"voicemails\\\",\\\"disable\\\"]],\\\"toggleVoicemails\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"voicemails--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"voicemails--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label greeting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"displaySpinner\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n\\\\n                                        \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"email-notifications-label\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.label\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]],[28,[\\\"emailNotifications\\\",\\\"disable\\\"]],\\\"toggleEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesEmailNotifications\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification-pii contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"pii-email-notifications-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]],[28,[\\\"piiInEmailNotifications\\\",\\\"disable\\\"]],\\\"togglePiiInEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesPiiInEmailNotifications\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-transcription contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"transcriptions--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"transcriptions-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]],[28,[\\\"transcriptionToggle\\\",\\\"disable\\\"]],\\\"toggleTranscriptions\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"transcriptions--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesVMTranscription\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"transcriptions--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"transcriptionDropDown\\\",\\\"show\\\"]],[28,[\\\"transcriptionLanguages\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"transcriptionDropDown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                    \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"transcriptionDropDown\\\",\\\"state\\\"]],null],[15,\\\"filterable\\\",\\\"true\\\"],[15,\\\"slot\\\",\\\"dropdown\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTranscriptionLanguage\\\"],null],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.dropDown.placeholder\\\"],null]]]],[16,\\\"disabled\\\",[28,[\\\"transcriptionDropDown\\\",\\\"disable\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                        \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"transcriptionLanguages\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"language\\\",\\\"key\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                                    \\\"],[1,[28,[\\\"language\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                                                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"language\\\"]},null],[0,\\\"                                        \\\"]]}],[0,\\\"\\\\n                                    \\\"]]}],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BatchDataRequestMixin from 'connections-ui/mixins/batch-data-requests';\n\nimport { LIST_TYPES } from '../component';\n\nexport default Ember.Component.extend(BatchDataRequestMixin, {\n    classNames: ['ring-sequence'],\n\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    group: null,\n    searchInput: '',\n    searchQuery: '',\n    personSearch: false,\n    sequenceContainer: null,\n    resultsContainer: null,\n    resizeListener: null,\n    isSequential: false,\n    displayIndices: false,\n    editing: false,\n    listDirty: false,\n    ringRotations: null,\n    listType: null,\n\n    owners: Ember.computed.reads('group.owners.owners'),\n    individuals: Ember.computed.reads('group.individuals.individuals'),\n\n    _editing: false,\n\n    isOwners: Ember.computed.equal('listType', LIST_TYPES.OWNERS),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.sequenceContainer = this.$('.sequence-container');\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n    },\n\n    didUpdateAttrs() {\n        const editing = this.get('editing');\n        const cachedEditing = this.get('_editing');\n        if (editing !== cachedEditing) {\n            this.set('_editing', editing);\n            this.notifyPropertyChange('owners');\n            this.notifyPropertyChange('individuals');\n        }\n    },\n\n    sequenceList: Ember.computed('isOwners', 'individualsSequenceList.[]', 'ownersSequenceList.[]', function () {\n        return this.get('isOwners') ? this.get('ownersSequenceList') : this.get('individualsSequenceList');\n    }),\n\n    individualsSequenceList: Ember.computed('individuals.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('individuals') || [])\n        });\n    }),\n\n    ownersSequenceList: Ember.computed('owners.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('owners') || [])\n        });\n    }),\n\n    renderedList: Ember.computed(\n        'sequenceList.[]',\n        'individualsSequenceList.[]',\n        'ownersSequenceList.[]',\n        'ringRotations',\n        function () {\n            return DS.PromiseArray.create({\n                promise: this._appendRotationListData()\n            });\n        }\n    ),\n\n    searchLabel: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.ownersSearch');\n        } else {\n            return this.get('intl').t('groups.groupRing.membersSearch');\n        }\n    }),\n\n    searchPlaceholder: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.searchPlaceholderOwners');\n        } else {\n            return this.get('intl').t('groups.groupRing.searchPlaceholder');\n        }\n    }),\n\n    addMemberPlaceholder: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.addMemberPlaceholder');\n    }),\n\n    clearSearch: Ember.observer('editing', function () {\n        this.set('searchInput', '');\n        this.set('searchQuery', '');\n    }),\n\n    actions: {\n        inputEntered() {\n            Ember.run.throttle(this, this._updateSearchQuery, 500, false);\n        },\n\n        togglePersonSearch() {\n            this.toggleProperty('personSearch');\n            this.handleListeners();\n        },\n\n        addPerson(person) {\n            return this.get('sequenceList').then(sequenceList => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                const index = sequenceList.get('length') + 1;\n                const listItem = Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: index\n                });\n                this.set('personSearch', false);\n                sequenceList.pushObject(listItem);\n                sequenceList.set('lastObject.scrollIntoView', true);\n                this.set('listDirty', true);\n            });\n        },\n\n        listModified() {\n            this.set('listDirty', true);\n        }\n    },\n\n    handleListeners() {\n        if (this.get('personSearch')) {\n            Ember.run.scheduleOnce('afterRender', this, () => {\n                this._attachListeners();\n                this._handleResizeEvent();\n            });\n        } else {\n            Ember.run.scheduleOnce('afterRender', this, this._removeListeners);\n        }\n    },\n\n    save() {\n        this.set('personSearch', false);\n\n        const owners = this.get('ownersSequenceList');\n        const individuals = this.get('individualsSequenceList');\n\n        return {\n            type: 'ring-sequence',\n            individuals: individuals.then(people => people.mapBy('person.id')),\n            owners: owners.then(people => people.mapBy('person.id'))\n        };\n    },\n\n    _appendRotationListData() {\n        return this.get('sequenceList').then(sequenceList => {\n            const ringRotations = this.get('ringRotations');\n            const listLength = sequenceList.get('length');\n            if (ringRotations !== null) {\n                sequenceList.forEach((listModel, index) => {\n                    listModel.setProperties({\n                        beginningOutOfRange: index === ringRotations,\n                        outOfRange: index >= ringRotations,\n                        endOutOfRange: index > ringRotations - 1 && index === listLength - 1,\n                        popupDismissed: false\n                    });\n                });\n            }\n            return sequenceList;\n        });\n    },\n\n    _sequenceListForPeople(people) {\n        const batchPromises = people.map(person => this.getUser(person.guid || person.value));\n        return Ember.RSVP.all(batchPromises).then(personArray => {\n            return personArray.map((person, index) => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                return Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: ++index\n                });\n            });\n        });\n    },\n\n    _updateSearchQuery() {\n        this.set('searchQuery', this.get('searchInput'));\n    },\n\n    _attachListeners() {\n        this.resizeListener = Ember.$(window).on(`resize.${this.get('elementId')}`, () => {\n            Ember.run.throttle(this, this._handleResizeEvent, 100, false);\n        });\n        this.resultsContainer = this.$('.results-container');\n    },\n\n    _removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n        this.resultsContainer = null;\n    },\n\n    _handleResizeEvent() {\n        const height = this.sequenceContainer.height();\n        this.resultsContainer.css('height', `${height - 4}px`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Mc0I3uIH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"list-search \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link add-person \\\",[33,[\\\"if\\\"],[[28,[\\\"personSearch\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePersonSearch\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-invite-user\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addOwner\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addMember\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"input-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-person-search\\\"]]],[13],[1,[26,[\\\"searchLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"type\\\",\\\"value\\\",\\\"key-up\\\",\\\"placeholder\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-person-search\\\"],null],\\\"search-input\\\",\\\"text\\\",[28,[\\\"searchInput\\\"]],\\\"inputEntered\\\",[28,[\\\"searchPlaceholder\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"people\\\",[28,[\\\"addMemberPlaceholder\\\"]],\\\"addPerson\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"can-add-group-ring-member\\\"],[[28,[\\\"result\\\"]],[28,[\\\"sequenceList\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.memberNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sequence-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-profile/group-list\\\"],null,[[\\\"groupList\\\",\\\"searchQuery\\\",\\\"editing\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"listType\\\",\\\"listModified\\\"],[[28,[\\\"renderedList\\\"]],[28,[\\\"searchQuery\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"listModified\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-help\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inviteHelp\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"owners-note\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.ownersAsMembers\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"TD8PPWDT\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-content-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-left-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tab-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owners active\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"owners\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owners\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owners\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-members\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#members\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.members\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/ring-sequence\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"displayIndices\\\",\\\"isSequential\\\",\\\"ringRotations\\\",\\\"personSearch\\\",\\\"listType\\\",\\\"appendSave\\\",\\\"removeSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"ringRotations\\\"]],[28,[\\\"personSearch\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-right-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings\\\"],null,[[\\\"entity\\\",\\\"orgVoicemailPolicy\\\",\\\"canEditGroupTelephonySettings\\\",\\\"editing\\\",\\\"appendSave\\\",\\\"removeSave\\\",\\\"disableSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"orgVoicemailPolicy\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-wrapper\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport Fuse from 'npm:fuse.js';\n\nimport { LIST_TYPES } from '../group-contact-panel/component';\n\nconst fuseOptions = {\n    shouldSort: false,\n    threshold: 0.4,\n    location: 0,\n    distance: 100,\n    maxPatternLength: 32,\n    minMatchCharLength: 1,\n    keys: ['person.name'],\n    getFn(obj, path) {\n        return obj.get(path);\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['group-list'],\n\n    groupList: null,\n    selectedIndex: null,\n    searchQuery: '',\n    editing: false,\n    displayIndices: true,\n    listType: null,\n\n    queryAvailable: Ember.computed.gt('searchQuery.length', 0),\n\n    searchResults: Ember.computed('groupList', 'searchQuery', function () {\n        if (this.get('queryAvailable')) {\n            return DS.PromiseArray.create({\n                promise: this.get('groupList').then(data => new Fuse(data, fuseOptions).search(this.get('searchQuery')))\n            });\n        }\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve(Ember.A([]))\n        });\n    }),\n\n    renderedList: Ember.computed('searchResults.[]', 'groupList.[]', 'queryAvailable', function () {\n        if (this.get('queryAvailable')) {\n            return this.get('searchResults');\n        }\n        return this.get('groupList');\n    }),\n\n    canRemove: Ember.computed('renderedList.[]', 'listType', function () {\n        if (this.get('listType') !== LIST_TYPES.OWNERS) {\n            return true;\n        }\n        return this.get('renderedList.length') > 1;\n    }),\n\n    actions: {\n        removeItem(index) {\n            if (!this.get('canRemove')) {\n                return;\n            }\n\n            this.get('groupList').removeAt(index - 1);\n            this._recalculateIndices();\n            this.notifyParentOfListChange();\n        },\n\n        changePosition(from, to) {\n            Ember.run.debounce(this, this.changePosition, from, to, 100);\n        }\n    },\n\n    notifyParentOfListChange() {\n        if (this.attrs.listModified) {\n            this.attrs.listModified();\n        }\n    },\n\n    changePosition(from, to) {\n        this._changePosition(from, to);\n\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        this.set('selectedIndex', null);\n        this.notifyParentOfListChange();\n    },\n\n    _recalculateIndices() {\n        this.get('groupList').map((listModel, index) => {\n            listModel.set('index', ++index);\n        });\n    },\n\n    _changePosition(from, to) {\n        if (!Number.isInteger(to)) {\n            return;\n        }\n        const groupList = this.get('groupList');\n        to = Math.min(to, groupList.get('length'));\n        to = Math.max(to, 1);\n\n        groupList.then(groupArray => {\n            const item = groupArray.get(from - 1);\n            groupArray.removeAt(from - 1);\n            groupArray.insertAt(to - 1, item);\n            this._recalculateIndices();\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nexport default Ember.Component.extend({\n    classNames: ['list-item'],\n    classNameBindings: ['editing', 'outOfRotationRange:out-of-range', 'listModel.scrollIntoView:highlight'],\n\n    intl: Ember.inject.service(),\n\n    isSequential: false,\n    displayIndices: true,\n    listModel: null,\n    input_value: null,\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            pin: true\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    hovercardArrowOffset: 24,\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('listModel.scrollIntoView')) {\n            this.scrollIntoView();\n        }\n    },\n\n    index: Ember.computed.reads('listModel.index'),\n\n    outOfRotationRange: Ember.computed.and('listModel.outOfRange', 'isSequential'),\n\n    displayRotationRangePopup: Ember.computed(\n        'listModel.beginningOutOfRange',\n        'listModel.popupDismissed',\n        'isSequential',\n        'editing',\n        function () {\n            return (\n                this.get('listModel.beginningOutOfRange') &&\n                this.get('isSequential') &&\n                !this.get('listModel.popupDismissed') &&\n                this.get('editing')\n            );\n        }\n    ),\n\n    position: Ember.computed('index', function () {\n        return `${this.get('index')}.`;\n    }),\n\n    role: Ember.computed('listModel.isOwner', function () {\n        if (this.get('listModel.isOwner')) {\n            return this.get('intl').t('groups.memberTypes.owner');\n        }\n        return this.get('intl').t('groups.memberTypes.individual');\n    }),\n\n    newIndex: Ember.computed('input_value', function () {\n        return parseInt(this.get('input_value'));\n    }),\n\n    popupTarget: Ember.computed('elementId', function () {\n        return `list-item-popup-${this.elementId}`;\n    }),\n\n    actions: {\n        indexChanged() {\n            this.changeIndex();\n        },\n        dismissPopup() {\n            this.set('listModel.popupDismissed', true);\n        },\n        setIndexChanged(event) {\n            if (eventToString(event) !== 'ENTER') {\n                const value = parseInt(event.target.value, 10);\n                if (!isNaN(value)) {\n                    this.set('newIndex', value);\n                }\n            }\n        },\n        submitIndexChange(event) {\n            if (eventToString(event) === 'ENTER') {\n                this.changeIndex();\n            }\n        }\n    },\n\n    changeIndex() {\n        this.attrs.changePosition(this.get('index'), this.get('newIndex'));\n        this.set('input_value', null);\n    },\n\n    scrollIntoView() {\n        const parent = this.$().parent();\n        const scrollHeight = parent.prop('scrollHeight');\n        parent.animate(\n            {\n                scrollTop: scrollHeight\n            },\n            1000\n        );\n        Ember.run.later(\n            this,\n            () => {\n                this.set('listModel.scrollIntoView', false);\n            },\n            5000\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WWNJD4ST\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayIndices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[15,\\\"class\\\",\\\"input\\\"],[16,\\\"placeholder\\\",[26,[\\\"index\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"index\\\"]],null],[16,\\\"value\\\",[26,[\\\"input_value\\\"]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"indexChanged\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"submitIndexChange\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setIndexChanged\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[1,[26,[\\\"position\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"enableMiniCard\\\"],[[28,[\\\"listModel\\\",\\\"person\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"listModel\\\",\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-right-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null],\\\"disabled\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"removeItem\\\"]],[28,[\\\"index\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.cannotRemoveAllOwners\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRotationRangePopup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"ember-tether\\\"],null,[[\\\"target\\\",\\\"targetAttachment\\\",\\\"attachment\\\",\\\"constraints\\\",\\\"classPrefix\\\",\\\"offset\\\"],[[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]]],null],\\\"top center\\\",\\\"bottom center\\\",[28,[\\\"tetherConstraints\\\"]],\\\"list-item-popup-tether\\\",[28,[\\\"hovercardOffset\\\"]]]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"popupTarget\\\"]]]]],[15,\\\"class\\\",\\\"list-item-popup\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-triangle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-description\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.popupDescription\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"dismissPopup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/list-item/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"ul9Fm8yu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"renderedList\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/group-list/list-item\\\"],null,[[\\\"editing\\\",\\\"listModel\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"canRemove\\\",\\\"removeItem\\\",\\\"changePosition\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"listModel\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"canRemove\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeItem\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"changePosition\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"listModel\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-entry'],\n\n    chat: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    attrs: {\n        person: null,\n        group: null,\n        individuals: [],\n        editing: false,\n        membership: [],\n        deletePerson: ''\n    },\n\n    actions: {\n        deletePerson() {\n            const group = this.get('group');\n            const person = this.get('person');\n            if (group.isPersonOwner(person) && this.get('group.owners.owners.length') === 1) {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.noOwners');\n                this.get('notification').info(title, message);\n            } else {\n                this.sendAction('deletePerson', person, this.get('memberTypeList'));\n            }\n        },\n\n        handleDeleteKeyDown(event) {\n            if (event.key === 'Enter' || event.key === ' ') {\n                event.preventDefault();\n                this.send('deletePerson');\n            }\n        }\n    },\n\n    showChat: computed('isLoggedInUser', 'chat.enabled', function () {\n        return !this.get('isLoggedInUser') && this.get('chat.enabled');\n    }),\n\n    isLoggedInUser: computed('person', 'session.person', function () {\n        const person = this.get('person');\n        const sessionPerson = this.get('session.person');\n        return person.get('id') === sessionPerson.get('id');\n    }),\n\n    cannotDeleteMember: computed('isLoggedInUser', 'group.owners.owners.@each.value', function () {\n        const person = this.get('person');\n        const group = this.get('group');\n        const isOwnerAndSelf = group.isPersonOwner(person) && this.get('isLoggedInUser');\n        const multipleOwners = group.get('owners.owners.length') > 1;\n        return isOwnerAndSelf && !multipleOwners;\n    }),\n\n    canViewRules: computed('group.membershipVisible', 'session.person', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return true;\n        }\n\n        const group = this.get('group');\n        const person = this.get('session.person');\n        const visible = this.get('group.membershipVisible');\n        const namedPermissions = person.get('namedPermissions');\n        const hasPermissions = namedPermissions.includes('admin') || namedPermissions.includes('group_administration');\n        if (!visible) {\n            return hasPermissions || group.isPersonOwner(person);\n        }\n        return true;\n    }),\n\n    memberType: computed('person', 'group', 'isCurrentMember', 'individuals.[]', 'group.isDynamicGroup', function () {\n        const intl = this.get('intl');\n        const group = this.get('group');\n        const person = this.get('person');\n        const individuals = this.get('individuals');\n        let translation = intl.lookup('common.removed');\n        if (this.get('isCurrentMember')) {\n            if (group.isPersonOwner(person)) {\n                translation = intl.lookup('groups.memberTypes.owner');\n            } else if (_.includes(individuals, person) || group.isPersonIndividual(person)) {\n                translation = intl.lookup('groups.memberTypes.individual');\n            } else if (this.get('group.isDynamicGroup')) {\n                translation = intl.lookup('groups.memberTypes.dynamic');\n            } else {\n                translation = intl.lookup('groups.memberTypes.rule');\n            }\n        }\n        return translation.toString();\n    }),\n\n    memberTypeList: computed('person', 'group', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        const paths = [];\n        if (group.isPersonOwner(person)) {\n            paths.push('owner');\n        }\n        if (group.isPersonIndividual(person)) {\n            paths.push('individual');\n        }\n        return paths;\n    }),\n\n    isRule: computed('person', 'group', 'isAddedIndividual', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        return !group.isPersonOwner(person) && !group.isPersonIndividual(person) && !this.get('isAddedIndividual');\n    }),\n\n    isLinkable: computed.not('editing'),\n    isAddedIndividual: computed('person', 'individuals.[]', 'membership.[]', function () {\n        const id = this.get('person.id');\n        const membership = this.get('membership').mapBy('guid');\n        return _.includes(membership, id);\n    }),\n\n    isCurrentMember: computed(\n        'group.owners.owners.@each.value',\n        'group.individuals.individuals.@each.value',\n        'isAddedIndividual',\n        function () {\n            const group = this.get('group');\n            const person = this.get('person');\n            return group.isPersonOwner(person) || group.isPersonIndividual(person) || this.get('isAddedIndividual');\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachTooltip();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.delete').tooltip('destroy');\n    },\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (newAttrs.editing.value !== oldAttrs.editing.value) {\n            this.attachTooltip();\n        }\n    },\n\n    attachTooltip() {\n        Ember.run.scheduleOnce('afterRender', () => {\n            if (this.get('editing') && this.get('isRule')) {\n                this.$('.delete').tooltip({\n                    title: this.get('intl').lookup('groups.cannotRemoveRuleEntry').toString(),\n                    placement: 'left'\n                });\n            }\n        });\n    },\n\n    click(event) {\n        const target = Ember.$(event.target);\n        if (target.is('.person-name')) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.get('person')]\n            });\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"4MOmVGd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"isLinkable\\\"],[[28,[\\\"person\\\"]],true,[28,[\\\"isLinkable\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"member-type \\\",[33,[\\\"unless\\\"],[[28,[\\\"isCurrentMember\\\"]],\\\"removed\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"memberType\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"member-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\",\\\"shouldTether\\\"],[[28,[\\\"person\\\"]],[28,[\\\"showChat\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"delete danger \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRule\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cannotDeleteMember\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleDeleteKeyDown\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deletePerson\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-entry/template.hbs\"}});","import Ember from 'ember';\nimport request from 'ember-ajax';\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport JobMixin from '../../../mixins/job';\nimport PagingMixin from '../../../mixins/paging';\nimport { BASE_PERSON } from '../../../models/person';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { set, get, inject, computed, observer, Component } = Ember;\n\nfunction equals(field, value, intl) {\n    return {\n        displayClassification: intl.lookup(field),\n        type: 'equals',\n        key: field,\n        value: value\n    };\n}\n\nfunction personQuery(rels, person) {\n    return {\n        rels: rels,\n        type: 'relationship',\n        value: person.get('_id') || person.get('id'),\n        guid: person.get('guid') || person.get('id'),\n        entity: 'people'\n    };\n}\n\nexport default Component.extend(PagingMixin, JobMixin, LoggerMixin, {\n    classNames: ['group-membership-listing', 'content'],\n    classNameBindings: ['editing', 'hunt-groups'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n    searchService: inject.service('search'),\n\n    phoneEnabled: computed.reads('permissions.phoneEnabled'),\n    group: null,\n    entityType: 'person',\n    fieldList: BASE_PERSON.fl,\n\n    filterChoices: [\n        {\n            key: 'all',\n            string: 'groups.dropdown.all',\n            active: false,\n            path: null\n        },\n        {\n            key: 'individuals',\n            string: 'groups.dropdown.individuals',\n            active: true,\n            path: 'individuals.individuals'\n        },\n        {\n            key: 'owners',\n            string: 'groups.dropdown.owners',\n            active: false,\n            path: 'owners.owners'\n        },\n        {\n            key: 'rules',\n            string: 'groups.dropdown.rules',\n            active: false,\n            path: null\n        }\n    ],\n\n    inclusionFilter: {\n        key: 'inclusions',\n        string: 'group_membership_inclusions_labelKey_inclusions',\n        active: false,\n        path: 'membership.inclusions'\n    },\n\n    exclusionFilter: {\n        key: 'exclusions',\n        string: 'group_membership_exclusions_labelKey_exclusions',\n        active: false,\n        path: 'membership.exclusions'\n    },\n\n    filter: null,\n    search: null,\n    editing: false,\n    showRules: false,\n    saving: false,\n    loadedAll: false,\n    loading: null,\n    ignoreScroll: false,\n    rateLimited: false,\n\n    currentlySearching: false,\n    currentMembershipRequest: null,\n    membershipQuery: null,\n\n    membership: null,\n    memberListLimitSize: 20,\n    retryTimeout: null,\n    retyTimeOutDuration: 10000,\n\n    actions: {\n        toggleRules() {\n            this.toggleProperty('showRules');\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            Ember.set(this, 'loadedAll', false);\n            if (this.get('showRules')) {\n                Ember.set(this, 'filter', this.inclusionFilter);\n            } else {\n                Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n            }\n            this.updateContentOnChange();\n        },\n\n        selectFilter(filter) {\n            this.set('ignoreScroll', true);\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'membership', []);\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', filter);\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'loadedAll', false);\n\n            this.updateContentOnChange();\n        },\n\n        updateSearch(search) {\n            Ember.set(this, 'search', search);\n            this.searchCriteriaChanged();\n        },\n\n        editMembership() {\n            Ember.set(this, 'editing', true);\n            Ember.set(this, 'showRules', false);\n            Ember.set(this, 'loadedAll', false);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'owners'));\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'membership', []);\n            this.updateContentOnChange();\n            Ember.run.scheduleOnce('afterRender', () => {\n                Ember.$('.add-member input').trigger('focus');\n            });\n            this.sendAction('changeEditing', true);\n        },\n\n        selectTab(tab) {\n            this.bubbleAction({\n                action: 'selectTab',\n                actionContext: tab\n            });\n        },\n\n        selectKeyword(keyword) {\n            this.addKeyword(keyword);\n        },\n\n        selectPerson(person) {\n            this.addPerson(person);\n        },\n\n        removeRule(rule) {\n            this.removeRule(rule);\n        },\n\n        removePerson(person, memberTypeList) {\n            this.removePerson(person, memberTypeList);\n        },\n\n        save() {\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'saving', true);\n            const application = this.get('application');\n            const group = this.get('group');\n            const addedIndividuals = this.get('addedIndividuals');\n            const removedIndividuals = this.get('removedIndividuals');\n            this.setRulesOnGroup();\n            group\n                .save()\n                .then(res => {\n                    const job = Ember.get(res, 'meta.job');\n                    if (job && job.jobId) {\n                        this.addJob(\n                            job,\n                            () => {\n                                this.handleJobFinish();\n                            },\n                            this\n                        );\n                    } else {\n                        return this.get('loadAll').perform();\n                    }\n                })\n                .then(() => this.saveIndividuals(group, addedIndividuals, application))\n                .then(() => this.deleteIndividuals(group, removedIndividuals, application))\n                .then(() => this.reload())\n                .then(() => {\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    this.sendAction('changeEditing', false);\n\n                    Ember.set(this, 'addedIndividuals', []);\n                    Ember.set(this, 'removedIndividuals', []);\n                    Ember.set(this, 'membershipQuery.offset', 0);\n\n                    Ember.set(this, 'loading', {\n                        add: false,\n                        search: false\n                    });\n\n                    this.setProperties({\n                        saving: false,\n                        editing: false,\n                        currentPage: 0,\n                        loadedAll: false\n                    });\n\n                    Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n                })\n                .then(() => {\n                    // Membership count is eventually consistent...\n                    // Check for membership count after some seconds...\n                    Ember.run.later(() => {\n                        this.reload();\n                    }, 5000);\n                })\n                .catch(err => {\n                    this.logger.error('There was an error saving the group', {\n                        err\n                    });\n\n                    const title = group.get('name');\n                    const message = this.get('intl').t('notification.group.saveError');\n                    this.get('notification').error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    Ember.set(this, 'saving', false);\n                });\n        },\n\n        cancel() {\n            const group = this.get('group');\n\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'editing', false);\n            Ember.set(this, 'loading.search', true);\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n\n            group.reload().then(() => {\n                group.rollbackAttributes();\n\n                Ember.set(this, 'loading.search', false);\n                Ember.set(this, 'membershipQuery.offset', 0);\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n\n                this.initMembership();\n                this.get('loadAll').perform();\n\n                this.sendAction('changeEditing', false);\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initMembership();\n\n        this.set('filter', _.head(this.filterChoices));\n        this.set('membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.set('loading', {\n            add: false,\n            search: false\n        });\n\n        this.loadMembershipList().then(() => Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit));\n        this.get('reloadPageOnGroupChange').perform();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').on(\n            'scroll',\n            Ember.run.bind(this, () => this.get('loadContentOnScroll').perform())\n        );\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.membership-listing').off('scroll');\n\n        if (this.get('retryTimeout')) {\n            Ember.run.cancel(timeout);\n        }\n    },\n\n    inclusionQueries: computed('group.membership.inclusions.[]', 'inclusions.[]', function () {\n        const addedInclusions = _.map(this.get('inclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.inclusions').concat(addedInclusions);\n    }),\n\n    exclusionQueries: computed('group.membership.exclusions.[]', 'exclusions.[]', function () {\n        const addedExclusions = _.map(this.get('exclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.exclusions').concat(addedExclusions);\n    }),\n\n    membershipRules: computed('filter.key', 'inclusionQueries', 'exclusionQueries', 'shouldShowRules', function () {\n        if (!this.get('shouldShowRules')) {\n            return;\n        }\n        const key = this.get('filter.key');\n        if (key === 'inclusions') {\n            return this.get('inclusionQueries');\n        }\n        if (key === 'exclusions') {\n            return this.get('exclusionQueries');\n        }\n    }),\n\n    canEdit: computed(\n        'group.id',\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.canEditGroups');\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.isOwner(person) ||\n                this.get('permissions.canEditGroups')\n            );\n        }\n    ),\n\n    canViewRules: computed('canEdit', 'group.membershipVisible', 'group.isDynamicGroup', function () {\n        return !this.get('group.isDynamicGroup') && (this.get('canEdit') || this.get('group.membershipVisible'));\n    }),\n\n    isEditingRules: computed('filter.key', 'editing', function () {\n        const key = this.get('filter.key');\n        return (key === 'inclusions' || key === 'exclusions') && this.get('editing');\n    }),\n\n    expressionDisplay: Ember.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.get('intl').t('groups.expressions.empty');\n        }\n\n        expression.forEach(con => {\n            let display = '(';\n            let orWrap = false;\n\n            con.rules.forEach(rule => {\n                let valid = !!rule.skill && !!rule.comparator && !isNaN(rule.proficiency.value);\n                if (valid) {\n                    display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n                    if (rule.lastRule) {\n                        display += ')';\n                    } else if (!rule.opAnd) {\n                        display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                        orWrap = true;\n                    } else {\n                        display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                    }\n                } else {\n                    invalid = true;\n                }\n            });\n\n            if (orWrap) {\n                display = `(${display})`;\n            }\n\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n            output += display;\n        });\n\n        let empty = output.replaceAll('(', '').replaceAll(')', '').trim() === 0;\n\n        if (invalid) {\n            output = this.get('intl').t('groups.expressions.invalid');\n        } else if (empty) {\n            //has no valid rules\n            output = this.get('intl').t('groups.expressions.empty');\n        }\n        return output;\n    }),\n\n    displayEditingFooter: Ember.computed('group.allowPermissionGroup', 'filter.key', 'editing', function () {\n        const isEditingRules = this.get('isEditingRules');\n        const rolesEnabled = this.get('group.allowPermissionGroup');\n        const editing = this.get('editing');\n        if (!editing) {\n            return false;\n        } else {\n            return !(rolesEnabled && isEditingRules);\n        }\n    }),\n\n    isSearching: computed('search', function () {\n        return !_.isEmpty(this.get('search'));\n    }),\n\n    shouldShowRules: computed.or('isEditingRules', 'showRules'),\n\n    showingFilterChoices: computed('filterChoices.[]', 'shouldShowRules', 'group.isDynamicGroup', function () {\n        if (this.get('shouldShowRules') && !this.get('group.isDynamicGroup')) {\n            return [this.inclusionFilter, this.exclusionFilter];\n        } else if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key !== 'rules' && choice.key !== 'individuals';\n            });\n        }\n        return this.get('filterChoices');\n    }),\n\n    editingFilterChoices: computed('filterChoices.[]', 'group.isDynamicGroup', function () {\n        const choices = this.get('filterChoices').filter(choice => {\n            return choice && choice.key !== 'all' && choice.key !== 'rules';\n        });\n        if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key === 'owners';\n            });\n        } else {\n            return choices.concat([this.inclusionFilter, this.exclusionFilter]);\n        }\n    }),\n\n    dropdownTitle: computed('filter', function () {\n        const filter = this.get('filter');\n        return this.get('intl').lookup(filter.string).toString();\n    }),\n\n    membershipCount: computed('membership.length', 'group.memberCount', function () {\n        const memberCount = this.get('group.memberCount');\n        let promise = Ember.RSVP.resolve(memberCount);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    membershipHeader: computed('membershipCount', 'membershipCount.isFulfilled', function () {\n        const count = this.get('membershipCount.content') || 0;\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    extraParams: computed('group.{generalSearchQuery,membershipSearchQuery}', 'search', 'filter', function () {\n        const search = this.get('search');\n        const filter = this.get('filter');\n        const generalQuery = this.get('group.generalSearchQuery');\n        const membershipQuery = this.get('group.membershipSearchQuery');\n        let queryGroup = [];\n        if (search) {\n            queryGroup.push(search);\n        }\n        if (generalQuery) {\n            queryGroup.push(generalQuery);\n        }\n        if (membershipQuery && filter && filter.key === 'rules') {\n            queryGroup.push(membershipQuery);\n        }\n\n        return { q: queryGroup.join(' AND ') };\n    }),\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'group.value.id') !== get(oldAttrs, 'group.value.id')) {\n            this.cancelEditOnGroupChange();\n            this.get('reloadPageOnGroupChange').perform(true);\n        }\n    },\n\n    debouncedSearchCriteriaChanged: task(function* () {\n        yield timeout(400);\n        Ember.run(() => {\n            const search = this.get('search');\n            if (_.isEmpty(search)) {\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n                this.updateContentOnChange();\n            } else {\n                this.get('loadRules').perform();\n            }\n        });\n    }).drop(),\n\n    cancelEditOnGroupChange() {\n        Ember.set(this, 'editing', false);\n        this.sendAction('changeEditing', false);\n    },\n\n    reloadPageOnGroupChange: task(function* (loadMore = false) {\n        if (!this.get('group.id')) {\n            return;\n        }\n\n        this.initMembership();\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        Ember.set(this, 'filter', this.get('filterChoices.0'));\n        Ember.set(this, 'search', '');\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n\n        yield this.updateContentOnChange();\n\n        if (loadMore) {\n            Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit);\n        }\n    }),\n\n    updateContentOnChange() {\n        const filter = this.get('filter');\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        switch (filter.key) {\n            case 'owners':\n                return this.get('loadOwners').perform();\n            case 'individuals':\n                return this.get('loadIndividuals').perform();\n            case 'rules':\n                return this.get('loadRules').perform();\n            case 'inclusions':\n            case 'exclusions':\n                return function () {};\n            default:\n                return this.get('loadAll').perform();\n        }\n    },\n\n    searchCriteriaChanged() {\n        this.get('debouncedSearchCriteriaChanged').perform();\n    },\n\n    reload() {\n        this.get('group')\n            .reload()\n            .then(() => this.reloadPageOnGroupReload());\n    },\n\n    reloadPageOnGroupReload() {\n        if (this.get('group.isReloading')) {\n            return;\n        }\n        Ember.set(this, 'loading.search', false);\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.updateContentOnChange();\n    },\n\n    pageChanged: observer('page', function () {\n        this.get('page').then(() => {\n            Ember.set(this, 'loading.search', false);\n        });\n    }),\n\n    initMembership() {\n        Ember.set(this, 'addedIndividuals', []);\n        Ember.set(this, 'removedIndividuals', []);\n        Ember.set(this, 'inclusions', []);\n        Ember.set(this, 'exclusions', []);\n        Ember.set(this, 'membership', []);\n    },\n\n    _individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const ids = [];\n        individuals.map(i => ids.push(`${i.id}`));\n\n        let url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n        if (method.toLowerCase() === 'post') {\n            return request(url, {\n                data: {\n                    memberIds: ids,\n                    version: group.get('version')\n                },\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        } else if (method.toLowerCase() === 'delete') {\n            url = url.concat('?ids=', ids);\n            return request(url, {\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    },\n\n    saveIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'delete');\n    },\n\n    loadOwners: task(function* () {\n        yield this.loadPathFieldMembers('owners.owners');\n    }).drop(),\n\n    loadIndividuals: task(function* () {\n        yield this.loadPathFieldMembers('individuals.individuals');\n        const addedIndividuals = this.get('addedIndividuals');\n        const membership = this.get('membership');\n\n        if (membership) {\n            membership.addObjects(addedIndividuals);\n        }\n    }).drop(),\n\n    addKeyword(keyword) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const query = equals(keyword.field, keyword.value, this.get('intl'));\n        const data = {\n            q: [query],\n            entity: ['people']\n        };\n        const path = `membership.${key}`;\n        group.set(path, data);\n    },\n\n    addPerson(person) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const data = person.get('id');\n        if (key === 'owners' && !this.isOwner(person)) {\n            group.set('owners.owners', data);\n            const latestAdded = group.get('owners.owners').findBy('value', data);\n            if (latestAdded) {\n                Ember.set(latestAdded, 'guid', data);\n            }\n            this.get('loadOwners').perform();\n        } else if (key === 'individuals' && !this.isIndividual(person)) {\n            const addedIndividuals = this.get('addedIndividuals');\n            if (addedIndividuals) {\n                addedIndividuals.addObject(person);\n            }\n            const removedIndividuals = this.get('removedIndividuals');\n            if (removedIndividuals) {\n                removedIndividuals.removeObject(person);\n            }\n            const membership = this.get('membership');\n            if (membership) {\n                membership.addObject(person);\n            }\n\n            this.get('loadIndividuals').perform();\n        } else if (key === 'inclusions' || key === 'exclusions') {\n            const addedRules = this.get(key);\n            const query = personQuery(['self'], person);\n            const data = {\n                q: [query],\n                entity: ['people']\n            };\n            addedRules.addObject(data);\n        }\n    },\n\n    removePerson(person, memberTypeList) {\n        if (_.isEmpty(memberTypeList)) {\n            memberTypeList = [singularize(this.get('filter.key'))];\n        }\n        memberTypeList.forEach(type => {\n            let path = null;\n            const currentFilter = this.get('filter').path;\n\n            if (type === 'owner') {\n                path = 'owners.owners';\n            }\n\n            if (currentFilter === 'individuals.individuals') {\n                // it is possible that an owner can also be an individual\n                path = 'individuals.individuals';\n                const removedIndividuals = this.get('removedIndividuals');\n                if (removedIndividuals) {\n                    removedIndividuals.addObject(person);\n                }\n                const addedIndividuals = this.get('addedIndividuals');\n                if (addedIndividuals) {\n                    addedIndividuals.removeObject(person);\n                }\n            }\n\n            if (!path) {\n                return;\n            }\n\n            const group = this.get('group');\n            const id = person.get('id');\n            const values = group.getFieldValue(path);\n            const index = _.findIndex(values, value => {\n                if (value.value.q) {\n                    const q = _.head(value.value.q);\n                    return q.value === id || q.guid === id;\n                }\n                return value.value === id || value.guid === id;\n            });\n            if (index > -1) {\n                values.removeAt(index);\n                group.notifyPropertyChange(path);\n            }\n        });\n\n        const membership = this.get('membership');\n        if (membership) {\n            membership.removeObject(person);\n        }\n    },\n\n    removeRule(rule) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const keypath = `membership.${key}`;\n        const values = group.getFieldValue(keypath);\n        const index = _.findIndex(values, value => {\n            if (value._id && rule._id) {\n                return value._id === rule._id;\n            } else {\n                const groupData = _.head(value.value.q);\n                const ruleData = _.head(rule.value.q);\n                return groupData.value === ruleData.value && groupData.key === ruleData.key;\n            }\n        });\n        this.get(key).removeObject(rule.value);\n        if (index > -1) {\n            return values.removeAt(index);\n        }\n    },\n\n    loadContentOnScroll: task(function* () {\n        if (this.get('rateLimited')) return;\n\n        if (this.get('ignoreScroll')) {\n            this.set('ignoreScroll', false);\n        } else {\n            yield timeout(200);\n            if (this.get('loading.search')) {\n                return;\n            }\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                return;\n            }\n\n            const filterKey = this.get('filter.key');\n            const isSearching = this.get('isSearching') || filterKey === 'rules';\n            const isEditing = this.get('editing') && ['owners', 'individuals'].indexOf(filterKey) > -1;\n\n            let promise;\n            if (isSearching) {\n                promise = this.loadSearchMembers();\n            } else if (isEditing || filterKey === 'individuals' || filterKey === 'owners') {\n                const path = filterKey === 'owners' ? 'owners.owners' : 'individuals.individuals';\n                promise = this.loadPathFieldMembers(path);\n            } else {\n                promise = this.loadMembershipList();\n            }\n\n            return promise.then(newMembership => {\n                const meta = newMembership && newMembership._meta;\n                const isLastPage = meta && meta.pageCount === meta.pageNumber;\n                Ember.set(this, 'loadedAll', _.isEmpty(newMembership) || isLastPage);\n            });\n        }\n    }).drop(),\n\n    loadSearchMembers() {\n        const loading = this.get('loading.search');\n        const loadedAll = this.get('loadedAll');\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        this.set('currentlySearching', true);\n        this.set('loading.search', true);\n        return this.searchMembership(this.get('search')).then(content => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n            if (Array.isArray(content.content)) {\n                content = content.content.map(x => x.getRecord());\n            }\n            this.set('loading.search', false);\n            const key = this.get('filter.key');\n            if (key !== 'all' && key !== 'rules') {\n                const filter = this.get(`group.${key}.${key}`);\n                if (filter) {\n                    const peopleIds = filter.mapBy('guid');\n                    content = _.filter(content, person => {\n                        return _.includes(peopleIds, person.get('id'));\n                    });\n                }\n            } else if (key === 'rules' && _.isEmpty(this.get('inclusionQueries'))) {\n                content = [];\n            }\n            if (this.get('currentPage')) {\n                this.get('membership').pushObjects(content || []);\n            } else {\n                Ember.set(this, 'membership', content);\n            }\n            this.incrementProperty('currentPage');\n            return content;\n        });\n    },\n\n    loadMembershipList() {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n        const editing = this.get('editing');\n        if (loading || loadedAll || editing) {\n            return Ember.RSVP.resolve([]);\n        }\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n        Ember.set(this, 'loading.search', true);\n        const promise = this.get('store')\n            .findGroupMembership(this.get('group.id'), query)\n            .then(membership => {\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n\n                if (membership) {\n                    const promises = membership.map(member => {\n                        if (member.get('type') === 'user') {\n                            return member.get('profile').then(person => person);\n                        } else {\n                            return member\n                                .reload()\n                                .then(res => {\n                                    return res;\n                                })\n                                .catch(err => {\n                                    if (!this.isDestroying && !this.isDestroyed) {\n                                        if (err.errors[0].status === 429) {\n                                            if (!this.get('rateLimited')) {\n                                                this.set('membershipQuery.offset', query.offset - query.limit);\n                                                this.set('rateLimited', true);\n                                                this.get('notification').error(\n                                                    this.get('intl').t('notification.group.errors.rateLimit.title'),\n                                                    this.get('intl').t('notification.group.errors.rateLimit.message')\n                                                );\n\n                                                this.set(\n                                                    'retryTimeout',\n                                                    Ember.run.later(() => {\n                                                        this.set('rateLimited', false);\n                                                    }, this.get('retyTimeOutDuration'))\n                                                );\n                                            }\n                                        }\n                                    }\n                                });\n                        }\n                    });\n\n                    Ember.RSVP.allSettled(promises).then(results => {\n                        const filteredResults = results\n                            .map(r => r.value)\n                            .filter(r => {\n                                return r && r.isError !== true;\n                            });\n                        const allMemberships = _.uniqBy([...this.get('membership'), ...filteredResults], 'id');\n\n                        this.get('membership').setObjects(allMemberships);\n                    });\n                } else {\n                    this.get('membership').addObjects(membership);\n                }\n                Ember.set(this, 'loading.search', false);\n                return membership;\n            });\n        Ember.set(this, 'currentMembershipRequest', DS.PromiseArray.create({ promise }));\n\n        return promise;\n    },\n\n    setRulesOnGroup() {\n        const group = this.get('group');\n        _.forEach(this.get('inclusions'), rule => group.set('membership.inclusions', rule));\n        Ember.set(this, 'inclusions', []);\n\n        _.forEach(this.get('exclusions'), rule => group.set('membership.exclusions', rule));\n        Ember.set(this, 'exclusions', []);\n    },\n\n    isOwner(person) {\n        return this.get('group').isPersonOwner(person);\n    },\n\n    isIndividual(person) {\n        return this.get('group').isPersonIndividual(person);\n    },\n\n    loadPathFieldMembers(path) {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        let ids;\n        let fieldData = this.get(`group.${path}`);\n        if (fieldData) {\n            ids = fieldData.mapBy('guid');\n        }\n\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n\n        if (_.isEmpty(ids)) {\n            Ember.set(this, 'loading.search', false);\n            Ember.set(this, 'membership', []);\n            return Ember.RSVP.resolve([]);\n        }\n        if (!Array.isArray(ids)) {\n            ids = [ids];\n        }\n\n        const updateOffset = ids.length > this.memberListLimitSize;\n\n        ids = ids.slice(query.offset, query.offset + query.limit);\n\n        if (updateOffset) {\n            Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n        }\n        Ember.set(this, 'loading.search', true);\n\n        return this.get('store')\n            .findMany('person', ids, BASE_PERSON)\n            .then(content => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                if (!Array.isArray(content)) {\n                    content = [content];\n                }\n\n                content = this.sort(content);\n\n                Ember.set(this, 'loading.search', false);\n                this.get('membership').addObjects(content);\n                return content;\n            });\n    },\n\n    sort(content) {\n        return content.sort((a, b) => {\n            const aName = a.get('name');\n            const bName = b.get('name');\n            if (aName > bName) {\n                return 1;\n            }\n            if (aName < bName) {\n                return -1;\n            }\n            return 0;\n        });\n    },\n\n    loadRules: task(function* () {\n        const isPending = this.get('page.isPending');\n        if (isPending) {\n            return;\n        }\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n        yield this.loadSearchMembers();\n    }),\n\n    loadAll: task(function* () {\n        yield this.loadMembershipList();\n    }),\n\n    handleJobFinish() {\n        this.get('loadAll').perform();\n        this.get('group').reload();\n    },\n\n    searchMembership(search) {\n        if (search && search.length < 2) {\n            return Ember.RSVP.resolve([]);\n        }\n        const builder = this.get('searchService').requestBuilder();\n        const group = this.get('group');\n        const fieldPath = `${group.getFieldValue('general.groupType').value}.guid`;\n        builder.addQuery(group.get('guid'), 'AND', 'EXACT', [fieldPath]);\n        if (search) {\n            builder.addQuery(search);\n        }\n\n        // Add pagination support\n        const currentPage = this.get('currentPage') || 0;\n        const pageSize = 25; // Default search page size (matches search service default)\n        builder.setPaging(currentPage + 1, pageSize);\n        return this.get('searchService').performCustomSearch(builder);\n    },\n\n    loadMoreMembersOnInit() {\n        if (this.get('group.memberCount') <= 10) {\n            return;\n        }\n\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.get('loadContentOnScroll').perform();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"8dp6s8U+\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isDynamicGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn show-dynamic-rules\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"dynamicRules\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-header\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-5\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"small\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRules\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewMembership\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewRules\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-button-multi\\\",{\\\"attrs\\\":[[16,\\\"text\\\",[34,[[26,[\\\"dropdownTitle\\\"]]]]],[15,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"class\\\",\\\"group-profile-members-button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"showingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-list-item\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]],null],null],[16,\\\"class\\\",[34,[[28,[\\\"filter\\\",\\\"key\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editMembership\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"membershipToggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleCallsEnabled\\\"]]],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"filter-tabs\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"editingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"filter\\\",\\\"active\\\"]],\\\"active\\\"],null],\\\" \\\",[28,[\\\"filter\\\",\\\"key\\\"]],\\\"-tab\\\"]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[28,[\\\"filter\\\",\\\"active\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-search\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"editing\\\",\\\"updateSearch\\\",\\\"filter\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"search\\\"]],[28,[\\\"editing\\\"]],\\\"updateSearch\\\",[28,[\\\"filter\\\"]],\\\"search\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"membership-listing \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"allowPermissionGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"alert alert-warning roles-rules-info-message\\\"],[15,\\\"role\\\",\\\"alert\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-info-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.rulesDisabledMessage\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membershipRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/membership-rule-entry\\\"],null,[[\\\"rule\\\",\\\"group\\\",\\\"editing\\\",\\\"filter\\\",\\\"deleteRule\\\"],[[28,[\\\"rule\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"filter\\\"]],\\\"removeRule\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membership\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-entry\\\"],null,[[\\\"person\\\",\\\"group\\\",\\\"editing\\\",\\\"individuals\\\",\\\"membership\\\",\\\"deletePerson\\\"],[[28,[\\\"member\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"addedIndividuals\\\"]],[28,[\\\"membership\\\"]],\\\"removePerson\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"member\\\"]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"search\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center empty\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayEditingFooter\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"add-member \\\",[33,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]],\\\"col-sm-6\\\",\\\"col-sm-12\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"filter\\\",\\\"selectPerson\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"add\\\"]],[28,[\\\"filter\\\"]],\\\"selectPerson\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-keyword col-sm-6\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-tag-search\\\"],null,[[\\\"group\\\",\\\"filter\\\",\\\"selectKeyword\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"filter\\\"]],\\\"selectKeyword\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"submit col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-listing/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['group-membership-rule-entry'],\n\n    store: Ember.inject.service(),\n\n    rule: null,\n    group: null,\n    filter: null,\n    editing: false,\n\n    relationships: ['ancestors', 'parent', 'self', 'siblings', 'children', 'descendants'],\n    groupedRelationships: [\n        ['ancestors', 'parent'],\n        ['self', 'siblings'],\n        ['children', 'descendants']\n    ],\n\n    actions: {\n        toggleRelationship(relationship) {\n            const key = `graph.${relationship}`;\n            this.toggleProperty(key);\n            const value = this.get(key);\n            const field = this.get('rule');\n            const { rels } = _.last(Ember.get(field, 'value.q'));\n            if (value) {\n                rels.addObject(relationship);\n            } else {\n                rels.removeObject(relationship);\n            }\n        },\n\n        deleteRule() {\n            this.sendAction('deleteRule', this.get('rule'));\n        }\n    },\n\n    isKeyword: computed('rule.value.q.@each.type', function () {\n        const q = this.get('rule.value.q');\n        return _.head(q).type === 'equals';\n    }),\n\n    relationshipGroups: computed(\n        'groupedRelationships',\n        'graph.{self,parent,ancestors,siblings,children,descendants}',\n        function () {\n            const groupedRelationships = this.get('groupedRelationships');\n            return groupedRelationships.map(group => {\n                return group.map(relationship => {\n                    return {\n                        relationship,\n                        key: `person.graph.${relationship}`,\n                        selected: this.relationshipSelected(relationship)\n                    };\n                });\n            });\n        }\n    ),\n\n    field: computed('group', 'filter.key', function () {\n        const key = this.get('filter.key');\n        return this.get(`group.fieldConfig.membership.${key}`);\n    }),\n\n    person: computed('rule.value.q.@each.value', 'isKeyword', function () {\n        if (this.get('isKeyword')) {\n            return;\n        }\n        const q = this.get('rule.value.q');\n        let guid = _.head(q).guid;\n        let oid = _.head(q).value;\n        if (!guid && !!oid) {\n            // We've got a weird case where a guid value was not populated by directory\n            // Log and take these errors to directory team so they can migrate\n            this.logger.error('Found a group rule entry without a guid value', {\n                group: this.get('group.id')\n            });\n        }\n        return this.get('store').findRecord('person', guid || oid);\n    }),\n\n    graph: computed('rule.value.q.@each.rels', function () {\n        const q = this.get('rule.value.q');\n        return this.buildGraphFromRelationships(_.head(q).rels);\n    }),\n\n    name: computed('person.name', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).value;\n        }\n        return this.get('person.name');\n    }),\n\n    title: computed('person.title', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).key;\n        }\n        return this.get('person.title');\n    }),\n\n    relationshipSelected(relationship) {\n        return this.get('graph')[relationship];\n    },\n\n    buildGraphFromRelationships(rels) {\n        const graph = {};\n        _.forEach(rels, rel => {\n            graph[rel] = true;\n        });\n        const defaults = {\n            ancestors: false,\n            parent: false,\n            self: false,\n            siblings: false,\n            children: false,\n            descendants: false\n        };\n        const options = Object.assign({}, defaults, graph);\n        return Ember.Object.create(options);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // If this entry fails to load due to the person record\n        // not being found, let's log it\n        let person = this.get('person');\n        if (!person || !person.catch) {\n            return;\n        }\n        person.catch(error => {\n            this.logger.error('Error loading membership rule entry', {\n                error\n            });\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+jW7/wZi\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null],true]],{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"title\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[26,[\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"relationships\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"relationshipGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-purecloud \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"selected\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRelationship\\\",[28,[\\\"relationship\\\",\\\"relationship\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"relationship\\\",\\\"key\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"graph\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"person-graph\\\"],null,[[\\\"person\\\",\\\"width\\\",\\\"height\\\",\\\"graph\\\",\\\"mini\\\"],[[28,[\\\"person\\\"]],50,50,[28,[\\\"graph\\\"]],true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete danger\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteRule\\\"]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-rule-entry/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SearchMixin } from '../../../mixins/search';\n\nconst { get, run, inject, computed, observer, Component } = Ember;\n\nfunction removeDuplicates(group, key, results) {\n    let currentIds;\n    const current = group.getFieldValue(key);\n    if (current) {\n        currentIds = current.mapBy('value');\n    }\n    if (_.includes(key, 'membership')) {\n        currentIds = currentIds.map(id => {\n            const data = _.head(id.q) || {};\n            return Ember.get(data, 'value');\n        });\n    }\n    if (results && currentIds.length) {\n        return results.filter(result => {\n            const id = result.get('id');\n            return !currentIds.includes(id);\n        });\n    }\n    return results;\n}\n\nexport default Component.extend(SearchMixin, {\n    classNames: ['group-membership-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    entityFilter: 'people',\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    searchLimit: 6,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n            this.updateSearchOnChange();\n        },\n\n        select(person) {\n            this.sendAction('selectPerson', person);\n            this.resetPersonSearch();\n        },\n\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange();\n        },\n\n        handleKeyDown(index, event) {\n            const items = this.element.querySelectorAll('[role=\"menuitem\"]');\n            const totalItems = items.length;\n\n            switch (event.key) {\n                case 'ArrowDown':\n                    event.preventDefault();\n                    const nextIndex = (index + 1) % totalItems;\n                    this.updateTabIndex(items, nextIndex);\n                    items[nextIndex].focus();\n                    break;\n\n                case 'ArrowUp':\n                    event.preventDefault();\n                    const prevIndex = (index - 1 + totalItems) % totalItems;\n                    this.updateTabIndex(items, prevIndex);\n                    items[prevIndex].focus();\n                    break;\n\n                case 'Enter':\n                case ' ':\n                    event.preventDefault();\n                    const results = this.get('results');\n                    this.send('select', results.objectAt(index));\n                    break;\n\n                case 'Escape':\n                    event.preventDefault();\n                    this.resetPersonSearch();\n                    this.element.querySelector('input').focus();\n                    break;\n\n                case 'Home':\n                    event.preventDefault();\n                    this.updateTabIndex(items, 0);\n                    items[0].focus();\n                    break;\n\n                case 'End':\n                    event.preventDefault();\n                    this.updateTabIndex(items, totalItems - 1);\n                    items[totalItems - 1].focus();\n                    break;\n            }\n        }\n    },\n\n    isRules: computed('filter.key', function () {\n        const key = this.get('filter.key');\n        return key === 'inclusions' || key === 'exclusions';\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-moon pc-search';\n        }\n        return 'pc pc-add-person';\n    }),\n\n    searchText: computed('mode', function () {\n        const intl = this.get('intl');\n        if (this.get('mode') === 'search') {\n            return intl.lookup('groups.searchMembers').toString();\n        }\n        return intl.lookup('groups.addPerson').toString();\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    results: computed('searchResults.[]', function () {\n        const group = this.get('group');\n        const key = this.get('filter.path');\n        return removeDuplicates(group, key, this.get('searchResults'));\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    resultsChanged: observer('results.[]', function () {\n        run.scheduleOnce('afterRender', this, () => {\n            const results = this.get('results');\n            if (results && results.length > 0) {\n                const firstItem = this.element.querySelector('[role=\"menuitem\"]');\n                if (firstItem) {\n                    firstItem.focus();\n                }\n            }\n        });\n    }),\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'editing.value') !== get(oldAttrs, 'editing.value')) {\n            this.set('searchValue', null);\n        }\n    },\n\n    didReceiveAttrs() {\n        const filter = this.get('filter');\n        const previousFilter = this.get('_previousFilter');\n        if (previousFilter && filter !== previousFilter) {\n            this.set('searchValue', '');\n        }\n        this.set('_previousFilter', filter);\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    updateSearchOnChange() {\n        if (this.get('mode') === 'search') {\n            this.sendAction('updateSearch', this.get('searchValue'));\n        } else {\n            run.debounce(this, this.performPersonSearch, 300);\n        }\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetPersonSearch();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    performPersonSearch() {\n        const search = this.get('searchValue');\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            this.get('search')\n                .performSearch(search, 0, 'users')\n                .then(({ results }) => {\n                    this.set('loading', false);\n                    this.set('searchResults', results);\n                });\n        } else {\n            this.set('searchResults', []);\n            this.set('searchMeta', {});\n        }\n    },\n\n    resetPersonSearch() {\n        this.set('searchValue', '');\n        this.set('searchResults', []);\n        this.set('searchMeta', {});\n    },\n\n    updateTabIndex(items, focusIndex) {\n        items.forEach((item, idx) => {\n            item.setAttribute('tabindex', idx === focusIndex ? '0' : '-1');\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"RCG3b8FL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMembers\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results show dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]],\\\"keyword\\\"],null]]]],[15,\\\"role\\\",\\\"menu\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"index\\\"]],0],null],\\\"0\\\",\\\"-1\\\"],null]]]],[15,\\\"role\\\",\\\"menuitem\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\",[28,[\\\"index\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[28,[\\\"result\\\"]],true]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"result\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"department\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"index\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-search/template.hbs\"}});","import Ember from 'ember';\n\nimport { SEARCH_FACET_KEYPATHS } from '../../../search/service';\nimport _ from 'lodash';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-search', 'tag-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    loading: false,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n        },\n\n        keyword(keyword) {\n            this.sendAction('selectKeyword', keyword);\n            this.resetSearch();\n        },\n\n        updateSearch(event) {\n            const value = event.target.value;\n            this.set('searchValue', value);\n            if (this.get('mode') === 'search') {\n                this.sendAction('updateSearch', value);\n            } else if (value === '') {\n                this.resetSearch();\n            } else {\n                Ember.run.debounce(this, this.performSearch, value, 250);\n            }\n        }\n    },\n\n    searchText: computed(function () {\n        return this.get('intl').lookup('groups.addKeyword').toString();\n    }),\n\n    results: computed('tagSearchResults.[]', function () {\n        return this.get('tagSearchResults');\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-search';\n        }\n        return 'pc-add-person';\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    editingStateChanged: observer('editing', function () {\n        if (!_.isEmpty(this.get('searchValue'))) {\n            this.set('searchValue', '');\n        }\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    attachOutsideHandler: on('didInsertElement', function () {\n        return Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetSearch();\n                }\n            });\n        });\n    }),\n\n    removeOutsideHandler: on('willDestroyElement', function () {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }),\n\n    performSearch(search) {\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            const type = 'CONTAINS';\n            const builder = this.get('search').requestBuilder();\n            const fields = ['profileSkills', 'department', 'certifications', 'title'];\n            builder.addAggregations(\n                ['profileSkills', search, 'profileSkills', type, 5],\n                ['department', search, 'department', type, 5],\n                ['certifications', search, 'certifications', type, 5],\n                ['title', search, 'title', type, 5]\n            );\n            this.get('search')\n                .performCustomSearch(builder)\n                .then(data => {\n                    this.set('loading', false);\n                    const results = fields.map(field => {\n                        const aggregates = data[field];\n                        return aggregates.map(aggregate => {\n                            return {\n                                field: SEARCH_FACET_KEYPATHS[field],\n                                value: aggregate.key\n                            };\n                        });\n                    });\n                    this.set('results', _.flatten(results));\n                });\n        }\n    },\n\n    resetSearch() {\n        this.set('loading', false);\n        this.set('searchValue', '');\n        this.set('results', []);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"7cwxw4o7\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMemberTags\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateSearch\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu keyword\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"keyword\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"result\\\",\\\"field\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-tag-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport JobMixin from '../../../mixins/job';\n\nexport default Ember.Component.extend(JobMixin, {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    session: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n\n    isEditingRoles: false,\n    displayRoleRemoveModal: false,\n    rolesToDelete: [],\n    displayRulesRolesWarningModel: false,\n\n    // tracks all unsaved grant changes when editing roles for group\n    unsavedGrants: new Ember.Object({\n        roles: {}, //map of roles that contains a map of unsaved-grant objects\n        _hasUnsavedGrants: false,\n        parent: undefined, //pass reference after instantiation\n        hasUnsavedGrants: undefined, //create computed after instantiation\n        add({ grantId, roleId, divisionId }) {\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            //if grant already exists, then just make sure we don't delete it\n            if (grantModel) {\n                delete this.get('roles')[roleId][grantId];\n            } else {\n                this.get('roles')[roleId][grantId] = {\n                    action: 'save',\n                    roleId,\n                    divisionId\n                };\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        remove({ grantId, roleId }) {\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (grantModel) {\n                this.get('roles')[roleId][grantId] = { action: 'delete' };\n            } else {\n                delete this.get('roles')[roleId][grantId];\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        addAllFutureDivisions({ grantId, roleId }) {\n            this.get('roles')[roleId] = {};\n            this.add({ divisionId: '*', roleId, grantId });\n        },\n        removeAllFutureDivisions(roleId, grantId) {\n            this.remove({ roleId, grantId });\n        },\n        recalculateHasUnsavedGrants() {\n            const grantMaps = _.values(this.get('roles'));\n            let hasUnsavedGrants = false;\n            grantMaps.forEach(grantMap => {\n                if (Object.keys(grantMap).length) {\n                    hasUnsavedGrants = true;\n                }\n            });\n            this.set('_hasUnsavedGrants', hasUnsavedGrants);\n        },\n        clear() {\n            this.set('roles', {});\n            this.recalculateHasUnsavedGrants();\n        }\n    }),\n\n    groupRolesViewColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'role.name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-view'\n        };\n        const typeColumn = {\n            key: 'role.type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-view'\n        };\n        const descriptionColumn = {\n            key: 'role.description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-view'\n        };\n        const divisionsViewColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '255px',\n            component: 'group-profile/roles-edit/fixtable/division-view',\n            cellClass: 't-role-divisions-view'\n        };\n        const deleteColumn = {\n            header: 'delete button',\n            hideLabel: true,\n            component: 'group-profile/roles-edit/fixtable/list-remove',\n            iconClass: 'fa fa-times',\n            width: '1px',\n            class: 'list-remove-button'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsViewColumn, deleteColumn];\n    }),\n\n    groupRolesEditColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-edit'\n        };\n        const typeColumn = {\n            key: 'type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-edit'\n        };\n        const descriptionColumn = {\n            key: 'description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-edit'\n        };\n        const divisionsEditColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '350px',\n            component: 'group-profile/roles-edit/fixtable/division-select',\n            cellClass: 't-role-divisions-edit'\n        };\n        const assignmentColumn = {\n            header: this.get('intl').lookup('groups.roles.selection'),\n            component: 'group-profile/roles-edit/fixtable/is-assigned-toggle',\n            width: '1px',\n            cellClass: 't-role-is-assigned'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsEditColumn, assignmentColumn];\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    actions: {\n        editRoles() {\n            if (this.get('hasRules')) {\n                this.set('displayRulesRolesWarningModel', true);\n            } else {\n                this.set('isEditingRoles', true);\n                this.set('allRolesFiltered', this.get('allRoles'));\n            }\n        },\n\n        toggleRolesEnabled() {\n            this._toggleRolesEnabled();\n        },\n\n        confirmWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n            this._enableRoles();\n        },\n\n        closeRulesRolesWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n        },\n\n        getGroupRoles() {\n            this._getGroupRoles();\n        },\n\n        deleteRoles() {\n            this._deleteRoles();\n        },\n\n        openConfirmModelSingleRole(roleId) {\n            const grantRole = this.get('groupAssignedRoles.list').find(grantRoles => {\n                return Ember.get(grantRoles, 'id') === roleId;\n            });\n            this.set('rolesToDelete', [grantRole.role]);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        openConfirmModelMultipleRole(divisionRoles) {\n            let roles = divisionRoles.map(divisionRole => {\n                return divisionRole.role;\n            });\n            this.set('rolesToDelete', roles);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        save() {\n            this.set('isLoadingAllRoles', true);\n            let rolesToUpdate = {}; //map a role Id to a list of division ids to add that role for bulk save\n            let grantsToDelete = [];\n            let version = this.get('model.grantVersion');\n            _.values(this.get('unsavedGrants.roles')).forEach(grantMap => {\n                _.forOwn(grantMap, ({ action, roleId, divisionId }, grantId) => {\n                    if (action === 'save') {\n                        if (rolesToUpdate[roleId]) {\n                            rolesToUpdate[roleId].pushObject(divisionId);\n                        } else {\n                            rolesToUpdate[roleId] = [divisionId];\n                        }\n                    } else if (action === 'delete') {\n                        const undeletedGrant = this.get('store').peekRecord('grant', grantId);\n                        if (undeletedGrant) {\n                            grantsToDelete.pushObject(undeletedGrant);\n                        }\n                    } else {\n                        Ember.Logger.error('grant actions other than save or delete are not supported');\n                    }\n                });\n            });\n            // Make API calls sequentially to avoid api clobbering data\n            _.reduce(\n                rolesToUpdate,\n                (promise, divisionIds, roleId) => {\n                    return promise.then(() => {\n                        return this.get('store')\n                            .adapterFor('grant')\n                            .saveBulk(roleId, [this.get('model.guid')], divisionIds);\n                    });\n                },\n                Ember.RSVP.Promise.resolve()\n            )\n                .then(() => {\n                    return grantsToDelete.reduce((promise, undeletedGrant) => {\n                        return promise.then(() => {\n                            return undeletedGrant.destroyRecord();\n                        });\n                    }, Ember.RSVP.Promise.resolve());\n                })\n                .then(() => {\n                    this.get('unsavedGrants').clear();\n                    this._stopEditingRoles();\n                    this.get('notification').success(\n                        null,\n                        this.get('intl').lookup('groups.roles.roleAssignmentSaveSuccess')\n                    );\n                    return this._getGroupRoles(version);\n                })\n                .catch(err => {\n                    if (this._isTooManyGrantsError(err)) {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.tooManyGrantsSaveError')\n                        );\n                    } else {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.roleAssignmenSaveError')\n                        );\n                    }\n                    Ember.Logger.error('error saving grants', { error: err });\n                })\n                .finally(() => {\n                    this.set('isLoadingAllRoles', false);\n                });\n        },\n\n        searchAssignedRoles(query) {\n            const assignedRoles = this.get('groupAssignedRoles.list');\n            if (!assignedRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('groupAssignedRolesFiltered', assignedRoles);\n            } else {\n                let filteredRoles = assignedRoles.filter(roleDivision => {\n                    return Ember.get(roleDivision, 'role.name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('groupAssignedRolesFiltered', filteredRoles);\n            }\n        },\n\n        searchAllRoles(query) {\n            const allRoles = this.get('allRoles');\n            if (!allRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('allRolesFiltered', allRoles);\n            } else {\n                let filteredRoles = allRoles.filter(role => {\n                    return role.get('name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('allRolesFiltered', filteredRoles);\n            }\n        },\n\n        cancel() {\n            this._stopEditingRoles();\n        },\n\n        updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n            this._updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions);\n        },\n\n        closeWarningModal() {\n            this.set('rolesToDelete', []);\n            this.set('displayRoleRemoveModal', false);\n        },\n\n        confirmHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n            this._disableRoles();\n        },\n\n        closeHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n        },\n        toggleRoleAssignment(roleId, isAssigned) {\n            if (isAssigned) {\n                this.get('groupAssignedRoles').addRole(roleId, {});\n            } else {\n                this.get('groupAssignedRoles').removeRole(roleId);\n            }\n        }\n    },\n\n    _stopEditingRoles() {\n        this.get('unsavedGrants').clear();\n        this._getGroupRoles();\n        Ember.trySet(this, 'isEditingRoles', false);\n    },\n\n    _updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n        //add selected divisions to unsaved grants map\n        selectedDivisions.forEach(division => {\n            const grantId = this.get('model.guid') + roleId + division.id;\n            this.get('unsavedGrants').add({\n                grantId,\n                roleId,\n                divisionId: division.id\n            });\n        });\n        //remove unselected divisions\n        previouslySelectedDivisions.forEach(division => {\n            let stillSelectedDivision = selectedDivisions.find(stillSelectedDivision => {\n                return division.id === stillSelectedDivision.id;\n            });\n            if (!stillSelectedDivision) {\n                const grantId = this.get('model.guid') + roleId + division.id;\n                this.get('unsavedGrants').remove({ grantId, roleId });\n            }\n        });\n\n        //keep unsaved divisions change between role pages\n        if (selectedDivisions.length) {\n            this.get('groupAssignedRoles').addRole(roleId, {\n                id: roleId,\n                role: this.get('store').peekRecord('role', roleId),\n                divisions: selectedDivisions\n            });\n        } else {\n            this.get('groupAssignedRoles').removeRole(roleId);\n        }\n    },\n\n    _removeRole(role) {\n        let grantsToDelete = [];\n        let divisionRole = this.get('groupAssignedRoles').getRoleWithDivisions(role.id);\n        Ember.get(divisionRole, 'divisions').forEach(division => {\n            const grantId = this.get('model.guid') + Ember.get(role, 'id') + division.get('id');\n            let grantRecord = this.get('store').peekRecord('grant', grantId);\n            grantsToDelete.pushObject(grantRecord);\n        });\n        Ember.set(divisionRole, 'divisions', []);\n        // Make API calls sequentially to avoid api clobbering data\n        return grantsToDelete\n            .reduce((promise, undeletedGrant) => {\n                return promise.then(() => {\n                    return undeletedGrant.destroyRecord();\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(data => {\n                this.get('notification').success(null, this.get('intl').lookup('groups.roles.removeSuccess'));\n                return data;\n            })\n            .catch(err => {\n                this.get('notification').error(null, this.get('intl').lookup('groups.roles.removeError'));\n                return err;\n            });\n    },\n\n    _deleteRoles() {\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        let version = this.get('model.grantVersion');\n        // Make API calls sequentially to avoid api clobbering data\n        return this.get('rolesToDelete')\n            .reduce((promise, role) => {\n                return promise.then(() => {\n                    return this._removeRole(role);\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(() => {\n                return this._getGroupRoles(version);\n            })\n            .catch(err => {\n                Ember.Logger.error('error removing selected roles', { error: err });\n            })\n            .finally(() => {\n                this.set('rolesToDelete', []);\n                this.set('displayRoleRemoveModal', false);\n            });\n    },\n\n    _getGroupRoles(previousVersion, attempt = 0) {\n        if (attempt >= 10) {\n            return Ember.RSVP.reject('timed out waiting for group roles to update');\n        }\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        const group = this.get('model');\n        if (!group) {\n            Ember.Logger.error('no group for roles edit component. (expected if test)');\n            return;\n        }\n        group\n            .getGrants()\n            .then(grants => {\n                //TODO: Bulk Update Does not Increment Version Number https://inindca.atlassian.net/browse/PLAT-1953\n                // if (previousVersion && this.get('model.grantVersion') <= previousVersion) {\n                //     return new Ember.RSVP.Promise((resolve) => {\n                //         Ember.run.later(() => {\n                //             resolve(this._getGroupRoles(previousVersion, ++attempt));\n                //         }, 500);\n                //     });\n                // }\n                let assignedRolesMap = {};\n                this.get('store').unloadAll('grant');\n                grants.forEach(grant => {\n                    grant.subjectId = this.get('model.guid');\n                    // push grants, roles and divisions to the store\n                    this.get('store').push(this.get('store').normalize('grant', grant));\n                    const role = this.get('store').push(this.get('store').normalize('role', grant.role));\n                    const division = this.get('store').push(this.get('store').normalize('division', grant.division));\n                    if (!assignedRolesMap[grant.role.id]) {\n                        assignedRolesMap[grant.role.id] = {\n                            id: grant.role.id,\n                            role,\n                            divisions: [division]\n                        };\n                    } else {\n                        Ember.get(assignedRolesMap[grant.role.id], 'divisions').pushObject(division);\n                    }\n                });\n                this.get('groupAssignedRoles').setMap(assignedRolesMap);\n                this.set('groupAssignedRolesFiltered', this.get('groupAssignedRoles.list'));\n            })\n            .catch(err => {\n                Ember.Logger.error('failed to load grants', { error: err });\n            })\n            .finally(() => {\n                this.isDestroyed || Ember.trySet(this, 'isLoadingGroupRoles', false); // workaround trySet until we get this fix https://github.com/emberjs/ember.js/pull/13355\n            });\n    },\n\n    _isTooManyGrantsError(err) {\n        return (\n            err &&\n            err.errors &&\n            err.errors.length &&\n            err.errors[0].message &&\n            err.errors[0].message.includes('Too many grants of role')\n        );\n    },\n\n    _toggleRolesEnabled() {\n        const turnOnRoles = !this.get('model.allowPermissionGroup');\n        if (turnOnRoles) {\n            this._toggleRolesOn();\n        } else {\n            this._toggleRolesOff();\n        }\n    },\n\n    _toggleRolesOn() {\n        if (this.get('hasRules')) {\n            this.set('displayRulesRolesWarningModel', true);\n        } else {\n            this._enableRoles();\n        }\n    },\n\n    _toggleRolesOff() {\n        if (this.get('groupAssignedRoles.list.length')) {\n            this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n            this.set('displayHasRolesWarningModel', true);\n        } else {\n            this._disableRoles();\n        }\n    },\n\n    _enableRoles() {\n        let hadRules = false;\n        this.set('isLoadingGroupRoles', true);\n        if (this.get('hasRules')) {\n            hadRules = true;\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n        }\n        this.set('model.allowPermissionGroup', true);\n        return this.get('model')\n            .save()\n            .then(res => {\n                const job = Ember.get(res, 'meta.job');\n                if (hadRules) {\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(null, message, {\n                        forceBrowserNotification: true\n                    });\n                }\n                if (job && job.jobId) {\n                    this.addJob(\n                        job,\n                        () => {\n                            this.get('model').reload();\n                        },\n                        this\n                    );\n                }\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    _disableRoles() {\n        this.set('isLoadingGroupRoles', true);\n        this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n        return this._deleteRoles()\n            .then(() => {\n                this.set('model.allowPermissionGroup', false);\n                return this.get('model').save();\n            })\n            .then(() => {\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardNavigation();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    // Re-run accessibility setup when table content changes\n    contentDidChange: Ember.observer(\n        'allRolesFiltered.[]',\n        'groupAssignedRolesFiltered.[]',\n        'isLoadingAllRoles',\n        'isLoadingGroupRoles',\n        'isEditingRoles',\n        function () {\n            if (\n                !this.get('isLoadingAllRoles') &&\n                !this.get('isLoadingGroupRoles') &&\n                this.get('allRolesFiltered') &&\n                this.get('groupAssignedRolesFiltered')\n            ) {\n                Ember.run.debounce(this, this._setupFixtableAccessibility, 100);\n            }\n        }\n    ),\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('.enable-roles-toggle .toggle-switch-container input');\n            const innerLabel = this.$('.enable-roles-toggle .toggle-switch-container .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.roles.enableRoles');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', 'enableRolesToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n\n            // Fix fixtable row selection checkboxes\n            this._setupFixtableAccessibility();\n        });\n    },\n\n    _setupFixtableAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Skip if component is destroyed or DOM not ready\n            if (this.isDestroyed || this.isDestroying || !this.$) {\n                return;\n            }\n\n            // Handle all checkboxes in fixtable\n            const allCheckboxes = this.$('.fixtable-grid input[type=\"checkbox\"]');\n\n            if (allCheckboxes && allCheckboxes.length) {\n                allCheckboxes.each((index, checkbox) => {\n                    const $checkbox = Ember.$(checkbox);\n\n                    // Skip if already has proper labeling\n                    if ($checkbox.attr('aria-label') || $checkbox.attr('aria-labelledby')) {\n                        return;\n                    }\n\n                    // Check if this is a header checkbox (select all)\n                    const $headerRow = $checkbox.closest('thead tr');\n                    if ($headerRow.length) {\n                        $checkbox.attr('aria-label', 'Select all roles');\n                        return;\n                    }\n\n                    // Check if this is in a toggle-switch component\n                    const $toggleSwitch = $checkbox.closest('.toggle-switch');\n                    if ($toggleSwitch.length) {\n                        // Find the row this toggle belongs to\n                        const $row = $checkbox.closest('tr');\n                        const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                        if ($roleNameCell.length) {\n                            const roleName = $roleNameCell.text().trim();\n                            if (roleName) {\n                                $checkbox.attr('aria-label', `Toggle assignment for role ${roleName}`);\n                            }\n                        }\n                        return;\n                    }\n\n                    // Handle row selection checkboxes\n                    const $row = $checkbox.closest('tr');\n                    const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                    if ($roleNameCell.length) {\n                        const roleName = $roleNameCell.text().trim();\n                        if (roleName) {\n                            $checkbox.attr('aria-label', `Select role ${roleName}`);\n                        }\n                    } else {\n                        // Fallback for checkboxes without identifiable context\n                        $checkbox.attr('aria-label', `Select table row ${index + 1}`);\n                    }\n                });\n\n                // Handle remove buttons accessibility\n                this._setupButtonAccessibility();\n\n                // Fix table headers for accessibility\n                this._setupTableHeaders();\n            }\n        });\n    },\n\n    _setupButtonAccessibility() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle remove buttons in fixtable\n        const $removeButtons = this.$('.fixtable-grid button[data-t=\"minus-button\"]');\n\n        if ($removeButtons && $removeButtons.length) {\n            $removeButtons.each((index, button) => {\n                const $button = Ember.$(button);\n\n                // Skip if already has proper labeling\n                if ($button.attr('aria-label') || $button.attr('aria-labelledby')) {\n                    return;\n                }\n\n                // Find the row this button belongs to\n                const $row = $button.closest('tr');\n                const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                if ($roleNameCell.length) {\n                    const roleName = $roleNameCell.text().trim();\n                    if (roleName) {\n                        $button.attr('aria-label', `Remove role ${roleName}`);\n                    } else {\n                        $button.attr('aria-label', 'Remove role');\n                    }\n                } else {\n                    // Fallback for buttons without identifiable context\n                    $button.attr('aria-label', `Remove item ${index + 1}`);\n                }\n            });\n        }\n\n        // Handle any other unlabeled buttons in the fixtable\n        const $otherButtons = this.$('.fixtable-grid button:not([aria-label]):not([aria-labelledby])');\n\n        if ($otherButtons && $otherButtons.length) {\n            $otherButtons.each((index, button) => {\n                const $button = Ember.$(button);\n                const buttonText = $button.text().trim();\n                const buttonTitle = $button.attr('title');\n\n                if (buttonText) {\n                    $button.attr('aria-label', buttonText);\n                } else if (buttonTitle) {\n                    $button.attr('aria-label', buttonTitle);\n                } else {\n                    // Check for common button patterns\n                    if ($button.find('.fa-times, .fa-remove, .fa-delete').length) {\n                        $button.attr('aria-label', 'Remove');\n                    } else if ($button.find('.fa-edit, .fa-pencil').length) {\n                        $button.attr('aria-label', 'Edit');\n                    } else {\n                        $button.attr('aria-label', `Action button ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupTableHeaders() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle table headers in fixtable\n        const $table = this.$('.fixtable-grid table');\n\n        if ($table && $table.length) {\n            // Ensure table has proper role and accessibility attributes\n            if (!$table.attr('role')) {\n                $table.attr('role', 'table');\n            }\n\n            // Add aria-label if not present\n            if (!$table.attr('aria-label') && !$table.attr('aria-labelledby')) {\n                const isEditMode = this.get('isEditingRoles');\n                const tableLabel = isEditMode ? 'Roles assignment table' : 'Assigned roles table';\n                $table.attr('aria-label', tableLabel);\n            }\n            // Add scope attributes to all header cells (including filter headers)\n            const $allHeaderCells = $table.find('thead th');\n\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n\n                // Skip if already has scope attribute\n                if ($th.attr('scope')) {\n                    return;\n                }\n\n                // Add appropriate scope attribute\n                $th.attr('scope', 'col');\n\n                // Handle filter headers specifically\n                if ($th.hasClass('fixtable-column-filters') || $th.find('.fixtable-column-filters').length) {\n                    // Add role attribute for filter headers\n                    if (!$th.attr('role')) {\n                        $th.attr('role', 'columnheader');\n                    }\n                }\n            });\n\n            // Add headers attribute to data cells if needed for complex tables\n            const headerIds = [];\n\n            // Create unique IDs for headers if they don't exist\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n                let headerId = $th.attr('id');\n\n                if (!headerId) {\n                    headerId = `fixtable-header-${index}`;\n                    $th.attr('id', headerId);\n                }\n\n                headerIds.push(headerId);\n            });\n\n            // Associate data cells with their headers\n            $table.find('tbody tr').each((rowIndex, row) => {\n                const $row = Ember.$(row);\n                const $cells = $row.find('td');\n\n                $cells.each((cellIndex, cell) => {\n                    const $cell = Ember.$(cell);\n\n                    // Skip if already has headers attribute\n                    if ($cell.attr('headers')) {\n                        return;\n                    }\n\n                    // Associate with corresponding header\n                    if (headerIds[cellIndex]) {\n                        $cell.attr('headers', headerIds[cellIndex]);\n                    }\n                });\n            });\n\n            // Handle any filter inputs in headers\n            const $filterInputs = $table.find('thead input, thead select');\n            $filterInputs.each((index, input) => {\n                const $input = Ember.$(input);\n\n                if (!$input.attr('aria-label') && !$input.attr('aria-labelledby')) {\n                    const $headerCell = $input.closest('th');\n                    const headerText = $headerCell.text().trim().replace(/\\s+/g, ' ');\n\n                    if (headerText) {\n                        $input.attr('aria-label', `Filter by ${headerText}`);\n                    } else {\n                        $input.attr('aria-label', `Filter column ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupKeyboardNavigation() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Remove any existing handlers first\n            this._removeKeyboardNavigation();\n\n            const $fixtable = this.$('.fixtable-grid');\n            if (!$fixtable || !$fixtable.length) {\n                return;\n            }\n\n            $fixtable.on('focusin.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).addClass('row-focused');\n            });\n\n            $fixtable.on('focusout.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).removeClass('row-focused');\n            });\n        });\n    },\n\n    _removeKeyboardNavigation() {\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n        const $fixtable = this.$('.fixtable-grid');\n        if ($fixtable && $fixtable.length) {\n            $fixtable.off('focusin.navigation');\n            $fixtable.off('focusout.navigation');\n        }\n    },\n\n    init() {\n        this.get('groupAssignedRoles').clear();\n        this.get('store').findAll('division'); //load divisions into the store for use in the fixtable table\n        this.get('unsavedGrants').parent = this; // pass parent reference into unsavedGrants object to provide access to injected properties\n        this.get('unsavedGrants').hasUnsavedGrants = Ember.computed('_hasUnsavedGrants', function () {\n            return this.get('_hasUnsavedGrants');\n        });\n        this.get('unsavedGrants').clear(); //in case the component didn't get the chance to clean itself up before it was destroyed\n        this._getGroupRoles();\n        //Load All Roles\n        this.set('isLoadingAllRoles', true);\n        this.get('store')\n            .findAll('role')\n            .then(roles => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('allRoles', roles);\n                this.set('allRolesFiltered', roles);\n                this.set('isLoadingAllRoles', false);\n            });\n        this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    layout,\n    selectionIsEmpty: Ember.computed('selectedDataRows', function () {\n        let selectedDataRows = this.get('selectedDataRows');\n        return !selectedDataRows || !selectedDataRows.length;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"hXr4u8/q\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"selectionIsEmpty\\\"]],null],[16,\\\"data-t\\\",[34,[[26,[\\\"bulkActionTitle\\\"]]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"bulkAction\\\"]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null]]],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"bulkActionTitle\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-custom-footer'],\n    layout,\n\n    one: 1,\n    isFirstPage: Ember.computed.equal('currentPage', 1),\n    isLastPage: Ember.computed('currentPage', 'totalPages', function () {\n        return this.get('currentPage') === this.get('totalPages');\n    }),\n    listedPages: Ember.computed('currentPage', 'totalPages', function () {\n        let currentPage = this.get('currentPage');\n        let totalPages = this.get('totalPages');\n\n        // ideal number of pages to be linked on each side of current page\n        let neighbors = 3;\n\n        // determine how many pages \"short\" we are on each side\n        let pagesToFirst = currentPage - 1;\n        let pagesToLast = totalPages - currentPage;\n        let shortageL = pagesToFirst < neighbors ? neighbors - pagesToFirst : 0;\n        let shortageR = pagesToLast < neighbors ? neighbors - pagesToLast : 0;\n\n        // increase neighbors by the largest \"shortage\" value\n        neighbors += Math.max(shortageL, shortageR);\n\n        // calculate indices of first & last pages in range\n        let lowerIndex = currentPage - neighbors;\n        let upperIndex = currentPage + neighbors;\n        if (lowerIndex < 1) {\n            lowerIndex = 1;\n        }\n        if (upperIndex > totalPages) {\n            upperIndex = totalPages;\n        }\n\n        // build & return pages array\n        let pages = [];\n        for (let i = lowerIndex; i <= upperIndex; i++) {\n            pages.push({\n                index: i,\n                isCurrent: i === currentPage\n            });\n        }\n        return pages;\n    }),\n    firstPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(1) >= 0\n        );\n    }),\n    secondPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(2) >= 0\n        );\n    }),\n    penultimatePageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages') - 1) >= 0\n        );\n    }),\n    finalPageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages')) >= 0\n        );\n    }),\n    showPaginationControls: Ember.computed('listedPages', function () {\n        return this.get('listedPages').length > 1;\n    }),\n    showRangeLabel: Ember.computed.not('isLoading'),\n\n    actions: {\n        bulkAction(selectedDataRows, action) {\n            this.sendAction('bubbleAction', action, selectedDataRows);\n        },\n        showPage(pageNumber) {\n            this.set('currentPage', pageNumber);\n        },\n        showNextPage() {\n            this.sendAction('goToNextPage');\n        },\n        showPreviousPage() {\n            this.sendAction('goToPreviousPage');\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPVwICVQ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-footer-bulk-actions\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"bulkActions\\\"]]],[[\\\"selectedDataRows\\\",\\\"bulkAction\\\",\\\"bulkActionTitle\\\"],[[28,[\\\"selectedDataRows\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null],[28,[\\\"bulkActionTitle\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRangeLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/item-range\\\"],null,[[\\\"currentPage\\\",\\\"pageSize\\\",\\\"totalPages\\\",\\\"totalRows\\\"],[[28,[\\\"currentPage\\\"]],[28,[\\\"pageSize\\\"]],[28,[\\\"totalPages\\\"]],[28,[\\\"totalRows\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPaginationControls\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-pagination-controls\\\"],[13],[0,\\\"\\\\n\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-prev\\\"],[16,\\\"disabled\\\",[26,[\\\"isFirstPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPreviousPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_previous\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"firstPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",1]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"one\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"secondPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"listedPages\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[16,\\\"disabled\\\",[28,[\\\"page\\\",\\\"isCurrent\\\"]],null],[16,\\\"data-page\\\",[28,[\\\"page\\\",\\\"index\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"page\\\",\\\"index\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"page\\\",\\\"index\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"page\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"finalPageListed\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"penultimatePageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"totalPages\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"totalPages\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-next\\\"],[16,\\\"disabled\\\",[26,[\\\"isLastPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showNextPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_next\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    rowHasToggled: Ember.observer('groupAssignedRoles.changeCount', function () {\n        const isAssigned = this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n        const wasAssigned = this.get('wasAssigned');\n\n        if (wasAssigned === isAssigned) {\n            return;\n        } else {\n            this.set('wasAssigned', isAssigned);\n        }\n\n        if (!isAssigned) {\n            const previouslySelected = this.get('selectedDivisions');\n            this.set('selectedDivisions', []);\n            this._updateDivisions([], previouslySelected);\n        } else {\n            const homeDivision = this.get('store')\n                .peekAll('division')\n                .find(division => {\n                    return division.get('homeDivision');\n                });\n            const selected = [homeDivision];\n            this.set('selectedDivisions', selected);\n            this._updateDivisions(selected, []);\n        }\n    }),\n\n    allFutureDivisionsSelected: false,\n\n    actions: {\n        updateDivisions(currentSelection, info) {\n            this._updateDivisions(currentSelection, info.selected);\n        }\n    },\n\n    _updateDivisions(currentSelection, previousSelection) {\n        const allFutureDivision = currentSelection.find(division => {\n            return division.id === '*';\n        });\n        //don't allow special division to exist with any other division\n        if (allFutureDivision) {\n            currentSelection = [allFutureDivision];\n        }\n        this.set('allFutureDivisionsSelected', !!allFutureDivision);\n        this.set('selectedDivisions', currentSelection);\n        const roleId = this.get('dataRow.id');\n        this.bubbleAction('updateDivisions', roleId, currentSelection, previousSelection);\n    },\n\n    _loadDivisions() {\n        this.set('divisions', this.get('store').peekAll('division'));\n    },\n\n    _setSelectedDivisions() {\n        // need to set selected divisions from the divisions array to make select work\n        const roleId = this.get('dataRow.id');\n        const roleDivisions = this.get('groupAssignedRoles').getRoleWithDivisions(roleId)\n            ? Ember.get(this.get('groupAssignedRoles').getRoleWithDivisions(roleId), 'divisions')\n            : [];\n        if (roleDivisions && roleDivisions.length) {\n            const allDivisions = this.get('divisions');\n            const allFutureDivisionsSelected = roleDivisions.some(division => {\n                return division.id === '*';\n            });\n            this.set('allFutureDivisionsSelected', allFutureDivisionsSelected);\n            let selectedDivisions = [];\n\n            roleDivisions.forEach(selectedDivision => {\n                selectedDivisions.push(\n                    allDivisions.find(division => {\n                        return division.id === selectedDivision.id;\n                    })\n                );\n            });\n            this.set('selectedDivisions', selectedDivisions);\n        }\n    },\n\n    init() {\n        this._loadDivisions();\n        this._setSelectedDivisions();\n        this.set('wasAssigned', this.get('groupAssignedRoles').containsRole(this.get('dataRow.id')));\n        //for passing into  custom components (e.g. select-footer)\n        this.set('extra', { rolesEditComponent: this });\n        return this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    allDivisionsSelected: Ember.computed('select.selected', function () {\n        let optionsWithoutSpecial = this.get('select.options').filter(division => {\n            return division.id !== '*';\n        });\n        return this.get('select.selected.length') === optionsWithoutSpecial.length;\n    }),\n    allFutureDivisions: undefined,\n\n    _allFutureDivisionsObserver() {\n        const allFutureDivisions = this.get('allFutureDivisions');\n        if (allFutureDivisions) {\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([{ id: '*' }], powerSelectAPI.selected);\n        } else {\n            this._selectAll();\n        }\n    },\n\n    actions: {\n        selectAll() {\n            this._selectAll();\n        },\n        deselectAll() {\n            if (this.get('allFutureDivisions')) {\n                this.removeObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n                this.set('allFutureDivisions', false);\n                this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n            }\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([], powerSelectAPI.selected);\n        }\n    },\n\n    _selectAll() {\n        if (this.get('allFutureDivisions')) {\n            return;\n        }\n        const powerSelectAPI = this.get('select');\n        const rolesEditComponent = this.get('extra.rolesEditComponent');\n        let optionsWithoutSpecial = powerSelectAPI.options.filter(division => {\n            return division.id !== '*';\n        });\n        rolesEditComponent._updateDivisions(optionsWithoutSpecial, powerSelectAPI.selected);\n    },\n\n    init() {\n        const powerSelectAPI = this.get('select');\n        const allFutureDivisions = powerSelectAPI.selected.some(division => {\n            return division.id === '*';\n        });\n        this.set('allFutureDivisions', allFutureDivisions);\n        this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n        return this._super(...arguments);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"NxGzYqOH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisions\\\"]],\\\"btn btn-link select-all-divisions disabled\\\",\\\"btn btn-link select-all-divisions\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.selectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        |\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"btn btn-link deselect-all-divisions\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deselectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.deselectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"type\\\",\\\"disabled\\\",\\\"checked\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null],\\\"checkbox\\\",[33,[\\\"not\\\"],[[33,[\\\"or\\\"],[[28,[\\\"allFutureDivisions\\\"]],[28,[\\\"allDivisionsSelected\\\"]]],null]],null],[28,[\\\"allFutureDivisions\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null]]]],[13],[0,\\\" \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.allFutureDivisions\\\"],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({});\n","export default Ember.HTMLBars.template({\"id\":\"AzDakxFC\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"option\\\",\\\"id\\\"]],\\\"*\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.allDivisions\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[28,[\\\"option\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"q65Ds8WH\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isAssigned\\\"]]],null,{\\\"statements\\\":[[6,[\\\"power-select-multiple\\\"],null,[[\\\"renderInPlace\\\",\\\"selected\\\",\\\"options\\\",\\\"searchField\\\",\\\"class\\\",\\\"placeholder\\\",\\\"onchange\\\",\\\"extra\\\",\\\"noMatchesMessage\\\",\\\"selectedItemComponent\\\",\\\"afterOptionsComponent\\\"],[true,[28,[\\\"selectedDivisions\\\"]],[28,[\\\"divisions\\\"]],\\\"name\\\",\\\"divisions-power-select\\\",[33,[\\\"t\\\"],[\\\"groups.roles.selectDivisions\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateDivisions\\\"],null],[28,[\\\"extra\\\"]],[33,[\\\"t\\\"],[\\\"groups.roles.noDivisionsFound\\\"],null],\\\"group-profile/roles-edit/fixtable/division-select/selected-division\\\",\\\"group-profile/roles-edit/fixtable/division-select/select-footer\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"division\\\",\\\"id\\\"]],\\\"*\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisionsSelected\\\"]],\\\"division-select-option disabled\\\",\\\"division-select-option\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-name\\\"],[13],[1,[28,[\\\"division\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-description\\\"],[13],[1,[28,[\\\"division\\\",\\\"description\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"division\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    divisionsDisplayList: Ember.computed('dataRow.divisions.[]', function () {\n        const divisions = this.get('dataRow.divisions');\n        let displayString = '';\n        if (divisions.length) {\n            for (var i = 0; i < divisions.length - 1; i++) {\n                displayString +=\n                    divisions.objectAt(i).id === '*'\n                        ? this.get('intl').lookup('groups.roles.allDivisions')\n                        : divisions.objectAt(i).get('name');\n                displayString += ', ';\n            }\n            displayString +=\n                divisions.objectAt(i).id === '*'\n                    ? this.get('intl').lookup('groups.roles.allDivisions')\n                    : divisions.objectAt(i).get('name');\n        }\n        return displayString;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"5snZkTTk\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"divisionsDisplayList\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    groupAssignedRoles: Ember.inject.service(),\n\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardHandler();\n    },\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            const innerLabel = this.$('.toggle-switch[title]');\n            const roleName = this.get('dataRow.name');\n\n            if (toggleInput.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                toggleInput.attr('aria-label', labelText);\n\n                // If there's no existing label association, add one\n                if (!toggleInput.attr('aria-labelledby') && !toggleInput.attr('id')) {\n                    const uniqueId = `role-toggle-${this.get('dataRow.id')}`;\n                    toggleInput.attr('id', uniqueId);\n                }\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n        });\n    },\n\n    _setupKeyboardHandler() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            if (toggleInput.length) {\n                toggleInput.on('keydown.toggle', event => {\n                    if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n                        event.preventDefault();\n                        this.send('toggle');\n                    }\n                });\n            }\n        });\n    },\n\n    _removeKeyboardHandler() {\n        const toggleInput = this.$('input[type=\"checkbox\"]');\n        if (toggleInput && toggleInput.length) {\n            toggleInput.off('keydown.toggle');\n        }\n    },\n\n    actions: {\n        toggle() {\n            const isAssigned = !this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n            const roleId = this.get('dataRow.id');\n            this.bubbleAction('assignRole', roleId, isAssigned);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"tl06NBdl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"class\\\",\\\"check\\\",\\\"toggle\\\",\\\"aria-label\\\",\\\"title\\\"],[\\\"toggle-width\\\",[28,[\\\"isAssigned\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggle\\\"],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-item-range'],\n    layout,\n\n    dash: '-',\n    firstItemIndex: Ember.computed('currentPage', 'pageSize', function () {\n        return (this.get('currentPage') - 1) * this.get('pageSize') + 1;\n    }),\n    lastItemIndex: Ember.computed('currentPage', 'pageSize', 'totalPages', 'totalRows', function () {\n        if (this.get('currentPage') === this.get('totalPages')) {\n            return this.get('totalRows');\n        } else {\n            return this.get('currentPage') * this.get('pageSize');\n        }\n    }),\n    isSingleItem: Ember.computed('firstItemIndex', 'lastItemIndex', function () {\n        return this.get('firstItemIndex') === this.get('lastItemIndex');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"X1zLrc19\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"totalRows\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSingleItem\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[1,[26,[\\\"dash\\\"]],false],[1,[26,[\\\"lastItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.of\\\"],null],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[26,[\\\"totalRows\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    iconClass: Ember.computed('columnDef.iconClass', function () {\n        return this.get('columnDef.iconClass') || 'fa fa-minus';\n    }),\n    class: Ember.computed('columnDef.class', function () {\n        return this.get('columnDef.class') ? this.get('columnDef.class') : 'btn btn-danger btn-xs';\n    }),\n    disabledMessage: Ember.computed('columnDef.disabledMessage', 'dataRow.disabledMessage', function () {\n        return this.get('dataRow.disabledMessage') || this.get('columnDef.disabledMessage');\n    }),\n    actions: {\n        remove(id) {\n            if (!this.get('dataRow.isDeleteDisabled')) {\n                this.bubbleAction('remove', id);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"GtcE/MmX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dataRow\\\",\\\"hideButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],\\\"disabled\\\"],null],\\\" \\\",[26,[\\\"class\\\"]]]]],[15,\\\"data-t\\\",\\\"minus-button\\\"],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"remove\\\",[28,[\\\"dataRow\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[26,[\\\"iconClass\\\"]],null],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"left\\\",[28,[\\\"disabledMessage\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.hbs\"}});","import { debounce } from '@ember/runloop';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['search-field'],\n    classNameBindings: ['positionSubclass'],\n\n    debounce: 250,\n    query: '',\n    _isInitialized: false,\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.set('_isInitialized', true);\n    },\n\n    queryChanged: observer('query', function () {\n        if (this.get('_isInitialized')) {\n            debounce(this, this.triggerSearch, this.get('debounce'));\n        }\n    }),\n\n    positionSubclass: computed('position', function () {\n        let position = this.get('position');\n        return position ? `search-field-${this.get('position')}` : '';\n    }),\n\n    triggerSearch: function () {\n        this.sendAction('onChange', this.get('query'));\n    },\n\n    actions: {\n        reset() {\n            this.set('query', '');\n            this.triggerSearch();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"lNaKkjiL\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-field-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"query\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-times-circle search-field-reset\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reset\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-icon-magnifying-glass\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fill-between-floats\\\"],[15,\\\"data-t\\\",\\\"searchfieldparent\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[34,[[26,[\\\"query\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[15,\\\"data-t\\\",\\\"input-search\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.roles.roleSearch\\\"],null]]]],[16,\\\"onInput\\\",[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"query\\\"]]],null]],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lI4I0C0D\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"roles-edit\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"unsavedGrants\\\",\\\"hasUnsavedGrants\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[true,[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAllRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"updateDivisions\\\",\\\"assignRole\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesEditColumns\\\"]],[28,[\\\"allRolesFiltered\\\"]],true,[28,[\\\"isLoadingAllRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",\\\"updateUnsavedGrants\\\",\\\"toggleRoleAssignment\\\",[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn new-btn\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editRoles\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-edit\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.assignRoles\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAssignedRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"rowSelection\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"remove\\\",\\\"bulkAction\\\",\\\"emptyStateComponentValues\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesViewColumns\\\"]],[28,[\\\"groupAssignedRolesFiltered\\\"]],true,true,[28,[\\\"isLoadingGroupRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelSingleRole\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelMultipleRole\\\"],null],[33,[\\\"hash\\\"],null,[[\\\"nullMessage\\\"],[[33,[\\\"t\\\"],[\\\"groups.roles.noRolesAreAssigned\\\"],null]]]],[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],[[\\\"bulkActions\\\",\\\"bulkActionTitle\\\"],[\\\"group-profile/roles-edit/fixtable/bulk-actions/selected-elements\\\",[33,[\\\"t\\\"],[\\\"groups.roles.deleteAllSelected\\\"],null]]]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRoleRemoveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"rolesToDelete\\\",\\\"enforceModality\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.roles.confirmRemove\\\"],null],true,\\\"warning-modal\\\",\\\"deleteRoles\\\",\\\"closeWarningModal\\\",[28,[\\\"rolesToDelete\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"rolesToDelete\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRoleConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRolesConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"each\\\"],[[28,[\\\"rolesToDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"b\\\",[]],[13],[1,[28,[\\\"role\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"role\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRulesRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeRulesRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayHasRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmHasRolesWarningModal\\\",\\\"closeHasRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.thereAreRoles\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmRolesRemoval\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"J4JECv3L\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"container-fluid\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditLeftRailInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit dropdown\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"id\\\",\\\"group-profile-edit\\\"],[15,\\\"closeOnClickOutside\\\",\\\"true\\\"],[15,\\\"class\\\",\\\"btn btn-link dropdown-link\\\"],[15,\\\"data-toggle\\\",\\\"dropdown\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[6,[\\\"click-outside\\\"],null,[[\\\"action\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-popover\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"group-profile-edit-popover\\\"],[15,\\\"position\\\",\\\"bottom-end\\\"],[15,\\\"for\\\",\\\"group-profile-edit\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"popover-menu\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-general\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-general\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editGeneralInfo\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.generalInfo\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-picture\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-profile-picture-link group\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-rules\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-privacy-rules\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editPrivacyRules\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.edit.privacyRules\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"delete-group\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"delete-group text-danger\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteGroup\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.admin.delete\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-picture\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-8 col-xs-offset-2\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"model\\\"]],400]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"general\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row name\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row group-type\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isEditing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"groupTypeIcon\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupType\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"groupType\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"description-contact-info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row description\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"description\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"description\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"description\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupDescription\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewVideo\\\",\\\"canViewChat\\\",\\\"entity\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"canViewChat\\\"]],[28,[\\\"model\\\"]],[28,[\\\"favorites\\\",\\\"enabled\\\"]],\\\"viewLightGallery\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"meta\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row visibility\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"group_privacy_groupVisibility_labelKey_groupVisibility\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupVisibility\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"privacy\\\",\\\"groupVisibility\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLinks\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"tooltip.groupLink\\\"],null],true],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"ul\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"model\\\",\\\"general\\\",\\\"links\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-fields/weblink-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"link\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"links\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"link\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.phone\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneService\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[16,\\\"href\\\",[34,[\\\"mailto:\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],[13],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail tabsUI hunt-groups\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-tabs\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flex-left\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-membership-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"membershipHeader\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEditRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-roles-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"roles\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[26,[\\\"groupRolesHeader\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"callsEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link edit-button\\\"],[16,\\\"disabled\\\",[26,[\\\"isEditing\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleEditing\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"toggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"disableToggleCalls\\\"]],[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"canEditGroupTelephonySettings\\\",\\\"changeEditing\\\",\\\"toggleEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],\\\"changeEditingMode\\\",\\\"toggleEditing\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12 field-section tabsUI\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"group-profile/membership-listing\\\"],null,[[\\\"group\\\",\\\"callsEnabled\\\",\\\"owners\\\",\\\"individuals\\\",\\\"toggleCallsEnabled\\\",\\\"changeEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"callsEnabled\\\"]],[28,[\\\"model\\\",\\\"owners\\\",\\\"owners\\\"]],[28,[\\\"model\\\",\\\"individuals\\\",\\\"individuals\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null],\\\"changeEditingMode\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/roles-edit\\\"],null,[[\\\"model\\\",\\\"class\\\"],[[28,[\\\"model\\\"]],\\\"roles-edit-container\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"dynamicRules\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/dynamicRules\\\"],null,[[\\\"group\\\",\\\"class\\\",\\\"selectTab\\\"],[[28,[\\\"model\\\"]],\\\"dynamic-rules\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\"],null]]]],false],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\",\\\"targetAttachment\\\"],[[28,[\\\"model\\\"]],[28,[\\\"editingPictures\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null],\\\"none\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showContactInfo\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"enforceModality\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\"],[true,\\\"cancelEditContactInfo\\\",[33,[\\\"t\\\"],[\\\"groups.modal.contact\\\"],null],[33,[\\\"t\\\"],[\\\"common.save\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-contact-modal\\\"],null,[[\\\"entity\\\",\\\"saveContactInfo\\\",\\\"disableModal\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditContactInfo\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingDeleteModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.admin.deleteHeader\\\"],[[\\\"name\\\"],[[33,[\\\"escape\\\"],[[28,[\\\"model\\\",\\\"name\\\"]]],null]]]],true,\\\"delete-group-confirmation-modal\\\",\\\"confirmDelete\\\",\\\"cancelDelete\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.admin.deleteConfirmation\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingGeneralModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"generalFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditProfile\\\",\\\"canEditSection\\\",\\\"excludedFields\\\",\\\"disableModal\\\"],[[28,[\\\"model\\\"]],[28,[\\\"generalFieldConfigSection\\\"]],true,true,true,true,true,[28,[\\\"generalExcludedEditingFields\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"_confirm\\\",\\\"_cancel\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingPrivacyModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"privacyFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditSection\\\",\\\"canEditProfile\\\"],[[28,[\\\"model\\\"]],[28,[\\\"privacyFieldConfigSection\\\"]],true,true,true,true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayWarningModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['grouped-facet-term'],\n    classNameBindings: ['label'],\n\n    intl: Ember.inject.service(),\n\n    group: null,\n\n    showDropdown: false,\n\n    actions: {\n        removeSelectedTerm: function () {\n            var terms = this.get('group.terms');\n            var term = terms.objectAt(0);\n\n            this.send('removeSingleTerm', term);\n        },\n\n        removeSingleTerm: function (term) {\n            var facet = this.get('group.facet');\n            this.bubbleAction({\n                action: 'removeSelectedTerm',\n                actionContext: [term, facet]\n            });\n        },\n\n        toggleDropdown: function () {\n            if (!this.get('isSingleTerm')) {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    isSingleTerm: Ember.computed('group.terms.[]', function () {\n        return this.get('group.terms.length') === 1;\n    }),\n\n    label: Ember.computed('group.facet.facetName', function () {\n        var facetName = this.get('group.facet.facetName');\n        if (facetName) {\n            return facetName.toLowerCase().replace(/\\./gi, '_');\n        }\n    }),\n\n    value: Ember.computed('isSingleTerm', function () {\n        var terms = this.get('group.terms');\n        if (this.get('isSingleTerm')) {\n            var term = terms.objectAt(0);\n            return term.term;\n        } else {\n            return this.get('intl').lookup('search.multipleFacetsSelected', { count: terms.length }).toString();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"l2Nsz1vc\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"grouped-facet-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSingleTerm\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"facet\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"value\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSelectedTerm\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"terms-dropdown-button\\\"],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-controls\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"facet \\\",[33,[\\\"unless\\\"],[[28,[\\\"isSingleTerm\\\"]],\\\"clickable\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"value\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"toggle-dropdown clickable\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"ul\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[15,\\\"class\\\",\\\"terms-dropdown list-unstyled\\\"],[15,\\\"role\\\",\\\"region\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"t\\\",\\\"term\\\"]]],null]]]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSingleTerm\\\",[28,[\\\"t\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"t\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/grouped-facet-term/template.hbs\"}});","define(\"connections-ui/components/headset-status/component\", [\"exports\", \"ember-softphone-integration/components/headset-status/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/headset-vendor-picker/component\", [\"exports\", \"ember-softphone-integration/components/headset-vendor-picker/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/horizontal-collection\", [\"exports\", \"smoke-and-mirrors/components/horizontal-collection\"], function (_exports, _horizontalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _horizontalCollection.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    session: Ember.inject.service(),\n\n    bootstrapIcons: Ember.computed.reads('session.isAuthenticated')\n});\n","export default Ember.HTMLBars.template({\"id\":\"dekSi0FY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"bootstrapIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-chevron-right invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-email invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading invisible\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/icon-bootstrap/template.hbs\"}});","define(\"connections-ui/components/in-viewport\", [\"exports\", \"smoke-and-mirrors/components/in-viewport\"], function (_exports, _inViewport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inViewport.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport Ember from 'ember';\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        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        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        Ember.Logger.warn('Infinite scroll event closure action has not been set up.');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"x6vvnuBv\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"infinite-scroll-loader\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/infinite-scroll/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['integration-badge'],\n    tagName: 'span',\n\n    intl: inject.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.get('isSmall')) {\n            return this.get('useLightIcon')\n                ? this.get('integration.badgeIcons.light')\n                : this.get('integration.badgeIcons.dark');\n        }\n        return this.get('integration.icon');\n    }),\n\n    translation: computed.reads('integration.translation')\n});\n","export default Ember.HTMLBars.template({\"id\":\"isG4X8WY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"integration\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"class\\\",[34,[\\\"integration-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"mini-icon\\\"],null]]]],[16,\\\"src\\\",[26,[\\\"iconUri\\\"]],null],[16,\\\"alt\\\",[26,[\\\"translation\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badge/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['integration-badges'],\n\n    phoneIntegrations: Ember.inject.service(),\n\n    entity: null,\n    size: null,\n    useLightIcon: false,\n    isSmall: Ember.computed.equal('size', 'small')\n});\n","export default Ember.HTMLBars.template({\"id\":\"lSIuV8JS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entity\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"small-integration-badge\\\",\\\"\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"phone-integrations\\\"],[[28,[\\\"entity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badge\\\"],null,[[\\\"integration\\\",\\\"isSmall\\\",\\\"useLightIcon\\\"],[[28,[\\\"phoneIntegration\\\"]],[28,[\\\"isSmall\\\"]],[28,[\\\"useLightIcon\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phoneIntegration\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badges/template.hbs\"}});","define(\"connections-ui/components/interaction-annotation/component\", [\"exports\", \"ember-purecloud-components/components/interaction-annotation/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar LightGalleryModal = Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showing: false,\n    escaped: false,\n\n    gallery: Ember.computed('entity.images.informal', 'entity.images.gallery', function () {\n        if (this.get('entity.type') === 'group') {\n            return this.get('entity.images.gallery');\n        }\n        return this.get('entity.images.informal');\n    }),\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        }\n    },\n\n    initGallery: Ember.observer('showing', function () {\n        if (this.get('showing')) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                const gallery = Ember.$('#lightGallery');\n                const images = gallery.children('li');\n\n                images.each((index /*, image */) => {\n                    const caption =\n                        '<div class=\"customHtml\"><h3>' + this.get('gallery')[index].labelKey + '</h3></div>';\n                    Ember.$(this).attr('data-sub-html', caption);\n                });\n\n                gallery.lightGallery({\n                    caption: true,\n                    loop: true,\n                    speed: 1,\n                    closable: false,\n                    escKey: true,\n                    lang: { allPhotos: this.get('intl').lookup('images.allPhotos') }\n                });\n            });\n        }\n    })\n});\n\nexport default LightGalleryModal;\n","export default Ember.HTMLBars.template({\"id\":\"BWEPhqLd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirmText\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"cancelText\\\"],[null,\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.viewPictures\\\"],null],[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"light-gallery-modal\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"id\\\",\\\"lightGallery\\\"],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"gallery\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"data-src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/light-gallery-modal/template.hbs\"}});","define(\"connections-ui/components/link-to-external\", [\"exports\", \"ember-engines/components/link-to-external-component\"], function (_exports, _linkToExternalComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _linkToExternalComponent.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['loading-indicator']\n});\n","export default Ember.HTMLBars.template({\"id\":\"Tx//k/3u\",\"block\":\"{\\\"statements\\\":[[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/loading-indicator/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['location-display', 'location'],\n\n    entity: null,\n    location: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"fewxU3+t\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],200]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h5\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/location-display/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['login-oauth'],\n\n    session: inject.service(),\n\n    isAuthenticated: computed.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.get('offerMobileApp')) {\n            this.attrs.authenticate();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"dq/ukkxL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isAuthenticated\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/login-oauth/template.hbs\"}});","define(\"connections-ui/components/logoff-link/component\", [\"exports\", \"ember-purecloud-components/components/logoff-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nexport default Ember.Component.extend({\n    tagName: 'ul',\n    classNames: ['media-provider-video-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    webrtc: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n    embedded: Ember.inject.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 in Web-Directory\n    selectProvider(provider) {\n        const personId = this.get('user').get('id');\n        const providerId = provider.get('id');\n        this.get('embedded').launchVideoProviderWithPersonById(personId, providerId);\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        Ember.assert(!!this.get('user'), '`user` is required');\n        Ember.assert(!!this.get('attachTo'), '`attachTo` is required');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        Ember.run.scheduleOnce('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        const ev = `click.${this.elementId}`;\n\n        Ember.$(window).off(ev);\n        if (targetEl) {\n            Ember.$(targetEl).off(ev);\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            Ember.run.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.$('.media-provider-arrow')[0],\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.get('attachClickHandler')) {\n            this.set('_displayDropdown', false);\n\n            Ember.$(targetEl).on(\n                `click.${this.elementId}`,\n                Ember.run.bind(this, () => Ember.run.once(this, this.handleClick))\n            );\n\n            Ember.$(window).on(`click.${this.elementId}`, Ember.run.bind(this, this.handleOutsideClick));\n        }\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        Ember.run.join(() =>\n            Ember.run.scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate())\n        );\n    },\n\n    handleOutsideClick(event) {\n        if (!this.get('displayDropdown')) {\n            return;\n        }\n\n        let target = event.target;\n        let isAttachTarget = Ember.$(this.attachTo).is(target);\n        let componentParents = Ember.$(target).parent(this.elementId);\n        let attachTargetParents = Ember.$(target).parents(this.attachTo);\n\n        if (!isAttachTarget && componentParents.length === 0 && attachTargetParents.length === 0) {\n            this.send('hide');\n        }\n    },\n\n    showingVideo: Ember.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: Ember.computed('user', 'room', 'webrtc.activeRoom.oneToOneTarget.presence', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'), this.get('room'));\n    }),\n\n    displayDropdown: Ember.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.get('showingVideo')) {\n                return false;\n            }\n\n            let chatRoom = this.get('room');\n            if (chatRoom && chatRoom.isGroupRoom()) {\n                return this._displayDropdown;\n            }\n\n            return this._displayDropdown;\n        }\n    )\n});\n","export default Ember.HTMLBars.template({\"id\":\"VTG6SUhQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"providers\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"provider\\\",\\\"haveAccess\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],\\\"disabled\\\"],null]]]],[16,\\\"aria-disabled\\\",[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectProvider\\\"]],[28,[\\\"provider\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"provider\\\",\\\"label\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"right\\\",[33,[\\\"t\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabledMessage\\\"]]],null]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"provider\\\"]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-provider-arrow\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/media-providers/video-dropdown/template.hbs\"}});","import Ember from 'ember';\n\nvar MiniCardComponent = Ember.Component.extend({\n    tagName: 'a',\n    attributeBindings: ['href'],\n    classNameBindings: [':mini-card', 'isManager:manager-card:'],\n\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n\n    entity: null,\n    currentPerson: null,\n    managerCount: null,\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    isManager: Ember.computed('entity', 'currentPerson', function () {\n        return this.get('entity.id') === this.get('currentPerson.manager.id');\n    }),\n\n    managerCountText: Ember.computed('managerCount', function () {\n        const intl = this.get('intl');\n        const count = this.get('managerCount');\n        if (count === 1) {\n            return intl.lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return intl.lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    click: function () {\n        this.sendAction('action', this.get('entity'));\n    },\n    eLocation: Ember.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: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.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: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    })\n});\n\nexport default MiniCardComponent;\n","export default Ember.HTMLBars.template({\"id\":\"PTNBkxes\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4 profile-pic\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[28,[\\\"entity\\\"]],200,false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-8 col-md-8 col-lg-8 profile-general\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"managerCount\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"managers\\\"],[13],[0,\\\"(\\\"],[1,[26,[\\\"managerCountText\\\"]],false],[0,\\\")\\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/mini-card/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\nimport * as focusTrap from 'focus-trap';\n\nexport default Ember.Component.extend({\n    layout: layout,\n    translucentOverlay: true,\n    containerClassNames: ['modal-component', 'modal', 'in', 'fade'].join(' '),\n    overlayClassNames: 'translucent',\n\n    intl: Ember.inject.service(),\n\n    headerText: '',\n    confirmText: '',\n    cancelText: '',\n\n    cancel: null,\n    confirm: null,\n\n    showHeader: true,\n    showFooter: true,\n    wrapContent: true,\n    enforceModality: false,\n\n    extraClassNames: '',\n\n    confirmDisabled: false,\n    noCancel: false,\n\n    trap: null,\n\n    actions: {\n        sendClose() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            if (typeof this.get('confirm') === 'function') {\n                let ret = this.get('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 (typeof this.attrs.cancel === 'function') {\n                this.attrs.cancel();\n            } else {\n                this.sendAction('cancel');\n            }\n        },\n\n        backdropDismiss() {\n            if (!this.get('enforceModality')) {\n                this.send('sendClose');\n            }\n        },\n\n        setAttribute(key, value) {\n            this.set(key, value);\n        }\n    },\n\n    setText: Ember.on('init', function () {\n        const intl = this.get('intl');\n        let { headerText, confirmText, cancelText } = this.getProperties('headerText', 'confirmText', 'cancelText');\n\n        if (headerText === '') {\n            headerText = intl.lookup('components.modal.header').toString();\n        }\n\n        if (confirmText === '') {\n            confirmText = intl.lookup('common.confirm').toString();\n        }\n\n        if (cancelText === '') {\n            cancelText = intl.lookup('common.cancel').toString();\n        }\n\n        this.setProperties({\n            headerText,\n            confirmText,\n            cancelText\n        });\n    }),\n\n    confirmAction: Ember.computed({\n        get() {\n            return this.get('confirm');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('confirm', value);\n            }\n            return value;\n        }\n    }),\n\n    cancelAction: Ember.computed({\n        get() {\n            return this.get('cancel');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('cancel', value);\n            }\n            return value;\n        }\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    attachClassToBody: Ember.on('didInsertElement', function () {\n        Ember.$('body').addClass('modal-open');\n\n        const modalContainerElement = this.$('.modal-dialog .modal-content')[0];\n        this.trap = focusTrap.createFocusTrap(modalContainerElement, {\n            escapeDeactivates: false,\n            allowOutsideClick: true\n        });\n        if (this.trap) {\n            this.trap.activate();\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        Ember.$('body').removeClass('modal-open');\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"vbH6Zjnv\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"overlayClassNames\\\",\\\"containerClassNames\\\",\\\"targetAttachment\\\",\\\"onClose\\\"],[[28,[\\\"overlayClassNames\\\"]],[28,[\\\"containerClassNames\\\"]],\\\"center\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"modal-dialog \\\",[26,[\\\"extraClassNames\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[15,\\\"role\\\",\\\"dialog\\\"],[16,\\\"aria-label\\\",[26,[\\\"headerText\\\"]],null],[15,\\\"aria-modal\\\",\\\"true\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"wrapContent\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showHeader\\\"]],[28,[\\\"headerText\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"modal-title\\\"],[13],[1,[26,[\\\"headerText\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.close\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n                    \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setAttribute\\\"],null],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showFooter\\\"]],[33,[\\\"or\\\"],[[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"confirmText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"confirmDisabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendConfirm\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"confirmText\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cancelText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendCancel\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"cancelText\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"modal-button-close\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null],null],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[15,\\\"accent\\\",\\\"ghost\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"close\\\"],[16,\\\"screenreader-text\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n                \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/modal-component/template.hbs\"}});","define(\"connections-ui/components/modal-dialog-overlay\", [\"exports\", \"ember-modal-dialog/components/modal-dialog-overlay\"], function (_exports, _modalDialogOverlay) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialogOverlay.default;\n    }\n  });\n});\n","define(\"connections-ui/components/modal-dialog\", [\"exports\", \"ember-modal-dialog/components/modal-dialog\"], function (_exports, _modalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialog.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport ModalDialog from 'ember-modal-dialog/components/modal-dialog';\n\n// This is a wrapper for the modal-dialog in the ember-modal-dialog library\nexport default ModalDialog.extend({\n    didInsertElement() {\n        this._super(...arguments);\n        this._initEscListener();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$('body').off('keyup.modal-dialog');\n    },\n\n    _initEscListener() {\n        const closeOnEscapeKey = ev => {\n            if (ev.key === 'Escape' || ev.key === 'Esc') {\n                this.sendAction('onClose');\n            }\n        };\n\n        Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey);\n    }\n});\n","define(\"connections-ui/components/navigation-sub-menu/component\", [\"exports\", \"ember-purecloud-components/components/navigation-sub-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nimport CreateGroupMixin from '../../mixins/create-group';\n\nconst { inject, Component } = Ember;\n\nexport default Component.extend(CreateGroupMixin, {\n    classNames: ['new-group'],\n\n    intl: inject.service(),\n\n    attrs: {\n        confirm() {},\n        cancel() {},\n        setAttribute() {}\n    },\n\n    setHandlers: Ember.on('init', function () {\n        const setAttr = this.get('setAttribute');\n        setAttr('confirm', this.createGroup.bind(this));\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.$('.form-control:first').focus();\n        });\n    }),\n\n    checkNameLength: Ember.observer('groupName', function () {\n        let isTooLong = this.get('groupName.length') > 140;\n\n        if (isTooLong) {\n            this.attrs.disable(true);\n            this.$('input.form-control').tooltip({\n                placement: 'bottom',\n                title: this.get('intl').lookup('groups.admin.nameLengthTooltip'),\n                trigger: 'manual'\n            });\n            this.$('input.form-control').tooltip('show');\n        } else {\n            this.attrs.disable(false);\n            this.$('input.form-control').tooltip('destroy');\n        }\n\n        this.set('nameLengthExceeded', isTooLong);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"PP2l++Ax\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-name\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.name\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-name\\\"],null],\\\"form-control\\\",[28,[\\\"groupName\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-type\\\"]]],[13],[1,[26,[\\\"groupTypeI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-type\\\"],null],[28,[\\\"groupType\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupType\\\"]]],null]],null],[28,[\\\"groupTypeDefault\\\"]],\\\"form-control group-type\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupTypeChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupTypeChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupTypeChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupTypeChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"]]],[13],[1,[26,[\\\"groupVisibilityI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"],null],[28,[\\\"groupVisibility\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupVisibility\\\"]]],null]],null],[28,[\\\"groupVisibilityDefault\\\"]],\\\"form-control group-visibility\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupVisibilityChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupVisibilityChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupVisibilityChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupVisibilityChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/new-group/template.hbs\"}});","define(\"connections-ui/components/occludable-area\", [\"exports\", \"smoke-and-mirrors/components/occludable-area\"], function (_exports, _occludableArea) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _occludableArea.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pc-style-icon-example\", [\"exports\", \"ember-purecloud-style/components/pc-style-icon-example\"], function (_exports, _pcStyleIconExample) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pcStyleIconExample.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport WebrtcActionUtilsMixin from 'connections-ui/mixins/webrtc-action-utils';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\nimport DS from 'ember-data';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport default Component.extend(WebrtcActionUtilsMixin, EntityImageDefaults, {\n    classNameBindings: ['isActive:current:sibling', 'isActive:col-sm-6:col-sm-3', ':card'],\n    attributeBindings: ['entity.id:data-entity-id'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    entity: null,\n\n    phone: inject(),\n\n    needsServices: ['chat'],\n    excludedFields: ['chat'],\n\n    init() {\n        this._super(...arguments);\n        this.checkUnusedFields();\n    },\n\n    emailEnabled: computed.notEmpty('entity.email'),\n    showPhone: computed.bool('phoneServiceEnabled'),\n\n    phoneNumber: computed('phoneNumber', function () {\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n\n        let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n        if (phone && phone.value && phone.value.fieldPath) {\n            return entity.getFieldValue(phone.value.fieldPath);\n        }\n\n        if (phone.rel) {\n            return phone.rel.e164;\n        }\n    }),\n\n    isSelf: Ember.computed('entity.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityContactGroupData: computed('entity.email', 'entity.phone.number', function () {\n        return {\n            isPerson: true,\n            isChatEnabled: true,\n            videoTooltipTitle: this.get('videoTooltipTitle'),\n            isWebrtcEnabled: this.get('isWebrtcEnabled'),\n            emailEnabled: this.get('emailEnabled'),\n            linkToProfile: 'person.detail',\n            phoneServiceEnabled: this.get('phoneServiceEnabled'),\n            phoneAvailable: this.get('phone.enabled'),\n            emailAddress: this.entity.get('email'),\n            telephoneNumber: this.entity.get('phone.number'),\n            showPhone: this.get('showPhone'),\n            isVideoButtonEnabled: this.get('isVideoButtonEnabled'),\n            canViewChat: this.get('canViewChat'),\n            canViewVideo: this.get('canViewVideo')\n        };\n    }),\n\n    checkUnusedFields: observer('entity', function () {\n        this.set('excludedFields', ['chat']);\n\n        if (this.get('entity.fieldConfig.sections') !== undefined) {\n            var fields = this.get('entity.fieldConfig.sections')[7].get('fieldList');\n\n            for (var i = 0; i < fields.length; i++) {\n                var value = this.get('entity.data.contactInfo.' + fields[i].key);\n\n                if (value === undefined || value[0].value === '') {\n                    this.get('excludedFields').push(fields[i].key);\n                }\n            }\n        }\n    }),\n\n    initialFieldsCheck: Ember.on('init', function () {\n        this.checkUnusedFields();\n    }),\n    eLocation: Ember.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: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.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: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    actions: {\n        startChat: function () {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [this.get('entity')]\n            });\n        },\n\n        moveToPerson: function () {\n            this.sendAction('setPerson', this.get('entity'));\n        }\n    },\n\n    async toggleFavorite() {\n        await this.get('favorites').toggleFavorite(this.entity);\n        this.setEntityContactGroupData();\n    },\n\n    navigateToProfileEvent() {\n        try {\n            const router = getOwner(this).lookup('router:main');\n            const profileId = this.entity.get('id');\n            if (router && profileId) router.transitionTo('person.detail', profileId);\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    },\n\n    contactEvent(e) {\n        try {\n            const openChat = this.get('actionOpenChatRoom');\n            const openVideo = this.get('actionOpenVideoCall');\n\n            switch (e.detail) {\n                case 'call':\n                    this.callEntity(this.entity);\n                    break;\n                case 'chat':\n                    if (openChat) {\n                        openChat(this.entity);\n                    }\n                    break;\n                case 'video':\n                    if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                        return;\n                    }\n                    if (openVideo) {\n                        openVideo(this.entity.get('jid'), this.get('useMediaProviders'));\n                    }\n                    break;\n                case 'navigateToProfile':\n                    this.navigateToProfileEvent();\n                    break;\n                default:\n                    Ember.Logger.error('Error: contact event not found.');\n                    break;\n            }\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PAQ203B5\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-image\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"moveToPerson\\\"]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],400,true,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-info\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h2\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-location-container\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location align-center\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"tooltip.person.profile\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"linkProfile\\\",\\\"showImages\\\",\\\"useMediaProviders\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],true,false,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-card/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonGraphComponent = Ember.Component.extend({\n    classNames: ['person-graph'],\n    classNameBindings: ['mini:mini'],\n    attributeBindings: ['width', 'height'],\n\n    person: null,\n\n    graph: null,\n    paper: null,\n\n    mini: false,\n\n    trueColor: '#66f',\n    trueStrokeColor: 'white',\n\n    falseColor: '#ddd',\n    falseStrokeColor: 'white',\n\n    disabledColor: 'transparent',\n    disabledStrokeColor: 'transparent',\n\n    disabledSegments: null,\n\n    paths: null,\n    baseAttrForPath: {},\n\n    segmentChanged: Ember.observer(\n        'graph',\n        'graph.{ancestors,parent,self,siblings,children,descendants}',\n        function (sender, key) {\n            if (this.get('paths')) {\n                var segName = key.split('.').reverse()[0];\n                var segment = this.get('paths.' + segName);\n                if (segment) {\n                    segment.attr(this.attrForSegment(segName));\n                }\n            }\n        }\n    ),\n\n    disabledSegmentsChanged: Ember.observer('disabledSegments.[]', function () {\n        var segs = this.get('disabledSegments');\n        var graph = this.get('graph');\n        if (segs && graph) {\n            for (var i = 0; i < segs.length; i++) {\n                graph.set(segs[i], false);\n                this.segmentChanged(this, 'graph.' + segs[i]);\n            }\n        }\n    }),\n\n    setupGraph: Ember.on('didInsertElement', function () {\n        this.set('paths', {});\n\n        if (!this.get('graph')) {\n            this.set(\n                'graph',\n                Ember.Object.create({\n                    ancestors: false,\n                    parent: false,\n                    self: false,\n                    siblings: false,\n                    children: false,\n                    descendants: false\n                })\n            );\n        }\n\n        this.drawGraphics();\n    }),\n\n    destroyGraphics: Ember.on('willDestroyElement', function () {\n        if (this.get('paper')) {\n            this.get('paper').remove();\n            this.set('paper', null);\n        }\n    }),\n\n    click: function (event) {\n        if (this.get('mini')) {\n            return;\n        }\n\n        var target = Ember.$(event.target);\n\n        if (target.is('path')) {\n            var segment = target.data('segmentName');\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: segment\n            });\n        } else if (target.is('img') || target.is('.entity-image')) {\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: 'self'\n            });\n        }\n    },\n\n    isDisabled: function (segment) {\n        return this.get('disabledSegments') && this.get('disabledSegments').indexOf(segment) > -1;\n    },\n\n    drawGraphics: function () {\n        this.destroyGraphics();\n\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var paper = new window.Raphael(this.get('element'), width, height);\n        this.set('paper', paper);\n\n        this.drawSegment('ancestors');\n        this.drawSegment('parent');\n        this.drawSegment('self');\n        this.drawSegment('siblings');\n        this.drawSegment('children');\n        this.drawSegment('descendants');\n\n        paper.renderfix();\n        paper.safari();\n    },\n\n    drawSegment: function (segment) {\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var xform = ['s', width, ',', height, ',0,0'];\n\n        var path = this.get('paper').path(this.pathForSegment(segment));\n        var attr = $.extend(this.get('baseAttrForPath'), this.attrForSegment(segment), { 'stroke-width': 0.5 });\n\n        path.transform(xform.join('')).attr(attr);\n        Ember.$(path.node).data('segmentName', segment);\n\n        this.set('paths.' + segment, path);\n    },\n\n    attrForSegment: function (segment) {\n        var attr = {};\n        attr.cursor = 'pointer';\n\n        if (this.isDisabled(segment)) {\n            attr.fill = this.get('disabledColor');\n            attr.stroke = this.get('disabledStrokeColor');\n            attr.cursor = 'default';\n        } else if (this.get('graph.' + segment)) {\n            attr.fill = this.get('trueColor');\n            attr.stroke = this.get('trueStrokeColor');\n        } else {\n            attr.fill = this.get('falseColor');\n            attr.stroke = this.get('falseStrokeColor');\n        }\n\n        if (this.get('mini')) {\n            attr.cursor = 'default';\n        }\n\n        return attr;\n    },\n\n    pathForSegment: function (segment) {\n        if (this.get('mini')) {\n            return this.get(segment + 'SmallPath');\n        } else {\n            return this.get(segment + 'Path');\n        }\n    },\n\n    ancestorsPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentPath:\n        'M0.439,0.299C0.458,0.294,0.478,0.29,0.499,0.29c0.022,0,0.043,0.004,0.064,0.011V0.258h0.062L0.499,0.133L0.374,0.258h0.065V0.299z',\n    selfPath:\n        'M0.499,0.313c-0.103,0-0.186,0.083-0.186,0.186s0.083,0.186,0.186,0.186s0.186-0.083,0.186-0.186S0.602,0.313,0.499,0.313z  M0.499,0.624c-0.069,0-0.125-0.056-0.125-0.125c0-0.069,0.056-0.125,0.125-0.125c0.069,0,0.125,0.056,0.125,0.125C0.624,0.568,0.568,0.624,0.499,0.624z',\n    siblingsPath:\n        'M0.298,0.559C0.293,0.54,0.289,0.52,0.289,0.5c0-0.022,0.004-0.044,0.011-0.064H0.173V0.374L0.049,0.5l0.125,0.125V0.559H0.298z M0.698,0.438c0.005,0.019,0.009,0.039,0.009,0.059c0,0.023-0.004,0.044-0.011,0.064h0.126v0.062l0.125-0.126L0.823,0.372v0.065H0.698z',\n    childrenPath:\n        'M0.56,0.699C0.541,0.705,0.521,0.708,0.5,0.708c-0.022,0-0.044-0.004-0.064-0.011v0.043H0.374L0.5,0.865l0.125-0.125H0.56V0.699z',\n    descendantsPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z',\n\n    ancestorsSmallPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentSmallPath:\n        'M0.439,0.343c0.019-0.007,0.039-0.011,0.06-0.011c0.022,0,0.044,0.004,0.064,0.013V0.291h0.062L0.499,0.167L0.374,0.291h0.065V0.343z',\n    selfSmallPath:\n        'M0.499,0.374c-0.069,0-0.125,0.056-0.125,0.125c0,0.069,0.056,0.125,0.125,0.125c0.069,0,0.125-0.057,0.125-0.125c0-0.038-0.017-0.072-0.043-0.095C0.559,0.385,0.53,0.374,0.499,0.374z',\n    siblingsSmallPath:\n        'M0.332,0.499c0-0.023,0.004-0.044,0.013-0.063H0.208V0.374L0.083,0.5l0.125,0.125V0.559h0.136C0.336,0.54,0.332,0.52,0.332,0.499z M0.916,0.498L0.791,0.374v0.065H0.654c0.007,0.019,0.012,0.039,0.012,0.06c0,0.022-0.004,0.043-0.013,0.063h0.138v0.062L0.916,0.498z',\n    childrenSmallPath:\n        'M0.56,0.654L0.56,0.654C0.55,0.658,0.541,0.661,0.53,0.663S0.51,0.666,0.499,0.666c-0.011,0-0.022-0.001-0.033-0.003c-0.01-0.002-0.021-0.005-0.03-0.009v0.054H0.374L0.5,0.833l0.125-0.125H0.56V0.654z',\n    descendantsSmallPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z'\n});\nexport default PersonGraphComponent;\n","export default Ember.HTMLBars.template({\"id\":\"fmI57xbg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"mini\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-graph/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonIconComponent = Ember.Component.extend({\n    classNames: ['person-icon'],\n\n    favorites: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    canViewChat: Ember.computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.reads('permissions.canViewCollaborateVideo'),\n    person: null,\n\n    actions: {\n        noop: () => {}\n    }\n});\n\nexport default PersonIconComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Vh8AiTYZ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"useInitialsPlaceholder\\\",\\\"enableMiniCard\\\",\\\"isLinkable\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"subscribeToPresence\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"componentUpdated\\\",\\\"onContact\\\"],[[28,[\\\"person\\\"]],48,true,true,true,true,[28,[\\\"favorites\\\",\\\"enabled\\\"]],true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"noop\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-icon/template.hbs\"}});","import Ember from 'ember';\r\nimport PikadayInputComponent from 'ember-pikaday/components/pikaday-input';\r\n\r\nexport default PikadayInputComponent;\r\n","define(\"connections-ui/components/pikaday-inputless\", [\"exports\", \"ember-pikaday/components/pikaday-inputless\"], function (_exports, _pikadayInputless) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pikadayInputless.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-component\", [\"exports\", \"ember-tooltips/components/popover-on-component\"], function (_exports, _popoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-element\", [\"exports\", \"ember-tooltips/components/popover-on-element\"], function (_exports, _popoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple\", [\"exports\", \"ember-power-select/components/power-select-multiple\"], function (_exports, _powerSelectMultiple) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectMultiple.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple/trigger\", [\"exports\", \"ember-power-select/components/power-select-multiple/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select\", [\"exports\", \"ember-power-select/components/power-select\"], function (_exports, _powerSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelect.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/before-options\", [\"exports\", \"ember-power-select/components/power-select/before-options\"], function (_exports, _beforeOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _beforeOptions.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/options\", [\"exports\", \"ember-power-select/components/power-select/options\"], function (_exports, _options) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _options.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/placeholder\", [\"exports\", \"ember-power-select/components/power-select/placeholder\"], function (_exports, _placeholder) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _placeholder.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/power-select-group\", [\"exports\", \"ember-power-select/components/power-select/power-select-group\"], function (_exports, _powerSelectGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectGroup.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/search-message\", [\"exports\", \"ember-power-select/components/power-select/search-message\"], function (_exports, _searchMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _searchMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/trigger\", [\"exports\", \"ember-power-select/components/power-select/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pre-render\", [\"exports\", \"smoke-and-mirrors/components/pre-render\"], function (_exports, _preRender) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _preRender.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/person-activity/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/person-activity/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/profile-dropdown-menu/component\", [\"exports\", \"ember-webrtc-components/components/profile-dropdown-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/progress-underlay/component\", [\"exports\", \"ember-purecloud-components/components/progress-underlay/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/queue-toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/queue-toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'input',\n\n    attributeBindings: [\n        'type',\n        'disabled',\n        'isChecked:checked',\n        'name',\n        'ariaLabel:aria-label',\n        'ariaLabelledBy:aria-labelledby',\n        'ariaDescribedBy:aria-describedby'\n    ],\n\n    checked: false,\n    disabled: false,\n    onClick: () => {},\n\n    type: 'radio',\n    name: 'radio',\n    ariaLabel: null,\n    ariaLabelledBy: null,\n    ariaDescribedBy: null,\n    isChecked: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('isChecked', this.get('checked'));\n    },\n\n    didUpdateAttrs() {\n        this.set('isChecked', this.get('checked'));\n    },\n\n    click(event) {\n        this.set('isChecked', true);\n\n        this.get('onClick')();\n\n        event.stopPropagation();\n    }\n});\n","import Ember from 'ember';\n\nconst { on, observer, Component } = Ember;\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.$().css('min-height', this.get('minHeight'));\n    }),\n\n    minimizedChanged: observer('minimized', function () {\n        if (this.get('minimized')) {\n            this.$().css('min-height', this.get('minHeight'));\n        } else {\n            let maxHeight = this.get('maxHeight');\n            if (!maxHeight) {\n                maxHeight = 'calc(100% - 8px)';\n                this.set('maxHeight', maxHeight);\n            }\n            this.$().css('min-height', maxHeight);\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O1G95mNX\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"resize-handle btn btn-purecloud\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleSize\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"minimized\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.expand\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.collapse\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/resizable-content/template.hbs\"}});","define(\"connections-ui/components/resize-detector\", [\"exports\", \"ember-element-resize-detector/components/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-group', 'panel', 'panel-default'],\n    classNameBindings: ['panelId'],\n\n    facet: null,\n    parentId: null,\n\n    selectedTerms: [],\n\n    accordianParentId: Ember.computed('parentId', function () {\n        return '#' + this.get('parentId');\n    }),\n\n    panelId: Ember.computed('facet.facetName', function () {\n        return this.get('facet.facetName').replace(/\\./g, '_');\n    }),\n\n    href: Ember.computed('panelId', function () {\n        return '#' + this.get('panelId');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"4Rob5zmU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"facet-label panel-heading\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"panel-title\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"role\\\",\\\"button\\\"],[15,\\\"data-toggle\\\",\\\"collapse\\\"],[16,\\\"data-parent\\\",[26,[\\\"parentId\\\"]],null],[16,\\\"href\\\",[26,[\\\"href\\\"]],null],[15,\\\"aria-expanded\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"facet\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"terms panel-collapse collapse in\\\"],[16,\\\"id\\\",[26,[\\\"panelId\\\"]],null],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-body\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"facet\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"term \\\",[33,[\\\"css-classify\\\"],[[28,[\\\"term\\\",\\\"term\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"search-facet-term\\\"],null,[[\\\"facet\\\",\\\"term\\\",\\\"selectedTerms\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\"]],[28,[\\\"selectedTerms\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"term\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-group/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-term'],\n\n    facet: null,\n    term: null,\n\n    selectedTerms: [],\n\n    isSelected: false,\n\n    actions: {\n        selectTerm: function () {\n            var term = this.get('term');\n            var facet = this.get('facet');\n            var action = 'selectTerm';\n\n            this.bubbleAction({\n                action: action,\n                actionContext: [term, facet]\n            });\n        }\n    },\n\n    selectedTermsChanged: Ember.observer('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var term = terms.findBy('term', this.get('term'));\n        this.set('isSelected', term !== undefined);\n    })\n\n    //    isSelectedChanged: Ember.observer('isSelected', function () {\n    //        var selected = this.get('isSelected');\n    //        if (!selected) {\n    //            this.send('selectTerm');\n    //        }\n    //    })\n\n    //    isSelected: Ember.computed('selectedTerms.[]', function () {\n    //        var terms = this.get('selectedTerms');\n    //        var term = terms.findBy('term', this.get('term'));\n    //        return term !== undefined;\n    //    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"8+SnBQn/\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"term\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTerm\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"count\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[28,[\\\"term\\\",\\\"count\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-term/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../../utils/newrelic';\nimport { BASE_GROUP_FIELDS } from '../../models/group';\nimport { BASE_LOCATION_FIELDS } from '../../models/location';\nimport { BASE_PERSON, BASE_PERSON_EXPANDS, BASE_PERSON_FIELDS } from '../../models/person';\nimport { MULTI_ENTITY_FIELDS } from '../../utils/entity-fields';\n\nconst FAVORITE_LIMIT = 200;\nconst FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA = 50;\n\nconst PAGE_SIZE = 15;\nconst FACET_COUNT = 10;\nconst PAGE_LIMIT = 4;\nconst keypathRegex = /[\\w+.]+:\"?.[^\"]+([\\w\\s]+)?\"?/gi;\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\nfunction reverseLookup(obj, value) {\n    for (const key in obj) {\n        if (obj[key] === value) {\n            return key;\n        }\n    }\n}\n\nconst FacetTerm = Ember.Object.extend({\n    facet: null,\n    term: null,\n    isKeyword: false,\n\n    searchField: Ember.computed('facet.facetName', function () {\n        return reverseLookup(SEARCH_FACET_KEYPATHS, this.get('facet.facetName'));\n    }),\n\n    toString: function () {\n        if (this.get('isKeyword')) {\n            return this.get('term.term');\n        }\n\n        const name = this.get('facet.facetName');\n        const term = this.get('term.term');\n        return `${name}:\"${term}\"`;\n    }\n});\n\nconst View = {\n    classNames: ['container-fluid', 'search-results-page'],\n\n    attachScrollListener: Ember.on('didInsertElement', function () {\n        this.$().on('scroll.' + this.get('elementId'), () => {\n            this.loadNextPage();\n        });\n    }),\n\n    removeListeners: Ember.on('willDestroyElement', function () {\n        this.$().off('.' + this.get('elementId'));\n    }),\n\n    createDebouncedLoadNextPage: Ember.on('init', function () {\n        this.loadNextPage = _.debounce(function () {\n            Ember.run(() => {\n                // model.isPending\n                if (this.get('model._state') === 0 || this.get('_state') !== 'inDOM') {\n                    return;\n                }\n\n                var scroll = this.$().scrollTop();\n                var height = this.$('.search-content').height() - this.$().height();\n\n                if (height - scroll <= 500) {\n                    this.send('loadMore');\n                }\n            });\n        }, 150);\n    }),\n\n    // Keep loading pages of results until the page is filled with items.\n    // The reason this was added was because when permissions are at play,\n    // search results can come back with limited data.\n    loadResultsToFillPage: Ember.observer('model._state', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            this.loadNextPage();\n        }\n    }),\n\n    scrollToTopOnPageZero: Ember.observer('page', function () {\n        if (this.get('_state') === 'inDOM' && this.get('page') === 0) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                let $el = this.$();\n                if ($el && $el.scrollTop) {\n                    $el.scrollTop(0);\n                }\n            });\n        }\n    })\n};\n\nconst Controller = {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    search: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    integrationsPresence: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    _searchQuery: null,\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true,\n\n    page: 0,\n\n    loading: {\n        searchResults: false,\n        facets: false\n    },\n\n    selectedTerms: [],\n    searchResults: [],\n    facets: null,\n    totalResults: 0,\n    lastSearchFavoritesCount: 0,\n\n    init(...args) {\n        this._super(...args);\n        this.get('favorites').on('favoriteChange', this, this.onFavoriteChanged);\n    },\n    willDestroyElement(...args) {\n        this._super(...args);\n        this.get('favorites').off('favoriteChange', this, this.onFavoriteChanged);\n    },\n\n    onFavoriteChanged() {\n        if (this.get('entity') === 'favorites') {\n            Ember.run.debounce(this, this.runSearchQuery, 300);\n        }\n    },\n\n    actions: {\n        changeSearchType: function (type) {\n            var currentActive = this.get('entity');\n\n            if (currentActive === type) {\n                return false;\n            }\n\n            this.set('entity', type || 'all');\n        },\n\n        selectTerm: function (term, facet) {\n            var terms = this.get('selectedTerms');\n            var termObj = terms.findBy('term', term);\n\n            if (terms && terms.length === 10) {\n                this.notifyTooManySearchFilters();\n                return;\n            }\n\n            if (termObj !== undefined) {\n                this.get('selectedTerms').removeObject(termObj);\n            } else {\n                termObj = FacetTerm.create({\n                    term: term,\n                    facet: facet\n                });\n\n                this.get('selectedTerms').addObject(termObj);\n            }\n\n            this.updateQueryOnTermsChange();\n        },\n\n        removeSelectedTerm: function (term /*, facet*/) {\n            var termObj = this.get('selectedTerms').findBy('term', term);\n\n            if (termObj) {\n                this.get('selectedTerms').removeObject(termObj);\n                this.updateQueryOnTermsChange();\n            }\n        },\n\n        loadMore: function () {\n            if (this.get('hasMoreResults')) {\n                this.runSearchQuery(true);\n            }\n        }\n    },\n\n    changeTabButtons: Ember.on('didRender', function () {\n        this.$('.entity-type-filter .gux-tab-button').attr('aria-controls', 'search-results');\n    }),\n\n    atPageLimit: Ember.computed.equal('page', PAGE_LIMIT),\n    remainingResults: Ember.computed('totalResults', 'page', function () {\n        return this.get('totalResults') - this.get('page') * PAGE_SIZE;\n    }),\n\n    hasMoreResults: Ember.computed('remainingResults', 'loading.searchResults', function () {\n        const moreResults = this.get('remainingResults') > 0;\n        const loading = this.get('loading.searchResults');\n        return !loading && moreResults;\n    }),\n\n    groupedSelectedTerms: Ember.computed('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var data = [];\n\n        terms.forEach(function (termObj) {\n            var term = termObj.get('term');\n            var facet = termObj.get('facet');\n            var currentGroup = data.findBy('facet.facetName', facet.facetName);\n\n            if (!currentGroup) {\n                currentGroup = {\n                    facet: facet,\n                    terms: [term]\n                };\n\n                data.addObject(currentGroup);\n            } else {\n                currentGroup.terms.addObject(term);\n            }\n        });\n\n        return data;\n    }),\n\n    isEmpty: Ember.computed('model._state', 'loading.searchResults', 'loading.facets', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            return this.get('totalResults') === 0;\n        } else if (this.get('model._state') === 2) {\n            // model.isRejected\n            return true;\n        }\n        return false;\n    }),\n\n    isGroups: Ember.computed.equal('entity', 'groups'),\n    isLocations: Ember.computed.equal('entity', 'locations'),\n    isExternalContacts: Ember.computed.equal('entity', 'externalContacts'),\n\n    isExternalContactsEmpty: Ember.computed('isExternalContacts', 'totalResults', 'query', function () {\n        return this.get('isExternalContacts') && this.get('totalResults') === 0 && !this.get('query');\n    }),\n\n    isFavorite: Ember.computed.equal('entity', 'favorites'),\n    isFavoritesEmpty: Ember.computed('isFavorite', 'lastSearchFavoritesCount', function () {\n        return this.get('isFavorite') && this.get('lastSearchFavoritesCount') === 0;\n    }),\n\n    haveSelectedTerms: Ember.computed.notEmpty('selectedTerms'),\n\n    displayFacets: Ember.computed('facets', 'selectedTerms', function () {\n        const facets = this.get('facets');\n        if (!Array.isArray(facets)) {\n            return facets;\n        }\n\n        // remove facets which are selected terms\n        const selectedTerms = this.get('selectedTerms');\n        facets.forEach(facet => {\n            const { facetName, terms } = facet;\n            facet.terms = terms.filter(\n                ({ term }) =>\n                    !selectedTerms.find(\n                        selected => selected.get('facet.facetName') === facetName && selected.get('term.term') === term\n                    )\n            );\n        });\n\n        // remove empty facets\n        return facets.filter(({ terms }) => !_.isEmpty(terms));\n    }),\n\n    updateQueryParameters() {\n        let queryParameters = '';\n        const params = [];\n        if (this.get('entity')) {\n            params.push(`entity=${encodeURIComponent(this.get('entity'))}`);\n        }\n        if (this.get('query')) {\n            params.push(`query=${encodeURIComponent(this.get('query'))}`);\n        }\n        if (this.get('queryFacets')) {\n            params.push(`queryFacets=${encodeURIComponent(this.get('queryFacets'))}`);\n        }\n        if (params.length) {\n            queryParameters = `?${params.join('&')}`;\n        }\n        const newHash = `#/search-v2${queryParameters}`;\n        if (newHash !== this.lastHash) {\n            this.lastHash = newHash;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n            return true;\n        }\n        return false;\n    },\n\n    searchInitial: Ember.on('didInsertElement', function () {\n        if (!this.get('entity')) {\n            this.set('entity', 'all'); // This will trigger a new /search (via searchOnChange() observer)\n        } else {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    searchOnChange: Ember.observer('entity', 'query', 'queryFacets', function () {\n        if (window.top.location.hash.startsWith('#/search-v2') && this.updateQueryParameters()) {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    updateQueryOnTermsChange() {\n        var terms = this.get('selectedTerms');\n\n        var termStrings = _.chain(terms)\n            .filter(term => !term.get('isKeyword'))\n            .map(term => term.toString())\n            .value();\n        var queryFacets = termStrings.join(' ');\n\n        var keywordStrings = _.map(\n            _.filter(terms, function (term) {\n                return term.get('isKeyword');\n            }),\n            function (term) {\n                return term.toString();\n            }\n        );\n        var query = keywordStrings.join(' ');\n\n        this.setProperties({\n            query,\n            queryFacets\n        });\n    },\n\n    _baseSearch() {\n        return {\n            pageSize: PAGE_SIZE,\n            sortOrder: 'SCORE'\n        };\n    },\n\n    _baseAggregations() {\n        const terms = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        const aggregateTerm = name => ({\n            name,\n            field: name,\n            type: 'TERM',\n            size: FACET_COUNT,\n            order: ['COUNT_DESC', 'VALUE_ASC']\n        });\n        return terms.map(aggregateTerm);\n    },\n\n    _valueQuery(value) {\n        if (value) {\n            return [\n                {\n                    type: 'QUERY_STRING',\n                    value\n                }\n            ];\n        }\n        return [{ type: 'MATCH_ALL' }];\n    },\n\n    _facetQuery(facets) {\n        return facets\n            .filter(facet => !facet.get('isKeyword'))\n            .map(facet => {\n                const value = facet.get('term.term');\n                const fields = [facet.get('searchField')];\n                return {\n                    value,\n                    fields,\n                    type: 'EXACT'\n                };\n            });\n    },\n\n    _baseSearchForEntity(entityType) {\n        if (entityType === 'people') {\n            entityType = 'users';\n        }\n        if (entityType === 'externalContacts') {\n            entityType = 'external_contacts';\n        }\n\n        if (entityType === 'all') {\n            let types = ['users', 'groups', 'locations'];\n            return {\n                types,\n                aggregations: this._baseAggregations(),\n                returnFields: MULTI_ENTITY_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'users') {\n            return {\n                types: ['users'],\n                aggregations: this._baseAggregations(),\n                returnFields: BASE_PERSON_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'locations') {\n            return {\n                types: ['locations'],\n                returnFields: BASE_LOCATION_FIELDS\n            };\n        }\n\n        if (entityType === 'groups') {\n            return {\n                types: ['groups'],\n                returnFields: BASE_GROUP_FIELDS\n            };\n        }\n\n        if (entityType === 'external_contacts') {\n            return {\n                types: ['external_contacts'],\n                returnFields: BASE_PERSON_FIELDS\n            };\n        }\n\n        // Unsafe to assert because the `entity` query param could\n        // be manually modified and blow up the page without warning.\n        Ember.Logger.warn(`_baseSearchForEntity(): Invalid entityType \"${entityType}\"`);\n        return this._baseSearchForEntity('all');\n    },\n\n    _buildSearch(entityType, search, facets, favoriteIds) {\n        let query = [...this._facetQuery(facets)];\n        const valueQuery = this._valueQuery(search);\n        if (search || _.isEmpty(facets)) {\n            query = [].concat([], query, valueQuery);\n        }\n        if (favoriteIds) {\n            if (favoriteIds.length > FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA) {\n                const chunks = _.chunk(favoriteIds, FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA);\n                query.push({\n                    group: chunks.map(chunk => ({\n                        operator: 'OR',\n                        type: 'EXACT',\n                        fields: ['id'],\n                        values: chunk\n                    }))\n                });\n            } else {\n                query.push({\n                    type: 'EXACT',\n                    fields: ['id'],\n                    values: favoriteIds\n                });\n            }\n        }\n\n        let base = this._baseSearch();\n        if (!valueQuery[0].value) {\n            base = Object.assign({}, base, {\n                sortBy: 'name',\n                sortOrder: 'ASC'\n            });\n        }\n\n        return Object.assign(\n            {\n                query\n            },\n            base,\n            this._baseSearchForEntity(entityType)\n        );\n    },\n\n    _normalizeSearch(data) {\n        const { total, aggregations, results } = data;\n        const models = this.get('search').modelResults(results);\n        const facets = this._processFacets(aggregations);\n        return { results: models, total, facets };\n    },\n\n    _processFacets(rawFacets) {\n        const facets = _.chain(rawFacets)\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, ({ key: term, count }) => ({ term, count }))\n                };\n            })\n            .filter()\n            .value();\n        const keyOrder = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => keyOrder.indexOf(key));\n    },\n\n    async getFavoriteIds() {\n        const favorites = await this.get('favorites').getLoadedFavorites();\n        return favorites.map(favorite => favorite.id).slice(0, FAVORITE_LIMIT);\n    },\n\n    async runSearchQuery(isLoadMore) {\n        // Wait for any existing search to complete (max 20 iterations * 50ms = 1 second)\n        let iterations = 0;\n        while (this.get('loading.searchResults') && iterations++ < 20) {\n            await new Promise(resolve => setTimeout(resolve, 50));\n        }\n\n        let nextPage = 1;\n        if (isLoadMore) {\n            nextPage = this.get('page') + 1;\n        }\n        this.set('loading.searchResults', true);\n        this.set('loading.facets', !isLoadMore);\n\n        let entity = this.get('entity') || 'all';\n        const query = this.get('query');\n        const queryFacets = this.get('queryFacets');\n        const selectedTerms = this.buildSelectedTerms(query, queryFacets);\n        let favoriteIds = null;\n        if (entity == 'favorites') {\n            entity = 'all';\n            try {\n                favoriteIds = await this.getFavoriteIds();\n            } catch (e) {\n                Ember.Logger.warn(`search::runSearchQuery() Cannot find favorites: ${e.message}`);\n                favoriteIds = [];\n            }\n            const numberOfFavoriteToSearch = favoriteIds ? favoriteIds.length : 0;\n            this.set('lastSearchFavoritesCount', numberOfFavoriteToSearch);\n            addPageAction('conn-ui-fav-disp', {\n                'conn-ui-fav-nb': numberOfFavoriteToSearch\n            });\n            if (favoriteIds && !favoriteIds.length) {\n                // There is no favorite at all, abort the search request!\n                const searchResults = this.get('searchResults');\n                searchResults.clear();\n                this.set('page', nextPage);\n                this.set('totalResults', 0);\n                this.set('facets', []);\n                this.set('selectedTerms', selectedTerms);\n                this.set('model', Ember.RSVP.resolve());\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                return;\n            }\n        }\n\n        const search = this._buildSearch(entity, query, selectedTerms, favoriteIds);\n        search.pageNumber = nextPage;\n\n        const fetch = this.get('search')\n            .search(search)\n            .then(data => this._normalizeSearch(data));\n\n        await fetch\n            .then(({ results, total, facets }) => {\n                const searchResults = this.get('searchResults');\n                if (!isLoadMore) {\n                    searchResults.clear();\n                }\n                searchResults.pushObjects(results);\n                this.set('page', nextPage);\n                this.set('totalResults', total);\n                this.set('facets', facets);\n                this.set('selectedTerms', selectedTerms);\n                return results;\n            })\n            .then((results = []) => {\n                const people = results.filterBy('type', 'person');\n                const ids = people.mapBy('id');\n                if (ids) {\n                    return this.get('store')\n                        .findMany('person', ids, BASE_PERSON)\n                        .then(userResults => {\n                            const integrationsPresence = this.get('integrationsPresence');\n                            if (\n                                integrationsPresence &&\n                                integrationsPresence.get('useIntegrationPresenceDirectorySearch')\n                            ) {\n                                return integrationsPresence.alterUsersWithIntegration(userResults);\n                            }\n                            return userResults;\n                        });\n                }\n            })\n            .catch(reason => {\n                let code = Ember.get(reason, 'payload.details.0.errorCode');\n                if (code === 'TOO_MANY_SEARCH_CRITERIA') {\n                    this.notifyTooManySearchFilters();\n                    throw reason;\n                }\n                this.set('searchResults', []);\n                throw reason;\n            })\n            .finally(() => {\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                this.set('model', fetch);\n            });\n    },\n\n    searchKeywords(query) {\n        const intoQuoteSegments = /(\".*?\"|'.*?'|[^\"\\s]+)+(?=\\s*|\\s*$)/g;\n        return query.split(intoQuoteSegments).filter(keyword => keyword && keyword.trim());\n    },\n\n    buildSelectedTerms(query, queryFacets) {\n        if (!query) {\n            query = '';\n        }\n        if (!queryFacets) {\n            queryFacets = '';\n        }\n\n        const selectedTerms = [];\n        const addSelectedTerm = (facetName, term, isKeyword) => {\n            selectedTerms.push(\n                FacetTerm.create({\n                    isKeyword,\n                    facet: { facetName },\n                    term: { term }\n                })\n            );\n        };\n\n        const keywordFacetName = this.get('intl').t('search.keyword');\n        this.searchKeywords(query).forEach(keyword => {\n            addSelectedTerm(keywordFacetName, keyword, true);\n        });\n\n        const directedSearchTerms = queryFacets.match(keypathRegex);\n        _.forEach(directedSearchTerms, directedSearch => {\n            const [facetName, ...searchSplit] = directedSearch.split(':');\n            const value = searchSplit.join(':');\n            if (value) {\n                const term = value.replace(/\"/g, '');\n                addSelectedTerm(facetName, term);\n            }\n        });\n\n        return selectedTerms;\n    },\n\n    notifyTooManySearchFilters() {\n        let title = this.get('intl').t('search.errors.tooManyFilters.title');\n        let message = this.get('intl').t('search.errors.tooManyFilters.message');\n        this.get('notification').error(title, message);\n    }\n};\n\nexport default Ember.Component.extend(Controller, View);\n","export default Ember.HTMLBars.template({\"id\":\"DE//2wWE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail facets\\\"],[15,\\\"role\\\",\\\"complementary\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filtersLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isGroups\\\"]],[28,[\\\"isLocations\\\"]],[28,[\\\"isExternalContacts\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-group\\\"],[15,\\\"id\\\",\\\"facets\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringGroups\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFiltering\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContacts\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringContacts\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResults\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"displayFacets\\\"]]],[[\\\"key\\\"],[\\\"facetName\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"search-facet-group\\\"],null,[[\\\"facet\\\",\\\"selectedTerms\\\",\\\"parentId\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"selectedTerms\\\"]],\\\"facets\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"facet\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail results\\\"],[15,\\\"role\\\",\\\"main\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-type-filter\\\"],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tabs-advanced\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"col-tabs\\\"],[16,\\\"active-tab\\\",[34,[\\\"tab-filter-\\\",[28,[null,\\\"entity\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-tab-advanced-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"show-new-tab-button\\\",\\\"false\\\"],[15,\\\"allow-sort\\\",\\\"false\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-all\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"all\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-all\\\"],[15,\\\"class\\\",\\\"filter all\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-search-all\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-people\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"people\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-people\\\"],[15,\\\"class\\\",\\\"filter people\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-groups\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"groups\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-groups\\\"],[15,\\\"class\\\",\\\"filter groups\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"PURE-7064_search_favorites\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-favorites\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"favorites\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-favorites\\\"],[15,\\\"class\\\",\\\"filter favorites\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"rating-active\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-locations\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"locations\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-locations\\\"],[15,\\\"class\\\",\\\"filter locations\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\\n            \\\"],[1,[26,[\\\"create-entity-menu\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"current-facets \\\",[33,[\\\"unless\\\"],[[28,[\\\"haveSelectedTerms\\\"]],\\\"no-selected-facets\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedSelectedTerms\\\"]]],[[\\\"key\\\"],[\\\"facet.facetName\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"grouped-facet-term\\\"],null,[[\\\"group\\\"],[[28,[\\\"group\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[26,[\\\"entity\\\"]]]]],[15,\\\"id\\\",\\\"search-results\\\"],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFavoritesEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-search-results-icon-favorite\\\"],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-background pc-moon\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-full\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-foreground pc-moon not-favorite favorite outline-favorite\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-alpha\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results-with-icon\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"strong\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"search.noFavorite\\\"],null],false],[14],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFavoriteLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContactsEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noContacts\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResultsLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"isSearchResult\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"entity\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"atPageLimit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasMoreResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"text-center page-limit entity-mini\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.reachedPageLimit\\\"],[[\\\"count\\\"],[[28,[\\\"remainingResults\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-page/template.hbs\"}});","import Ember from 'ember';\n\nconst SearchResultContextComponent = Ember.Component.extend({\n    classNameBindings: ['searchResultContextVisible:search-result-context-area'],\n    searchResultContextVisible: false,\n\n    _scrollToPreviousTop(messages, $messagePane, $lastMessage) {\n        if (messages.length > 0) {\n            Ember.run.scheduleOnce('afterRender', null, () => {\n                let targetHeight =\n                    $lastMessage.position().top - $lastMessage.height() - this.$('.history-bar').outerHeight();\n                $messagePane.animate({ scrollTop: targetHeight });\n            });\n        }\n    },\n\n    closeOnContextSwitch: Ember.observer('chatService.activeRoom', function () {\n        this.send('close');\n    }),\n\n    actions: {\n        close() {\n            this.attrs.close();\n        },\n\n        replyToMessage(message) {\n            this.attrs.close();\n            this.attrs.replyToMessage(message);\n        },\n\n        loadHistoryAfterLast() {\n            const promise = this.attrs.loadMoreHistoryAfter(this.get('historyRoom'));\n            promise.then(messages => messages);\n        },\n\n        loadHistoryBeforeFirst() {\n            let $messagePane = this.$('.search-result-context-messages');\n            let $lastMessage = this.$('.search-result-context .chat-message').first();\n            const promise = this.attrs.loadMoreHistoryBefore(this.get('historyRoom'));\n            promise.then(messages => {\n                this._scrollToPreviousTop(messages, $messagePane, $lastMessage);\n                return messages;\n            });\n        }\n    }\n});\n\nexport default SearchResultContextComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Z/9pIjDO\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"close\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"chat.history\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-messages\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],false,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryBeforeFirst\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/messages\\\"],null,[[\\\"room\\\",\\\"replyToMessage\\\",\\\"isMediaCollapsed\\\",\\\"openMentionWarning\\\"],[[28,[\\\"historyRoom\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"replyToMessage\\\"],null],true,[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"openMentionWarning\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryAfterLast\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-result-context/template.hbs\"}});","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","export default Ember.HTMLBars.template({\"id\":\"swD2LZfy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"line\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"line-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"facebook\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"facebook-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"twitter\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"twitter\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"viber\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"viber\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"wechat\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"wechat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"telegram\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"telegram\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"whatsapp\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"whatsapp\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"webmessaging\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"chat-multi\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"open\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"comment-ellipsis\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"sms\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/sms-message-icon/template.hbs\"}});","define(\"connections-ui/components/station-disassociate-link/component\", [\"exports\", \"ember-purecloud-components/components/station-disassociate-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"kFbO6UNm\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tags-input-label\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"tags-input__tag\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-truncate-beta\\\",{\\\"attrs\\\":[[15,\\\"max-lines\\\",\\\"1\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/tags-input/label/template.hbs\"}});","define(\"connections-ui/components/telephone-input/component\", [\"exports\", \"ember-purecloud-components/components/telephone-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-dialog\", [\"exports\", \"ember-modal-dialog/components/deprecated-tether-dialog\"], function (_exports, _deprecatedTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deprecatedTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-component\", [\"exports\", \"ember-tooltips/components/tether-popover-on-component\"], function (_exports, _tetherPopoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-element\", [\"exports\", \"ember-tooltips/components/tether-popover-on-element\"], function (_exports, _tetherPopoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-component\"], function (_exports, _tetherTooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-element\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-element\"], function (_exports, _tetherTooltipOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnElement.default;\n    }\n  });\n});\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'connections-ui/utils/dates';\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 duration = moment.duration(durationInMs);\n        const days = duration.asDays();\n        const hours = duration.hours();\n        const minutes = duration.minutes();\n\n        if (days) {\n            if (hours) {\n                return this.get('intl').t('components.timeElapsed.detail.daysHours', {\n                    days: days,\n                    hours: hours\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.days', {\n                days: days\n            });\n        } else if (hours) {\n            if (minutes) {\n                return this.get('intl').t('components.timeElapsed.detail.hoursMinutes', {\n                    hours: hours,\n                    minutes: minutes\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.hours', {\n                hours: hours\n            });\n        }\n\n        return this.get('intl').t('components.timeElapsed.detail.minutes', {\n            minutes: minutes || '0'\n        });\n    },\n\n    _formatDuration: function () {\n        const timeSince = this.get('timeSince');\n        const msSince = moment().diff(moment(timeSince));\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.get('intl').t('components.timeElapsed.now');\n        }\n\n        cnt = moment().diff(moment(timeSince), unit);\n\n        if (cnt < 2) {\n            return this.get('intl').t(`components.timeElapsed.singular.${unit}`);\n        }\n\n        return this.get('intl').t(`components.timeElapsed.plural.${unit}`, { count: cnt });\n    },\n\n    tickingDuration: computed('timeSince', 'clock.second', function () {\n        return this._formatDuration();\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"fP6V7Isp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[13],[1,[26,[\\\"tickingDuration\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-elapsed/template.hbs\"}});","import Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst CLOCK_MODE_DURATION = 10000;\n\nexport default Ember.Component.extend({\n    classNames: 'time-machine-confirmation',\n\n    // Expose attrs as direct properties for modern Ember\n    cancel: Ember.computed.reads('attrs.cancel'),\n    confirm: Ember.computed.reads('attrs.confirm'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('primaryDirection', Math.random() < 0.5 ? 1 : -1);\n        this.set('minuteDirection', this.get('primaryDirection') * -1);\n        // Set to undefined to init the clock with the current time and tick as normal\n        this.set('_clockStandardMode', true);\n        this.set('randomTime', undefined);\n    },\n\n    willDestroyElement() {\n        let timer = this.get('_updInterval');\n        if (timer) {\n            Ember.run.cancel(timer);\n            this.set('_updInterval', null);\n        }\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n    },\n\n    escapedBuildTag: Ember.computed('buildTag', function () {\n        let result = '';\n\n        let rawBuildTag = this.get('buildTag');\n        if (typeof rawBuildTag === 'string' && Ember.isPresent(rawBuildTag)) {\n            result = Ember.Handlebars.Utils.escapeExpression(rawBuildTag);\n        }\n\n        return result;\n    }),\n\n    updRandTime() {\n        if (this.get('_clockStandardMode')) {\n            this.set('_clockStandardMode', false);\n            this.set('_randomModeStart', Date.now());\n        } else if (Date.now() - this.get('_randomModeStart') > CLOCK_MODE_DURATION) {\n            this.set('_clockStandardMode', true);\n            this.set('randomTime', undefined);\n            this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n            return;\n        }\n\n        let currTime = moment(this.get('randomTime'));\n\n        try {\n            let currMinutes = currTime.get('minutes');\n            let currBin = Math.floor(currMinutes / 5);\n            currTime.add(5 * this.get('minuteDirection'), 'minutes');\n            currTime.add(10 * this.get('primaryDirection'), 'seconds');\n            let nextMinutes = currTime.get('minutes');\n            let nextBin = Math.floor(nextMinutes / 5);\n\n            let hourMultiplier = 1;\n            if (Math.abs(nextBin - currBin) === 11) {\n                // Prevents jitter caused by minutes rolling hours\n                hourMultiplier++;\n            }\n            currTime.add(hourMultiplier * this.get('primaryDirection'), 'hours');\n\n            if (isNaN(currTime) || !currTime.isValid()) {\n                // Protect against overflow\n                currTime = moment();\n            }\n        } catch (e) {\n            currTime = moment();\n        }\n\n        this.set('randomTime', currTime);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', 100));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"14qtFvIN\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"attachment\\\",\\\"targetAttachment\\\",\\\"translucentOverlay\\\",\\\"overlay-class\\\",\\\"container-class\\\",\\\"destinationElementId\\\"],[\\\"top center\\\",\\\"top center\\\",true,\\\"dark\\\",\\\"modal-dialog time-machine-confirm-dialog\\\",\\\"modal-overlays\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"header\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"analog-clock\\\"],null,[[\\\"class\\\",\\\"showSecondHand\\\",\\\"staticMoment\\\"],[\\\"random-clock\\\",true,[28,[\\\"randomTime\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"h1\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"timemachine.title\\\"],null],false],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close cancel-time-machine-nav\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"intended-destination\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.intendedDestination\\\"],[[\\\"buildNumber\\\"],[[28,[\\\"escapedBuildTag\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"disclaimer\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.disclaimer\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"actions\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default confirm-time-machine-nav\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.confirm.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extra-links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"https://www.genesys.com/company/careers\\\"],[15,\\\"class\\\",\\\"hiring-link\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.hiring\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-machine-confirmation/template.hbs\"}});","define(\"connections-ui/components/toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tooltip-on-component\"], function (_exports, _tooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tooltipOnComponent.default;\n    }\n  });\n});\n","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","/* global File */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nimport PromiseLoadingMixin from 'connections-ui/mixins/promise-loading';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\n\nimport FileAPI from 'fileapi';\nimport { uploadImageUrl } from './helpers';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, observer } = Ember;\nconst webcamWidth = 640;\nconst webcamHeight = 480;\n\nexport default Ember.Component.extend(PromiseLoadingMixin, AutoSaveDevicesMixin, {\n    classNames: ['upload-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    currentFile: null,\n    currentFileInfo: null,\n    currentCoords: null,\n    currentXHR: null,\n    currentImageId: null,\n\n    selectedCamera: null,\n    cameraPending: false,\n    cameraError: false,\n    startingMedia: false,\n\n    imageUrl: null,\n    imageUrlData: null,\n    uploadingImageUrl: false,\n\n    attrs: {\n        confirm() {},\n\n        upload: null,\n        autoTakePicture: false,\n\n        entity: null,\n        uploadType: null\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.send('cancelCamera');\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n    },\n\n    actions: {\n        uploadError() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('cameraError'));\n            }\n        },\n\n        uploadImage() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('currentFile'));\n                return;\n            }\n\n            let file = this.get('currentFile');\n            let promise;\n\n            if (this.get('uploadingImageUrl')) {\n                promise = Ember.RSVP.resolve(this.get('imageUrlData'));\n            } else {\n                promise = this.upload(file);\n            }\n\n            let coords = this.get('currentCoords');\n            let left = coords.x + (coords.x2 - coords.x) / 2 - 21;\n            let top = coords.y + (coords.y2 - coords.y) / 2 - 21;\n            const entityType = Ember.get(this, 'attrs.entity.value.type');\n\n            if (entityType === 'group') {\n                // using the public api group image requests we don't need to worry\n                // about linking an image.\n                promise\n                    .then(result => {\n                        // set image Id\n                        this.set('currentImageId', result.id);\n                        return;\n                    })\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const groupId = this.get('entity').guid;\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for group ${groupId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            } else {\n                const userId = this.get('entity').id;\n                promise\n                    .then(this.get('entity').reload())\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for user ${userId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            }\n\n            this.addIndicatorForPromise(promise, `#${this.get('elementId')} .image`);\n            this.$('.loading-indicator i').css({ top, left });\n        },\n\n        uploadImageUrl() {\n            let application = this.get('application');\n            let imageUrl = this.get('imageUrl');\n\n            if (!imageUrl) {\n                return;\n            }\n\n            this.set('uploadingImageUrl', true);\n\n            uploadImageUrl(application, imageUrl)\n                .then(data => {\n                    this.set('imageUrlData', data);\n\n                    this.displayImage(data);\n                    this.setupFileFromUrl();\n                })\n                .catch(err => {\n                    const intl = this.get('intl');\n\n                    const groupId = this.get('entity').guid;\n                    const orgId = this.get('entity').orgId;\n                    this.get('logger').error(`upload ImageUrl failed for group ${groupId} of organization ${orgId}`, {\n                        error: err\n                    });\n\n                    this.get('notification').error(\n                        intl.t('notification.titles.profileSaveError').toString(),\n                        intl.t('notification.fieldSection.error').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'image-upload'\n                        }\n                    );\n\n                    this.set('uploadingImageUrl', false);\n                    this.set('imageUrl', '');\n                });\n        },\n\n        clearImage() {\n            this.$('.image').empty();\n\n            this.set('currentFile', null);\n            this.set('currentFileInfo', null);\n            this.set('currentFileCoords', null);\n            this.set('currentImageId', null);\n\n            this.set('uploadingImageUrl', false);\n\n            Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n        },\n\n        startCamera() {\n            if (this.get('startingMedia')) {\n                return;\n            }\n\n            this.send('cancelCamera');\n            this.set('startingMedia', true);\n            this.set('cameraPending', true);\n\n            let options = {\n                audio: false,\n                video: true\n            };\n            return navigator.mediaDevices\n                .getUserMedia(options)\n                .then(stream => {\n                    this.set('cameraStream', stream);\n                    this.attachMediaStream(stream, this.$('.camera-preview')[0], {\n                        muted: true,\n                        mirror: true\n                    });\n                    this.set('startingMedia', false);\n                    if (this.get('autoTakePicture')) {\n                        this.send('takePicture');\n                    }\n                })\n                .catch(err => {\n                    this.set('cameraError', this.get('intl').lookup(`images.error.${err.name}`).toString());\n                    if (this.get('autoTakePicture')) {\n                        this.send('uploadError');\n                    }\n                });\n        },\n\n        takePicture() {\n            this.set('countdown', true);\n            Ember.run.later(() => {\n                let video = this.$('video')[0];\n                this.set('countdown', false);\n                let canvas = document.createElement('canvas');\n                canvas.width = video.videoWidth;\n                canvas.height = video.videoHeight;\n                let ctx = canvas.getContext('2d');\n                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n                //convert to desired file format\n                let dataUrl = canvas.toDataURL('image/jpeg');\n                let asBlob = window.dataURLtoBlob(dataUrl);\n                let pictureInfo = { width: webcamWidth, height: webcamHeight, type: 'image/jpeg' };\n\n                let fileName = 'webcam';\n                if (this.get('autoTakePicture')) {\n                    fileName = this.get('intl').lookup('chat.commands.selfie.command').toString();\n                }\n\n                let asFile = new File([asBlob], `${fileName}.jpeg`, pictureInfo);\n                this.onTookPicture(dataUrl, asFile, pictureInfo);\n                this.send('cancelCamera');\n            }, 3000);\n        },\n\n        cancelCamera() {\n            let cameraStream = this.get('cameraStream');\n            try {\n                if (cameraStream && cameraStream.getTracks) {\n                    cameraStream.getTracks().forEach(track => {\n                        track.stop();\n                    });\n                }\n            } catch (e) {\n                const groupId = this.get('entity').guid;\n                const orgId = this.get('entity').orgId;\n                this.get('logger').error(`Error stopping camera stream for group ${groupId} of organization ${orgId}`, {\n                    error: e\n                });\n            }\n            this.set('cameraPending', false);\n            this.set('cameraStream', null);\n        }\n    },\n\n    switchCamera: observer('selectedCamera', function () {\n        if (this.get('cameraPending')) {\n            this.send('startCamera');\n            this.get('webrtc').updateDefaultDevices({\n                camera: this.get('selectedCamera')\n            });\n        }\n    }),\n\n    canUseCamera: computed('webrtc.hasCamera', function () {\n        return (\n            this.get('webrtc.hasCamera') &&\n            (window.navigator.getUserMedia ||\n                (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia))\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        // Calling enumerateDevices will conduct translation PCM-316\n        this.get('webrtc').enumerateDevices();\n        if (this.get('autoTakePicture')) {\n            this.send('startCamera');\n        }\n    },\n\n    getImageDataFromXhr(xhr) {\n        if (xhr) {\n            if (typeof xhr.responseText === 'string') {\n                return JSON.parse(xhr.responseText);\n            } else if (typeof xhr.responseText === 'object') {\n                return xhr.responseText;\n            } else if (typeof xhr === 'string') {\n                return JSON.parse(xhr);\n            }\n        }\n        return xhr;\n    },\n\n    initCrop() {\n        let aspectRatio = 1;\n        let size = this.get('currentFileInfo.height');\n        let type = this.get('entity.type');\n        let uploadType = this.get('uploadType');\n\n        if (type === 'floor' || uploadType === 'informal') {\n            aspectRatio = null;\n        }\n\n        if (this.get('currentFileInfo').width <= this.get('currentFileInfo').height) {\n            size = this.get('currentFileInfo').width;\n        }\n        this.$('img').Jcrop({\n            onSelect: this.handleCropChange.bind(this),\n            onChange: this.handleCropChange.bind(this),\n            aspectRatio: aspectRatio, // TODO: get this ratio from field config.\n            setSelect: [0, 0, size, size]\n        });\n    },\n\n    showPictures() {\n        const entity = this.get('entity');\n        if (!entity) {\n            throw new Error('Missing entity for component');\n        }\n\n        if (entity.get('type') === 'group') {\n            /*\n               https://github.com/emberjs/data/issues/3704\n               I hit what I believe is an ember-data 2.16 bug where the store was not being\n               updated after a findRecord request (even with reload: true specified).\n               As a result we make the request ourselves and update the store.\n            */\n            const store = this.get('store');\n            let serializer = store.serializerFor('group');\n            let model = store.modelFor('group');\n            let adapter = store.adapterFor('group');\n\n            const url = adapter.urlForFindRecord(entity.id);\n            const fieldsObj = { fl: '*' };\n            const data = Object.assign({}, data, fieldsObj);\n\n            const traditional = true;\n\n            this.get('ajax')\n                .request(url, { method: 'GET', data, traditional })\n                .then(result => {\n                    const santizedResult = serializer.normalizeSingleResponse(\n                        store,\n                        model,\n                        result,\n                        entity.id,\n                        'findRecord'\n                    );\n                    entity.set('version', santizedResult.data.attributes.version);\n                    entity.set('images', santizedResult.data.attributes.images);\n                    this.attrs.confirm();\n                });\n        } else {\n            entity.reload().then(() => {\n                this.attrs.confirm();\n            });\n        }\n    },\n\n    handleCropChange(coords) {\n        if (coords.x === coords.x2 && coords.y === coords.y2) {\n            let ratio = this.get('currentFileInfo.ratio');\n            coords = {\n                x: 0,\n                y: 0,\n                x2: this.get('currentFileInfo.width') * ratio,\n                y2: this.get('currentFileInfo.height') * ratio\n            };\n        }\n\n        this.set('currentCoords', coords);\n    },\n\n    displayImage(xhr) {\n        let data = this.getImageDataFromXhr(xhr);\n        let container = this.$('div.image');\n\n        let width = container.width();\n        let ratio = width / data.dimensions.x;\n        let height = data.dimensions.y * ratio;\n\n        let image = $(`<img src=\"${data.url}\" />`).css({ width: width, height: height });\n        container.html(image);\n\n        let currentFileInfo = this.get('currentFileInfo');\n        if (_.isEmpty(currentFileInfo) || !currentFileInfo.ratio) {\n            if (!width) {\n                width = 100;\n            }\n\n            if (!height) {\n                height = 100;\n            }\n\n            let fileInfo = {\n                ratio: ratio,\n                width,\n                height\n            };\n\n            this.set('currentFileInfo', fileInfo);\n        }\n\n        return xhr;\n    },\n\n    setupFileFromUrl() {\n        let container = this.$('div.image');\n        let $image = this.$('div.image img');\n        let image = $image[0];\n        let currentFile = FileAPI.Image(image);\n        this.set('currentFile', currentFile);\n\n        $image.on('load', () => {\n            Ember.run(() => {\n                let ratio = container.width() / image.naturalWidth;\n                let width = container.width();\n                let height = image.naturalHeight * ratio;\n                this.set('currentFileInfo', {\n                    ratio,\n                    width: image.naturalWidth,\n                    height: image.naturalHeight\n                });\n                $image.width(width);\n                $image.height(height);\n\n                this.initCrop();\n            });\n        });\n    },\n\n    upload(file) {\n        const entityType = this.attrs.entity.value.get('type');\n\n        let uploadType = this.get('uploadType');\n        let imageCategory = uploadType === 'informal' ? 'gallery' : 'profile';\n        const coords = this.get('currentCoords');\n        const displaywidth = this.$('img').width();\n        const cropProportion = file.name === 'webcam.jpeg' ? webcamWidth / displaywidth : file.width / displaywidth; // webcam files are always 640 * 480\n\n        if (entityType === 'group') {\n            const gId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                groupImageType: imageCategory\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'groupImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/groups/${gId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        } else {\n            const uId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                userImageType: uploadType\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'userImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/users/${uId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        }\n    },\n\n    onTookPicture(dataUri, file) {\n        this.set('currentFile', file);\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const container = this.$('div.image');\n            const width = container.width();\n\n            let image = $(`<img src=\"${dataUri}\" />`);\n            container.html(image);\n            image.width(width);\n\n            image.one('load', () => {\n                const width = image.width();\n                const ratio = width / image[0].naturalWidth;\n                this.set('currentFileInfo', {\n                    width: width,\n                    height: image.height(),\n                    ratio\n                });\n\n                this.initCrop();\n            });\n\n            if (this.get('autoTakePicture')) {\n                this.send('uploadImage');\n            }\n        });\n    },\n\n    onChange(file) {\n        let container = this.$('div.image');\n\n        if (/^image/.test(file.type)) {\n            FileAPI.getInfo(file, (err, info) => {\n                this.handleFileInfo(err, info, file);\n            });\n        } else {\n            if (file) {\n                container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n            }\n\n            FileAPI.reset(event.currentTarget);\n        }\n    },\n\n    handleFileInfo(err, info, file) {\n        let container = this.$('div.image');\n        if (!err) {\n            let image = FileAPI.Image(file);\n\n            let ratio = container.width() / info.width;\n\n            this.set('currentFile', file);\n            this.set('currentFileInfo', info);\n            this.set('currentFileInfo.ratio', ratio);\n\n            let width = container.width();\n            let height = info.height * ratio;\n\n            image.preview(width, height).get((err, img) => {\n                if (width && height) {\n                    let uri = img.toDataURL();\n                    let image = $(`<img src=\"${uri}\" />`);\n                    container.html(image);\n\n                    this.initCrop();\n                }\n            });\n        } else {\n            container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n        }\n        FileAPI.reset(event.currentTarget);\n    },\n\n    createDropZone: function () {\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n        const dropzone = new window.Dropzone(`#${this.get('elementId')} .dropzone`, {\n            acceptedFiles: 'image/*',\n            url: '/file/post',\n            uploadMultiple: false,\n            maxFiles: 1,\n            clickable: '.browse',\n            autoProcessQueue: false,\n            addRemoveLinks: true,\n            maxFilesize: 10,\n            dictInvalidFileType: this.get('intl').t('images.genericFileTypeMessage').toString(),\n            dictRemoveFile: this.get('intl').t('common.remove').toString(),\n            dictFileTooBig: this.get('intl').t('images.fileTooLarge').toString(),\n            dictCancelUpload: this.get('intl').t('images.cancelUpload').toString(),\n            dictUploadCanceled: this.get('intl').t('images.uploadCanceled').toString()\n        });\n\n        dropzone.on('thumbnail', file => {\n            Ember.run(() => this.onChange(file));\n        });\n\n        dropzone.on('addedfile', function () {\n            Ember.run(() => {\n                if (this.files.length > 1) {\n                    this.removeFile(this.files[0]);\n                }\n            });\n        });\n        this.set('dropzone', dropzone);\n    },\n\n    attachMediaStream: 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 (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","import ajax from 'ember-ajax';\n\nexport function uploadImageUrl(application, url) {\n    let formData = new window.FormData();\n    formData.append('imageUrl', url);\n    return ajax(application.uri('api/v2/images'), {\n        method: 'post',\n        data: formData,\n        contentType: false,\n        processData: false\n    });\n}\n","export default Ember.HTMLBars.template({\"id\":\"K6YT0VqB\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"uploads \\\",[33,[\\\"if\\\"],[[28,[\\\"autoTakePicture\\\"]],\\\"hide\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]],\\\"have-file\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary upload-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-danger clear-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.clearImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"webrtc\\\",\\\"hasCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-block camera-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-with-icon\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"camera-select\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"webrtcDevices.videoSource\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"class\\\",\\\"aria-label\\\"],[\\\"camera-select\\\",[28,[\\\"selectedCamera\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"selectedCamera\\\"]]],null]],null],\\\"form-control with-icon\\\",\\\"{{t \\\\\\\"webrtcDevices.videoSource\\\\\\\"}}\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"webrtc\\\",\\\"cameraList\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"camera\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"camera\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"camera\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-video select-icon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary take-picture-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"takePicture\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dropzone\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dz-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"glyphicon glyphicon-cloud-upload\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.drop\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"browse\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"images.browseFile\\\"],null],false],[0,\\\".\\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picture-options\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canUseCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-default take-picture-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startCamera\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"camera \\\",[33,[\\\"unless\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cameraError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"h4\\\",[]],[13],[1,[26,[\\\"cameraError\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[11,\\\"video\\\",[]],[15,\\\"class\\\",\\\"camera-preview\\\"],[15,\\\"mute\\\",\\\"true\\\"],[15,\\\"autoplay\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"countdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-3\\\"],[13],[0,\\\"3\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-2\\\"],[13],[0,\\\"2\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-1\\\"],[13],[0,\\\"1\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/upload-picture/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nlet profilePaths = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nexport default Ember.Component.extend(LoggerMixin, {\n    classNames: ['uploaded-image'],\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    image: null,\n    entity: null,\n    size: '128',\n    labelKey: '',\n    editingCaption: false,\n    canAddCaption: false,\n\n    type: 'profile',\n\n    attrs: {\n        select() {},\n        delete() {},\n\n        editing: false,\n        canEdit: false,\n        showingInformal: false\n    },\n\n    actions: {\n        selectUploadedImage(event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n\n            let selectUploadedImage = this.attrs.select;\n\n            if (this.get('editing') && this.get('canEdit') && this.get('type') === 'profile') {\n                selectUploadedImage(type, image, active);\n            } else {\n                let current = this.get('currentInformal');\n                if (current !== this.get('image')) {\n                    this.set('currentInformal', this.get('image'));\n                    this.showImage(image, type);\n                } else {\n                    this.set('currentInformal', null);\n                }\n            }\n        },\n        deleteUploadedImage(event) {\n            //action executed on click, kb Space, kb Enter\n            if (event) {\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n            let deleteUploadedImage = this.attrs.delete;\n\n            if (this.get('canDelete')) {\n                const entityType = Ember.get(this, 'entity.type');\n\n                if (entityType === 'group' || entityType === 'person') {\n                    const id = Ember.get(this, 'entity.id');\n                    const imageId = Ember.get(this, 'image._id');\n                    const url =\n                        entityType === 'group'\n                            ? `api/v2/groups/${id}/images/${imageId}`\n                            : `api/v2/users/${id}/images/${imageId}`;\n\n                    return this.get('ajax')\n                        .delete(Ember.get(this, 'application').pcV2Uri(url))\n                        .then(() => {\n                            deleteUploadedImage(type, image, false);\n                            return;\n                        })\n                        .catch(err => {\n                            const intl = this.get('intl');\n\n                            this.logger.error('failed to upload image', { error: err });\n\n                            this.get('notification').error(\n                                intl.lookup('notification.titles.profileSaveError').toString(),\n                                intl.lookup('notification.fieldSection.error').toString(),\n                                {\n                                    forceBrowserNotification: true,\n                                    tag: 'image-upload'\n                                }\n                            );\n                            return;\n                        });\n                } else {\n                    this.get('delete')(type, image, active);\n                }\n            }\n        }\n    },\n\n    addCaption() {\n        this.set('openCaption', this);\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            this.$('.caption textarea').focus();\n        });\n    },\n\n    saveCaption() {\n        this.set('openCaption', null);\n\n        let imageList = this.get('entity').getFieldValue('images.informal');\n        let image = imageList.findBy('_id', this.get('image._id'));\n\n        Ember.set(image, 'labelKey', this.get('labelKey'));\n        this.get('entity').save();\n    },\n\n    initCaption: Ember.on('init', function () {\n        this.set('canAddCaption', this.get('type') === 'informal' && this.get('entity.type') === 'person');\n        this.set('labelKey', this.get('image.labelKey'));\n    }),\n\n    ownImage: Ember.computed('entity', 'entity.id', function () {\n        if (!this.get('canEdit')) {\n            return false;\n        }\n\n        let isPerson = this.get('entity.id') === this.get('session.person.id');\n        let isGroupOwner = false;\n\n        if (this.get('entity.type') === 'group') {\n            let owners = this.get('entity').getFieldValue('owners.owners') || [];\n            isGroupOwner = _.find(owners, owner => {\n                return owner.value === this.get('session.person.id');\n            });\n        }\n\n        return isPerson || isGroupOwner;\n    }),\n\n    closeCaption: Ember.observer('openCaption', function () {\n        if (this.get('openCaption') !== this) {\n            this.set('editingCaption', false);\n        } else {\n            this.set('editingCaption', true);\n        }\n    }),\n\n    canDelete: Ember.computed('entity.uploadedProfilePictures.length', function () {\n        const entityType = this.get('entity.type');\n        if (entityType === 'group') {\n            let isEditing = this.get('editing');\n            return isEditing;\n        }\n\n        let type = this.get('type') === 'informal';\n        let populated = this.get('entity.uploadedProfilePictures.length') !== 1;\n        let isEditing = this.get('editing');\n        return (type || populated) && isEditing;\n    }),\n\n    src: Ember.computed('image', 'entity', 'size', function () {\n        let image = this.get('image.value');\n        let size = `x${this.get('size')}`;\n\n        if (image) {\n            return image[size];\n        }\n\n        return '';\n    }),\n\n    isActive: Ember.computed('image', 'entity', 'entity.profilePicture', function () {\n        let image = this.get('image');\n        let type = this.get('type');\n        let imagePath = profilePaths[this.get('entity.type')];\n\n        if (type === 'profile') {\n            let currentImage = this.get('entity').getReferencedField(imagePath);\n\n            if (!_.isEmpty(currentImage)) {\n                return image._id === currentImage._id;\n            }\n        }\n\n        return false;\n    }),\n\n    showImage: function (/*image, type*/) {\n        this.bubbleAction({\n            action: 'viewLightGallery',\n            actionContext: [this.get('image')]\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kplgeCU/\",\"block\":\"{\\\"statements\\\":[[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"class\\\",[34,[\\\"clickable \\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],\\\"active\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"can-edit\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],[33,[\\\"concat\\\"],[[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],\\\" (selected)\\\"],null],[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"src\\\",[26,[\\\"src\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"]],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"delete \\\",[33,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]],\\\"informal-delete\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-close-circled\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editingCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"classNames\\\",\\\"value\\\",\\\"aria-label\\\"],[\\\"form-control\\\",[28,[\\\"labelKey\\\"]],[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.save\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"saveCaption\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption clickable\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"addCaption\\\",[28,[\\\"image\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption own-caption\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"edit\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-edit\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showingInformal\\\"]],[28,[\\\"labelKey\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption\\\"],[16,\\\"title\\\",[26,[\\\"labelKey\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/uploaded-image/template.hbs\"}});","define(\"connections-ui/components/vertical-collection\", [\"exports\", \"smoke-and-mirrors/components/vertical-collection\"], function (_exports, _verticalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalCollection.default;\n    }\n  });\n});\n","define(\"connections-ui/components/vertical-item\", [\"exports\", \"smoke-and-mirrors/components/vertical-item\"], function (_exports, _verticalItem) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalItem.default;\n    }\n  });\n});\n","define(\"connections-ui/components/volume-input/component\", [\"exports\", \"ember-purecloud-components/components/volume-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-debug-modal/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-debug-modal/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-issues/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-issues/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-settings/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-settings/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls\", [\"exports\", \"ember-wrap-urls/components/wrap-urls\"], function (_exports, _wrapUrls) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _wrapUrls.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/link\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/link\"], function (_exports, _link) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _link.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/url\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/url\"], function (_exports, _url) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _url.default;\n    }\n  });\n});\n","import XOption from 'emberx-select/components/x-option';\nexport default XOption;\n","import XSelect from 'emberx-select/components/x-select';\nexport default XSelect;\n","import require from 'require';\nimport environment from './environment';\n\nconst modulePrefix = environment.modulePrefix;\nconst metaName = `${modulePrefix}/config/asset-manifest`;\nconst nodeName = `${modulePrefix}/config/node-asset-manifest`;\n\nlet config = {};\n\ntry {\n  // If we have a Node version of the asset manifest, use that for FastBoot and\n  // similar environments.\n  if (require.has(nodeName)) {\n    config = require(nodeName).default; // eslint-disable-line\n  } else {\n    const rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n    config = JSON.parse(unescape(rawConfig));\n  }\n} catch(err) {\n  throw new Error('Failed to load asset manifest. For browser environments, verify the meta tag with name \"'+ metaName +\n    '\" is present. For non-browser environments, verify that you included the node-asset-manifest module.');\n}\n\nexport default config;\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['path'],\n    path: ''\n});\n","import Ember from 'ember';\n\nconst isNonEmptyStringQueryParam = paramStr => {\n    return (\n        typeof paramStr === 'string' &&\n        !Ember.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 Ember.Controller.extend({\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    appsService: Ember.inject.service('apps'),\n    webrtc: Ember.inject.service('webrtc'),\n\n    queryParams: ['mobile', 'panels', 'initialPanel'],\n    panels: null,\n    initialPanel: null,\n\n    updateCurrentRouteName: Ember.observer('currentRouteName', function () {\n        Ember.run.once(this, this.set, 'application.currentRouteName', this.get('currentRouteName'));\n    }),\n\n    panelsOverrideObject: Ember.computed('panels', 'initialPanel', function () {\n        const panelsOverrideObject = {};\n        const panelsOverride = this.get('panels');\n        const initialPanelOverride = this.get('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.transitionToRoute('feedback');\n        },\n\n        openPreferencesModal() {\n            this.get('settings').open();\n        }\n    }\n});\n","define(\"connections-ui/controllers/array\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.reads('model'),\n\n    currentPerson: null,\n\n    actions: {\n        setCurrentPerson(person) {\n            this.set('currentPerson', person);\n        }\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    permissions: Ember.inject.service()\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n\n    managePresenceSubscriptions: Ember.observer('model.participantsVisible', function () {\n        const subscribeTo = this.get('model.participantsVisible') ? this.get('model.participants') : null;\n        return this.get('presenceSubscription').autoSubscribe(subscribeTo, this);\n    }),\n\n    actions: {\n        inviteUserToRoom(person) {\n            const room = this.get('model');\n            if (room.isOneToOneRoom()) {\n                return this.promoteToAdhocRoom(person);\n            } else {\n                return this.get('chat').inviteToRoom(room, person);\n            }\n        },\n\n        toggleParticipants() {\n            this.toggleProperty('model.participantsVisible');\n        },\n\n        collapseChat() {}\n    },\n\n    promoteToAdhocRoom(person) {\n        const chat = this.get('chat');\n        const oneToOneTarget = this.get('model.oneToOneTarget');\n        return chat.makeNewEmptyRoom().then(room => {\n            chat.inviteToRoom(room, oneToOneTarget);\n            return chat.inviteToRoom(room, person);\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nimport PersonModel from '../models/person';\n\nvar ContactsController = Ember.Controller.extend({\n    favoritesNameFilter: null,\n\n    personBinding: 'session.person',\n    isOnlyFavorite: false,\n    canSearch: false,\n\n    actions: {\n        removeFavorite: function (person) {\n            var path = this.get('applicationService').uri([\n                'api/v2/people',\n                this.get('person.id'),\n                'favorites',\n                person.get('id')\n            ]);\n\n            $.ajax({\n                url: path,\n                type: 'delete',\n                dataType: 'json'\n            }).then(() => {\n                this.get('person').reload();\n                this.get('filteredFavorites').removeObject(person);\n            });\n        },\n\n        addFavorite: function (person) {\n            this.get('filteredFavorites').addObject(person);\n        },\n\n        toggleFavorite: function (person, isFavorite) {\n            if (person.content) {\n                person = person.content;\n            }\n\n            if (isFavorite) {\n                this.send('addFavorite', person);\n            } else {\n                this.send('removeFavorite', person);\n            }\n        }\n    },\n\n    recents: Ember.computed('person', 'model', function () {\n        var apiEndpoint = PersonModel.apiEndpoint;\n        var url = `/api/${apiEndpoint}/${this.get('person.id')}/recents`;\n\n        var promise = new Ember.RSVP.Promise(function (resolve) {\n            $.getJSON(url, { idOnly: true }).then(function (data) {\n                resolve(data.res);\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    setLocalFavorites: Ember.observer('model', 'person', function () {\n        var favorites = this.get('model');\n        if (!_.isEmpty(favorites)) {\n            this.set('filteredFavorites', favorites);\n        }\n    }),\n\n    favoritesFilterChanged: Ember.observer('favoritesNameFilter', function () {\n        this.debouncedFavoritesFilterChanged();\n    }),\n\n    createDebouncedFavoritesFilterChanged: Ember.on('init', function () {\n        this.debouncedFavoritesFilterChanged = _.debounce(() => {\n            Ember.run(() => this._filterChanged());\n        }, 250);\n    }),\n\n    _filterChanged: function () {\n        var filter = this.get('favoritesNameFilter');\n        var favorites = this.get('model');\n\n        if (filter) {\n            var filtered = this.get('model').filter(function (person) {\n                return _.includes(person.get('name').toLowerCase(), filter.toLowerCase());\n            });\n\n            this.setFavorites(filtered);\n        } else {\n            this.setFavorites(favorites);\n        }\n    },\n\n    countFavorites: Ember.observer('filteredFavorites', 'person.favorites.content', 'view', function () {\n        try {\n            var list = this.get('filteredFavorites');\n            this.set('isOnlyFavorite', list.length === 1);\n        } catch (err) {\n            this.set('isOnlyFavorite', false);\n        }\n    }),\n\n    checkSearchVisibility: Ember.observer('filteredFavorites', 'person.favorites.content', function () {\n        var list = this.get('filteredFavorites');\n\n        if (list !== null && list !== undefined) {\n            var value = list.length > 0;\n            this.set('canSearch', value);\n        }\n    }),\n\n    setFavorites: function (favorites) {\n        this.set('filteredFavorites', favorites);\n    }\n});\n\nexport default ContactsController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar EngageController = Ember.Controller.extend(LoggerMixin, {\n    engageService: Ember.inject.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: Ember.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: Ember.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 Ember from 'ember';\n\nconst { Controller } = Ember;\n\nexport default Controller.extend();\n","import Ember from 'ember';\n\nconst { Controller, computed, inject } = Ember;\n\ntype MaintenanceModeMessageKeys = {\n    titleKey: string;\n    descKey?: string;\n    actionKey: string;\n};\n\nconst MaintenanceController = Controller.extend({\n    intl: inject.service(),\n\n    hasDesc: false,\n\n    messageKeys: computed('model', function (): MaintenanceModeMessageKeys {\n        // Always return the same generic error in the maintenance page.\n        // Newrelic will still report the specific error.\n        return {\n            titleKey: 'unrecoverableAppFailure.unknownFailure.title',\n            descKey: 'unrecoverableAppFailure.unknownFailure.desc',\n            actionKey: 'unrecoverableAppFailure.unknownFailure.action'\n        };\n    })\n});\n\nexport default MaintenanceController;\n\n// DO NOT DELETE: This registers controllers by key with the Ember Container allowing TS to know the types of items in the container\ndeclare module '@ember/controller' {\n    interface Registry {\n        maintenance: typeof MaintenanceController;\n    }\n}\n","define(\"connections-ui/controllers/object\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.alias('model.person'),\n    embedded: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    queryParams: ['editing', 'editEmergencyLocation'],\n\n    editing: true,\n    editEmergencyLocation: false,\n    showMobile: false,\n    showDropdown: false,\n\n    loadingFieldSections: false,\n\n    editingProfile: computed.alias('editing'),\n    editingSection: false,\n\n    actions: {\n        toggleEditing() {\n            this.toggleProperty('editingProfile');\n        },\n\n        setEditingSection(value) {\n            this.set('editingSection', value);\n        },\n\n        showGridMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: true,\n                treeMode: false\n            });\n        },\n\n        showStackedMode() {\n            this.setProperties({\n                stackedMode: true,\n                gridMode: false,\n                treeMode: false\n            });\n        },\n\n        showTreeMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: false,\n                treeMode: true\n            });\n        },\n\n        toggleLeftRail() {\n            this.toggleProperty('showMobile');\n        },\n\n        noop() {}\n    },\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    onOwnProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    /**\n     * Observes query parameter changes and notifies the host application\n     */\n    queryParamObserver: Ember.observer('editing', 'editEmergencyLocation', function () {\n        Ember.run.debounce(this, this.syncQueryParamsWithHost, 100);\n    }),\n\n    /**\n     * Syncs current query parameters with the host application URL\n     */\n    syncQueryParamsWithHost() {\n        if (!this.get('embedded')) return;\n\n        if (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        ) {\n            return; // Do not navigate when embedded in the Users-UI.\n        }\n\n        const currentLocalHash = window.location.hash;\n        const currentHostHash = window.top.location.hash;\n        if (!currentLocalHash.startsWith('#/person')) return;\n\n        const updatedHostHash = currentLocalHash.replace(/person/, 'person-v2');\n\n        // Send navigation event to host application, if different from current\n        if (currentHostHash !== updatedHostHash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: updatedHostHash\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { PUBLIC_ENVS } from '../utils/net';\n\nconst { Controller, inject } = Ember;\n\nexport default Controller.extend({\n    application: inject.service(),\n    intl: inject.service(),\n\n    desktopRegionId: null,\n\n    actions: {\n        chooseRegion() {\n            const context = this.get('application.hostedContext');\n            if (context.isHosted()) {\n                context.sendRegionToDesktop(this.get('desktopRegionId'));\n            }\n        }\n    },\n\n    init: function () {\n        this._super(...arguments);\n\n        // Set Initial/Default Region\n        let defaultDesktopRegionId = 'global';\n\n        const locale = this.get('intl.systemLocale');\n        if (_.includes(locale, 'au')) {\n            defaultDesktopRegionId = 'au';\n        } else if (_.includes(locale, 'ja') || _.includes(locale, 'zh')) {\n            defaultDesktopRegionId = 'jp';\n        }\n\n        this.set(\n            'desktopRegionId',\n            _.find(PUBLIC_ENVS, { desktopId: defaultDesktopRegionId })\n                ? defaultDesktopRegionId\n                : PUBLIC_ENVS[0].desktopId\n        );\n    }\n});\n","import IndexController from './index';\n\nvar RelateExternalContactController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalContactController;\n","import IndexController from './index';\n\nvar RelateExternalOrganizationController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalOrganizationController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar IndexController = Ember.Controller.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    relateService: Ember.inject.service('relate'),\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    navigationEvent: Ember.observer('relateService.navigationRoute', function () {\n        var navRoute = this.get('relateService.navigationRoute');\n        if (navRoute) {\n            this.logger.debug('Transitioning to', navRoute);\n            this.transitionToRoute(navRoute); //see override above\n            this.set('relateService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('relateService.redirectRoute', function () {\n        let redirectRoute = this.get('relateService.redirectRoute');\n        this.logger.debug('Redirecting to', redirectRoute.route);\n        this.replaceRoute(redirectRoute.route); //see override above\n    }),\n\n    init: function () {\n        this._super.apply(this, arguments);\n        this.get('relateService.redirectRoute');\n    }\n});\n\nexport default IndexController;\n","import Ember from 'ember';\nimport SignupController from './signup';\n\nexport default SignupController.extend({\n    intl: Ember.inject.service(),\n\n    _heading: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    }),\n\n    _button: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['entity', 'query', 'queryFacets', 'saveHistory'],\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['targetRoute']\n});\n","define(\"connections-ui/enums/plantronics-call-events\", [\"exports\", \"ember-softphone-integration/enums/plantronics-call-events\"], function (_exports, _plantronicsCallEvents) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronicsCallEvents.default;\n    }\n  });\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 Ember from 'ember';\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 = Ember.Object.extend({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    id: Ember.computed.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.get('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.get('sections').forEach(function (section) {\n            if (!Ember.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.get('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: Ember.computed(function () {\n        return this.getFieldConfig('group', Ember.getOwner(this));\n    }),\n\n    personFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('person', Ember.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        Ember.Logger.warn('Unknown field-config type:', { type: attributes.entityType });\n    }\n})\n    .reopenClass(extra)\n    .reopen(extra);\n\nexport default FieldConfig;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default Ember.Object.extend({\n    entity: null,\n    field: null,\n\n    entries: [],\n\n    attachComputedEntries: Ember.on('init', function () {\n        var fieldPath = this.get('field').getFieldPath();\n        if (typeof fieldPath === 'string') {\n            fieldPath = fieldPath.trim();\n\n            var boundTo = `entity.${fieldPath}`;\n            var boundToEach = `entity.${fieldPath}.[]`;\n\n            Ember.defineProperty(this, 'entries', Ember.computed(boundTo, boundToEach, this.getEntriesFromEntity));\n        }\n    }),\n\n    fieldPath: Ember.computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed('fieldPath', function () {\n        var fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    isEmpty: Ember.computed('field', 'entries', 'entries.[]', function () {\n        return this.isFieldEmpty(this.get('field'), this.get('entries'));\n    }),\n\n    writeable: Ember.computed('entity.readWritePermissions', 'entries.[]', function () {\n        var path = this.get('field').getFieldPath();\n        var readWritePermissions = this.get('entity.readWritePermissions');\n        var promise = Ember.RSVP.resolve(true);\n\n        if (this.get('entity.type') !== 'group') {\n            promise = new Ember.RSVP.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.get('field').getFieldPath();\n        var value = this.get('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 Ember from 'ember';\nimport _ from 'lodash';\n\nimport Field from './field';\n\nvar FieldSection = Ember.Object.extend({\n    intl: Ember.computed.reads('fieldConfig.intl'),\n    application: Ember.computed.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.get('fieldList');\n\n        if (_.map(fieldList, 'key').indexOf(property) > -1) {\n            return this.getFieldByKey(property);\n        }\n\n        return null;\n    },\n\n    sectionName: Ember.computed(function () {\n        const intl = this.get('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, null, 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","/* global requirejs */\n\nimport Ember from 'ember';\n\nvar Field = Ember.Object.extend({\n    intl: Ember.computed.reads('section.intl'),\n    application: Ember.computed.reads('section.application'),\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: Ember.computed.reads('params.maxRepeat'),\n\n    i18nLabel: Ember.computed(function () {\n        let intl = this.get('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.get('key');\n    }),\n\n    i18nKey: Ember.computed(function () {\n        return this.getI18nKey();\n    }),\n\n    elemId: Ember.computed(function () {\n        return `#${this.get('key')}`;\n    }),\n\n    fieldPath: Ember.computed(function () {\n        return this.getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed(function () {\n        let path = this.getFieldPath();\n        return path.replace(/\\./gi, '-');\n    }),\n\n    componentName: Ember.computed('type', function () {\n        var type = this.get('type');\n        return `entity-fields/${type}-field`;\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    cleanForEntity(entity) {\n        Ember.Logger.warn('DEPRECATION: Stop using this method please...it breaks a lot of rules...');\n\n        var name = this.get('componentName');\n        if (requirejs._eak_seen[name]) {\n            var module = requirejs(name);\n            if (module.cleanFieldForEntity) {\n                return module.cleanFieldForEntity(entity, this, entity.getFieldValue(this.getFieldPath()));\n            }\n        }\n    },\n\n    component: Ember.computed(function () {\n        Ember.Logger.warn(\n            'DEPRECATION: Use component helper and `field.componentName` property to use field components'\n        );\n\n        // We have fields with hyphens (multiline-text). Make sure they get Ember-ized.\n        var className = this.get('componentName');\n\n        var factory = this.get('application.container').lookupFactory('component:' + className);\n        if (factory) {\n            return factory;\n        }\n\n        Ember.Logger.warn('Could not find view for:', { className });\n\n        return this.get('application.container').lookupFactory('component:text-field');\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 Ember from 'ember';\n\nconst { Mixin, RSVP } = Ember;\n\nconst DEFAULT_PARAMETERS = {\n    offset: 0,\n    limit: 15\n};\n\nexport default Mixin.create({\n    findGroupMembership(id, parameters = DEFAULT_PARAMETERS) {\n        const label = 'Adapter#findGroupMembership';\n        const adapter = this.adapterFor('group');\n\n        const serializer = this.serializerFor('person');\n        const modelClass = this.modelFor('person');\n        let promise = adapter.findGroupMembership(id, parameters);\n        promise = RSVP.Promise.resolve(promise, label);\n\n        return promise.then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(this, modelClass, payload, null, 'findMany');\n                const records = this.push(payload);\n                return records;\n            },\n            null,\n            'Store#findGroupMembership'\n        );\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst activityMessages = {\n    sms: 'components.recentContact.sms',\n    voice: 'components.recentContact.voice',\n    email: 'components.recentContact.email',\n    chat: 'components.recentContact.chat'\n};\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const activity = params[0];\n        const message = activityMessages[activity.method];\n        const date = moment(activity.ts * 1000);\n        return this.get('intl').lookup(message, { date: date.format('L') });\n    }\n});\n","define(\"connections-ui/helpers/abs\", [\"exports\", \"ember-math-helpers/helpers/abs\"], function (_exports, _abs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"abs\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.abs;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acos\", [\"exports\", \"ember-math-helpers/helpers/acos\"], function (_exports, _acos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acos\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.acos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acosh\", [\"exports\", \"ember-math-helpers/helpers/acosh\"], function (_exports, _acosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acosh\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.acosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/add\", [\"exports\", \"ember-math-helpers/helpers/add\"], function (_exports, _add) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"add\", {\n    enumerable: true,\n    get: function get() {\n      return _add.add;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _add.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    addressformat: Ember.inject.service(),\n\n    compute: function (params) {\n        if (!params || params.length !== 1) {\n            Ember.Logger.warn('addressformat helper called with bad arguments');\n            return '';\n        }\n        return this.get('addressformat').formatOrLookupAddressForDisplay(params[0]);\n    }\n});\n","define(\"connections-ui/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"and\", {\n    enumerable: true,\n    get: function get() {\n      return _and.and;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _and.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport { shaRegExp, versionRegExp } from 'ember-cli-app-version/utils/regexp';\n\nconst {\n  APP: {\n    version\n  }\n} = config;\n\nexport function appVersion(_, hash = {}) {\n  if (hash.hideSha) {\n    return version.match(versionRegExp)[0];\n  }\n\n  if (hash.hideVersion) {\n    return version.match(shaRegExp)[0];\n  }\n\n  return version;\n}\n\nexport default Ember.Helper.helper(appVersion);\n","define(\"connections-ui/helpers/array-contains\", [\"exports\", \"ember-array-contains-helper/helpers/array-contains\"], function (_exports, _arrayContains) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"arrayContains\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.arrayContains;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asin\", [\"exports\", \"ember-math-helpers/helpers/asin\"], function (_exports, _asin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asin\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.asin;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asinh\", [\"exports\", \"ember-math-helpers/helpers/asinh\"], function (_exports, _asinh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asinh\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.asinh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan\", [\"exports\", \"ember-math-helpers/helpers/atan\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan2\", [\"exports\", \"ember-math-helpers/helpers/atan2\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan2\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan2;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atanh\", [\"exports\", \"ember-math-helpers/helpers/atanh\"], function (_exports, _atanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atanh\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.atanh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/await\", [\"exports\", \"ember-promise-helpers/helpers/await\"], function (_exports, _await) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _await.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default Ember.Helper.extend({\n    compute([person, promiseArray]) {\n        return DS.PromiseObject.create({\n            promise: promiseArray.then(sequenceList => {\n                const people = sequenceList.filter(listItem => listItem.person === person);\n                return people.get('length') === 0;\n            })\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    permissionsService: Ember.inject.service('permissions'),\n\n    permissions: null,\n\n    compute([entity, fieldPath]) {\n        if (!entity || !fieldPath) {\n            return false;\n        }\n\n        const permissionsService = this.get('permissionsService');\n        return permissionsService.get('canEditProfiles');\n    }\n});\n","define(\"connections-ui/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cancelAll\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.cancelAll;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cbrt\", [\"exports\", \"ember-math-helpers/helpers/cbrt\"], function (_exports, _cbrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cbrt\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.cbrt;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ceil\", [\"exports\", \"ember-math-helpers/helpers/ceil\"], function (_exports, _ceil) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ceil\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.ceil;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return time.format('LLLL');\n});\n","define(\"connections-ui/helpers/clz32\", [\"exports\", \"ember-math-helpers/helpers/clz32\"], function (_exports, _clz) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"clz32\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.clz32;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cos\", [\"exports\", \"ember-math-helpers/helpers/cos\"], function (_exports, _cos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cos\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.cos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cosh\", [\"exports\", \"ember-math-helpers/helpers/cosh\"], function (_exports, _cosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cosh\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.cosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { dasherize } = Ember.String;\n\nexport function cssClassify([string]) {\n    if (string) {\n        string = string.replace(/[,\\(\\)]/g, '');\n        return dasherize(string);\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(cssClassify);\n","define(\"connections-ui/helpers/dasherize\", [\"exports\", \"ember-purecloud-components/helpers/dasherize\"], function (_exports, _dasherize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"dasherize\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.dasherize;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/div\", [\"exports\", \"ember-math-helpers/helpers/div\"], function (_exports, _div) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _div.default;\n    }\n  });\n  Object.defineProperty(_exports, \"div\", {\n    enumerable: true,\n    get: function get() {\n      return _div.div;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-group\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-group\"], function (_exports, _emberPowerSelectIsGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsGroup\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.emberPowerSelectIsGroup;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-selected\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-selected\"], function (_exports, _emberPowerSelectIsSelected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsSelected\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.emberPowerSelectIsSelected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-true-string-if-present\", [\"exports\", \"ember-power-select/helpers/ember-power-select-true-string-if-present\"], function (_exports, _emberPowerSelectTrueStringIfPresent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectTrueStringIfPresent\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.emberPowerSelectTrueStringIfPresent;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst { Handlebars, Helper } = 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 Ember.String.htmlSafe(text);\n    }\n    return text;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nEmber.Handlebars.helper('highlight', function (context, options) {\n    return _.isEmpty(options.context) ? options.fn(this) : null;\n});\n","define(\"connections-ui/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/equal\"], function (_exports, _equal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.equal;\n    }\n  });\n});\n","define(\"connections-ui/helpers/equals\", [\"exports\", \"fixtable-ember/helpers/equals\"], function (_exports, _equals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equals\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.equals;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return _.escape(params[0]);\n});\n","define(\"connections-ui/helpers/exp\", [\"exports\", \"ember-math-helpers/helpers/exp\"], function (_exports, _exp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.default;\n    }\n  });\n  Object.defineProperty(_exports, \"exp\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.exp;\n    }\n  });\n});\n","import Ember from 'ember';\nimport escape from 'connections-ui/utils/escape';\n\nconst { Helper } = Ember;\n\nexport default Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute([text]) {\n        if (!text) {\n            text = '';\n        }\n\n        // Check for promise\n        if (typeof text !== 'string' && typeof text.then === 'function' && !text.get('content')) {\n            text.then(() => this.recompute());\n        } else if (typeof text === 'object' && typeof text.get === 'function') {\n            text = text.get('content') || '';\n        }\n\n        // Check if we've got a POJO\n        if (typeof text === 'object' && typeof text.get !== 'function') {\n            return this.get('intl')\n                .t('entity.fieldTypes.location.address', {\n                    street1: text.street1,\n                    street2: text.street2,\n                    city: text.city,\n                    state: text.state,\n                    country: text.country,\n                    zipcode: text.zipcode\n                })\n                .toString();\n        }\n        return Ember.String.htmlSafe(escape(text).replace(/\\n/g, '<br>'));\n    }\n});\n","define(\"connections-ui/helpers/expm1\", [\"exports\", \"ember-math-helpers/helpers/expm1\"], function (_exports, _expm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"expm1\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.expm1;\n    }\n  });\n});\n","import Ember from 'ember';\nimport FieldConfig from '../field-config/field-config';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        const facetName = facet.facetName;\n        const splitName = facetName.split('.');\n        const section = splitName[0];\n        const field = splitName[1];\n\n        if (section && field) {\n            const owner = Ember.getOwner(this);\n            let fieldObj = FieldConfig.getFieldConfig('person', owner).getSectionByKey(section).getFieldByKey(field);\n\n            if (fieldObj === undefined) {\n                const section = FieldConfig.getFieldConfig('group', owner).getSectionByKey(section);\n                if (!!section) {\n                    fieldObj = section.getFieldByKey(field);\n                } else {\n                    return field;\n                }\n            }\n\n            if (fieldObj !== undefined) {\n                const intl = this.get('intl');\n                const path = fieldObj.getFieldPath();\n                const lookupPath = path.replace(/\\./g, '_');\n                let i18nKey;\n\n                if (facet.total > 1) {\n                    i18nKey = `directedSearch_${lookupPath}_plural`;\n                } else {\n                    i18nKey = `directedSearch_${lookupPath}_singular`;\n                }\n\n                if (intl.query(i18nKey)) {\n                    return intl.lookup(i18nKey);\n                } else {\n                    return fieldObj.get('i18nLabel');\n                }\n            }\n        }\n\n        return facetName;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        let term = namedArgs.term;\n        let facetName = facet.facetName;\n        if (term && facetName === 'general.groupType') {\n            facetName = facetName.replace(/[\\. ]/g, '_');\n            term = term.replace(/[\\. ]/g, '_');\n            const intl = this.get('intl');\n            const i18nKey = ['group', facetName, 'value', term].join('_');\n            if (intl.query(i18nKey)) {\n                return intl.lookup(i18nKey);\n            }\n        }\n        return term;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([arr]) {\n    if (arr && arr.length) {\n        return arr[0];\n    }\n\n    return {};\n});\n","import Ember from 'ember';\nimport { emojifyString } from 'ember-purecloud-components/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 Ember.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","define(\"connections-ui/helpers/floor\", [\"exports\", \"ember-math-helpers/helpers/floor\"], function (_exports, _floor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"floor\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.floor;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-date\", [\"exports\", \"ember-intl/helpers/format-date\"], function (_exports, _formatDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatDate.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute: function (params) {\n        let bytes = params[0];\n        let units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n        for (var i = units.length - 1; i >= 0; i--) {\n            var converted = bytes / Math.pow(1000, i);\n            if (converted >= 1 && converted < 1000) {\n                var decimals = i === 0 ? 0 : 1;\n                return `${converted.toFixed(decimals)} ${units[i]}`;\n            }\n        }\n    }\n});\n","define(\"connections-ui/helpers/format-html-message\", [\"exports\", \"ember-intl/helpers/format-html-message\"], function (_exports, _formatHtmlMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatHtmlMessage.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const link = params[0];\n    return link.replace('http://', '').replace('https://', '').replace('www.', '');\n});\n","define(\"connections-ui/helpers/format-message\", [\"exports\", \"ember-intl/helpers/format-message\"], function (_exports, _formatMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-number\", [\"exports\", \"ember-intl/helpers/format-number\"], function (_exports, _formatNumber) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatNumber.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-relative\", [\"exports\", \"ember-intl/helpers/format-relative\"], function (_exports, _formatRelative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatRelative.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-time\", [\"exports\", \"ember-intl/helpers/format-time\"], function (_exports, _formatTime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatTime.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/fround\", [\"exports\", \"ember-math-helpers/helpers/fround\"], function (_exports, _fround) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.default;\n    }\n  });\n  Object.defineProperty(_exports, \"fround\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.fround;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst fullNameHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    names: Ember.inject.service(),\n\n    compute(params) {\n        const externalProfile = params[0];\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile) || Ember.get(externalProfile, 'firstName');\n        }\n        return this.get('intl').lookup('purecloud.unknown');\n    }\n});\n\nexport default fullNameHelper;\n","define(\"connections-ui/helpers/gcd\", [\"exports\", \"ember-math-helpers/helpers/gcd\"], function (_exports, _gcd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gcd\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.gcd;\n    }\n  });\n});\n","define(\"connections-ui/helpers/get-select-options\", [\"exports\", \"fixtable-ember/helpers/get-select-options\"], function (_exports, _getSelectOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.default;\n    }\n  });\n  Object.defineProperty(_exports, \"getSelectOptions\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.getSelectOptions;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    name: '',\n    compute(params) {\n        const groupId = params[0];\n        if (!this.get('name')) {\n            if (this.get('store').hasRecordForId('group', groupId)) {\n                let group = this.get('store').recordForId('group', groupId);\n                if (group && group.get('name')) {\n                    this.set('name', group.get('name'));\n                    this.recompute();\n                }\n            } else {\n                this.get('store')\n                    .find('group', groupId)\n                    .then(group => {\n                        this.set('name', group.get('name'));\n                        this.recompute();\n                    });\n            }\n        }\n\n        return this.get('name');\n    }\n});\n","define(\"connections-ui/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gt\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.gt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gte\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.gte;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute(params) {\n        const group = params[0];\n        return !!Ember.get(group, 'contactInfo.groupNumber.firstObject.rel.e164');\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(params => {\n    const type = params[0];\n\n    switch (type) {\n        case 'faq':\n            return 'faq';\n        case 'article':\n            return 'article';\n        case 'glossary':\n            return 'glossary';\n        case 'video':\n            return 'video-camera';\n        case 'post':\n            return 'post';\n        case 'releasenote':\n            return 'releasenote';\n        case 'page':\n            return 'page';\n        default:\n            return '';\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return Ember.String.htmlSafe(params[0]);\n});\n","define(\"connections-ui/helpers/hypot\", [\"exports\", \"ember-math-helpers/helpers/hypot\"], function (_exports, _hypot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hypot\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.hypot;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst activityIcons = {\n    sms: 'ion-iphone',\n    voice: 'ion-ios-telephone',\n    email: 'ion-email',\n    chat: 'ion-chatboxes'\n};\n\nexport default Ember.Helper.helper(params => {\n    const activity = params[0];\n    return Ember.String.htmlSafe(`<i class='${activityIcons[activity.method]}'></i>`);\n});\n","define(\"connections-ui/helpers/ignore-children\", [\"exports\", \"ember-ignore-children-helper/helpers/ignore-children\"], function (_exports, _ignoreChildren) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ignoreChildren\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.ignoreChildren;\n    }\n  });\n});\n","define(\"connections-ui/helpers/imul\", [\"exports\", \"ember-math-helpers/helpers/imul\"], function (_exports, _imul) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.default;\n    }\n  });\n  Object.defineProperty(_exports, \"imul\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.imul;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const string = typeof params[0] === 'undefined' ? '' : params[0];\n    return string.charAt(0);\n});\n","define(\"connections-ui/helpers/intl-get\", [\"exports\", \"ember-intl/helpers/intl-get\"], function (_exports, _intlGet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _intlGet.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-after\", [\"exports\", \"ember-moment/helpers/is-after\"], function (_exports, _isAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isArray\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.isArray;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-before\", [\"exports\", \"ember-moment/helpers/is-before\"], function (_exports, _isBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-between\", [\"exports\", \"ember-moment/helpers/is-between\"], function (_exports, _isBetween) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBetween.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isEmpty.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    const left = params[0];\n    const right = params[1];\n    return left === right;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params) {\n    const user = params[0];\n    const entity = params[1];\n    const favorites = user.get('_favorites');\n    const isFavorite = !!favorites && !_.isEmpty(favorites.findBy('id', entity.get('id')));\n\n    if (isFavorite) {\n        return 'favorite';\n    } else {\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/is-fulfilled\", [\"exports\", \"ember-promise-helpers/helpers/is-fulfilled\"], function (_exports, _isFulfilled) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isFulfilled\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.isFulfilled;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-pending\", [\"exports\", \"ember-promise-helpers/helpers/is-pending\"], function (_exports, _isPending) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isPending\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.isPending;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-rejected\", [\"exports\", \"ember-promise-helpers/helpers/is-rejected\"], function (_exports, _isRejected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isRejected\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.isRejected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-after\", [\"exports\", \"ember-moment/helpers/is-same-or-after\"], function (_exports, _isSameOrAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-before\", [\"exports\", \"ember-moment/helpers/is-same-or-before\"], function (_exports, _isSameOrBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same\", [\"exports\", \"ember-moment/helpers/is-same\"], function (_exports, _isSame) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSame.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(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 Ember from 'ember';\n\nexport function joinStrings(params /*, hash*/) {\n    const [joinCharacter, ...rest] = params || [];\n    return rest.join(joinCharacter);\n}\n\nexport default Ember.Helper.helper(joinStrings);\n","define(\"connections-ui/helpers/l\", [\"exports\", \"ember-intl/helpers/l\"], function (_exports, _l) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _l.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lcm\", [\"exports\", \"ember-math-helpers/helpers/lcm\"], function (_exports, _lcm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lcm\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.lcm;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    presence: Ember.inject.service(),\n\n    compute(params) {\n        return this.get('presence').localizePresence(...params);\n    }\n});\n","define(\"connections-ui/helpers/log-e\", [\"exports\", \"ember-math-helpers/helpers/log-e\"], function (_exports, _logE) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.default;\n    }\n  });\n  Object.defineProperty(_exports, \"logE\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.logE;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log10\", [\"exports\", \"ember-math-helpers/helpers/log10\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log10\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log10;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log1p\", [\"exports\", \"ember-math-helpers/helpers/log1p\"], function (_exports, _log1p) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log1p\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.log1p;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log2\", [\"exports\", \"ember-math-helpers/helpers/log2\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log2\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log2;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lt\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.lt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lte\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.lte;\n    }\n  });\n});\n","define(\"connections-ui/helpers/max\", [\"exports\", \"ember-math-helpers/helpers/max\"], function (_exports, _max) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _max.default;\n    }\n  });\n  Object.defineProperty(_exports, \"max\", {\n    enumerable: true,\n    get: function get() {\n      return _max.max;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute(date) {\n        let locale = this.get('intl.isoLocale');\n        if (moment(date, 'YYYY-MM-DD').isSame(new Date(), 'day')) {\n            return `TODAY: ${moment(date, 'YYYY-MM-DD').locale(locale).format('dddd MMMM DD')}`;\n        } else {\n            return moment(date, 'YYYY-MM-DD').locale(locale).format('MMMM DD');\n        }\n    }\n});\n","define(\"connections-ui/helpers/min\", [\"exports\", \"ember-math-helpers/helpers/min\"], function (_exports, _min) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _min.default;\n    }\n  });\n  Object.defineProperty(_exports, \"min\", {\n    enumerable: true,\n    get: function get() {\n      return _min.min;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mod\", [\"exports\", \"ember-math-helpers/helpers/mod\"], function (_exports, _mod) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mod\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.mod;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-add\", [\"exports\", \"ember-moment/helpers/moment-add\"], function (_exports, _momentAdd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentAdd.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-calendar\", [\"exports\", \"ember-moment/helpers/moment-calendar\"], function (_exports, _momentCalendar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentCalendar.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-diff\", [\"exports\", \"ember-moment/helpers/moment-diff\"], function (_exports, _momentDiff) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDiff.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-duration\", [\"exports\", \"ember-moment/helpers/moment-duration\"], function (_exports, _momentDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDuration.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-format\", [\"exports\", \"ember-moment/helpers/moment-format\"], function (_exports, _momentFormat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFormat.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from-now\", [\"exports\", \"ember-moment/helpers/moment-from-now\"], function (_exports, _momentFromNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFromNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from\", [\"exports\", \"ember-moment/helpers/moment-from\"], function (_exports, _momentFrom) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFrom.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-subtract\", [\"exports\", \"ember-moment/helpers/moment-subtract\"], function (_exports, _momentSubtract) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentSubtract.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-date\", [\"exports\", \"ember-moment/helpers/moment-to-date\"], function (_exports, _momentToDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToDate.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-now\", [\"exports\", \"ember-moment/helpers/moment-to-now\"], function (_exports, _momentToNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to\", [\"exports\", \"ember-moment/helpers/moment-to\"], function (_exports, _momentTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentTo.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment\", [\"exports\", \"ember-moment/helpers/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _moment.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mult\", [\"exports\", \"ember-math-helpers/helpers/mult\"], function (_exports, _mult) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mult\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.mult;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport default Ember.Helper.helper(function (params) {\n    if (params && params[0]) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n});\n","define(\"connections-ui/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-equal\"], function (_exports, _notEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"notEq\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.notEq;\n    }\n  });\n});\n","define(\"connections-ui/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _not.default;\n    }\n  });\n  Object.defineProperty(_exports, \"not\", {\n    enumerable: true,\n    get: function get() {\n      return _not.not;\n    }\n  });\n});\n","define(\"connections-ui/helpers/now\", [\"exports\", \"ember-moment/helpers/now\"], function (_exports, _now) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _now.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _or.default;\n    }\n  });\n  Object.defineProperty(_exports, \"or\", {\n    enumerable: true,\n    get: function get() {\n      return _or.or;\n    }\n  });\n});\n","define(\"connections-ui/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.default;\n    }\n  });\n  Object.defineProperty(_exports, \"perform\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.perform;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default Ember.Helper.extend({\n    phoneIntegrations: inject.service(),\n\n    onIntegrationConfigChange: Ember.observer('phoneIntegrations.integrationConfigs.[]', function () {\n        this.recompute();\n    }),\n\n    compute([person]) {\n        if (person.integrationContactInfo === undefined) {\n            return [];\n        }\n        const phoneIntegrations = this.get('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 Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\n\nexport default Ember.Helper.helper(function (params) {\n    const count = params[1] || 1;\n    const text = params[0];\n    if (count !== 1) {\n        return pluralize(text);\n    }\n    return text;\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","define(\"connections-ui/helpers/pow\", [\"exports\", \"ember-math-helpers/helpers/pow\"], function (_exports, _pow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pow\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.pow;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-all\", [\"exports\", \"ember-promise-helpers/helpers/promise-all\"], function (_exports, _promiseAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseAll\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.promiseAll;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-hash\", [\"exports\", \"ember-promise-helpers/helpers/promise-hash\"], function (_exports, _promiseHash) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseHash\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.promiseHash;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-rejected-reason\", [\"exports\", \"ember-promise-helpers/helpers/promise-rejected-reason\"], function (_exports, _promiseRejectedReason) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseRejectedReason.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/random\", [\"exports\", \"ember-math-helpers/helpers/random\"], function (_exports, _random) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _random.default;\n    }\n  });\n  Object.defineProperty(_exports, \"random\", {\n    enumerable: true,\n    get: function get() {\n      return _random.random;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport function renderMarkdown(params /*, hash*/) {\n    if (params && params.length > 0) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(renderMarkdown);\n","define(\"connections-ui/helpers/round\", [\"exports\", \"ember-math-helpers/helpers/round\"], function (_exports, _round) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _round.default;\n    }\n  });\n  Object.defineProperty(_exports, \"round\", {\n    enumerable: true,\n    get: function get() {\n      return _round.round;\n    }\n  });\n});\n","define(\"connections-ui/helpers/route-action\", [\"exports\", \"ember-route-action-helper/helpers/route-action\"], function (_exports, _routeAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeAction.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return moment(time).format('h:mm a');\n});\n","import Ember from 'ember';\nimport { emojifyStringUnicode } from 'ember-purecloud-components/utils/emoji';\n\nexport default Ember.Helper.helper(params => {\n    const emoji = params[0];\n    const isUnicode = params.length > 1 ? params[1] : false;\n    const isUnicodeLookAhead = params[1] === 'isUnicodeLookAhead' ? true : false;\n    if (isUnicodeLookAhead) {\n        return emojifyStringUnicode(`:${emoji}:`);\n    }\n    return /:\\w+:/.test(emoji) || isUnicode ? emoji : `:${emoji}:`;\n});\n","define(\"connections-ui/helpers/sign\", [\"exports\", \"ember-math-helpers/helpers/sign\"], function (_exports, _sign) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sign\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.sign;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sin\", [\"exports\", \"ember-math-helpers/helpers/sin\"], function (_exports, _sin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sin\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.sin;\n    }\n  });\n});\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import Ember from 'ember';\nimport orderBy from 'lodash/orderBy';\nimport moment from '../utils/dates';\n\nexport function sortFieldData([data], { group }) {\n    let key = group.key;\n    if (key === 'workHistory' || key === 'education') {\n        return orderBy(\n            data,\n            function (fieldData) {\n                let value = fieldData.get('value.value.startDate');\n                if (value) {\n                    let { month, year } = value;\n                    if (month) {\n                        month -= 1;\n                    }\n\n                    return moment({ month, year }).valueOf();\n                }\n            },\n            ['desc']\n        );\n    }\n\n    return data;\n}\n\nexport default Ember.Helper.helper(sortFieldData);\n","define(\"connections-ui/helpers/sqrt\", [\"exports\", \"ember-math-helpers/helpers/sqrt\"], function (_exports, _sqrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sqrt\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.sqrt;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute([value, placeholder] /*, hash*/) {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (!value) {\n            return '';\n        }\n        if (Ember.get(value, 'promise')) {\n            if (Ember.get(value, 'isFulfilled')) {\n                return Ember.get(value, 'content');\n            }\n            return placeholder || this.get('intl').t('common.loading');\n        }\n        return 'stringOrPromiseError';\n    }\n});\n","define(\"connections-ui/helpers/sub\", [\"exports\", \"ember-math-helpers/helpers/sub\"], function (_exports, _sub) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sub\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.sub;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sum\", [\"exports\", \"ember-math-helpers/helpers/sum\"], function (_exports, _sum) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sum\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.sum;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute: function (params, hash) {\n        return this.get('intl').lookup(params[0], hash);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        var field = params[0];\n        var tag = field;\n        if (field) {\n            var section = field.replace('.', '_');\n            var key = section.substring(section.indexOf('_') + 1);\n            tag = this.get('intl').lookup(`person_${section}_labelKey_${key}`);\n        }\n\n        return tag;\n    }\n});\n","define(\"connections-ui/helpers/tan\", [\"exports\", \"ember-math-helpers/helpers/tan\"], function (_exports, _tan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tan\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.tan;\n    }\n  });\n});\n","define(\"connections-ui/helpers/tanh\", [\"exports\", \"ember-math-helpers/helpers/tanh\"], function (_exports, _tanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tanh\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.tanh;\n    }\n  });\n});\n","define(\"connections-ui/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _task.default;\n    }\n  });\n  Object.defineProperty(_exports, \"task\", {\n    enumerable: true,\n    get: function get() {\n      return _task.task;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst { run, inject, addObserver, removeObserver, Helper } = Ember;\n\nfunction padZero(num) {\n    return num.toString().length === 1 ? `0${num}` : num;\n}\n\n// clone of duration format\n\nexport default Helper.extend({\n    clock: inject.service(),\n\n    willDestroy() {\n        removeObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this._super(...arguments);\n    },\n\n    compute(params, { startTime, endTime, durationInMs }) {\n        const shouldTick = (startTime || endTime) && !durationInMs;\n\n        this.set('startTime', startTime);\n        this.set('endTime', endTime);\n        this.set('durationInMs', durationInMs);\n\n        if (shouldTick) {\n            this._setupObserver();\n        }\n\n        return this._formatDuration();\n    },\n\n    _formatDuration: function () {\n        const startTime = this.get('startTime');\n        const endTime = this.get('endTime');\n\n        let durationInMs;\n        if (startTime && endTime) {\n            durationInMs = endTime.diff(startTime);\n        } else if (startTime) {\n            durationInMs = moment().diff(startTime);\n        } else if (endTime) {\n            durationInMs = endTime.diff(moment());\n        } else {\n            durationInMs = this.get('durationInMs');\n        }\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n        const duration = moment.duration(durationInMs);\n        const days = duration.days();\n\n        let hours = duration.hours() + days * 24;\n        let minutes = '';\n        if (hours) {\n            hours = `${hours}:`;\n            minutes = duration.minutes() ? `${padZero(duration.minutes())}:` : '00:';\n        } else {\n            hours = '';\n            minutes = duration.minutes() ? `${duration.minutes()}:` : '0:';\n        }\n\n        const seconds = duration.seconds() ? `${padZero(duration.seconds())}` : '00';\n\n        return `${hours}${minutes}${seconds}`;\n    },\n\n    _setupObserver() {\n        addObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this.get('clock.second'); // start observation\n    },\n\n    _scheduleRecompute() {\n        run.next(this, this.recompute);\n    }\n});\n","import Ember from 'ember';\n\nconst titleForEntityPropertyHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const entity = params[0];\n        const entityType = params[1];\n        const entityPropertyType = params[2];\n        if (entityType === 'phone') {\n            return entity.getPhoneTitleFor(entityPropertyType);\n        }\n        if (entityType === 'email') {\n            return entity.getEmailTitleFor(entityPropertyType);\n        }\n        return '';\n    }\n});\n\nexport default titleForEntityPropertyHelper;\n","define(\"connections-ui/helpers/trunc\", [\"exports\", \"ember-math-helpers/helpers/trunc\"], function (_exports, _trunc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"trunc\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.trunc;\n    }\n  });\n});\n","define(\"connections-ui/helpers/unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/utc\", [\"exports\", \"ember-moment/helpers/utc\"], function (_exports, _utc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"utc\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.utc;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const intl = this.get('intl');\n        const value = params[0];\n        const type = params[1];\n        if (type === 'location') {\n            return intl.lookup('geolocation.formattedLocationName', value);\n        }\n        if (!value || !value.value) {\n            return '';\n        }\n        if (type === 'email') {\n            return value.value;\n        }\n        if (type === 'voice' || type === 'sms') {\n            const number = value.value.number;\n            const ext = value.value.extension;\n            const html = `<span class='number'>${number}</span>`;\n            const extLabel = intl.lookup('entity.fieldTypes.phone.extension');\n            return Ember.String.htmlSafe(\n                ext ? `${html} <span>${extLabel}</span> <span class='extension'>${ext}</span>` : html\n            );\n        }\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"xor\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.xor;\n    }\n  });\n});\n","export 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};\n","define(\"connections-ui/index\", [\"exports\", \"ember-uuid\"], function (_exports, _emberUuid) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v4;\n    }\n  });\n});\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 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 Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\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         * Use unprotected or unauthenticated route mixins to relax\n         * permissions on your routes\n         */\n        Ember.Route.reopen(AuthenticatedAuthorizedRouteMixin);\n\n        UnauthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n\n        AuthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (!this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\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\nexport function deprecateJqueryCookie() {\n    const jQueryCookieDeprecation = {\n        id: 'directory-core.deprecate-jquery-cookie',\n        until: '8.0.0',\n        url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-jquery-cookie'\n    };\n\n    if (Ember.$.cookie) {\n        const cookie = Ember.$.cookie;\n        Ember.$.cookie = function _overrideCookie(name, value) {\n            let message = 'Please use `service:ember-cookies`.read(name) instead of jQuery.$.cookie';\n            if (value) {\n                message = 'Please use `service:ember-cookies`.write(name, value, [opts]) instead of jQuery.$.cookie';\n            }\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return cookie.apply(Ember.$, arguments);\n        };\n    }\n\n    if (Ember.$.removeCookie) {\n        const removeCookie = Ember.$.removeCookie;\n        Ember.$.removeCookie = function _overrideRemoveCookie() {\n            const message = 'Please use `service:ember-cookies`.clear(name) instead of jQuery.$.removeCookie';\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return removeCookie.apply(Ember.$, arguments);\n        };\n    }\n}\n\nexport default {\n    name: 'authenticators',\n    before: 'ember-simple-auth',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        deprecateJqueryCookie();\n\n        application.register('authenticator:oauthProps', Ember.Object.extend(loadOauthProps() || {}));\n        application.inject('authenticator:directory', 'oauthProps', 'authenticator:oauthProps');\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', 'applicationService', 'service:application');\n        application.inject('service:chat', 'phoneService', 'service:phone');\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 Clock from '../services/clock';\n\nexport default {\n  name: 'clock',\n  initialize: function() {\n    var app = arguments[1] || arguments[0];\n    app.register('clock:main', Clock);\n    app.inject('controller', 'clock', 'clock:main');\n    app.inject('component', 'clock', 'clock:main');\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","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `data-adapter` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'data-adapter',\n  before: 'store',\n  initialize() {}\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","define(\"connections-ui/initializers/ember-concurrency\", [\"exports\", \"ember-concurrency/initializers/ember-concurrency\"], function (_exports, _emberConcurrency) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.initialize;\n    }\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 setupContainer from 'ember-data/setup-container';\nimport 'ember-data';\n\n/*\n\n  This code initializes Ember-Data onto an Ember application.\n\n  If an Ember.js developer defines a subclass of DS.Store on their application,\n  as `App.StoreService` (or via a module system that resolves to `service:store`)\n  this code will automatically instantiate it and make it available on the\n  router.\n\n  Additionally, after an application's controllers have been injected, they will\n  each have the store made available to them.\n\n  For example, imagine an Ember.js application with the following classes:\n\n  App.StoreService = DS.Store.extend({\n    adapter: 'custom'\n  });\n\n  App.PostsController = Ember.Controller.extend({\n    // ...\n  });\n\n  When the application is initialized, `App.ApplicationStore` will automatically be\n  instantiated, and the instance of `App.PostsController` will have its `store`\n  property set to that instance.\n\n  Note that this code will only be run if the `ember-application` package is\n  loaded. If Ember Data is being used in an environment other than a\n  typical application (e.g., node.js where only `ember-runtime` is available),\n  this code will be ignored.\n*/\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 setupSessionService from 'ember-simple-auth/initializers/setup-session-service';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(registry) {\n    const config = ENV['ember-simple-auth'] || {};\n    config.baseURL = ENV.rootURL || ENV.baseURL;\n    Configuration.load(config);\n\n    setupSession(registry);\n    setupSessionService(registry);\n  }\n};\n","define(\"connections-ui/initializers/engines\", [\"exports\", \"ember-engines/initializers/engines\"], function (_exports, _engines) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.initialize;\n    }\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 throttled from \"rate-limit-computed/throttled\";\nimport debounced from \"rate-limit-computed/debounced\";\n\nexport default {\n  name: 'extend-ember-computed',\n  initialize: function() {\n    Ember.computed.throttle = throttled;\n    Ember.computed.debounce = debounced;\n  }\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","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `injectStore` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'injectStore',\n  before: 'store',\n  initialize() {}\n};\n","import Ember from 'ember';\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\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            Ember.Debug.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 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', 'applicationService', 'service:application');\n\n        application.inject('route', 'phoneService', 'service:phone');\n        application.inject('component', 'phoneService', 'service:phone');\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","define(\"connections-ui/initializers/route-styles\", [\"exports\", \"ember-component-css/initializers/route-styles\"], function (_exports, _routeStyles) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.initialize;\n    }\n  });\n});\n","import ApplicationService from 'connections-ui/services/application';\nimport netUtils from '../utils/net';\nimport { isTesting } from 'connections-ui/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            const instanceProperties = {};\n            const runtimePublicDomainName = netUtils.getEnvDetails().runtime\n                ? netUtils.getEnvDetails().runtime.publicDomainName\n                : null;\n            if (runtimePublicDomainName) {\n                instanceProperties.authUri = 'https://login.' + runtimePublicDomainName;\n                instanceProperties.purecloudV2BaseUri = 'https://api.' + runtimePublicDomainName;\n                instanceProperties.cobrowseUri = 'https://cobrowse.' + runtimePublicDomainName;\n                instanceProperties.purecloudAppsUri = 'https://apps.' + runtimePublicDomainName + '/';\n                instanceProperties.streamingServiceUri = 'wss://streaming.' + runtimePublicDomainName;\n            } else {\n                instanceProperties.authUri = null;\n            }\n            ApplicationService.reopen(instanceProperties);\n            application.advanceReadiness();\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 { loadTheme, setThemeClass } from '../utils/theme-loader';\n\nexport default {\n    name: 'set-application-theme',\n    before: 'orgspan',\n    /**\n     * Sets the theme to an out-of-the-box supported theme until FT's load in, and then will update the theme\n     * of the application to the actual cached theme if the FT is supported in the Environment. That way the\n     * theme will never show until it's confirmed to be supported no matter the value of the theme cookie.\n     */\n    initialize: () => setThemeClass(loadTheme())\n};\n","const require = window.requirejs;\n\nexport function initialize(instance) {\n    const regex = /^ember-webrtc-components\\/components\\/([\\w\\-/]+)\\/component/;\n    const packages = Object.keys(require._eak_seen);\n    const paths = packages.filter(path => regex.test(path));\n    paths.forEach(path => {\n        const matches = path.match(regex);\n        const name = matches && matches.length && matches[matches.length - 1];\n        instance.register(`component:${name}`, require(path).default);\n    });\n}\n\nexport default {\n    name: 'setup-webrtc-components',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `store` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'store',\n  after: 'ember-data',\n  initialize() {}\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `transforms` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'transforms',\n  before: 'store',\n  initialize() {}\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 'ember-webrtc-components/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', 'applicationService', 'service:application');\n        application.inject('service:webrtc', 'phoneService', 'service:phone');\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","export function initialize(instance) {\n    instance.lookup('controller:application');\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","define(\"connections-ui/instance-initializers/backburner-debug\", [\"exports\", \"ember-purecloud-components/instance-initializers/backburner-debug\"], function (_exports, _backburnerDebug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.initialize;\n    }\n  });\n});\n","define(\"connections-ui/instance-initializers/conversation-service\", [\"exports\", \"ember-purecloud-components/instance-initializers/conversation-service\"], function (_exports, _conversationService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.initialize;\n    }\n  });\n});\n","export function initialize(applicationInstance) {\n    applicationInstance.lookup('service:embedded');\n}\n\nexport default {\n    name: 'embedded',\n    initialize: initialize\n};\n","import initializeStoreService from 'ember-data/instance-initializers/initialize-store-service';\n\nexport default {\n  name: \"ember-data\",\n  initialize: initializeStoreService\n};\n","/* globals requirejs, Intl */\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nimport Ember from 'ember';\nimport ENV from '../config/environment';\nimport links from 'ember-intl/utils/links';\n\nconst { warn } = Ember;\n\nfunction filterBy(type) {\n  return Object.keys(requirejs._eak_seen).filter((key) => {\n    return key.indexOf(`${ENV.modulePrefix}\\/${type}\\/`) === 0;\n  });\n}\n\nexport function instanceInitializer(instance) {\n  let service;\n\n  if (typeof instance.lookup === 'function') {\n    service = instance.lookup('service:intl');\n  } else {\n    service = instance.container.lookup('service:intl');\n  }\n\n  if (typeof Intl === 'undefined') {\n    warn(`[ember-intl] Intl API is unavailable in this environment.\\nSee: ${links.polyfill}`, false, {\n      id: 'ember-intl-undefined-intljs'\n    });\n  }\n\n  const cldrs = filterBy('cldrs');\n\n  if (!cldrs.length) {\n    warn('[ember-intl] project is missing CLDR data\\nIf you are asynchronously loading translation, see: ${links.asyncTranslations}.', false, {\n      id: 'ember-intl-missing-cldr-data'\n    });\n  } else {\n    cldrs.map((moduleName) => requirejs(moduleName, null, null, true)['default'])\n      .forEach((locale) => locale.forEach(service.addLocaleData));\n  }\n\n  filterBy('translations').forEach((moduleName) => {\n    const localeSplit = moduleName.split('\\/');\n    const localeName = localeSplit[localeSplit.length - 1];\n    service.addTranslations(localeName, requirejs(moduleName, null, null, true)['default']);\n  });\n}\n\nexport default {\n  name: 'ember-intl',\n  initialize: instanceInitializer\n}\n","import setupSessionRestoration from 'ember-simple-auth/instance-initializers/setup-session-restoration';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(instance) {\n    setupSessionRestoration(instance);\n  }\n};\n","import LazyRenderWrapper from 'ember-tooltips/components/lazy-render-wrapper';\n\nexport function initialize() {\n    // this can be removed after ember-tooltips version is bumped to 3.0.\n    // 2.5 defaults this property to off.\n    LazyRenderWrapper.reopen({\n        enableLazyRendering: true\n    });\n}\n\nexport default {\n    name: 'ember-tooltips',\n    initialize\n};\n","import EntityContactGroupComponent from '../components/entity-contact-group-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityContactGroupComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-contact-group-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityFavoriteComponent from 'ember-purecloud-components/components/entity-favorite/component';\n\nexport function initialize() {\n    EntityFavoriteComponent.reopen({\n        favorites: Ember.inject.service(),\n        toggleFavorite(entity) {\n            this.get('favorites').toggleFavorite(entity);\n        }\n    });\n}\n\nexport default {\n    name: 'entity-favorite',\n    initialize\n};\n","import EntityHoverCard from '../components/entity-hover-card-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityHoverCard.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-hover-card-v2',\n    initialize\n};\n","import EntityImageComponent from '../components/entity-image-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityImageComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-image-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityLocationComponent from 'ember-purecloud-components/components/entity-location/component';\n\nexport function initialize() {\n    EntityLocationComponent.reopen({\n        session: Ember.inject.service(),\n        geolocation: Ember.inject.service(),\n\n        self: Ember.computed.reads('session.person'),\n        isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled')\n    });\n}\n\nexport default {\n    name: 'entity-location',\n    initialize\n};\n","import Validators from '../components/entity-fields/validators';\n\nexport function initialize(application) {\n    Validators.reopen(application.ownerInjection());\n}\n\nexport default {\n    name: 'inject-owner',\n    initialize\n};\n","import manifest from '../config/asset-manifest';\n\n/**\n * Initializes the AssetLoader service with a generated asset-manifest.\n */\nexport function initialize(instance) {\n  const service = instance.lookup('service:asset-loader');\n  service.pushManifest(manifest);\n}\n\nexport default {\n  name: 'load-asset-manifest',\n  initialize\n};\n","import Ember from 'ember';\nimport PresenceLabelComponent from 'ember-purecloud-components/components/presence-label/component';\n\nexport function initialize() {\n    PresenceLabelComponent.reopen({\n        chat: Ember.inject.service(),\n        isChatEnabled: Ember.computed.reads('chat.enabled')\n    });\n}\n\nexport default {\n    name: 'presence-label',\n    initialize\n};\n","export default {\n  name: 'setupRecordingService',\n  initialize (instance) {\n    instance.lookup('service:recording');\n  }\n};\n","import Ember from 'ember';\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        Ember.Component.reopen({\n            bubbleAction(data) {\n                try {\n                    this.triggerAction(data);\n                } catch (e) {\n                    // Turn on to debug component stack\n                    // Ember.Logger.warn(e.message, e.stack);\n                }\n\n                const parentView = this.get('parentView');\n                if (parentView && parentView.bubbleAction) {\n                    parentView.bubbleAction(data);\n                }\n            }\n        });\n\n        Ember.Component.reopen({\n            init() {\n                this._super();\n\n                var services = this.get('needsServices');\n                if (!services) {\n                    services = [];\n                }\n\n                var current = this.get('services');\n                if (!current) {\n                    current = {};\n                }\n\n                _.each(services, function (name) {\n                    var service = instance.lookup('service:' + name);\n                    Ember.set(current, name, service);\n                });\n\n                this.set('services', current);\n\n                if (!this.get('session')) {\n                    this.set('session', session);\n                }\n\n                if (!this.get('preferences')) {\n                    this.set('preferences', preferences);\n                }\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nconst { inject, observer, Route } = Ember;\n\nexport default {\n    name: 'reopen-route',\n\n    initialize() {\n        Route.reopen({\n            intl: inject.service(),\n            application: inject.service(),\n\n            routeTitle: '',\n\n            updateRouteTitle: observer(\n                'routeName',\n                'routeTitle',\n                'application.{orgName,currentRouteName}',\n                function () {\n                    let parts = [];\n                    let routeName = this.get('routeName');\n                    let routeTitle = this.get('routeTitle');\n                    let appRoute = this.get('application.currentRouteName') || '';\n                    let orgName = this.get('application.orgName');\n\n                    if (!routeTitle || appRoute.indexOf(routeName) === -1) {\n                        return;\n                    }\n\n                    parts.push(typeof routeTitle === 'function' ? routeTitle.call(this) : routeTitle);\n\n                    if (orgName) {\n                        parts.push(orgName);\n                    }\n\n                    window.top.document.title = parts.join(' - ');\n                }\n            )\n        });\n    }\n};\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/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                Ember.Logger.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 Ember from 'ember';\nimport { initializeMarkdownRendering } from '../utils/markdown';\nimport { initializeEmojiRendering } from 'ember-purecloud-components/utils/emoji';\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        Ember.$(window).on('beforeunload', function (event) {\n            return Ember.run(() => {\n                // mailto: links cause beforeunload to fire.\n                let isLink = false;\n                let $target = Ember.$(Ember.get(event, 'target.activeElement'));\n                let href = $target.attr('href');\n                if (!href) {\n                    $target = Ember.$($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        });\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    }\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 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        const status = error ? Ember.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 (error._logged === true || error === 'Request Cancelled') {\n            return;\n        }\n\n        if (typeof error === 'object') {\n            error._logged = true;\n        }\n\n        return stashLogger.error(`Global Error Caught: ${error}`);\n    };\n\n    Ember.RSVP.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","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 Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst TARGET_PRESENCE = Object.freeze({\n    BUSY: 'busy',\n    MEETING: 'meeting',\n    OFFLINE: 'offline'\n});\n\nexport default Ember.Object.extend(LoggerMixin, {\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.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: Ember.computed(function () {\n        return '';\n    }),\n\n    disabled: Ember.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: Ember.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.get('intl').t('ewc.userOffline', { name });\n        }\n        if (presence === TARGET_PRESENCE.BUSY || presence === TARGET_PRESENCE.MEETING) {\n            return this.get('intl').t('ewc.userBusy', { name });\n        }\n        return this.get('intl').t('common.disabled');\n    }),\n\n    getTargetPresence() {\n        let user = this.get('user');\n        let room = this.get('room');\n\n        if (user) {\n            const gcPresence = user.get('primaryPresence');\n            if (gcPresence) {\n                return (Ember.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 (Ember.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: Ember.computed(function () {\n        return true;\n    }),\n\n    isActive: Ember.computed('id', 'mediaProviders.activeProvider', function () {\n        const active = this.get('mediaProviders.activeProvider');\n        return active && active.get('id') === this.get('id');\n    }),\n\n    notification: Ember.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.get('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.get('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.get('user')\n            });\n\n            if (!this.canRunAction(options) && this.showRunErrorNotification) {\n                this.showRunErrorNotification(options);\n                return;\n            }\n\n            if (this.get('haveEmbeddedClientAccess')) {\n                this.get('mediaProviders').set('activeProvider', this);\n            }\n            try {\n                await originalAction.apply(this, [_options]);\n            } catch (err) {\n                this.get('mediaProviders').set('activeProvider', null);\n                this.logger.error('Media Provider: Error running video action', {\n                    err,\n                    provider: this.get('id')\n                });\n            }\n        }.bind(this);\n    }\n});\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport const PROVIDER_ID = 'purecloud';\n\nexport default Provider.extend({\n    intl: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: PROVIDER_ID,\n    data: {},\n    type: 'video',\n    component: 'webrtc-panel',\n\n    init() {\n        this._super(...arguments);\n\n        this.get('webrtc.activeRoom.showingVideo');\n    },\n\n    launchVideoImage: Ember.computed('application.urlprefix', function () {\n        return `${this.get('application.urlprefix')}assets/images/svg/Genesys_Cloud-Expanded-landscape-color.svg`;\n    }),\n\n    haveAccess: Ember.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.get('application').openChatRoomWithVideo(jid, false);\n    },\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.purecloud.label').toString();\n    }),\n\n    showingVideoChanged: Ember.observer('webrtc.activeRoom.showingVideo', function () {\n        if (!this.get('webrtc.activeRoom.showingVideo') && this.get('isActive')) {\n            this.set('mediaProviders.activeProvider', null);\n        }\n    })\n});\n","import Ember from 'ember';\nimport LoggerMixin from '../mixins/logger';\nimport Provider from './provider';\n\nexport default Provider.extend(LoggerMixin, {\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.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 in ember-chat-components.\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: 'teams-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\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: Ember.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: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.teams.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.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: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.teams.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\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 Ember from 'ember';\nimport Provider from './provider';\n\nexport default Provider.extend({\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: 'zoom',\n    type: 'video',\n    component: 'zoom-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/zoom-integration/zoom-lg.png';\n    }),\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.zoom.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\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: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.zoom.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","import Ember from 'ember';\nimport netUtils from 'ember-purecloud-components/utils/net';\n\nconst { inject } = Ember;\nconst INTERNAL_DL_MATCHER = /\\/api\\/v[12]\\/downloads\\/([\\w-+]+).*$/i;\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n\n    embeddedUrl: function (imageUrl) {\n        const url = imageUrl;\n        const isLocal = this.get('application.runtime.local');\n\n        if (!url || isLocal) {\n            return url;\n        }\n\n        try {\n            // Only transform internal PC urls\n            if (!netUtils.isExternalDomain(url)) {\n                const matches = INTERNAL_DL_MATCHER.exec(url);\n                if (matches && matches[1]) {\n                    const id = matches[1];\n                    return `${this.get('application').pcV2Uri([\n                        'api/v2/apps/downloads',\n                        id\n                    ])}?contentDisposition=INLINE`;\n                }\n            }\n        } catch (error) {\n            // Failed to check URL, returning unmodified url below\n            this.get('logger').info(`ACD embeddedUrl`, {\n                error,\n                imageUrl: url\n            });\n            return url;\n        }\n        return url;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'connections-ui/utils/dates';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    personGuid: Ember.computed.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 && !Ember.get(model, 'isDestroyed') && !Ember.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.get('intl').exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.get('intl').t(messageKey, messageKeyOption).toString();\n        this.get('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.get('intl').t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.get('intl').t(messageKey).toString();\n        }\n\n        this.get('notification').info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.get('isDestroyed') ||\n            this.get('isDestroying') ||\n            !this.get('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.get('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            const tmpInteractionModel = Interaction.create(payload, Ember.getOwner(ctx).ownerInjection());\n\n            if (tmpInteractionModel && conversationModel) {\n                Ember.set(tmpInteractionModel, 'conversation', conversationModel);\n            }\n\n            const interactionHasMissedTimer = Ember.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                Ember.run.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 = moment().diff(timeCreated);\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Mixin.create({\n    notes: null,\n    selectedWrapupCode: null,\n    wrapupNotSaved: true,\n    oldWrapupCode: null,\n    skipAfterCallWork: false,\n    isAfterCallWorkTimerExpired: false,\n\n    isWrapupCodeSet: computed.notEmpty('selectedWrapupCode'),\n    isNotesSet: computed.notEmpty('notes'),\n    activeCallWorkCompleted: computed.reads('participantForCurrentUser.wrapup.code'),\n\n    activeCallWorkNeeded: computed('activeCallWorkCompleted', 'participantForCurrentUser.wrapupRequired', function () {\n        return !this.get('activeCallWorkCompleted') && this.get('participantForCurrentUser.wrapupRequired');\n    }),\n\n    canUseCommunicationACW: false,\n\n    canAgentRequestACW: computed.and('canUseCommunicationACW', 'useCommunicationACW', 'isWrapupPromptAgentRequested'),\n\n    useCommunicationACW: computed('canUseCommunicationACW', 'isWrapupPromptAgentRequested', function () {\n        if (this.get('canUseCommunicationACW') && this.get('isWrapupPromptAgentRequested')) {\n            return true;\n        }\n\n        return this.get('canUseCommunicationACW');\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'isCommunicationAfterCallWorkCompleted',\n        'useCommunicationACW',\n        function () {\n            if (this.get('useCommunicationACW')) {\n                return this.get('isCommunicationAfterCallWorkCompleted');\n            }\n\n            if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.get('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.get('isCall')) {\n                communicationObj = this.get('participantForCurrentUser.calls.firstObject');\n            } else if (this.get('isChat')) {\n                communicationObj = this.get('participantForCurrentUser.chats.firstObject');\n            } else if (this.get('isEmail')) {\n                communicationObj = this.get('participantForCurrentUser.emails.firstObject');\n            } else if (this.get('isSms')) {\n                communicationObj = this.get('participantForCurrentUser.messages.firstObject');\n            } else if (this.get('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.get('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.get('skipAfterCallWork');\n        }\n    ),\n\n    isCommunicationAfterCallWorkRequested: computed.bool('connectedCommunication.afterCallWorkRequired'),\n\n    isAfterCallWorkMandatory: computed(\n        'isCall',\n        'conversation.isAfterCallWorkMandatory',\n        'isCallback',\n        'participantForCurrentUser.wrapupPrompt',\n        'isNonDiscretionaryCompletion',\n        'canUseCommunicationACW',\n        'dialerPreview',\n        function () {\n            const wrapupPrompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n            if (this.get('isCallback')) {\n                return wrapupPrompt === 'mandatory' || this.get('dialerPreview');\n            } else if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkMandatory');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return wrapupPrompt === 'mandatory' || this.get('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.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkForcedTimeout');\n            } else {\n                if (this.get('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.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkTimeout');\n            } else {\n                if (this.get('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.get('isCall')) {\n                return this.get('conversation.isNonDiscretionaryCompletion');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return (\n                        this.get('isAfterCallWorkForcedTimeout') ||\n                        this.get('isAfterCallWorkTimeout') ||\n                        this.get('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.get('isNonDiscretionaryCompletion')\n        );\n    })\n});\n","import { 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 { getTrueCustomerIfMultipleCustomersExist } from 'connections-ui/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    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.get('participants') || [];\n        return participants.filter(participant => this.isCustomerParticipant(participant));\n    }),\n\n    agentParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('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.get('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.get('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 = !!participant.bargedParticipantId;\n\n            return isDisconnected || isMonitored || isCoached || isBarged;\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.get('participants'), participant => {\n            const isDisconnected = !!participant.endTime;\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            return isDisconnected || isMonitored || isCoached || this.isMachineParticipant(participant);\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.get('participants') || [];\n            const connectingQueue = new Map();\n            return participants.filter(participant => {\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        'session.person.guid',\n        'onConsult',\n        'consultParticipant',\n        'otherConnectedParticipants.[]',\n        'isDisconnected',\n        'isTerminated',\n        'isCall',\n        function () {\n            const consultParticipantId = this.get('consultParticipantId');\n            if (consultParticipantId) {\n                const participants = this.get('participants') || [];\n                const trueCustomerParticipant = participants.findBy('id', consultParticipantId);\n                if (trueCustomerParticipant) {\n                    return trueCustomerParticipant;\n                }\n            }\n\n            if (this.get('onConsult') && this.get('consultParticipant')) {\n                return this.get('consultParticipant');\n            }\n\n            let participantCaller = null;\n\n            const customer = findLast(this.get('participants'), participant => {\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                return (\n                    !participant.monitoredParticipantId &&\n                    !participant.coachedParticipantId &&\n                    !participant.bargedParticipantId &&\n                    (isExternalCustomer || isInternalCustomer)\n                );\n            });\n\n            if (customer && customer.endTime) {\n                const nextConnectedParticipant = this.get('otherConnectedParticipants.firstObject');\n                const isDisconnected = this.get('isDisconnected') || this.get('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\n             * then consider the scenario where this may be an agent\n             * calling a queue on behalf of a queue so we are identifying\n             * the caller as the `customer`\n             */\n            if (!customer && this.get('isCall') && participantCaller) {\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                const customerParticipant = getTrueCustomerIfMultipleCustomersExist(this);\n                if (customer.purpose !== 'user' && 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.\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.get('participants') || [];\n        return participants.reduce((filtered, participant) => {\n            const { endTime, externalContactId, userId, queueId, id, purpose } = participant;\n            if (!endTime) {\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        const participants = this.get('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            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    getFirstStuckParticipant: function () {\n        const currentUserParticipants = this.get('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.get('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.get('participants') || [];\n        return participants.filter(participant => participant.purpose === 'acd');\n    }),\n\n    participantForQueue: computed.alias('participantsForACD.lastObject'),\n\n    dialerParticipant: computed('participants.@each.purpose', function () {\n        const participants = this.get('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.get('activeAttendedTransfer');\n        const destination = activeTransfer ? activeTransfer.destination : null;\n        if (!destination) return null;\n\n        const participants = this.get('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 Ember from 'ember';\nimport { isRoomJid } from 'ember-purecloud-components/utils/jid-helpers';\nimport isEmpty from 'lodash/isEmpty';\nimport maxBy from 'lodash/maxBy';\nimport moment from 'connections-ui/utils/dates';\n\nconst { computed } = Ember;\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 Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.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: computed.and('isCall', 'permissions.canViewAcdScreenShare'),\n    canScreenShareOnChat: computed.and('isChat', 'permissions.canViewAcdScreenShare'),\n    canCobrowseOnCall: computed.and('isCall', 'permissions.canViewAcdCoBrowseForCall'),\n    canCobrowseOnChat: computed.and('isChat', 'permissions.canViewAcdCoBrowseForChat'),\n\n    // State\n\n    isRequestingScreenShareOrCoBrowse: false,\n    isRequestingVideo: false,\n\n    sessionShareState: computed.reads('mostRecentAgentSessionShare.state'),\n    customerShareState: computed.reads('mostRecentCustomerSessionShare.state'),\n    hasSessionShareCode: computed.notEmpty('sessionShareCode'),\n    sessionShareActive: computed.or('isRequestingSessionShare', 'hasSessionShareCode', 'isSessionSharing'),\n    isRequestingSessionShare: computed.or('isRequestingScreenShareOrCoBrowse', 'isRequestingVideo'),\n\n    isSessionShareConnected: computed('sessionShareState', 'isV2Provider', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    isSessionShareDisconnected: computed('sessionShareState', 'isRequestingNewSessionShare', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'disconnected' && !this.get('isRequestingNewSessionShare');\n    }),\n\n    isCustomerInSessionShare: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'connected';\n    }),\n\n    isCustomerDisconnectedFromSharedSession: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'disconnected';\n    }),\n\n    isAgentDisconnectedFromSharedSession: computed(\n        'sessionShareState',\n        'isSessionSharing',\n        'isRequestingNewSessionShare',\n        function () {\n            const state = this.get('sessionShareState') || '';\n            return (\n                this.get('isSessionSharing') &&\n                state.toLowerCase() === 'disconnected' &&\n                !this.get('isRequestingNewSessionShare')\n            );\n        }\n    ),\n\n    isWaitingForAgentToConnect: computed(\n        'isSessionShareConnected',\n        'isAgentDisconnectedFromSharedSession',\n        'sessionShareState',\n        'isV2Provider',\n        function () {\n            return !this.get('isSessionShareConnected') && !this.get('isAgentDisconnectedFromSharedSession');\n        }\n    ),\n\n    isWaitingForCustomerToConnect: computed(\n        'isSessionCodeRequired',\n        'isCustomerInSessionShare',\n        'isCustomerDisconnectedFromSharedSession',\n        'isV2Provider',\n        function () {\n            return (\n                this.get('isSessionCodeRequired') &&\n                !this.get('isCustomerInSessionShare') &&\n                !this.get('isCustomerDisconnectedFromSharedSession')\n            );\n        }\n    ),\n\n    hasCustomerJoinedSessionShareRoom: computed('customerShareState', function () {\n        const state = this.get('customerShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    hasAgentJoinedSessionShareRoom: computed('sessionShareState', function () {\n        const state = this.get('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.get('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.get('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.get('isScreenShare')) {\n            return 'screen-share';\n        } else if (this.get('isVideoShare')) {\n            return 'video';\n        } else if (this.get('isCoBrowse')) {\n            return 'co-browse';\n        }\n        return null;\n    }),\n\n    canScreenShare: computed.or('canScreenShareOnCall', 'canScreenShareOnChat'),\n    canCobrowse: computed.or('canCobrowseOnCall', 'canCobrowseOnChat'),\n\n    mediaTypeIsScreenShare: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.SCREENSHARE),\n    mediaTypeIsCobrowse: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.COBROWSE),\n    mediaTypeIsVideo: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.VIDEO),\n\n    isScreenShare: computed(\n        'isRequestingScreenShareOrCoBrowse',\n        'isRequestingVideo',\n        'canScreenShare',\n        'mediaTypeIsScreenShare',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse')) {\n                return true;\n            }\n\n            if (this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canScreenShare') && this.get('mediaTypeIsScreenShare');\n        }\n    ),\n\n    isCoBrowse: computed(\n        'isRequestingVideo',\n        'isRequestingScreenShareOrCoBrowse',\n        'mediaTypeIsCobrowse',\n        'canCobrowse',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse') || this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canCobrowse') && this.get('mediaTypeIsCobrowse');\n        }\n    ),\n\n    isVideoShare: computed('isRequestingVideo', 'isRequestingScreenShareOrCoBrowse', 'mediaTypeIsVideo', function () {\n        return this.get('isRequestingVideo') && !this.get('isRequestingScreenShareOrCoBrowse');\n    }),\n\n    // permission errors\n\n    hasScreenSharePermissionError: computed.or(\n        'hasCobrowsePermissionError',\n        'hasVideoPermissionError',\n        'hasShareError'\n    ),\n\n    hasCobrowsePermissionError: computed('mediaTypeIsCobrowse', 'canCobrowse', function () {\n        if (this.get('mediaTypeIsCobrowse') && !this.get('canCobrowse')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Co-Browse: Permissions or feature toggle missing to process acd co-browse events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasVideoPermissionError: computed('mediaTypeIsVideo', function () {\n        if (this.get('mediaTypeIsVideo')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Video: Permissions or feature toggle missing to process acd video events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasShareError: computed('mediaTypeIsScreenShare', 'canScreenShare', function () {\n        if (this.get('mediaTypeIsScreenShare') && !this.get('canScreenShare')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Screen-share: Permissions or feature toggle missing to process acd screen-share events.',\n                this.get('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","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    _privacyStatement: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('chrome.privacyStatement');\n    }),\n\n    _securityDisclaimer: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('signIn.securityDisclaimer');\n    })\n});\n","import Ember from 'ember';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\n\nexport default Ember.Mixin.create(AuthenticatedRouteMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive) {\n            // Authenticated by Simple Auth\n            result = Ember.RSVP.resolve(result).then(() => {\n                // Authorizing the route\n                if (!this.get('session.hasAppAccess')) {\n                    transition.abort();\n                    this.transitionTo('no-access');\n                    return Ember.RSVP.reject();\n                }\n\n                return true;\n            });\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\n\nconst BatchDataRequestsMixin = Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    getUser(id) {\n        return this.get('batchDataRequests').getUser(id);\n    },\n\n    refreshUser(id) {\n        return this.get('batchDataRequests').refreshUser(id);\n    },\n\n    getChatUser(jid) {\n        return this.get('batchDataRequests').getChatUser(jid);\n    },\n\n    getGroup(jid) {\n        return this.get('batchDataRequests').getGroup(jid);\n    }\n});\n\nexport default BatchDataRequestsMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ChatRoom from '../models/chat-room';\nimport {\n    getEntityObjectId,\n    isPersonJid,\n    isGroupJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP, getOwner } = Ember;\n\nexport default Ember.Mixin.create({\n    presenceSubscription: Ember.inject.service(),\n    batchDataRequests: Ember.inject.service(),\n\n    // this is set in chat service\n    useChatBetaCleanUp: false,\n\n    initRoomCaching: Ember.on('init', function () {\n        return this.set('rooms', Ember.Object.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                if (this.get('useChatBetaCleanUp')) {\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({ jid, objectId }, getOwner(this).ownerInjection());\n                        Ember.set(this.rooms, objectId, personRoom, true);\n\n                        // shouldn't need to run this feature toggle check but to be safe\n                        if (this.get('useCollaborateChat')) {\n                            return resolve(this.setupRoomContextV2(personRoom));\n                        }\n                        return resolve(this.setupRoomContext(personRoom));\n                    }\n                }\n                return resolve(room);\n            }\n\n            room = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n            Ember.set(this.rooms, objectId, room, true);\n\n            return resolve(this.setupRoomContext(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 Ember.RSVP.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 Ember.RSVP.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 Ember.RSVP.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 Ember.RSVP.resolve(room);\n    },\n\n    addChatTargetAsParticipant(room) {\n        const jid = room.get('jid');\n        const user = this.get('session.person');\n        return this.get('batchDataRequests')\n            .getChatUser(jid)\n            .then(person => {\n                room.set('oneToOneTarget', person);\n                this.addParticipantToRoom(room, person);\n                this.addParticipantToRoom(room, user);\n                this.get('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 Ember.RSVP.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        Ember.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.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    return this.addParticipantToRoom(room, person);\n                });\n        });\n    },\n\n    loadGroup(room) {\n        if (!room.isGroupRoom()) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        return this.get('batchDataRequests')\n            .getGroup(room.get('objectId'))\n            .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","define(\"connections-ui/mixins/change-serializer\", [\"exports\", \"ember-data-change-tracker/mixins/keep-only-changed\"], function (_exports, _keepOnlyChanged) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _keepOnlyChanged.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport GithubItemModel from '../models/github-item';\n\nconst { computed, 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 Ember.Mixin.create({\n    intl: Ember.inject.service(),\n\n    mediaItems: computed('images', 'videos', 'gists', 'githubRepos', 'tweets', function () {\n        const images = this.get('images');\n        const videos = this.get('videos');\n        const giphies = this.get('giphies');\n        const audios = this.get('audios');\n        const gists = this.get('gists');\n        const repos = this.get('githubRepos');\n        const tweets = this.get('tweets');\n        const googleSlides = this.get('googleSlides');\n        const soundcloud = this.get('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.get('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 Ember.Object.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 Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('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 Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('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 Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('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                    Ember.setOwner(modelData, Ember.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                    Ember.setOwner(modelData, Ember.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 Ember.Object.create({\n                        mediaType: 'twitter-card',\n                        title: this.get('intl').lookup('chat.inlineMedia.tweet'),\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 Ember.Object.create({\n                    mediaType: 'google-slides',\n                    title: this.get('intl').lookup('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 Ember.Object.create({\n                    mediaType: 'soundcloud',\n                    title: this.get('intl').lookup('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 Ember.Object.create({\n                    mediaType: 'inline-audio',\n                    title: this.get('intl').lookup('chat.inlineMedia.audio').toString(),\n                    url: res.link\n                });\n            });\n    })\n});\n","import Ember from 'ember';\nimport { displayDateRelativeToToday } from '../utils/dates';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    acdChatUser: Ember.computed.alias('room.acdCustomerParticipant'),\n\n    isYou: Ember.computed('chatUser.jid', 'session.person.jid', function () {\n        return compareJids(this.get('chatUser.jid'), this.get('session.person.jid'));\n    }),\n\n    isAcdChatUser: Ember.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: Ember.computed('room.messages.lastObject.id', function () {\n        return this.get('id') === this.get('room.messages.lastObject.id');\n    }),\n\n    messageTime: Ember.computed('time', function () {\n        return displayDateRelativeToToday(this.get('time'), this.get('intl.isoLocale'));\n    }),\n\n    messageDisplay: Ember.computed('correction', function () {\n        const correction = this.get('correction');\n        if (correction) {\n            return correction;\n        } else {\n            return this;\n        }\n    }),\n\n    isCorrection: Ember.computed.bool('correction')\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst ChatEvents = Ember.Mixin.create(Ember.Evented, LoggerMixin, {\n    initialDataLoaded: false,\n    connected: false,\n    enabled: false,\n    historyDirty: false,\n    handleHiddenRooms: true,\n    hiddenRooms: {},\n    useChatSyncFix: false\n});\n\nexport default ChatEvents;\n","import Ember from 'ember';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst MessageNotificationsMixin = Ember.Mixin.create(LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    preferences: Ember.inject.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 = room.getRawDisplaySubject();\n\n            const title = person.get('name');\n            const toastMessage = this.get('intl')\n                .lookup('notification.titles.chatMention', {\n                    roomName\n                })\n                .toString();\n            this.get('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.get('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 (message.widgetType === 'video-notification') {\n                const messageKey = `chat.video.chatNotifications.${message.get('widget.data.type')}`;\n                const intl = this.get('intl');\n                if (intl.exists(messageKey)) {\n                    messageBody = this.get('intl').lookup(messageKey);\n                    raw = this.get('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.get('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.get('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.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n        };\n\n        if (message.severity === 'error') {\n            this.get('notification').error(title, body, options);\n        } else {\n            this.get('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        targetRoomIsMuted = this.roomMuted(message.get('room.jid'));\n        isSupervisorRoom = message.get('room.isSupervisorRoom');\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) {\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let groupNotificationsEnabled = false;\n        let coveredByMessageNotification = false;\n\n        targetRoomIsMuted = this.roomMuted(room.get('jid'));\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) {\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.get('intl')\n                .lookup('notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    },\n\n    sendTestNotification() {\n        let title = this.get('intl').lookup('notification.titles.testNotification').toString();\n        let message = this.get('intl').lookup('notification.titles.testText').toString();\n        this.get('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.get('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 Ember from 'ember';\nimport moment from 'moment';\nimport { markdownToHtml } from '../../utils/markdown';\nimport ChatMessage from '../../models/chat-message';\nimport { v4 as uuid } from 'uuid';\n\nexport default Ember.Mixin.create({\n    batchDataRequests: Ember.inject.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();\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 = Ember.RSVP.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 = Ember.getOwner(this);\n            const stanza = this._manuallyCreateStanzaForFailedMessage(splitWidget);\n\n            let message = ChatMessage.create(\n                {\n                    from: this.get('session.person.jid'),\n                    oid: uuid(),\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            message.set('messageBody', markdownToHtml(splitWidget.body));\n            this.checkForMentions(message);\n            this.get('batchDataRequests')\n                .getChatUser(message.get('from'))\n                .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 = Ember.get(splitWidget, 'children.lastObject.name');\n        const childPayload = Ember.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.get('messageDelay') >= this.get('maxDelay')) {\n            this.set('messageDelay', this.get('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(Ember.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.get('messageDelayDefault'));\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    null,\n                    this.get('messageDelay')\n                );\n            })\n            .catch(messageId => {\n                this.set('messageDelay', this.get('messageDelay') * 2);\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    messageId,\n                    this.get('messageDelay')\n                );\n                return Ember.RSVP.reject();\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    chatService: inject.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 Ember.get(chatField, 'value.jid');\n        }\n        return null;\n    }),\n\n    // Deprecated: Please use entity-presence mixin properties where possible.\n    presence: computed.reads('activityPresence'),\n    chatStatus: computed.reads('primaryStatusMessage'),\n    hasChatStatus: computed.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 ClickOutsideMixin from 'ember-click-outside/mixins/click-outside';\nexport default ClickOutsideMixin;\n","define(\"connections-ui/mixins/conversation-analysis\", [\"exports\", \"ember-webrtc-components/mixins/webrtc-conversation-analysis\"], function (_exports, _webrtcConversationAnalysis) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversationAnalysis.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst BASE_URI_V2 = 'api/v2/conversations';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    application: inject.service(),\n    acdNormalizedMessages: Ember.computed.bool('session.features.acdNormalizedMessages'),\n\n    pcUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri.apply(application, arguments);\n    },\n    baseUri: function () {\n        let application = this.get('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) {\n        if (this.get('session.features.acdTransferPermissions') && entity) {\n            entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n            return this.participantUri(id, participantId, mediaType) + '/consult' + `/${entity}`;\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.get('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    monitorUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/monitor';\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 (this.get('session.features.acdTransferPermissions') && entity) {\n                entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n                return this.participantUri(id, participantId, mediaType) + '/replace' + `/${entity}`;\n            }\n            return this.participantUri(id, participantId, mediaType) + '/replace';\n        }\n    },\n    scheduleCallbackUri: function (id, participantId) {\n        return `${this.participantUri(id, participantId)}/callbacks`;\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    sendMessagingTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'messages')}/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    draftAttachmentUri: function (id, attachmentId, mediaType) {\n        return `${this.draftUri(id, mediaType)}/attachments/${attachmentId}`;\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=${this.get('acdNormalizedMessages')}`;\n    },\n    smsMessageBatchUri: function (id) {\n        return `${this.smsUri(id)}/bulk?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    sendSMSMessageUri: function (id, communicationId) {\n        return `${this.communicationUri(\n            id,\n            'messages'\n        )}/communications/${communicationId}/messages?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    createMediaAttachmentUri: function (id, communicationId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media`;\n    },\n    getMediaAttachmentUri: function (id, communicationId, mediaId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media/${mediaId}`;\n    },\n    copyMediaAttachmentUri: function (conversationId) {\n        // api/v2/conversations/emails/{conversationId}/messages/draft/attachments/copy\n        return `${this.communicationUri(conversationId, 'emails')}/messages/draft/attachments/copy`;\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    getSupportedContentUri: function (subType, id) {\n        return `${this.baseUri()}/messaging/integrations/${subType}/${id}?expand=supportedContent`;\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    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 Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    // TODO: Fill in this stub for answer a chat\n    // with code that will actually answer a chat.\n    answerChat: function (conversation) {\n        return Ember.RSVP.resolve(conversation);\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject } = Ember;\nconst { Promise } = Ember.RSVP;\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    session: inject.service(),\n    ajax: inject.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.get('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.get('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 Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldConfig from '../field-config/field-config';\n\nconst { inject, Mixin } = Ember;\n\nfunction newPublicApiGroupData(name, type, vis) {\n    return {\n        name: name,\n        type: type.includes('groups.') ? type.split('.')[1] : type,\n        visibility: vis.toLowerCase(),\n        rulesVisible: true\n    };\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    application: inject.service(),\n\n    groupName: null,\n    groupType: null,\n    groupVisibility: null,\n\n    groupTypeDefault: Ember.computed.reads('newGroupTypeChoices.0'),\n    groupVisibilityDefault: Ember.computed.reads('newGroupVisibilityChoices.0'),\n    groupMembershipDefault: Ember.computed.reads('newGroupMembershipChoices.0'),\n    groupModal: null,\n\n    nameLengthExceeded: false,\n\n    creatingGroup: false,\n\n    createGroup() {\n        const intl = this.get('intl');\n        var name = this.get('groupName');\n        var type = this.get('groupType');\n        var visibility = this.get('groupVisibility');\n\n        if (!type) {\n            type = this.get('groupTypeDefault.value');\n        }\n\n        if (!visibility) {\n            visibility = this.get('groupVisibilityDefault.value');\n        }\n\n        if (visibility.toLowerCase() === 'public') {\n            visibility = 'public';\n        } else if (visibility.toLowerCase() === 'members-only') {\n            visibility = 'members';\n        } else {\n            visibility = 'owners';\n        }\n\n        const data = newPublicApiGroupData(name, type, visibility);\n        const url = this.get('application').pcV2Uri('api/v2/groups');\n        const request = this.get('ajax').post(url, { data });\n\n        return request\n            .then(data => {\n                try {\n                    this.setProperties({\n                        groupName: null,\n                        groupType: null,\n                        groupVisibility: null\n                    });\n                } catch (err) {\n                    Ember.Logger.error('Failed to set properties to null', { error: err });\n                }\n\n                this.sendAction('cancel');\n\n                this.bubbleAction({\n                    action: 'transitionToRoute',\n                    actionContext: ['group.detail', data.id]\n                });\n            })\n            .catch(err => {\n                this.setProperties({\n                    groupName: null,\n                    groupType: null,\n                    groupVisibility: null\n                });\n\n                this.sendAction('cancel');\n\n                const error = Ember.get(err, 'errors.0.detail');\n                const title = intl.lookup('notification.group.errorTitle');\n                let message = intl.lookup('notification.group.createError');\n\n                if (Ember.get(error, 'payload.code') === 'DUPLICATE_VALUE') {\n                    message = intl.lookup('notification.group.duplicate');\n                }\n\n                this.get('notification').error(title, message, {\n                    hideAfter: 5,\n                    forceBrowserNotification: true\n                });\n\n                Ember.Logger.error('Error creating group:', { error: err });\n            });\n    },\n\n    canCreateGroup: Ember.computed('session.person.namedPermissions', 'session.person.isAdmin', function () {\n        var permissions = this.get('session.person.namedPermissions');\n        var isAdmin = this.get('session.person.isAdmin');\n\n        if (_.includes(permissions, 'admin') || isAdmin) {\n            return true;\n        }\n\n        var createGroup = _.includes(permissions, 'group_creation');\n        var adminGroup = _.includes(permissions, 'group_administration');\n\n        return createGroup || adminGroup;\n    }),\n\n    groupTypeI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('general.groupType.i18nLabel');\n    }),\n\n    newGroupTypeChoices: Ember.computed('intl.isoLocale', function () {\n        var types = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('groupTypes');\n\n        return types.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_general_groupType_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    }),\n\n    groupVisibilityI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('privacy.groupVisibility.i18nLabel');\n    }),\n\n    newGroupVisibilityChoices: Ember.computed('intl.isoLocale', function () {\n        var choices = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).getAllowedValues(\n            'privacy.groupVisibility'\n        );\n\n        return choices.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_privacy_groupVisibility_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    })\n});\n","define(\"connections-ui/mixins/device-enumeration\", [\"exports\", \"ember-webrtc-components/mixins/device-enumeration\"], function (_exports, _deviceEnumeration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deviceEnumeration.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst {\n    $,\n    Mixin,\n    run: { bind }\n} = Ember;\n\nexport default Mixin.create({\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            const iframe = Ember.get(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: Ember.on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, bind(this, this.handleMessageEvent));\n    }),\n\n    stopMessageListener: Ember.on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nvar EntityControllerMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    entity: null,\n\n    excludedFieldSections: null,\n\n    lastUploadedImage: null,\n\n    editingPictures: false,\n\n    viewingGallery: 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        viewLightGallery() {\n            this.set('viewingGallery', true);\n        },\n\n        cancelViewLightGallery() {\n            this.set('viewingGallery', false);\n        },\n\n        noop() {}\n    },\n\n    setInitialFieldSections: Ember.on('init', function () {\n        this.set('excludedFieldsSections', []);\n    }),\n\n    fieldSections: Ember.computed('entity', function () {\n        var entity = this.get('entity');\n\n        if (entity) {\n            var sections = this.get('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.get('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.get('entity').getReadableSections(),\n                        excludedSections = this.get('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 Ember from 'ember';\n\n// Brings in isOneToOneOfflineOrBusy\nimport WebrtcActionUtils from 'connections-ui/mixins/webrtc-action-utils';\n\nexport default Ember.Mixin.create(WebrtcActionUtils, {\n    chat: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    application: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    mediaProviders: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    isChatEnabled: Ember.computed.reads('chat.enabled'),\n    isWebrtcEnabled: Ember.computed.reads('webrtc.enabled'),\n    isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled'),\n    phoneServiceEnabled: Ember.computed.reads('phoneService.enabled'),\n    phoneAvailable: Ember.computed.reads('phoneService.phoneAvailable'),\n    self: Ember.computed.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-v2')) {\n            this.get('store')\n                .findRecord('public-api-user', this.get('entity.id'), {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => this.set('user', user));\n        }\n    },\n    callEntity(entity) {\n        this.get('phoneService').makeCall(entity);\n    },\n    toggleFavorite(entity) {\n        this.get('favorites').toggleFavorite(entity);\n    },\n\n    mediaProviderComponent: 'media-providers/video-dropdown',\n\n    videoProviders: Ember.computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getProvidersForUser('video', this.get('user'));\n    }),\n\n    useMediaProviders: Ember.computed('videoProviders.@each.haveAccess', function () {\n        const providers = this.get('videoProviders').filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }),\n\n    integrationBadgesComponent: 'integration-badges',\n    useIntegrationBadges: true\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport Presence from 'ember-purecloud-components/models/presence';\n\nconst { get, set, inject, computed, Mixin } = Ember;\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: inject.service(),\n    session: inject.service(),\n    presenceService: inject.service('presence'),\n    phoneIntegrations: inject.service(),\n\n    outOfOffice: computed.reads('activities.outOfOffice'),\n    routingStatus: computed.reads('activities.routingStatus'),\n    acdDivisionPresenceProfileToggle: computed.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 = moment(existingPresence.modifiedDate);\n                        const activitiesPresenceDate = moment(presence.modifiedDate);\n                        const isExistingPresenceLatest = existingPresenceDate.isAfter(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 && Ember.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 ? Ember.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: computed.reads('activities.conversationSummary'),\n    geolocation: computed.reads('activities.geolocation'),\n    presenceDefinition: computed.reads('primaryPresence.presenceDefinition'),\n\n    // PCUCC-1546 - new integrationPresence expands for 3rd Party Presence\n    integrationPresence: computed.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                const canViewPresenceDefinition = this.get('permissions.canViewPresenceDefinition');\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                        if (canViewPresenceDefinition) {\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                            Ember.run.join(() => {\n                                return presenceService.findPresence(get(presenceDefinition, 'id'), presenceDefinition);\n                            });\n                        } else {\n                            if (\n                                get(presenceDefinition, 'id') &&\n                                presenceDefinition &&\n                                presenceDefinition.systemPresence\n                            ) {\n                                //same code as in presenceService.findPresence catch() to retrieve the matching system status\n                                // We need to map the out of band presence to a primary presence for translation sake.\n                                return presenceService.get('primaryPresences').find(presence => {\n                                    const matchingPrimaryPresence =\n                                        presence.get('presence.systemPresence').toLowerCase() ===\n                                        presenceDefinition.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', presenceDefinition.id);\n                                        const instance = Presence.create(\n                                            {\n                                                presence: newPresence\n                                            },\n                                            presenceService.getOwner(presenceService).ownerInjection()\n                                        );\n                                        presenceService.get('outOfBandPresenceDefinitions').addObject(instance);\n                                        return instance;\n                                    }\n                                    return false;\n                                });\n                            }\n                        }\n                    }\n                    return presence || outOfBandPresence;\n                } else {\n                    if (!presence && canViewPresenceDefinition) {\n                        // Try to find a system presence that matches\n                        const systemPresence = presences.find(\n                            p =>\n                                get(p, 'presence.type') === 'System' &&\n                                get(p, 'presence.systemPresence') === get(presenceDefinition, 'systemPresence')\n                        );\n                        if (systemPresence) {\n                            return systemPresence;\n                        }\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                        Ember.run.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',\n        'integrationPresence',\n        'primaryPresence',\n        'presenceModel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const endOfTime = moment('9999-12-31T00:00:00.000Z');\n\n            if (this.get('isOutOfOffice')) {\n                let end = moment(this.get('outOfOffice.endDate'));\n                if (end.isSame(endOfTime) || end.year() === 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: end.locale(this.get('intl.isoLocale')).format('l')\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: computed.reads('primaryPresence.message'),\n\n    cityExists: computed.notEmpty('geolocation.city'),\n    regionExists: computed.notEmpty('geolocation.region'),\n    countryExists: computed.notEmpty('geolocation.country'),\n    hasGeolocation: computed.or('cityExists', 'regionExists', 'countryExists'),\n\n    isAvailable: computed.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: computed.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 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 = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.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        Ember.set(this, '_initialData', {});\n        Ember.set(this, '_previousData', {});\n        Ember.set(this, '_changedSinceSave', []);\n\n        this._super();\n    },\n\n    name: Ember.computed('general.name.@each.value', function () {\n        return this.getFieldValue('general.name').value;\n    }),\n\n    type: Ember.computed(function () {\n        if (typeof this.fieldConfig === 'undefined') {\n            return '';\n        }\n        return this.fieldConfig.entityType;\n    }),\n\n    profilePicture: Ember.computed(\n        'images.profile',\n        'images.profile.[]',\n        'images.activeProfilePicture.[]',\n        'images.profile.@each.ref',\n        function () {\n            const pictureKey = profilePictureFieldKey[this.get('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: Ember.computed('profilePicture', function () {\n        const profilePicture = this.get('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: Ember.computed('uploads.images.[]', function () {\n        const type = this.get('type');\n        const path = imageMappings[type].profile;\n        return this.get(path);\n    }),\n\n    stateString: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('data.state')}`)\n            .toString();\n    }),\n\n    _self: Ember.computed(function () {\n        return this;\n    }),\n\n    _missingFields: Ember.computed('_missingFieldsCache', function () {\n        return missingFieldsCache[this.get('id')] || [];\n    }),\n\n    recordPropertyChange(fieldPath) {\n        const changedSinceSave = this.get('_changedSinceSave');\n\n        const missingFields = this.get('_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.get('_changedSinceSave');\n        const missingFields = this.get('_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 (Ember.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 = Ember.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 = Ember.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.get('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.get('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                const currentVersion = this.get('version');\n                const newVersion = matches[2];\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', publicApiError);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            }\n        } else if ((data && data.payload) || Ember.get(error, 'errors.length')) {\n            // Check error payload from directory-style error response\n            const payload = data.payload || Ember.get(error, 'errors.0.payload') || {};\n            if (payload.code === 'VERSION_MISMATCH') {\n                const currentVersion = this.get('version');\n                const newVersion = payload.currentVersion;\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion && newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', payload);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged or missing, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            } else {\n                return Ember.RSVP.reject(error);\n            }\n        } else {\n            Ember.Logger.error(\"Couldn't save field config\", error);\n            return new Ember.RSVP.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 && Ember.get(error, 'payload.code') === 'VERSION_MISMATCH') {\n                        return Ember.RSVP.resolve(response);\n                    }\n                }\n                return Ember.RSVP.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                // Ember.Logger.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                Ember.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.get('id');\n        const field = this.getFieldValue(fieldPath);\n\n        if (!fieldId) {\n            fieldId = field._id;\n        }\n\n        const version = this.get('version');\n\n        const type = pluralize(this.get('type'));\n        const path = `/directory/api/v2/${type}/${id}/${version}/field/${fieldPath}/${fieldId}`;\n\n        return this.get('ajax')\n            .del(path)\n            .then(data => {\n                this.set('version', data.rel.version);\n            });\n    }\n});\n\nexport default EntityMixin;\n","import Ember from 'ember';\nimport EvaluationModel from '../models/evaluation';\nimport moment from '../utils/dates';\n\nconst EvaluationsMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    evaluationsAjax: Ember.$.ajax,\n\n    getEvaluations() {\n        return new Ember.RSVP.Promise(resolve => {\n            let promises = [];\n            let agentEvaluations = [];\n            let evaluatorEvaluations = [];\n            let assigneeEvaluations = [];\n            let payload = {\n                agentId: this.get('session.person.guid'),\n                evaluationState: ['Pending', 'InProgress'],\n                userType: 'evaluator'\n            };\n            let isAssigneeFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.assignee'];\n            let isDisputesFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.disputes'];\n\n            let evaluatorUri = `api/v2/quality/evaluations/query?`;\n            if (isAssigneeFeatureEnabled) {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&expand=assignee` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            } else {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            }\n\n            let agentFinishedUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.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=${payload.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=${payload.agentId}` +\n                `&pageSize=25`;\n\n            const startTime = moment().add(-1, 'month').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.get('application').pcUri(evaluatorUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentFinished = {\n                url: this.get('application').pcUri(agentFinishedUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentInReview = {\n                url: this.get('application').pcUri(agentInReviewUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAssignee = {\n                url: this.get('application').pcUri(assigneeUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n\n            let locale = this.get('intl.isoLocale');\n            promises.push(\n                this.get('evaluationsAjax')(evaluatorRequest).then(({ entities = [] }) => {\n                    evaluatorEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate =\n                                    isAssigneeFeatureEnabled && !evaluation.calibration\n                                        ? evaluation.dateAssigneeChanged || evaluation.assignedDate\n                                        : evaluation.assignedDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.get('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 &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            if (isAssigneeFeatureEnabled) {\n                promises.push(\n                    this.get('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 &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'admin';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            if (isDisputesFeatureEnabled) {\n                promises.push(\n                    this.get('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 &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'agent';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            let evaluationIdSet = {};\n            Ember.RSVP.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 Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst { inject } = Ember;\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create(RelateFeaturesMixin, {\n    relate: inject.service(),\n    names: inject.service(),\n    externalContacts: inject.service(),\n\n    externalContactProfiles: null,\n\n    conversationId: null,\n    mediaType: null,\n\n    participants: [],\n    consultAgentParticipant: null,\n    consultParticipant: null,\n    communicationId: null,\n    hasMultipleExternalContactMatches: computed.gt('externalContactProfiles.length', 1),\n\n    isIncomingFromExternalContacts: computed.and('hasRelateAccess', 'isIncoming', 'hasExternalContactProfiles'),\n    isConnectedWithExternalContact: computed.and('hasRelateAccess', 'isConnected', 'hasOneExternalContactProfile'),\n    hasExternalContactProfiles: computed.notEmpty('externalContactProfiles'),\n    hasOneExternalContactProfile: computed.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.get('names').fullName(externalProfile);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator.calls.firstObject.other.name');\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ajax from 'ember-ajax';\nimport FaxModel from '../models/fax';\n\nconst FaxesMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n\n    getFaxes() {\n        return new Ember.RSVP.Promise(resolve => {\n            let request = {\n                contentType: 'application/json; charset=UTF-8',\n                cache: false\n            };\n            let url = this.get('application').pcV2Uri('api/v2/fax/documents');\n\n            return ajax(url, request).then(({ entities = [] }) => {\n                let owner = Ember.getOwner(this);\n                return resolve(\n                    _.map(entities, function (fax) {\n                        return FaxModel.create(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.get('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.get('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        Ember.RSVP.all(\n            _.map(faxes, fax => {\n                this.deleteFax(fax);\n            })\n        );\n    },\n\n    downloadFax(id) {\n        ajax(this.get('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.get('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 Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nconst { run, inject, computed, RSVP, Mixin } = Ember;\n\nexport default Mixin.create({\n    classNames: ['field-component'],\n    classNameBindings: ['field.key', 'fieldTypeClass', 'isEmpty:empty-field', 'isNewField:new-field-entry-component'],\n\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    entity: null,\n\n    allFieldData: [],\n\n    fieldData: null,\n    field: computed.reads('fieldData.field'),\n    writeable: computed.reads('fieldData.writeable'),\n    isValid: computed.reads('fieldData.isValid'),\n    isEmpty: computed.alias('fieldData.isEmpty'),\n\n    editing: false,\n    showLabel: false,\n\n    isNewField: false,\n    savingField: false,\n\n    complexField: false,\n    complexValueFields: [], // Override complex fields for simple 'entry.value' bindings to fire\n\n    timers: null,\n\n    attrs: {\n        cancelAddNew: () => {}\n    },\n\n    init() {\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachObserversForComplexFields();\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    entry: computed('fieldData.value', 'fieldData.valueReference', function () {\n        return this.get('fieldData.value') || this.get('fieldData.valueReference');\n    }),\n\n    fieldTypeClass: computed('field.type', function () {\n        return `${this.get('field.type')}-field`;\n    }),\n\n    canEdit: computed('editing', 'fieldData.writeable', function () {\n        var editing = this.get('editing');\n\n        if (!editing) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(false)\n            });\n        }\n\n        return this.get('fieldData.writeable');\n    }),\n\n    attachObserversForComplexFields() {\n        var fields = this.get('complexValueFields');\n        if (_.isEmpty(fields)) {\n            return;\n        }\n\n        _.each(fields, field => {\n            this.addObserver(field, this, this.notifyComplexPropertyChange);\n        });\n    },\n\n    isFieldEmpty() {},\n\n    notifyComplexPropertyChange() {\n        run.once(this, this.performNotification);\n    },\n\n    performNotification() {\n        let fieldData = this.get('fieldData');\n        if (fieldData) {\n            fieldData.notifyPropertyChange('isEmpty');\n            fieldData.notifyPropertyChange('isValid');\n        }\n    },\n\n    // Called before save\n    cleanFieldForSave: () => {},\n\n    // Override for empty logic check for complex fields\n    isComplexFieldEmpty() {\n        return false;\n    },\n\n    saveField(value) {\n        if (this.get('savingField')) {\n            return new RSVP.Promise(function (resolve) {\n                resolve({});\n            });\n        }\n\n        const entity = this.get('entity');\n        const fieldPath = this.get('field').getFieldPath();\n\n        if (value || value === '') {\n            this.set('entry.value', value);\n            entity.set(fieldPath, value);\n        }\n\n        this.set('savingField', true);\n\n        const section = this.get('field.section');\n        if (section) {\n            return entity.saveSection(section).finally(() => this.set('savingField', false));\n        }\n        return entity.save();\n    }\n});\n","import Ember from 'ember';\nimport moment from 'connections-ui/utils/dates';\n\nexport default Ember.Mixin.create({\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    didFlag: Ember.computed.bool('flaggedSelves.length'),\n    flagOperationInProcess: false,\n\n    flaggedSelves: Ember.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: Ember.computed('call.callEnd', 'clock.minute', function () {\n        let minutesPassed = moment().diff(this.get('call.callEnd'), 'minutes');\n        return minutesPassed < 45;\n    }),\n\n    flagInteractionAction(action) {\n        if (this.get('allowFlagChange')) {\n            this.set('flagOperationInProcess', true);\n            const participants = action === 'flag' ? [this.get('call.myParticipant')] : this.get('flaggedSelves');\n            this.get('phone')\n                .flagCallHistoryInteraction(action, this.get('call'), participants)\n                .then(() => {\n                    this.set('flagOperationInProcess', false);\n                });\n        } else {\n            const message = this.get('intl').lookup('notification.purecloud.tooLateToFlag');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Mixin from 'smoke-and-mirrors/mixins/in-viewport';\n\nexport default Mixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\n// ==========================================================\n// NOTICE: This mixin is intended to be consumed by the\n// Interaction component. It inherits servies injects and\n// dependencies from the parent component.\n// ==========================================================\n//\n// Rules for showing/hiding/disabling session share button\n//\n// 1. If the agent has session share permissions then the\n// session share button should be visible (it may be disabled\n// when end customer's browser cannot support screen share).\n//\n// 2. If the agent has session share permissions and the end\n// user is using Firefox - button is enabled.\n//\n// 3. If the agent has session share permissions and the end\n// user is using Chrome AND has the screen share extension\n// installed - button is enabled.\n//\n// 4. If the agent has session share permissions and the end\n// user is using any browser except Firefox or Chrome the\n// screen share button is disabled with tooltip.\n//\n// 5. If the agent has session share permissions and the end\n// user is using Chrome but does NOT have the screen share\n// extension, button is disabled with tooltip.\n//\n// ==========================================================\n\nexport default Ember.Mixin.create({\n    // Configuration\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 = Ember.get(customerDetails, 'isChrome') === 'true' ? true : false;\n            const isFirefox = Ember.get(customerDetails, 'isFirefox') === 'true' ? true : false;\n            const isEdgeChromium = Ember.get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n            const hasChromeExtension = Ember.get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n            const isStandAloneApplication =\n                Ember.get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n            const canScreenshare = Ember.get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n            const canCobrowse = Ember.get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n            const cobrowseType = Ember.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: computed.or(\n        'customerBrowserDetails.cobrowseType',\n        'customerBrowserDetails.canCobrowse'\n    ),\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.get('customerBrowserDetails');\n            if (\n                Ember.get(customerBrowserDetails, 'canScreenshare') ||\n                Ember.get(customerBrowserDetails, 'isFirefox') ||\n                (Ember.get(customerBrowserDetails, 'isChrome') &&\n                    Ember.get(customerBrowserDetails, 'hasChromeExtension')) ||\n                Ember.get(customerBrowserDetails, 'isEdgeChromium') ||\n                Ember.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.get('isCustomerConfiguredForScreenShare') === !this.get('isAgentAllowedToScreenShare');\n        }\n    ),\n\n    cobrowseMisconfiguration: computed('isCustomerConfiguredForCobrowse', 'isAgentAllowedToCobrowse', function () {\n        return this.get('isCustomerConfiguredForCobrowse') === !this.get('isAgentAllowedToCobrowse');\n    }),\n\n    // Permissions & Feature Toggles\n\n    canCobrowseChat: computed.reads('permissions.canViewAcdCoBrowseForChat'),\n    canCobrowseCall: computed.reads('permissions.canViewAcdCoBrowseForCall'),\n\n    isAgentAllowedToCobrowseCall: computed.and('isCall', 'canCobrowseCall'),\n    isAgentAllowedToCobrowseChat: computed.and('isChat', 'canCobrowseChat'),\n    isAgentAllowedToCobrowse: computed.or('isAgentAllowedToCobrowseCall', 'isAgentAllowedToCobrowseChat'),\n\n    canScreenShare: computed.reads('permissions.canViewAcdScreenShare'),\n\n    isAgentAllowedToScreenShareCall: computed.and('isCall', 'canScreenShare'),\n    isAgentAllowedToScreenShareChat: computed.and('isChat', 'canScreenShare'),\n    isAgentAllowedToScreenShare: computed.or('isAgentAllowedToScreenShareCall', 'isAgentAllowedToScreenShareChat'),\n\n    // Tooltips\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,screenShareViaHawk}',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function () {\n            const canScreenShareViaHawk =\n                this.get('interaction.canScreenShare') && this.get('webrtc.screenShareViaHawk');\n            /* if we cannot screen share via hawk, we need to check the activeBridge */\n            if (!canScreenShareViaHawk && !this.get('webrtc.activeBridge')) {\n                return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n            } else if (this.get('disableShareButtonReason') && this.get('isChat')) {\n                return this.get('disableShareButtonReason');\n            } else if (this.get('customerBrowserDetails.isStandAloneApplication') && this.get('isChat')) {\n                return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed(\n        'interaction.cobrowseSessionShareActive',\n\n        function () {\n            if (!this.get('interaction.cobrowseSessionShareActive')) {\n                return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n            }\n            return 'purecloud.acdInteraction.sessionShare.screenShareActive';\n        }\n    ),\n\n    // Session Share State\n\n    isCoBrowse: computed.bool('interaction.isCoBrowse'),\n\n    isRequestingScreenShareOrCoBrowse: computed.alias('interaction.isRequestingScreenShareOrCoBrowse'),\n    isRequestingVideo: computed.alias('interaction.isRequestingVideo'),\n\n    isAgentDisconnectedFromSharedSession: computed.reads('interaction.isAgentDisconnectedFromSharedSession'),\n    isCustomerDisconnectedFromSharedSession: computed.reads('interaction.isCustomerDisconnectedFromSharedSession'),\n\n    isSessionCodeRequired: computed.alias('interaction.isSessionCodeRequired'),\n\n    // Button Enablement\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            const isConfigured =\n                this.get('isCustomerConfiguredForCobrowse') ||\n                this.get('isCustomerConfiguredForScreenShare') ||\n                this.get('customerBrowserDetails.isStandAloneApplication');\n\n            if (!customerBrowserDetails || isConfigured) {\n                return false;\n            }\n\n            if (this.get('screenShareMisconfiguration')) {\n                if (\n                    Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'hasChromeExtension')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                }\n                if (\n                    !Ember.get(customerBrowserDetails, 'isFirefox') &&\n                    !Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.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\n    disableVideoButton: computed.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.get('disableVideoButton') ||\n                !(this.get('isCustomerConfiguredForCobrowse') || this.get('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.get('isAgentAllowedToScreenShare') || this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function () {\n            const isInternalProvider = this.get('isInternalProvider');\n            return (\n                isInternalProvider &&\n                (this.get('isCall') || this.get('isChat')) &&\n                this.get('isConnected') &&\n                !this.get('interaction.onConsult')\n            );\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        if (!this.get('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.get('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","import Ember from 'ember';\n\nvar currentJobs = [];\nvar finishedJobs = [];\n\nfunction jobEndpoint(id) {\n    return `/api/v2/jobs/${id}`;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.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.get('ajax')\n            .ajaxGet(jobEndpoint(job.jobId))\n            .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","define(\"connections-ui/mixins/logger\", [\"exports\", \"ember-purecloud-components/mixins/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    actions: {\n        error(error) {\n            const errorState = { type: 'profileFetchServerFailure' };\n\n            Ember.Logger.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 Ember from 'ember';\n\nvar PagingMixin = Ember.Mixin.create({\n    entityType: null,\n\n    currentPage: null,\n    cachedTotal: null,\n\n    limit: 10,\n    extraParams: Ember.computed(function () {\n        return {};\n    }),\n\n    fieldList: null,\n\n    actions: {\n        nextPage() {\n            if (this.get('hasNextPage')) {\n                this.incrementProperty('currentPage');\n                this.loadPage();\n            }\n        },\n\n        prevPage() {\n            if (this.get('hasPrevPage')) {\n                this.decrementProperty('currentPage');\n                this.loadPage();\n            }\n        }\n    },\n\n    ensureCorrectProperties: Ember.on('init', function () {\n        if (!this.get('entityType')) {\n            this.set('entityType', 'person');\n        }\n\n        this.set('currentPage', 0);\n        this.set('cachedTotal', 0);\n    }),\n\n    offset: Ember.computed('limit', 'currentPage', function () {\n        return this.get('limit') * this.get('currentPage');\n    }),\n\n    currentPageDisplay: Ember.computed('currentPage', function () {\n        return this.get('currentPage') + 1;\n    }),\n\n    totalPages: Ember.computed('currentPage', 'content.[]', 'page', 'cachedTotal', function () {\n        var cachedTotal = this.get('cachedTotal') || 0;\n\n        return Math.ceil(cachedTotal / this.get('limit'));\n    }),\n\n    hasNextPage: Ember.computed('currentPageDisplay', 'totalPages', function () {\n        return this.get('currentPageDisplay') < this.get('totalPages');\n    }),\n\n    hasPrevPage: Ember.computed('currentPage', function () {\n        return this.get('currentPage') !== 0;\n    }),\n\n    haveContent: Ember.computed('content.[]', 'currentPage', function () {\n        var content = this.get('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.get('entityType');\n        let extraParams = this.get('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.get('limit'),\n                offset: this.get('offset'),\n                directory: directory\n            },\n            extraParams,\n            letterUpdate\n        );\n\n        if (this.get('fieldList')) {\n            params = Object.assign({}, params, {\n                fl: this.get('fieldList')\n            });\n        }\n\n        let page = this.store.query(entityType, params);\n\n        page.then(data => {\n            let content = data;\n            if (data.content) {\n                content = data.content;\n            }\n\n            content = content.map(x => x.getRecord());\n\n            this.set('content', content);\n\n            let cachedTotal = Ember.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","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    activeCall: null,\n    isHeld: computed.reads('activeCall.isHeld'),\n    isMuted: computed.reads('activeCall.isMuted'),\n    isRecording: computed.reads('activeCall.isRecording'),\n    isActiveCallACD: computed('activeCall.{isAgentCall,myselfIsMonitor,myselfIsCoach,myselfIsBarged}', function () {\n        if (!this.get('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: computed.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 Ember from 'ember';\nimport _ from 'lodash';\n\nimport { task, timeout } from 'ember-concurrency';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\n\nconst CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nconst Promise = Ember.RSVP.Promise;\nconst { run, inject, observer } = Ember;\n\nexport default Ember.Mixin.create(AutoSaveDevicesMixin, {\n    headset: inject.service(),\n    session: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    store: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    // temp variables for user actions (merging, dialing)\n    attemptingToCall: null,\n    shouldPromptForMerge: false,\n    callToMergeInto: null,\n    mergeData: null,\n\n    deviceMuteEvent(isMuted) {\n        const call = this.get('activeCall');\n        if (call && this.get('isMuted') !== isMuted) {\n            this.mute(call);\n        }\n    },\n\n    deviceHoldEvent(holdRequested, toggle) {\n        const call = this.get('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.get('conversations').findBy('id', conversationId);\n        } else {\n            conversation = this.get('conversations').find(conversation => {\n                return conversation.get('isDialing') && conversation.get('isIncoming');\n            });\n        }\n\n        this.sendToVoicemail(conversation);\n    },\n\n    init() {\n        this._super(...arguments);\n        run.next(() => {\n            if (this.get('webrtcSdkService.useSdk')) {\n                this.enableHeadsets(this.get('webrtcSdkService'));\n            } else {\n                this.enableHeadsets(this.get('headset'));\n            }\n        });\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.enableHeadsets(this.get('webrtcSdkService'));\n        }\n    }),\n\n    enableHeadsets(headsetSource) {\n        const headset = headsetSource;\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: Ember.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    _validateCall(phoneNumber, callingPerson, onbehalfOfQueue) {\n        if (this.get('station.isWebrtc')) {\n            if (!this.get('carrierPigeonConnected')) {\n                this.get('notification').error(\n                    null,\n                    this.get('intl').lookup('notification.purecloud.webrtcPhoneUnavailable'),\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.get('webrtcPhoneWithIssues')) {\n                const intl = this.get('intl');\n                const title = intl.t('notification.titles.callError').toString();\n                const message = intl.t(this.get('webrtc.webrtcAudioCallIssueKey'));\n                this.get('notification').info(title, message);\n                return this._handleValidationError('Station is webrtc and has audio issues');\n            }\n        }\n\n        let message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n        if (this.get('onQueue') && (!onbehalfOfQueue || !onbehalfOfQueue.id)) {\n            message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n        let station = this.get('station');\n        let noStation = station === undefined || station === null;\n        if (noStation) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.noStationSelected');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('No station selected');\n        }\n        if (this.get('phoneDisabled')) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.unsupportedStation');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('Phone service disabled');\n        }\n        return Promise.resolve();\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    _makeCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId) {\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.get('addressformat').format(phoneNumber);\n        } else if (_.startsWith(phoneNumber, 'sip:')) {\n            phoneNumber = this.get('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        if (onbehalfOfQueue && onbehalfOfQueue.id) {\n            data.callFromQueueId = onbehalfOfQueue.id;\n        }\n        if (phoneNumber === undefined || phoneNumber === null) {\n            let message = this.get('intl').lookup('notification.purecloud.unableToMakeCall');\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 Ember.RSVP.Promise.reject(error);\n        }\n\n        let promise;\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.get('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.get('conversationsMadeByClient').pushObject(data);\n                data.attemptingToCall = this.get('attemptingToCall');\n                const conversation = this.updateActiveConversationEntry(data);\n\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('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.get('_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 Ember.RSVP.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*/) {\n        const callArgs = arguments;\n        return this._validateCall(...callArgs).then(() => {\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.get('phoneAvailable')) {\n            return;\n        }\n\n        const person = await this.get('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            Ember.Logger.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                Ember.Logger.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.get('shouldPromptForMerge') === false) {\n            return this.makeMergeRequest();\n        }\n    },\n\n    toVoicemail(conversation) {\n        Ember.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/connections-ui/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.get('_throttledHandlePhoneStatusChange').perform('sendToVoicemail', conversation);\n            !this.get('webrtcSdkService.useSdk') &&\n                this.get('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.get('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.get('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.get('conversationsMadeByClient').pushObject(json);\n            })\n            .catch(err => {\n                Ember.Logger.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.get('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        const isNumber = typeof participant.value === 'string';\n        const myselfId = this.get('myself.id');\n        const callId = this.get('activeCall.id');\n        const participantEntity = Ember.get(participant, 'entity');\n        const url = this.replaceUri(callId, myselfId, null, 'calls');\n        const isQueue = participant ? Ember.get(participant, 'entity.type') === 'queue' : false;\n        let data = {};\n\n        if (isNumber) {\n            data.address = participant.value;\n        } else if (isQueue) {\n            data.queueId = participant.id;\n        } else {\n            const personGuid = Ember.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 ? Ember.get(interaction, 'id') : this.get('activeCall.id');\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            Ember.set(conversation, 'acceptedByClient', false);\n            Ember.set(conversation, 'shouldAutoProceedWebrtc', false);\n        }\n        if (interaction) {\n            Ember.set(interaction, 'acceptedByClient', false);\n            Ember.set(interaction, 'shouldAutoProceedWebrtc', false);\n        }\n        const conversationsMadeByClient = this.get('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.get('activeCall');\n        const isNumber = typeof destination.value === 'string';\n        const person = destination.entity;\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        const currentCallId = Ember.get(activeCall, 'id');\n        const otherPartyId = Ember.get(activeCall, 'otherParty.id');\n        let url = this.consultUri(currentCallId, otherPartyId, 'calls');\n        if (!isNumber && !isQueue) {\n            return this.get('store')\n                .find('person', Ember.get(person, 'guid'))\n                .then(party => {\n                    return this.initiateTransfer(party, url);\n                });\n        } else if (isQueue) {\n            return this.initiateTransfer(destination, url);\n        }\n        return this.initiateTransfer(destination.value, url);\n    },\n\n    initiateTransfer(destination, url) {\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        let addressee = {};\n        if (isQueue) {\n            addressee = { queueId: destination.id };\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        const options = { data: { destination: 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 = Ember.get(otherParty, 'consultParticipantId');\n        const url = this.consultUri(callId, otherPartyId, 'calls');\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        Ember.assert(\n            'phone:dialDtmfNumber must take a conversation id as the first argument',\n            currentCallId !== undefined\n        );\n        Ember.assert(\n            'phone:dialDtmfNumber must take a participant id as the second argument',\n            participantId !== undefined\n        );\n\n        let uri = this.pcUri(\n            `api/${this.get('convAPIVersion')}/conversations/${currentCallId}/participants/${participantId}/digits`\n        );\n        this.logger.info('sendingDtmfTones', {\n            conversationId: currentCallId,\n            participantId,\n            number\n        });\n\n        this.get('ajax').post(uri, { data: { digits: number } });\n    },\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.get('webrtcSdkService').acceptPendingSession({ conversationId });\n        } else {\n            this.get('webrtc').answerSoftphoneConversation(conversationId);\n        }\n        yield timeout(1000);\n    }).drop(),\n\n    answer() {},\n\n    _answerWebrtc(conversation) {\n        const conversationId = conversation.get('id');\n        const session = this._findPendingSessionsByConversationId(conversationId);\n        if (session === undefined) {\n            if (this.get('stationHasPersistentConnection')) {\n                // This is a flag we can look at in case we end up getting proposes for this conversation *later*\n                Ember.set(conversation, 'shouldAutoProceedWebrtc', true);\n\n                this.logger.info('_answerWebrtc stationHasPersistentConnection', { conversationId });\n                const task = this.get('_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.get('_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.get('communication').validateActionSucceeded(conversation, 'callState.state', 'CONNECTED');\n            })\n            .then(() => {\n                if (this.get('onQueue')) {\n                    return this.checkForNonACD(conversation);\n                }\n            })\n            .catch(() => {\n                const message = 'Failed to answer call: ' + conversationId;\n                const title = this.get('intl').t('notification.titles.callError');\n                this.get('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.get('activeCall');\n        if (conversation) {\n            return this.get('_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.get('headset').setMute(!isMuted);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isMuted', !isMuted);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.mute');\n                return this.get('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.get('activeCall');\n            if (!conversation) {\n                return Ember.RSVP.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 Ember.RSVP.Promise.resolve();\n    },\n\n    _holdOtherActiveConversations(conversation) {\n        const conversationId = Ember.get(conversation, 'id');\n        const otherConversations = this.get('connectedConversations').filter(c => c.get('id') !== conversationId);\n        otherConversations.forEach(otherConversation => {\n            if (!otherConversation.get('isHeld')) {\n                this._held(otherConversation);\n            }\n        });\n    },\n\n    held(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_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.get('headset').setHold(conversation.get('id'), !isHeld);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isHeld', !isHeld);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hold');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    record(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_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.get('communication').validateActionSucceeded(conversation, 'isRecording', !isRecording);\n            })\n            .catch(() => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.record');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    flagActiveInteraction(action, conversation) {\n        const call = conversation || this.get('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: Ember.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.get('communication').validateActionSucceeded(conversation, 'myself.flaggedReason', [\n                    isFlagged ? undefined : 'general'\n                ]);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n                this.get('notification').error(title, message);\n                this.logger.warn('Failed to validate interaction flagging', {\n                    conversationId: Ember.get(conversation, 'id'),\n                    err\n                });\n            });\n    },\n\n    flagCallHistoryInteraction(action, conversation, participants) {\n        return Ember.RSVP.all(\n            participants.map(participant => {\n                return this._makeFlagChange(conversation, participant, action);\n            })\n        ).catch(err => {\n            const title = this.get('intl').t('notification.titles.callError');\n            const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n            this.get('notification').error(title, message);\n            this.logger.warn('Failed to validate history interaction flagging', {\n                conversationId: Ember.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                Ember.set(participant, 'flaggedReason', 'general');\n            } else {\n                Ember.set(participant, 'flaggedReason', undefined);\n            }\n        });\n    },\n\n    endCall(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_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.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCallForAll').perform(conversation);\n        }\n    },\n\n    endCallById(conversationId) {\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            return this.get('_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.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.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(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('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.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.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(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('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.get('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.get('_throttledEndWebrtcCall').perform(data);\n        }\n    },\n\n    _throttledEndWebrtcCall: task(function* (data) {\n        yield timeout(1000);\n        this.get('webrtc').endConversation(data);\n    }).drop(),\n\n    handlePhoneStatusChange(action, conversation) {\n        return new Promise((resolve, reject) => {\n            const call = conversation || this.get('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: Ember.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            // 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.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\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                url = this.replaceUri(call.get('id'), participant.id, null, 'calls');\n                data = query;\n            } else if (action === 'held') {\n                if (!Ember.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 {\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.get('intl').t('notification.titles.callError');\n                            const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                            return this.get('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.get('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 Ember.Logger.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.get('intl').t('notification.titles.callError');\n                        const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                        return this.get('notification').error(title, message);\n                    }\n                }\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    callForwardingActive: false,\n    callForwardingNumber: null,\n    callForwardingExtension: null,\n\n    fetchCallForwarding() {\n        if (this.get('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.get('application').pcV2Uri('api/v2/users/' + this.get('personGuid') + '/callForwarding');\n        return this.get('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 Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\nimport ERROR_WHITE_LIST from 'connections-ui/utils/error-white-list';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject, observer, run } = Ember;\n\nexport default Ember.Mixin.create({\n    externalContacts: inject.service(),\n\n    _contactObservers: null,\n\n    // holds all of the conversations\n    conversations: [],\n    conversationsMadeByClient: [],\n    activeConversations: computed.reads('conversations'),\n    onMultipleCalls: computed.gt('activeConversations.length', 1),\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.get('activeConversations').filter(conv => {\n                if (!this.get('station.isWebrtc')) {\n                    return conv.get('isAgentCall');\n                }\n                const callState = Ember.get(conv, 'callState.state');\n                const webrtcConversation = this.get('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 ? Ember.get(session, 'id') || Ember.get(session, 'sid') : false; // seems redundant when checking for session above\n                const webrtcSessions = Ember.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.get('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.get('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.get('conversations');\n            return conversations.filter(conversation => {\n                const thisClientMadeTheCall = this.get('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.get('conversationsMadeByClient').removeObject(conversation);\n                    return false;\n                }\n                if (thisClientMadeTheCall || waitingForSession) {\n                    return true;\n                }\n\n                const thisBrowserIsTheOneToAnswerFrom = this.get('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.get('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.get('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.get('_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.get('activeCall');\n        const activeNonAcdCalls = this.get('activeNonAcdCalls');\n\n        // activeNonAcdCalls could contain calls that have ended\n        const connectedNonAcdCalls = activeNonAcdCalls.filterBy('onCall');\n\n        const connectedConversations = this.get('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 && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n        } else {\n            // active call might have finished\n            const activeCallOngoing = this.get('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                    Ember.Logger.warn('lastConversationError: ', this.get('lastConversationError'));\n                } else {\n                    // call finished successfully - move to the next one\n                    newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n                }\n\n                // prioritize new dialed or incoming calls\n                if (dialingOrIncomingConversation && dialingOrIncomingConversation.length) {\n                    newActiveCall = Ember.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 = Ember.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        'station.isWebrtc',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filterBy('isIncoming');\n        }\n    ),\n\n    incomingNonAcdConversations: computed('incomingConversations.[]', function () {\n        const conversations = this.get('incomingConversations');\n        return conversations.rejectBy('isAgentCall');\n    }),\n\n    isOnConnectedCall: computed('activeConversations.@each.isConnected', function () {\n        return !!this.get('activeConversations').findBy('isConnected');\n    }),\n\n    mostRecentlyConnectedConferenceCalls() {\n        return this.get('activeConversations').filter(conversation => {\n            const isConferenceCall = Ember.get(conversation, 'onConference');\n            const isConnectedCall = Ember.get(conversation, 'onCall');\n            const myTime = moment(Ember.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.get('conversations').filter(conversation => {\n            return conversation.get('isConnected') && !conversation.get('isAgentCall');\n        });\n    }),\n\n    recentDisconnectedAgentCalls: computed('conversations.@each.connected', function () {\n        return this.get('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.get('conversations').filter(conversation => {\n            const callState = Ember.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.get('conversations');\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n        if (this.isDefinedAndLengthGreaterThan(conversations, 0)) {\n            calls.forEach(conversation => {\n                const conversationId = Ember.get(conversation, 'id');\n                if (!conversationId || !Ember.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                    const conversationModelTemp = ConversationModel.create(\n                        conversation.get('__interaction_metadata__'),\n                        Ember.getOwner(this).ownerInjection()\n                    );\n                    Ember.set(conversationModelTemp, 'type', 'call');\n\n                    const { id } = conversation;\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    conversation.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.get('userCallSessionsWithErrors').findBy('id', conversation.id);\n        const conversationMadeByClient = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n        const conversationAcceptedOnClient = Ember.get(conversation, 'acceptedByClient');\n        const conversationWasMadeOrAcceptedOnClient = conversationAcceptedOnClient || conversationMadeByClient;\n\n        const participantsForUser = conversation.get('participants').filterBy('userId', this.get('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.get('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.get('recentDisconnectedNonAcdCalls').filter(conversation => {\n                return this._shouldRemoveNonAcdConversation(conversation);\n            });\n            let timeOutToRemove = this.get('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.get('_debouncedRemoveConversationFromConversations').perform(\n                    conversationsToRemove,\n                    timeOutToRemove\n                );\n            }\n        }\n    },\n\n    _debouncedRemoveConversationFromConversations: task(function* (conversationsToRemove, debounceTime) {\n        yield timeout(debounceTime);\n        this.removeConversationFromConversations(conversationsToRemove);\n    }),\n\n    thereIsAConnectedConversation: computed.gte('onlyConnectedConversations.length', 1),\n\n    updateConversationArray(conversation, conversationDetails, isAgentCall) {\n        const conversationExists = conversationDetails != null ? true : false;\n        if (conversationExists) {\n            conversationDetails.setProperties(conversation);\n        } else {\n            conversationDetails = ConversationModel.create(conversation, Ember.getOwner(this).ownerInjection());\n\n            //Verify if we should process this update if agentCall\n            let isUpdateValid = true;\n            if (isAgentCall) {\n                Ember.set(conversationDetails, 'type', 'call');\n            }\n            if (isUpdateValid) {\n                this.get('conversations').pushObject(conversationDetails);\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('conversations.@each.participants', function () {\n        const nonAcdCalls = this.get('conversations').reject(conversation => {\n            return Ember.get(conversation, 'participants').any(party =>\n                party && party.purpose ? party.purpose === 'agent' || party.purpose === 'acd' : false\n            );\n        });\n        return Ember.A([].concat(nonAcdCalls || []));\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.get('monitoredConversationsForErrors').forEach(conversation => {\n            Ember.get(conversation, 'participants').forEach(participant => {\n                const purpose = (Ember.get(participant, 'purpose') || '').toLowerCase();\n                const participantIsUserAgent = ['user', 'agent'].indexOf(purpose) > -1;\n                const participantIsCurrentUser = Ember.get(participant, 'userId') === this.get('personGuid');\n                const userParticipant = participantIsCurrentUser && participantIsUserAgent ? participant : null;\n                if (userParticipant && Ember.get(userParticipant, 'calls')) {\n                    callSessions.push({ id: conversation.id, calls: Ember.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.get('usersCallSessions').filter(session => {\n                const calls = Ember.get(session, 'calls');\n                const callsWithErrors = calls.filter(call => {\n                    const disconnectReasons = Ember.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 = Ember.get(call, 'errorInfo');\n                    const disconnectTypeIsError =\n                        typeof Ember.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 Ember from 'ember';\n\nconst { observer, Logger } = Ember;\n\nexport default Ember.Mixin.create({\n    registerCPTopics: observer('user.id', function () {\n        const id = this.get('user.id');\n        const pigeon = this.get('pigeon');\n        let topics = [];\n        if (id && !this.get('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            this.get('pigeon').on(`v2.users.${id}.station`, 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.get('conversations').findBy('id', conversation.id);\n        if (conversationDetails) {\n            const participantOnExistingConversation = conversationDetails\n                .get('participants')\n                .findBy('userId', this.get('personGuid'));\n            if (!participantOnExistingConversation) {\n                Logger.error(\n                    `updateActiveConversationEntry: Expected to find person ${this.get('personGuid')} on conversation ${\n                        conversation.id\n                    } 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 = Ember.get(conversation, 'participants');\n        const isAgentCall = participants.any(party => (party.purpose ? party.purpose === 'agent' : false));\n\n        const participantsForUser = participants.filterBy('userId', this.get('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            Ember.set(conversation, 'acceptedByClient', false);\n        }\n\n        if (\n            currentCallState &&\n            participantIsNotVoicemail &&\n            currentCallState !== 'connected' &&\n            newCallState === 'connected'\n        ) {\n            this.get('headset').answerCall(conversation.id, this.get('connectedConversations.length') >= 1);\n        }\n\n        if (currentCallState && currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n            this.get('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 Ember from 'ember';\nimport { EVENTS } from 'connections-ui/utils/hosted-context';\nimport moment from 'connections-ui/utils/dates';\nimport _ from 'lodash';\n\nconst { observer, run, inject } = Ember;\nconst IGNORED_ERRORS = ['error.ininedgecontrol.session.inactive'];\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    useNotificationProfileOutput: Ember.computed.reads('session.features.notificationOutputPicker'),\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.get('intl').lookup('notification.titles.incomingCall').toString();\n            const message = this.get('intl').lookup('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            if (this.get('useNotificationProfileOutput')) {\n                notificationOptions.notificationOutputDeviceId = this.getNotificationOutputDeviceId();\n            }\n\n            this.get('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.get('callsWithErrors');\n            const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n            // are there any errors on any of the user's sessions?\n            _.each(userCallSessionsWithErrors, session => {\n                const calls = Ember.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 = Ember.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                            Ember.set(call, '_hasThrownError', true);\n                            this.showErrorNotification(call.errorInfo);\n                        }\n                    }\n                });\n            });\n\n            if ((this.get('_testIsStationWebrtc') || this.get('station.isWebrtc')) && callsWithErrors.length > 0) {\n                _.each(callsWithErrors, call => {\n                    const reason = Ember.get(call, 'call.disconnectReasons.firstObject');\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    if (\n                        reason &&\n                        isRecent &&\n                        Ember.get(reason, 'type') === 'SIP' &&\n                        !Ember.get(call, 'call._hasThrownError')\n                    ) {\n                        Ember.set(call, 'call._hasThrownError', true);\n                        run.throttle(this, this.showSipError, reason, 1000);\n                    }\n                });\n            }\n        }\n    ),\n\n    showSipError(response) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.sipError');\n        messageText = `${messageText} ${response.code} ${response.phrase}`;\n        this.get('notification').error(title, messageText, {\n            tag: 'call-error',\n            icon: `${prefix} assets/images/icons/png/checkmark-circled.png`,\n            hideAfter: 5\n        });\n    },\n\n    translateServerErrors(response) {\n        const { message, messageParams, messageWithParams, code } = response;\n        const intl = this.get('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 Ember.RSVP.resolve(intl.t(newCode));\n            }\n            default: {\n                if (code && intl.exists(code)) {\n                    return Ember.RSVP.resolve(intl.t(code));\n                }\n                if (message) {\n                    return Ember.RSVP.resolve(message);\n                }\n                return code;\n            }\n        }\n    },\n\n    showErrorNotification(response, err) {\n        if (!response) {\n            if (!err) {\n                Ember.Logger.error(new Error('Cannot show error notification with no error information'));\n                return;\n            }\n            response = { message: err.message };\n        }\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.dialpad.call');\n        messageText = this.translateServerErrors(response, err);\n        return messageText.then(text => {\n            return this.get('notification').error(title, text, {\n                tag: 'call-error',\n                icon: prefix + 'assets/images/icons/png/checkmark-circled.png',\n                hideAfter: 5\n            });\n        });\n    },\n    showFeedbackErrorNotification(message) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        message = '' + message;\n        return this.get('notification').error(title, message, {\n            target: this.get('applicationController'),\n            tag: 'activeCall',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').lookup('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    showNoStationSelected(conversation) {\n        Ember.Logger.error('Cannot answer conversation because there is no active station for the current user', {\n            conversationId: conversation.get('id')\n        });\n        const title = this.get('intl').t('notification.titles.callError');\n        const message = this.get('intl').t('purecloud.station.noStationSelected');\n        this.get('notification').error(title, message, {\n            tag: 'call-error'\n        });\n    },\n\n    checkForNonACD(conversation) {\n        let isAcdCall = this.get('isActiveCallACD');\n        if (conversation) {\n            isAcdCall = conversation.get('isAgentCall');\n        }\n        if (!isAcdCall) {\n            const message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nconst { computed, RSVP, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    store: inject.service(),\n    station: null,\n    needStation: false,\n    updateStationEventTimeout: 500,\n\n    freeSeatPreference: computed('session.org.orgSettings.freeSeating', function () {\n        return this.get('session.org.orgSettings.freeSeating');\n    }),\n\n    noStationSelected: computed.not('station'),\n\n    defaultStation: computed('user.station.defaultStation', function () {\n        const user = this.get('user');\n        if (user && Ember.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.get('defaultStation') || this.get('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.get('defaultStation')) {\n            return RSVP.resolve(null);\n        }\n\n        return this.get('store')\n            .find('station', this.get('defaultStation.id'))\n            .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                Ember.Logger.error('Failed to fetch station:', {\n                    error: err,\n                    stationId\n                });\n            });\n    },\n\n    disassociateStation() {\n        let url = this.get('applicationService').pcV2Uri(`api/v2/users/stations/me/associatedstation`);\n        return this.get('ajax').delete(url);\n    },\n\n    disconnectPersistentConnection() {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService').endAllSoftphoneSessions();\n        }\n\n        const webrtc = this.get('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            Ember.Logger.warn('Disconnecting persistent connection with active conversations', {\n                conversations: conversations.map(c => Ember.get(c, 'id'))\n            });\n        } else {\n            Ember.Logger.info('disconnecting persistent connection', conversations[0]);\n        }\n        conversations.forEach(c => webrtc.endConversation(c));\n    },\n\n    chooseDefault() {\n        const user = this.get('user');\n        let defaultStation = Ember.get(user, 'station.defaultStation');\n        if (!defaultStation) {\n            defaultStation = Ember.get(user, 'station.associatedStation');\n        }\n        this.chooseStation(Ember.get(defaultStation, 'id'));\n        this.set('defaultStation', defaultStation);\n        Ember.set(user, 'station.defaultStation', defaultStation);\n    },\n\n    doLoginAssociationLogic() {\n        const isFreeSeatOrg = this.get('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 Ember.RSVP.resolve();\n    },\n\n    _loginAssociationFreeSeat() {\n        const user = this.get('user');\n        const associatedStation = Ember.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.get('user');\n        const associatedStation = Ember.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 = Ember.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 = Ember.get(lastAssociatedStation, 'associatedUser');\n            if (!lastAssociatedUser) {\n                return this.chooseStation(Ember.get(lastAssociatedStation, 'id'));\n            }\n        }\n        const defaultStation = Ember.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 = Ember.get(defaultStation, 'associatedUser');\n            if (!defaultStationUser) {\n                return this.chooseStation(Ember.get(defaultStation, 'id'));\n            }\n        }\n        const userStationSettings = Ember.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 Ember.RSVP.resolve();\n        }\n        let uri = this.get('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 = Ember.get(jqXHR, 'responseJSON.message') || '';\n            message = this.get('intl').lookup('notification.purecloud.phoneFail') + message;\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        };\n        return this.get('ajax').put(uri).then(successHandler, errorHandler);\n    },\n\n    _updateStationEvent(eventBody, json) {\n        this.get('_debouncedUpdateStationEvent').cancelAll();\n        this.get('_debouncedUpdateStationEvent').perform(eventBody, json);\n    },\n\n    _debouncedUpdateStationEvent: task(function* (eventBody, json) {\n        yield timeout(this.get('updateStationEventTimeout'));\n        this._handleUpdateStation(eventBody, json);\n    }),\n\n    _handleUpdateStation(eventBody, json) {\n        const metadata = Ember.get(json, 'metadata');\n        if (!metadata) {\n            return;\n        }\n        const stationId = this.get('station') ? this.get('station.id') : null;\n        const newStation = Ember.get(eventBody, 'associatedStation');\n        const newStationId = newStation && newStation.id ? newStation.id : null;\n        const currentStationIsNewStation = !!(stationId && newStationId && stationId === newStationId);\n        const action = Ember.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 Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    addIndicatorForPromise: function (promise, target) {\n        Ember.assert('You must specify a valid target selector', target && typeof target === 'string');\n\n        if (promise && promise.then) {\n            var view = Ember.$('<div class=\"loading-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>');\n            Ember.$(target).append(view);\n\n            promise.then(function () {\n                view.remove();\n            });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst PurecloudModelMixin = Ember.Mixin.create({});\n\nexport default PurecloudModelMixin;\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\nconst { alias } = computed;\n\nconst FEATURE_RELATE_ACCESS = 'permissions.hasExternalContactsViewContactAccess';\n\nconst FEATURE_CUSTOM_FIELDS = 'session.features.relateDynamicSchema';\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    hasRelateAccess: computed.alias(FEATURE_RELATE_ACCESS),\n\n    canShowCustomFields: alias(FEATURE_CUSTOM_FIELDS),\n\n    contactRoute: computed('isRelateEngineAvailable', function () {\n        return 'relate.contacts-ui-redirect'; // todo: clean up with redirects\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport ajax from 'ember-ajax';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst SEARCH_ALL = '*';\n\nconst TAGS_ENDPOINT = '/directory/api/v2/tags/skills.skills,skills.certs,general.department,general.title';\n\nconst CANCELLATION_ERROR = 'Request Cancelled';\n\nfunction performSearch() {\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n\n    var value;\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = SEARCH_ALL;\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    var deferred = this.get('pendingSearchRequest');\n    if (deferred) {\n        deferred.reject(CANCELLATION_ERROR);\n    }\n    deferred = Ember.RSVP.defer();\n\n    this.set('pendingSearchRequest', deferred);\n\n    var requestArray = [];\n\n    var queueSearchRequest;\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    if (this.get('searchQueueOnly') && queuePermission) {\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        const myQueuesOnly = this.get('myQueuesOnly');\n\n        if (divisionAgnostic) {\n            queueSearchData.name = `**${value}**`;\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        if (myQueuesOnly) {\n            queueSearchData.myQueuesOnly = myQueuesOnly;\n        }\n\n        queueSearchRequest = this.get('store').query('queue', queueSearchData);\n        requestArray.push(queueSearchRequest);\n    } else if (this.get('searchRelate') && this.get('searchRelateOnly') && relatePermission) {\n        queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            originator: this.get('componentClassName'),\n            expandField: 'externalOrganization'\n        });\n        requestArray.push(queueSearchRequest);\n    } else {\n        if (this.get('searchQueueOnly')) {\n            return;\n        }\n        const query = [\n            {\n                value: value,\n                type: 'QUERY_STRING'\n            }\n        ];\n        // should be the ucIntegrationKey, will be null unless set\n        const searchIntegrationKey = this.get('searchIntegrationKey');\n        if (searchIntegrationKey) {\n            query.push({\n                type: 'EXACT',\n                fields: ['integration'],\n                value: searchIntegrationKey\n            });\n        }\n\n        let request = null;\n\n        const userRequest = this.get('store').query('public-api-user', {\n            query,\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        request = userRequest.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        requestArray.push(request);\n\n        if (this.get('searchQueue') && queuePermission) {\n            let queueSearchQuery;\n            if (this.get('divisionAgnostic')) {\n                queueSearchQuery = {\n                    name: value,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit'),\n                    divisionAgnostic: true\n                };\n            } else {\n                queueSearchQuery = {\n                    name: `**${value}**`,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit')\n                };\n            }\n            queueSearchRequest = this.get('store').query('queue', queueSearchQuery);\n            requestArray.push(queueSearchRequest);\n        }\n\n        if (this.get('searchRelate') && relatePermission) {\n            queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n                searchTerm: `${value}`,\n                pageSize: this.get('searchLimit'),\n                originator: this.get('componentClassName'),\n                pageNumber: 1,\n                expandField: 'externalOrganization,division'\n            });\n            requestArray.push(queueSearchRequest);\n        }\n    }\n\n    Ember.RSVP.allSettled(requestArray).then(promises => {\n        const results = [];\n        promises.forEach(promise => {\n            if (promise.state === 'rejected') {\n                Ember.Logger.warn('Failed to load search request', { reason: promise.reason });\n            } else {\n                results.push(promise.value);\n            }\n        });\n        if (results.length === 0) {\n            deferred.reject(new Error('All search requests failed'));\n        } else {\n            deferred.resolve(results);\n        }\n    });\n\n    deferred.promise\n        .then(entities => {\n            var results = _.map(entities, function (entity) {\n                if (!Array.isArray(entity)) {\n                    return entity.get('content').map(x => x.getRecord());\n                } else {\n                    return entity;\n                }\n            });\n\n            if (entities.length) {\n                this.set('searchMeta', _.head(entities).meta);\n            }\n            entities = _.flatten(results);\n            const people = entities.filterBy('type', 'person');\n            if (people.length > 0) {\n                this.get('presenceSubscription').autoSubscribe(people, this, 'search');\n            }\n            this.set('searchResults', entities);\n\n            if (_.isEmpty(entities)) {\n                this.notifyPropertyChange('searchResults');\n            }\n\n            return entities;\n        })\n        .finally(() => {\n            this.set('pendingSearchRequest', null);\n        });\n\n    this.set('currentSearchRequest', DS.PromiseArray.create({ promise: deferred.promise }));\n}\n\nfunction performTagSearch() {\n    var request = tagSearchRequest(this.get('tagSearchQuery'));\n\n    request.then(results => {\n        this.set('tagSearchResults', results);\n        return results;\n    });\n\n    this.set('tagSearchRequest', DS.PromiseObject.create({ promise: request }));\n}\n\nfunction tagSearchRequest(query) {\n    return new Ember.RSVP.Promise(function (resolve, reject) {\n        ajax(TAGS_ENDPOINT, {\n            type: 'GET',\n            data: { q: query }\n        }).then(function (data) {\n            var results = data.res;\n\n            if (results.length !== 0) {\n                _.each(results, function (result) {\n                    var tag = result.field.substring(result.field.indexOf('.') + 1);\n                    result.tag = tag;\n                });\n            }\n\n            resolve(results);\n        }, reject);\n    }, 'SearchMixin#tagSearchRequest');\n}\n\nexport const SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    searchIntegrationKey: null,\n\n    searchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        Ember.run.debounce(this, performSearch, 200);\n    })\n});\n\nexport const ThenableSearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    store: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    performSearch(searchQuery, entityFilter) {\n        this.set('searchQuery', searchQuery);\n        this.set('entityFilter', entityFilter);\n        performSearch.apply(this);\n        return this.get('currentSearchRequest');\n    }\n});\n\nexport const TagSearchMixin = Ember.Mixin.create({\n    tagSearchQuery: null,\n    tagSearchRequest: null,\n\n    tagSearchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performTagSearch: Ember.observer('tagSearchQuery', function () {\n        Ember.run.debounce(this, performTagSearch, 150);\n    })\n});\n\n// TODO: Remove this after toggle is flipped\nexport const HelpMixin = Ember.Mixin.create({\n    searchQuery: null,\n    searchResults: null,\n    request: null,\n\n    _performHelpSearch() {\n        const searchQuery = this.get('searchQuery');\n\n        if (searchQuery) {\n            const request = new Ember.RSVP.Promise((resolve, reject) => {\n                Ember.$.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: 'https://help.genesys.cloud/purecloud-search-api.php',\n                    dataType: 'json',\n                    data: {\n                        q: searchQuery\n                    },\n                    success: data => {\n                        const results = data ? Ember.get(data, 'results') : null;\n                        _.forEach(results, function (result) {\n                            if (result.excerpt) {\n                                result.excerpt = result.excerpt\n                                    .replace(/(<([^>]+)>)/gi, '')\n                                    .replace(/&quot;/g, '\"')\n                                    .replace(/&#39;/g, \"'\")\n                                    .replace(/&lt;/g, '<')\n                                    .replace(/&gt;/g, '>')\n                                    .replace(/&amp;/g, '&')\n                                    .replace(/&#8217;/g, \"'\");\n                            }\n                        });\n                        this.set('searchResults', results);\n                        resolve(data);\n                    },\n                    error: function (error) {\n                        Ember.Logger.log('Error accessing resourceCenter');\n                        reject(error);\n                    }\n                });\n            });\n\n            this.set('request', DS.PromiseObject.create({ promise: request }));\n        } else {\n            this.set('searchResults', null);\n        }\n    },\n\n    performHelpSearch: Ember.observer('searchQuery', function () {\n        Ember.run.debounce(this, this._performHelpSearch, 150);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst TIMEOUT = isTesting ? 0 : 300;\n\nconst PrepareResults = (context, results) => {\n    let parsedResults;\n\n    if (!Array.isArray(results)) {\n        parsedResults = results.get('content');\n        parsedResults = parsedResults.map(x => x.getRecord());\n    } else {\n        parsedResults = results;\n    }\n\n    if (parsedResults.length < 0 && parsedResults === undefined && parsedResults === null) {\n        context.set('retrySearch', true);\n        return;\n    }\n\n    const entities = _.flatten(parsedResults);\n    const people = entities.filterBy('type', 'person');\n\n    if (people.length > 0) {\n        context.get('presenceSubscription').autoSubscribe(people, context, 'search');\n    }\n\n    return entities;\n};\n\nconst performSearch = function () {\n    let value;\n\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = '*';\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    const userPending = this.get('userPending');\n    const queuePending = this.get('queuePending');\n    const relatePending = this.get('relatePending');\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    const searchRelate = this.get('searchRelate');\n    const searchQueues = this.get('searchQueue');\n    const searchUsers = this.get('searchUser');\n    let userRequests = null;\n\n    if (searchUsers && !userPending) {\n        this.set('userPending', true);\n\n        const request = this.get('store').query('public-api-user', {\n            query: [\n                {\n                    value: value,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        userRequests = request.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        userRequests.catch(() => this.set('userSearchFailed', true));\n        userRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('userResults', entities);\n        });\n        userRequests.finally(() => {\n            this.set('userPending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchQueues && queuePermission && !queuePending) {\n        this.set('queuePending', true);\n\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        if (divisionAgnostic) {\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        const queueRequests = this.get('store').query('queue', queueSearchData);\n\n        queueRequests.catch(() => this.set('queueSearchFailed', true));\n        queueRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('queueResults', entities);\n        });\n        queueRequests.finally(() => {\n            this.set('queuePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchRelate && relatePermission && !relatePending) {\n        this.set('relatePending', true);\n        const relateRequests = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            expandField: 'externalOrganization,division',\n            originator: this.get('componentClassName')\n        });\n\n        relateRequests.catch(() => this.set('relateSearchFailed', true));\n        relateRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('relateResults', entities);\n        });\n        relateRequests.finally(() => {\n            this.set('relatePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n};\n\nconst SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    searchOnEmpty: false,\n\n    retrySearch: false,\n\n    searchUser: false,\n    searchRelate: false,\n    searchQueue: false,\n\n    userSearchFailed: false,\n    queueSearchFailed: false,\n    relateSearchFailed: false,\n\n    searchLimit: 25,\n    userPending: false,\n    queuePending: false,\n    relatePending: false,\n\n    userResults: null,\n    queueResults: null,\n    relateResults: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('userResults', []);\n        this.set('relateResults', []);\n        this.set('queueResults', []);\n    },\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        this.debouncedSearch();\n    }),\n\n    performReload: Ember.observer('retrySearch', function () {\n        if (this.get('retrySearch')) {\n            this.set('userResults', []);\n            this.set('relateResults', []);\n            this.set('queueResults', []);\n            this.debouncedSearch();\n        }\n    }),\n\n    debouncedSearch: _.debounce(performSearch, TIMEOUT, { leading: false, trailing: true })\n});\n\nexport default SearchMixin;\n","import Ember from 'ember';\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 = Ember.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","define(\"connections-ui/mixins/style-namespacing-extras\", [\"exports\", \"ember-component-css/mixins/style-namespacing-extras\"], function (_exports, _styleNamespacingExtras) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _styleNamespacingExtras.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    beforeModel: function () {\n        // Skip call to super which is the authenticated-route-mixin\n        return null;\n    }\n});\n","import Ember from 'ember';\n\n// Viewport code adapted from:\n// https://emberway.io/ember-js-detecting-if-a-dom-element-is-in-the-viewport-eafcc77a6f86\n\nconst { computed } = Ember;\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 = Ember.$(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 Ember.Mixin.create({\n    enableViewport: true,\n\n    enteredViewport: computed('boundingClientRect', 'windowHeight', function () {\n        const rect = this.get('boundingClientRect');\n        const windowHeight = this.get('windowHeight');\n        const windowWidth = this.get('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: computed.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.get('enableViewport')) {\n            Ember.run.scheduleOnce('afterRender', this, '_setup');\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._teardown();\n    },\n\n    _setup() {\n        Ember.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        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const scrollParentRef = Ember.$(scrollParent);\n        if (scrollParentRef) {\n            scrollParentRef.off(`.${this.elementId}`);\n        }\n\n        const windowRef = Ember.$(window);\n        if (windowRef) {\n            windowRef.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 = Ember.$(scrollParent);\n        const resizeHandler = this.resizeHandler.bind(this);\n        $scrollParent.on(`scroll.${this.elementId}`, this.scrollHandler.bind(this));\n        Ember.$(window).on(`resize.${this.elementId}`, resizeHandler);\n    },\n\n    _updateBoundingClientRect() {\n        const el = this.element;\n        if (el && el.getBoundingClientRect) {\n            this.set('boundingClientRect', el.getBoundingClientRect());\n        }\n    },\n\n    _updateWindowSize() {\n        this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n        this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n    },\n\n    scrollHandler() {\n        Ember.run.debounce(this, '_scrollHandler', REFRESH_RATE, false);\n    },\n\n    _scrollHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateBoundingClientRect.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateBoundingClientRect', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    },\n\n    resizeHandler() {\n        Ember.run.debounce(this, '_resizeHandler', REFRESH_RATE, false);\n    },\n\n    _resizeHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateWindowSize.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateWindowSize', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    }\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    interaction: computed.reads('webrtc.interaction'),\n    webrtc: inject.service(),\n    streaming: inject.service(),\n    intl: computed.reads('webrtc.intl'),\n    phone: inject.service(),\n    mediaProviders: inject.service(),\n    sessionService: inject.service('session'),\n\n    videoTooltipTitle: Ember.computed('videoTooltipKey', 'haveNonPurecloudMediaProvider', function () {\n        let key = this.get('videoTooltipKey');\n        if (this.get('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            Ember.run.scheduleOnce('afterRender', this, this._fixTooltips);\n        }\n        return this.get('intl').t(key, params);\n    }),\n\n    videoTooltipTitleSr: Ember.computed('videoTooltipTitle', 'videoTooltipeKey', 'activeRoom.videoPeers', function () {\n        let key = this.get('videoTooltipKey');\n\n        const numberOfParticipants = this.get('activeRoom.videoPeers');\n        if (key == 'ewc.open' && numberOfParticipants > 0) {\n            key = 'ewc.openSr';\n            return this.get('intl').t(key, { number: numberOfParticipants });\n        }\n\n        return this.get('videoTooltipTitle');\n    }),\n\n    oneToOneChat: computed('webrtcTarget.oneToOneTarget', function () {\n        const webrtcTarget = this.get('webrtcTarget');\n        return webrtcTarget && webrtcTarget.isOneToOneRoom();\n    }),\n\n    isFirefox: BrowserUtils.isFirefox,\n\n    webrtcTarget: computed.or('activeRoom', 'entity.oneToOneRoom'),\n\n    webrtcPhoneWithIssues: Ember.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: Ember.computed('useMediaProviders', 'sessionService', 'mediaProviders.enabled', function () {\n        if (!this.get('useMediaProviders') || !this.get('mediaProviders.enabled')) {\n            return [];\n        }\n\n        return this.get('mediaProviders').getVideoProviders(this.get('sessionService.user'), this.get('webrtcTarget'));\n    }),\n\n    haveNonPurecloudMediaProvider: Ember.computed('videoMediaProviders.[]', function () {\n        return !!this.get('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.get('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.get('useMediaProviders')) {\n                    return openTooltip;\n                }\n                if (!this.get('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.get('useMediaProviders')) {\n                return 'ewc.browserNotSupported';\n            }\n            return openTooltip;\n        }\n    ),\n\n    isOneToOneOfflineOrBusy: computed.and(\n        'oneToOneChat',\n        'webrtcTarget',\n        'webrtcTarget.oneToOneTarget.isOfflineOrBusy'\n    ),\n\n    isVideoButtonEnabled: computed(\n        'videoTooltipKey',\n        'webrtc.webrtcAudioCallIssueKey',\n        'haveNonPurecloudMediaProvider',\n        'useMediaProviders',\n        function () {\n            if (this.get('useMediaProviders') && this.get('haveNonPurecloudMediaProvider')) {\n                return true;\n            }\n\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return false;\n            }\n\n            return this.get('videoTooltipKey') === 'ewc.open' || this.get('videoTooltipKey') === 'ewc.openActiveCall';\n        }\n    ),\n\n    videoButtonEnabled: computed('isVideoButtonEnabled', function () {\n        return this.get('isVideoButtonEnabled') ? 'enabled' : 'disabled';\n    })\n});\n","define(\"connections-ui/models/annotation\", [\"exports\", \"ember-purecloud-components/models/annotation\"], function (_exports, _annotation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _annotation.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { typeOf, isPresent, copy, computed, assign } = Ember;\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 = Ember.Object.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 config from '../config/environment';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport InternallyHostedApp from './internally-hosted-app';\n\nconst { Evented, computed, run, get } = Ember;\n\nlet AppState = Ember.Object.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            Ember.Logger.error(errorMsg);\n            throw new Error(errorMsg);\n        }\n\n        return this.get('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 = Ember.Object.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', Ember.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                Ember.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.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let reportStoppedInteraction = this.get('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.get('currState');\n        if (!requestedState || requestedState.compareTo(currState) <= 0) {\n            // Invalid next state\n            return;\n        }\n\n        // if monitoring ... cancel\n        let timeout = this.get('_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.get('currState');\n        let currStateConfig = STATE_CONFIGS[currState];\n        let nextState = this._getNextState(currState);\n        let currStateEntryTimestamp = this.get('_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.get('_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.get('_interactionStartTimestamp');\n        if (!startTimestamp) {\n            Ember.Logger.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.get('_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.get('appId'),\n            pcAppInstanceId: this.get('instanceId'),\n            pcAppDisplayType: this.get('app.displayType'),\n            pcAppInternallyHosted: this.get('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.get('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 Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'ember-purecloud-components/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\nconst { computed, RSVP } = Ember;\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 = Ember.Object.extend(Ember.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: computed.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: computed.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 = Ember.Object.create({});\n        let runningInstances = this._searchInstances(this.get('_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.get('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.get('_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.get('_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.get('_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.get('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.get('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.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_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.get('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.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_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.get('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.get('_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.get('currState');\n                });\n            })\n            .catch(reason => {\n                if (\n                    reason &&\n                    reason.name &&\n                    reason.name === POOL_STATES.LOAD_FAILED &&\n                    (!this.get('_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.get('currState'));\n            })\n            .then(loadResult => {\n                this.trigger(APPS_RELOADED_EVENT);\n\n                let restoreAppId = this.get('_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.get('_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.get('_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.get('skipLongRunningTasks')) {\n                            this._scheduleAppReload();\n                        }\n                        return this.get('currState');\n                    })\n                    .catch(e => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps threw exception', e);\n                        let autoRetry = this.get('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.get('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.get('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.get('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.get('_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                Ember.Logger.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.get('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.get('_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.get('reloadAppsRetryBaseMillis') * Math.pow(2, reloadFailureCount - 1)\n                );\n                if (reloadWait === this.get('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.get('_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                Ember.Logger.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                Ember.Logger.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.get('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.get('fetchAppsFn');\n            if (typeof fetchAppsFn !== 'function') {\n                Ember.Logger.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                                Ember.Logger.error(\n                                    this._decorateLogStatement('Invalid App Fetch Payload. Expected Array.'),\n                                    { remoteData: { typeOfApps: Ember.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                                Ember.Logger.info(this._decorateLogStatement('App fetch request failed.'), { reason });\n                                this.incrementProperty('_fetchFailureLog.endpointFailureCount');\n                                reject('endpointFailure');\n                            }\n                        });\n                } catch (error) {\n                    Ember.Logger.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.get('_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.get('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.get('currState'));\n                });\n        });\n    },\n\n    _allocateSpace() {\n        let getMaxActive = this.get('getMaxActive');\n        if (getMaxActive) {\n            let renderedInstances = this.get('_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.get('skipLongRunningTasks')) {\n            this.get('_monitorAppLifecyclesTask').perform();\n        }\n    },\n\n    _monitorAppLifecyclesTask: task(function* () {\n        yield timeout(this.get('stoppedInstanceRemovalInterval'));\n        this._monitorAppLifecycles();\n    }),\n\n    _removeStopped() {\n        let renderedInstances = this.get('_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.get('poolName');\n        if (poolName && Ember.typeOf(poolName) === 'string') {\n            prefix += ` (${poolName})`;\n        }\n\n        return `${prefix}: ${logText}`;\n    },\n\n    _logPoolEvent(poolEvent, poolEventDetails = {}) {\n        const getMaxActive = this.get('getMaxActive');\n        const attrs = {\n            poolEvent,\n            poolName: this.get('poolName'),\n            poolState: this.get('currState.name'),\n            maxPoolSize: getMaxActive && getMaxActive(),\n            renderedApps: this.get('renderedAppInstances.length'),\n            totalAttentionCount: this.get('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 Ember from 'ember';\nimport _ from 'lodash';\nimport appUtils from '../utils/apps';\n\nconst { Copyable, computed, copy, getOwner, typeOf, isPresent } = 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_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_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\nconst 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 = Ember.Object.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    gcHostOrigin: null,\n    gcTargetEnv: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('sandbox')) {\n            this.set('sandbox', []);\n        }\n\n        if (!this.get('assets')) {\n            this.set('assets', {});\n        }\n\n        if (!this.get('permissionsPolicy')) {\n            this.set('permissionsPolicy', []);\n        }\n\n        this.set('lifecycle', _.merge(copy(LIFECYCLE_DEFAULTS, true), this.get('lifecycle')));\n    },\n\n    url: computed('urlTemplate', 'langTag', 'envTld', 'interactionId', 'usePopupAuth', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = this.get('urlTemplate');\n            if (typeOf(result) === 'string' && isPresent(result)) {\n                URL_REPLACEMENTS.forEach(currReplacement => {\n                    let replacementValue = '';\n                    if (currReplacement.replacementValue) {\n                        if (this.get('interactionId') && this.get('interactionType'))\n                            replacementValue = currReplacement.replacementValue(\n                                this.get('interactionId'),\n                                this.get('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            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derived url property instead of new urlTemplate property.'),\n                {\n                    urlTemplate: this.get('urlTemplate'),\n                    remoteData: {\n                        appId: this.get('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.get('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.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            urlTemplate: this.get('urlTemplate'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? _.cloneDeep(this.get('sandbox')) : this.get('sandbox'),\n            assets: deep ? _.cloneDeep(this.get('assets')) : this.get('assets'),\n            lifecycle: deep ? _.cloneDeep(this.get('lifecycle')) : this.get('lifecycle'),\n            permissionsPolicy: deep ? _.cloneDeep(this.get('permissionsPolicy')) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default App;\n","define(\"connections-ui/models/call-communication\", [\"exports\", \"ember-purecloud-components/models/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { attr, Model } = DS;\n\nconst { computed } = Ember;\n\nexport default Model.extend({\n    enabled: attr(),\n    phoneNumber: attr(),\n\n    calls: attr(),\n\n    voicemail: attr(),\n\n    isExternalVoicemail: computed.equal('voicemail', 'LASTCALL')\n});\n","define(\"connections-ui/models/callback-communication\", [\"exports\", \"ember-purecloud-components/models/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\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 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    // 410 is a queue call that gets transfered to an agent for some reason\n    return !!party.sipResponseCodes.filter((c: number) => c >= 300 && c !== 487 && c !== 410).length;\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 = 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    // 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        '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[0].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    // 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                    );\n                }\n                return true;\n            });\n    }),\n\n    callParties: computed('otherParties.[]', 'isGroupRing', 'conversationParticipants', function () {\n        const otherParties = this.get('otherParties');\n        const addressformat = this.get('addressformat');\n\n        // We dont display (all) group call participants in any call UIs\n        if (this.get('isGroupRing')) {\n            return [];\n        }\n\n        return otherParties.rejectBy('purpose', 'voicemail').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 conversationParticipants = this.get('conversationParticipants');\n                    const participant = conversationParticipants.find(\n                        (participant: any) => participant.id === party.id\n                    );\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.lookup(`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 purpose !== 'ivr' && purpose !== 'acd';\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 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        let promise = Ember.RSVP.Promise.resolve([]);\n        if (!this.get('conversation') && personParticipants.length > 2) {\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","define(\"connections-ui/models/chat-communication\", [\"exports\", \"ember-purecloud-components/models/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst SECOND_TO_EDIT = 60;\n\nconst ChatMessage = Ember.Object.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        Ember.run.cancel(this.get('isEditableTimeout'));\n    },\n\n    isSplitMessage: Ember.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: Ember.computed('time', function () {\n        const time = this.get('time');\n        if (time) {\n            return moment(time).add(SECOND_TO_EDIT, 'seconds');\n        }\n        return time;\n    }),\n\n    isEditing: Ember.computed('widgetType', function () {\n        return 'editor' === this.get('widgetType');\n    }),\n\n    canEdit: Ember.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.get('isEditable') || this.get('files.length') || this.get('room.isAcdRoom')) {\n                return false;\n            }\n\n            const message = this.get('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: Ember.computed('raw', 'correction.raw', function () {\n        const raw = this.get('correction.raw') || this.get('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.get('widgetType'));\n        this.set('widgetType', 'editor');\n    },\n\n    stopEditing() {\n        const originalWidgetType = this.get('_originalWidgetType');\n        if (originalWidgetType && 'editor' === this.get('widgetType')) {\n            this.set('widgetType', originalWidgetType);\n        }\n    },\n\n    determineMessageEditability() {\n        if (!this.get('corrects') && compareJids(this.get('from'), this.get('session.person.jid'))) {\n            const now = moment();\n            const seconds = SECOND_TO_EDIT - now.diff(this.get('time'), 'seconds');\n            const isEditable = seconds > 0;\n            this.set('isEditable', isEditable);\n            if (isEditable) {\n                const isEditableTimeout = Ember.run.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 Ember from 'ember';\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 'ember-purecloud-components/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        Ember.$('.action-item.chat a').addClass('faa-horizontal animated');\n        Ember.run.later(() => {\n            Ember.$('.action-item.chat a').removeClass('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 = Ember.Object.extend(SortChatUsersMixin, {\n    session: Ember.inject.service('session'),\n    webrtc: Ember.inject.service('webrtc'),\n    batchDataRequests: Ember.inject.service(),\n    chat: Ember.inject.service('chat'),\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: Ember.on('init', function () {\n        this.setProperties({\n            participants: [],\n            messages: [],\n            messageCache: Ember.Object.create({}),\n            splitMessageCache: Ember.Object.create({}),\n            firstMessageTime: moment(0),\n            lastMessageTime: moment(0),\n            deferredParticipants: Ember.A([])\n        });\n    }),\n\n    authenticatedUserIsRoomOwner: Ember.computed('session.person', function () {\n        const group = this.get('group');\n        return group && group.isPersonOwner(this.get('session.person'));\n    }),\n\n    resizeNewPopout: Ember.observer('popout', function () {\n        const popout = this.get('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    videoConversation: Ember.computed('webrtc.conversations.[]', function () {\n        let conversations = this.get('webrtc.conversations');\n        if (conversations) {\n            return conversations.findBy('room.jid', this.get('jid'));\n        }\n        return null;\n    }),\n\n    videoRoomFull: false,\n\n    subject: Ember.computed('rawSubject', 'group.{id,name}', 'oneToOneTarget.name', function () {\n        const group = this.get('group');\n\n        if (!group) {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\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.get('groupName');\n        } else {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n    }),\n\n    mapCanRemoveParticipant(participantList) {\n        const group = this.get('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            Ember.set(participant, 'canBeRemovedFromRoom', canRemove);\n            return participant;\n        });\n    },\n\n    sortedParticipants: Ember.computed('participants.@each.presence', 'allowUserRemoval', function () {\n        if (this.get('allowUserRemoval')) {\n            const list = this.mapCanRemoveParticipant(this.get('participants'));\n            return this.sortChatUsers(list);\n        }\n        return this.sortChatUsers(this.get('participants'));\n    }),\n\n    skipGroupDataCheckEnabled: true,\n\n    groupName: Ember.computed.reads('group.name'),\n\n    isAdhocRoom: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        return isRoomJid(jid) && _.isEmpty(this.get('groupName'));\n    }),\n\n    isAcdRoom: Ember.computed('jid', function () {\n        return isAcdJid(this.get('jid'));\n    }),\n\n    isSupervisorRoom: Ember.computed('jid', function () {\n        return isSupervisorJid(this.get('jid'));\n    }),\n\n    isSoftphoneRoom: Ember.computed('jid', function () {\n        return isSoftphoneJid(this.get('jid'));\n    }),\n\n    isOneToOne: Ember.computed('jid', function () {\n        return this.isOneToOneRoom();\n    }),\n\n    allowUserRemoval: true,\n\n    processRoomDetails({ owners }) {\n        this.set('roomOwners', owners);\n    },\n\n    isRoomOwner(person) {\n        const group = this.get('group');\n        const isGroupOwner = !!group && group.isPersonOwner(person);\n        const personId = Ember.get(person, 'id');\n        const isOwner = this.get('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        // we're skipping the haveGroupData check\n        if (this.get('skipGroupDataCheckEnabled')) {\n            if (group) {\n                return this.get('groupName');\n            }\n        } else if (group && haveGroupData(group)) {\n            return this.get('groupName');\n        }\n        return this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || '';\n    },\n\n    clearMessageCache() {\n        this.set('activated', false);\n        this.set('messages', []);\n        this.set('messageCache', Ember.Object.create({}));\n    },\n\n    pruneMessages() {\n        const messages = this.get('messages');\n        if (messages.length > PRUNE_SIZE) {\n            const messageCache = this.get('messageCache');\n            const splitMessageCache = this.get('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.get('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.get('messages').unshiftObjects(historyMessages);\n\n        const cache = this.get('messageCache');\n        _.each(historyMessages, message => {\n            cache.set(message.get('id'), message);\n        });\n    },\n\n    sortChatMessages() {\n        const messages = _.sortBy(this.get('messages'), message => {\n            return message.get('time').valueOf();\n        });\n        this.set('messages', messages);\n    },\n\n    processSplitMessageHistory() {\n        const messages = this.get('messages')\n            .map(message => {\n                if (message.get('isSplitMessage')) {\n                    const splitMessage = this.processSplitMessage(message);\n                    if (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.get('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.get('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.get('firstUnread')) {\n            this.set('firstUnread.firstUnread', false);\n            this.set('firstUnread', null);\n        }\n\n        const messages = this.get('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.get('splitMessageCache');\n        const stanza = message.get('stanza.children').findBy('name', 'multipart-message');\n        const splitMessageData = JSON.parse(Ember.get(stanza, 'children.lastObject'));\n        const splitMessageParentExists = Object.prototype.hasOwnProperty.call(splitMessageCache, splitMessageData.id);\n        if (!splitMessageParentExists) {\n            const owner = Ember.getOwner(this);\n            let splitMessage = SplitMessage.create(\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            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.get('messages');\n        const cache = this.get('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.get('isSupervisorRoom');\n        const isAcd = this.get('isAcdRoom');\n\n        if (!isAcd && !isSupervisor) {\n            this.bumpActivityCount(message);\n        }\n\n        if (message.get('unread') && !message.get('corrects')) {\n            if (!this.get('muted')) {\n                if (roomJid && !isAcd && !isSupervisor) {\n                    animateChatIcon();\n                }\n            }\n\n            if (!this.get('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            Ember.Logger.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.get('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.get('participants').addObject(person);\n        }\n    },\n\n    removeParticipant(person) {\n        this.get('participants').removeObject(person);\n    },\n\n    clearUnreadMessages() {\n        if (this.get('firstUnread')) {\n            this.get('firstUnread').set('firstUnread', false);\n        }\n        this.set('firstUnread', null);\n        const messages = this.get('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.get('jid'));\n    },\n\n    isGroupRoom() {\n        return isGroupJid(this.get('jid'));\n    },\n\n    isUserInRoom(userjid) {\n        return this.get('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.get('deferredParticipants').addObject(jid);\n    },\n\n    loadDeferredParticipants() {\n        let deferred = Ember.A([...this.get('deferredParticipants')]);\n        deferred.forEach(jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    this.addParticipant(person);\n                });\n            // Semi-deferred to run loop\n            Ember.run.join(() => this.get('deferredParticipants').removeObject(jid));\n        });\n    }\n});\n\nexport default ChatRoom;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\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    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\n    name: Ember.computed('person.name', 'associatedInteraction.customerName', function () {\n        return (\n            this.get('person.name') ||\n            this.get('associatedInteraction.customerName') ||\n            this.get('intl').t('ewc.unknownParticipant')\n        );\n    }),\n\n    // HACK PCDWEBK-2982: remove when video bridge send video when you dont provide it\n    noVideoTrack: Ember.computed('cameraStream', 'isV1', function () {\n        if (this.get('isV1')) {\n            return false;\n        }\n\n        const stream = this.get('cameraStream');\n        return !(stream && stream.getVideoTracks().length);\n    }),\n\n    speaking: false,\n\n    mediaPresence: Ember.computed.reads('person.mediaPresence'),\n\n    _getInteractionAvatarDisplay() {\n        if (this.get('videoMuted')) {\n            return true;\n        }\n        return false;\n    },\n\n    showAvatar: Ember.computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'inLastN',\n        'isOffline',\n        'noVideoTrack',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        function () {\n            if (this.get('associatedInteraction')) {\n                return this._getInteractionAvatarDisplay();\n            }\n\n            const videoMuted = this.get('videoMuted');\n            const sharingScreen = this.get('sharingScreen') || this.get('screenStream');\n            const state = this.get('connectionState');\n            const isOffline = this.get('isOffline');\n            const inLastN = this.get('inLastN');\n            const noVideo = this.get('noVideoTrack') && !sharingScreen;\n            const zeroBitrateCount = this.get('zeroBitrateCount');\n\n            if (\n                _.includes(['failed', 'checking', 'starting'], state) ||\n                isOffline ||\n                noVideo ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n            if (!inLastN) {\n                if (this.get('positiveBitrateCount') > 3) {\n                    Ember.Logger.warn('hiding avatar for !inLastN && positiveBitrateCount > 3', {\n                        remoteData: {\n                            kind: 'webrtcSession',\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: Ember.computed('showAvatar', function () {\n        return this.get('showAvatar') ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: Ember.computed('connectionState', 'person.presence', 'zeroBitrateCount', function () {\n        if (this.get('local') || this.get('associatedInteraction')) {\n            return false;\n        }\n\n        const connectionState = this.get('connectionState');\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.get('person') && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.get('zeroBitrateCount');\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: Ember.computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.get('intl');\n        const state = this.get('connectionState');\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.get('isOffline') || this.get('zeroBitrateCount') >= ZERO_BITRATE_THRESHOLD) &&\n            this.get('hasConnected')\n        ) {\n            return intl.lookup('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.lookup(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: Ember.computed('audioMuted', 'local', 'associatedInteraction', function () {\n        return !this.get('audioMuted') && !this.get('local') && !this.get('associatedInteraction');\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.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 DS from 'ember-data';\n\nexport default DS.Model.extend({\n    city: DS.attr(),\n    region: DS.attr(),\n    country: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'connections-ui/mixins/external-contacts';\nimport PersonModel from '../models/person';\nimport moment from '../utils/dates';\nimport { userGuidFromParticipant } from '../utils/conversation';\n\nconst { computed, get, inject, observer, run } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Object.extend(ExternalContactsMixin, {\n    application: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    chat: inject.service(),\n    phone: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n    names: inject.service(),\n    store: inject.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\n    hasDisplayedDesktopNotification: false,\n    acceptedByClient: false,\n\n    willDestroy() {\n        run.cancel(this.get('_recomputePartiesTimer'));\n        this._super(...arguments);\n    },\n\n    dialingTime: computed('isDialing', 'isContacting', 'participants.[]', function () {\n        if (this.get('isContacting')) {\n            return moment();\n        } else if (this.get('isDialing') && this.get('participants.length') > 1) {\n            return moment();\n        }\n    }),\n\n    otherPartyJid: null,\n    setOtherPartyJid: observer('onCall', 'otherPartyModel', 'otherParty', function () {\n        const promise = Ember.RSVP.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    }).on('init'),\n\n    startTime: computed('myself.connectedTime', 'isDialing', 'dialingTime', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        if (this.get('isDialing') && connectedTime === undefined) {\n            return this.get('dialingTime');\n        }\n        if (!this.get('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.get('myGuid');\n    }),\n\n    otherPartyThatIsNotTheInitiator: computed('participants.[]', 'conversationInitiator', 'myGuid', function () {\n        const initiator = this.get('conversationInitiator');\n        const otherParties = _.reject(this.get('participants'), party => {\n            const partyId = party && party.userId;\n            const initiatorId = initiator && initiator.userId;\n            return partyId === initiatorId || partyId === this.get('myGuid');\n        });\n        return _.last(otherParties);\n    }),\n\n    otherParticipantsThatAreNotTheInitiator: computed(\n        'participants.[]',\n        'conversationInitiator',\n        'myGuid',\n        function () {\n            const initiator = this.get('conversationInitiator');\n            const otherParties = _.reject(this.get('participants'), party => {\n                const partyId = party && party.userId;\n                const initiatorId = initiator && initiator.userId;\n                return partyId === initiatorId || partyId === this.get('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.get('otherPartyThatIsNotTheInitiator'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator');\n    }),\n\n    setLastPartyTalkingTo: observer('connectedParties.[]', function () {\n        const connectedParties = _.reject(this.get('connectedParties'), party => {\n            return party && party.userId === this.get('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.get('lastPartyTalkingTo'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('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.get('initiatorModel');\n            const initiator = _.find(this.get('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[0];\n            const otherPartyThatIsNotTheInitiatorConnected =\n                otherPartyThatIsNotTheInitiatorCall.state.toLowerCase() === 'connected';\n            if (this.get('iAmInitiatorOfConsult')) {\n                if (this.get('onCall')) {\n                    return _.head(this.get('otherParties'));\n                }\n                if (this.get('connectedParties.length') < 1) {\n                    return this.get('lastDisconnectedPartyModel');\n                }\n                return _.head(this.get('connectedParties'));\n            } else {\n                if (initiatorConnected) {\n                    return initiatorModel;\n                }\n                if (otherPartyThatIsNotTheInitiatorConnected) {\n                    return this.get('otherPartyThatIsNotTheInitiatorModel');\n                }\n                if (this.get('otherPartyModel') === undefined) {\n                    return this.get('lastPartyTalkingToModel');\n                }\n                return this.get('otherPartyModel');\n            }\n        }\n    ),\n\n    consultOtherPartyModel: computed('consultOtherParty', 'participants.[]', 'onCall', function () {\n        const guid = userGuidFromParticipant(this.get('consultOtherParty'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('consultOtherParty');\n    }),\n\n    participantModels: computed('participants.[]', function () {\n        const participants = _.reject(this.get('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.get('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.get('addressformat').formatAddressForDisplay(number, null, { doLookup: true });\n        }\n    }),\n\n    otherParties: computed('participants.[]', function () {\n        const otherParties = _.filter(this.get('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.get('myGuid') === guid;\n            const isMonitor = !!participant.monitoredParticipantId;\n            const isCoach = !!participant.coachedParticipantId;\n            const isBarge = !!participant.bargedParticipantId;\n\n            if (notTerminatedOrDisconnected && !isMonitor && !isCoach && !isBarge) {\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.get('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.get('myGuid') &&\n                participant.purpose !== 'ivr' &&\n                participant.purpose !== 'group'\n            );\n        });\n    }),\n\n    sortedDisconnectedParties: computed.sort('disconnectedParties', function (a, b) {\n        return moment(b.endTime).valueOf() - moment(a.endTime).valueOf();\n    }),\n\n    lastDisconnectedPartyModel: computed('sortedDisconnectedParties', function () {\n        const last = _.last(this.get('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.get('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.get('disconnectedParties') : this.get('connectedParties');\n\n        parties = parties.reject(\n            p =>\n                p.purpose === 'ivr' ||\n                p.purpose === 'group' ||\n                p.userId === this.get('myGuid') ||\n                !!p.coachedParticipantId ||\n                !!p.monitoredParticipantId ||\n                !!p.bargedParticipantId // Both ACD and Communicate should not display monitor/coached or barged in users\n        );\n\n        if (parties.length > 0) {\n            return parties.get('lastObject');\n        }\n        const otherParties = this.get('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.get('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.get('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.get('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.get('onConference')) {\n            return this.get('onConsult') ? this.get('otherParties') : [this.get('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.get('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.get('conversationIsAConsult');\n            if (isConsult && !this.get('iAmInitiatorOfConsult')) {\n                return this.get('lastPartyTalkingToModel');\n            }\n            const otherParties = _.filter(this.get('participants'), party => {\n                const guid = userGuidFromParticipant(party);\n                const isSelf = guid === this.get('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            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 => !Ember.get(otherParty, 'endTime'));\n                return _.head(otherPartiesNoEndTime);\n            }\n\n            return _.head(otherParties);\n        }\n    ),\n\n    otherDisconnectedPartyModel: computed('otherDisconnectedParty', function () {\n        const participant = this.get('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.get('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.get('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.get('initiator');\n        if (!_.isEmpty(initiator) && this.get('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.get('otherParties'), party => {\n            return party.id === myConsultId;\n        });\n        const nonInitiator = _.last(consultParty);\n        return this.get('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.get('participants'), participant => {\n            const isMe = this.get('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: computed.reads('session.person.guid'),\n    myself: computed('participants.[]', 'myGuid', 'hasActiveAgent', function () {\n        const hasActiveAgent = this.get('hasActiveAgent');\n        return _.findLast(this.get('participants'), participant => {\n            const isMe = this.get('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            // 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: computed.bool('myself.monitoredParticipantId'),\n    myselfIsCoach: computed.bool('myself.coachedParticipantId'),\n\n    myselfIsBarged: computed('myself.bargedParticipantId', function () {\n        const bargedParticipantId = this.get('myself.bargedParticipantId');\n        const bargedParticipant =\n            (this.get('participants') || []).find(participant => participant.id === bargedParticipantId) || {};\n\n        const disconnectType = get(bargedParticipant, 'calls.firstObject.disconnectType');\n        return bargedParticipantId && !disconnectType;\n    }),\n\n    myselfIsMCB: computed.or('myselfIsMonitor', 'myselfIsCoach', 'myselfIsBarged'),\n\n    monitoredParticipant: computed('myselfIsMonitor', 'myself.monitoredParticipantId', 'allParties', function () {\n        if (this.get('myselfIsMonitor')) {\n            return this.get('allParties').findBy('id', this.get('myself.monitoredParticipantId'));\n        }\n        return null;\n    }),\n\n    coachedParticipant: computed('myselfIsCoach', 'myself.coachedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsCoach')) {\n            return this.get('allParties').findBy('id', this.get('myself.coachedParticipantId'));\n        }\n        return null;\n    }),\n\n    bargedParticipant: computed('myselfIsBarged', 'myself.bargedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsBarged')) {\n            return this.get('allParties').findBy('id', this.get('myself.bargedParticipantId'));\n        }\n        return null;\n    }),\n\n    monitoredParticipantPerson: computed('monitoredParticipant', function () {\n        const monitoredParticipant = this.get('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.get('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.get('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    isAgentCall: computed('participants.[]', 'myself', 'myselfIsMCB', function () {\n        const isSelfMCB = this.get('myselfIsMCB');\n\n        // Otherwise, if there is another agent on the call, I want to view this conversation in ACD.\n        const participants = this.get('participants') || [];\n        return participants.some(user => maybeLowerCase(user.purpose) === 'agent') || isSelfMCB;\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: true,\n\n    isWrapupPromptAgentRequested: computed(\n        'myself.{wrapupPrompt,wrapupTimeoutMs}',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('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: computed.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.get('isNonDiscretionaryCompletion');\n    }),\n\n    callState: computed.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: computed.reads('callState.errorInfo'),\n    errorInfoMessage: computed.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 =\n            this.get('participants.firstObject.userId') === this.get('myGuid') && this.get('isContacting');\n        return this.get('participants').length === 1 && iAmContacting;\n    }),\n\n    theOtherPartyWhileContacting: computed('justMyselfOnCall', 'attemptingToCall', function () {\n        if (!this.get('justMyselfOnCall')) {\n            return;\n        }\n        const address = this.get('attemptingToCall');\n        if (address) {\n            const userId = Ember.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.get('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.get('id') === this.get('phone.activeCall.id');\n    }),\n\n    isHeld: computed.and('callState.held', 'onCall'),\n    isConfined: computed.and('callState.confined', 'onCall', 'onConsult'),\n    isMuted: computed.and('callState.muted', 'onCall'),\n    isRecording: computed.and('callState.recording', 'onCall'),\n    isDisconnected: computed.not('onCall'),\n    wentToVoicemail: computed('allParties.@each.purpose', function () {\n        const parties = this.get('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.get('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.get('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.get('participants'), participant => {\n            return participant.consultParticipantId;\n        });\n        if (this.get('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.get('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.get('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.get('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.get('groupRingId');\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        const groupId = this.get('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.get('isGroupRing')) {\n            return null;\n        }\n\n        // We are going to mimic the callv2 behavior, for consistency\n        let participants = this.get('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 Ember.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.get('isOutbound') && this.get('_groupRingCaller.userId') === this.get('myGuid');\n    }),\n\n    groupRingCaller: computed('_groupRingCaller', function () {\n        const actualCaller = this.get('_groupRingCaller');\n        let caller = actualCaller;\n\n        if (caller && caller.userId) {\n            let promise = this.get('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.get('participants');\n        const anotherPartyIsStation = !!participants.find(p => {\n            const isStation = Ember.get(p, 'purpose') === 'station';\n            if (!isStation) {\n                return false;\n            }\n            const isStandaloneStation = Ember.get(p, 'name');\n            if (isStandaloneStation) {\n                return false;\n            }\n            return Ember.get(p, 'calls.firstObject.disconnectType') !== 'transfer.forward';\n        });\n        const anotherPartyIsVoicemail = !!participants.findBy('purpose', 'voicemail');\n        return anotherPartyIsStation && !this.get('onConference') && !anotherPartyIsVoicemail;\n    }),\n\n    _doesParticipantHaveActiveSessionShare: function (participant) {\n        const screenShares = Ember.get(participant, 'screenShares') || Ember.get(participant, 'screenshares');\n        const cobrowsesessions = Ember.get(participant, 'cobrowsesessions');\n        const videos = Ember.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.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const purpose = participant.purpose.toLowerCase();\n            return this.get('myGuid') === guid && (purpose === 'agent' || purpose === 'user');\n        });\n    }),\n\n    conversationHasActiveSessionShare: computed('agentParticipants.[]', function () {\n        let hasActiveMedia = _.some(this.get('agentParticipants'), participant => {\n            return this._doesParticipantHaveActiveSessionShare(participant);\n        });\n        return hasActiveMedia;\n    })\n});\n","define(\"connections-ui/models/conversation\", [\"exports\", \"ember-purecloud-components/models/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    homeDivision: DS.attr('boolean')\n});\n","define(\"connections-ui/models/email-communication\", [\"exports\", \"ember-purecloud-components/models/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import TranslationModel from 'ember-intl/models/translation';\n\n/* Allows support for both dot-separated keys and nested objects in the dictionary\n * For example, all of the following are supported\n       {\n            'greeting': \"Hello!\",\n            \"error\": {\n                \"catastrophic.failure\": \"The world has ended.\"\n            },\n            \"my.favorite.color\": \"fuchsia\"\n       }\n*/\nexport default TranslationModel.extend({\n    addTranslation(key, value) {\n        this.get('translations')[key] = value;\n    },\n    getValue(key) {\n        if (key) {\n            let segments = key.split('.');\n            let level = this.get('translations');\n            let i = 0;\n\n            for (i = 0; i < segments.length; i++) {\n                let value = level[segments.slice(i).join('.')];\n\n                if (typeof value === 'string') {\n                    return value;\n                }\n\n                let segment = segments[i];\n\n                if (Object.prototype.hasOwnProperty.call(level, segment)) {\n                    level = level[segment];\n                } else {\n                    break;\n                }\n            }\n        }\n\n        return undefined;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.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: Ember.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 Ember from 'ember';\nimport DS from 'ember-data';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\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 DS from 'ember-data';\n\nexport default DS.Model.extend({\n    channelId: DS.attr('string'),\n    isNewChannel: DS.attr('boolean')\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const PreferredPhoneContactOrder = ['workPhone', 'homePhone', 'cellPhone', 'otherPhone', 'whatsAppId'];\nexport const PreferredEmailContactOrder = ['workEmail', 'personalEmail', 'otherEmail'];\nexport const ENTITY_TYPE = 'externalcontacts/contact';\n\nconst { computed } = Ember;\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    names: Ember.inject.service(),\n    schemaService: Ember.inject.service('schema'),\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.get('contactType') === 'curated';\n    }),\n    isIdentified: computed('contactType', function () {\n        return this.get('contactType') === 'identified';\n    }),\n\n    canonicalId: computed.alias('canonicalContact.id'),\n    divisionName: computed.alias('division.name'),\n    isCanonical: computed('id', 'canonicalId', function () {\n        const { canonicalId, id } = this.getProperties('canonicalId', 'id');\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.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    hasEmailAddresses: Ember.computed.bool('bestEmailAddress'),\n\n    //these aliases are used to aid in validation.\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    isSalesForce: computed.bool('salesforceLink'),\n    acdOutboundWhatsApp: true,\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, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    initials: computed('firstName', 'lastName', function () {\n        return this.get('names').initials(this);\n    }),\n    name: computed('firstName', 'lastName', 'middleName', function () {\n        return this.get('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 this.get('acdOutboundWhatsApp') && 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')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return bestPhoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${bestPhoneType}`)\n            : 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.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.emailTypes.otherEmail');\n    },\n\n    getPhoneTitleFor(phoneType) {\n        if (phoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return phoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`)\n            : this.get('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.get('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    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.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        if (this.get('canShowCustomFields') && id) {\n            return await this.get('schemaService')\n                .getSchema(schemaType, id)\n                .catch(() => {\n                    return SERVICE_ERROR;\n                });\n        } else {\n            return '';\n        }\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData && schemaData !== SERVICE_ERROR ? schemaData.get('name') : schemaData;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport moment from '../../utils/dates';\n\nconst { computed } = Ember;\nexport const PreferredPhoneContactOrder = ['phoneNumber', 'faxNumber'];\nconst getSetter = function (index) {\n    return {\n        get() {\n            const websites = this.get('websites');\n            return websites ? websites[index] : null;\n        },\n        set(key, value) {\n            const websites = this.get('websites');\n            websites[index] = value;\n            return websites[index];\n        }\n    };\n};\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    isOrganization: true,\n    schemaService: Ember.inject.service('schema'),\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: computed.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, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('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: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        return this.get('canShowCustomFields') && id ? await this.get('schemaService').getSchema(schemaType, id) : '';\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData ? schemaData.get('name') : '';\n    })\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const FACEBOOKID_TYPE = 'externalcontacts/facebook-id';\n\nexport default Channel.extend({\n    type: 'facebook',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const LINEID_TYPE = 'externalcontacts/line-id';\n\nexport default Channel.extend({\n    type: 'line',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const TWITTERID_TYPE = 'externalcontacts/twitter-id';\n\nexport default Channel.extend({\n    type: 'twitter',\n    id: DS.attr('string'),\n    name: DS.attr('string'),\n    screenName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const WHATSAPP_TYPE = 'externalcontacts/whatsapp-id';\n\nexport default Channel.extend({\n    type: 'whatsapp',\n    displayName: DS.attr('string'),\n    phoneNumber: DS.attr() // includes e164: an e164-formatted phone number, and display: a display-friendly phone number\n});\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.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.get('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.get('isDefaultName')) {\n            return this.get('intl')\n                .t('notification.inbox.faxFrom', { callerAddress: this.get('callerAddress') })\n                .toString();\n        }\n        return this.get('name');\n    }),\n\n    faxFrom: computed('callerAddress', 'createdBy', function () {\n        const callerAddress = this.get('callerAddress');\n        if (callerAddress) {\n            return callerAddress;\n        }\n        return this.get('intl').lookup('notification.inbox.unknownSender');\n    }),\n\n    faxFile: computed('filename', 'name', function () {\n        const name = this.get('name');\n        if (name) {\n            return name;\n        }\n        return this.get('filename');\n    }),\n    displayThumbnail: computed('thumbnails.[]', function () {\n        const thumbnails = this.get('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 Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, observer } = Ember;\n\nconst ISSUE_REGEX = /http(?:s)?:\\/\\/github\\.com\\/[a-zA-Z0-9_\\-.]+\\/[a-zA-Z0-9\\-.]+\\/issues\\/([0-9]+)$/i;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    preferences: inject.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.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .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: computed.equal('mediaType', 'github-repo'),\n    isGist: computed.equal('mediaType', 'github-gist'),\n\n    isIssue: computed('link', 'isRepo', function () {\n        if (!this.get('isRepo')) {\n            return false;\n        }\n\n        return ISSUE_REGEX.test(this.get('link'));\n    }),\n\n    issueNumber: computed('link', function () {\n        return _.last(this.get('link').match(ISSUE_REGEX));\n    }),\n\n    title: computed('username', 'repo', 'isRepo', 'isGist', 'isIssue', function () {\n        const intl = this.get('intl');\n        const username = this.get('username');\n        if (this.get('isGist')) {\n            return intl.t('chat.inlineMedia.gistTitle', { username }).toString();\n        } else if (this.get('isRepo')) {\n            const repo = this.get('repo');\n            if (this.get('isIssue')) {\n                const issue = this.get('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.get('intl').lookup('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.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                this.set('settings', settings);\n                this.set('showEmbedConfirmation', settings.showEmbedConfirmation);\n            });\n    }),\n\n    setEmbedPreference(pref) {\n        let settings = this.get('settings');\n        Ember.setProperties(settings, {\n            embed: pref,\n            showEmbedConfirmation: false\n        });\n\n        this.set('showEmbedConfirmation', false);\n\n        this.get('preferences').setPreference('widgets.githubRepo', settings);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    division: DS.attr(),\n    role: DS.attr(),\n    subjectId: DS.attr('string')\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 Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityMixin from '../mixins/entity';\nimport EntityImageComponent from 'ember-purecloud-components/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: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    permissions: Ember.inject.service(),\n\n    meta: DS.attr(),\n    policy: DS.belongsTo('group-policy'),\n\n    acdSkills: null,\n\n    lastSavedExpression: null,\n\n    expression: Ember.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: Ember.computed(\n        'expression',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            return this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')\n                ? !!this.get('expression')\n                : false;\n        }\n    ),\n\n    reload() {\n        this.notifyPropertyChange('greeting');\n        this.get('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.get('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: Ember.computed('guid', function () {\n        const path = `api/v2/groups/${this.get('guid')}/greetings/defaults`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return DS.PromiseObject.create({\n            promise: this.get('ajax').request(url)\n        });\n    }),\n\n    _expression: Ember.computed(\n        'guid',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            if (this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')) {\n                const path = `api/v2/groups/${this.get('guid')}/dynamicsettings`;\n                const url = this.get('application').pcV2Uri(path);\n                return DS.PromiseObject.create({\n                    promise: this.get('ajax')\n                        .ajaxGet(url, {\n                            retry: true\n                        })\n                        .then(res => {\n                            return Ember.RSVP.resolve(res.query);\n                        })\n                        .catch(err => {\n                            if (err.status === 404) {\n                                //this group is confirmed not a dynamic group\n                                return Ember.RSVP.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.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.permissionErrorMessage')\n                                );\n                            } else {\n                                //actual error\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.loadErrorMessage')\n                                );\n                                return Ember.RSVP.resolve(null);\n                            }\n                        })\n                });\n            }\n        }\n    ),\n\n    description: Ember.computed('general.description.@each.value', function () {\n        return this.getFieldValue('general.description').value;\n    }),\n\n    groupType: Ember.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.get('intl').lookup(key, null, true).toString();\n        }\n\n        return '';\n    }),\n\n    memberCount: Ember.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: Ember.computed('images.activeProfilePicture', function () {\n        var images = this.get('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: Ember.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: Ember.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: Ember.computed('privacy.groupVisibility', function () {\n        return this.getFieldValue('privacy.groupVisibility').value;\n    }),\n\n    membershipVisible: Ember.computed('privacy.membershipVisible', function () {\n        return this.getFieldValue('privacy.membershipVisible').value;\n    }),\n\n    includeOwners: Ember.computed('membership.includeOwners', function () {\n        var visible = this.getFieldValue('membership.includeOwners').value;\n        return this.get('intl').lookup(`entity.fieldTypes.boolean.checked-${visible}`).toString();\n    }),\n\n    areOwnersIncluded: Ember.computed('membership.includeOwners', function () {\n        return this.getFieldValue('membership.includeOwners').value;\n    }),\n\n    groupEmailAddress: Ember.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: Ember.computed('general.needsCommit', function () {\n        return this.getFieldValue('general.needsCommit').value;\n    }),\n\n    membershipSearchQuery: Ember.computed('membership.compiledQuery.[]', function () {\n        var compiledQuery = this.getFieldValue('membership.compiledQuery');\n        var query = Ember.get(compiledQuery, 'value.q');\n        if (query && query.length) {\n            return query[0].value;\n        }\n\n        return '';\n    }),\n\n    generalSearchQuery: Ember.computed('id', 'general.groupType', function () {\n        var groupType = this.getFieldValue('general.groupType').value;\n        return `${groupType}:${this.get('guid')}`;\n    }),\n\n    isActive: Ember.computed('state', function () {\n        return this.get('state') === 'active';\n    }),\n\n    isDeleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    jid: Ember.computed('_id', 'contactInfo.chat.[]', function () {\n        // Synthesizing jid from a missing `_id` previously produced \"undefined@conference.<org>.orgspan.com\".\n        // Prefer the API-provided chat jid. Search/partial loads often omit `_id` even when contactInfo.chat is present;\n        const chatJid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (chatJid) return chatJid;\n\n        const id = this.get('_id');\n        if (!id) return null;\n\n        const org = this.get('application.session.org');\n        const shortName = Ember.get(org, 'general.shortName');\n        const name = shortName && shortName[0] && shortName[0].value;\n        if (!name) return null;\n\n        return `${id}@conference.${name}.orgspan.com`;\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve()\n        });\n    }),\n\n    // -- Handles Grants and Roles Associated with the Group --\n\n    allowPermissionGroup: Ember.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 Ember.RSVP.Promise(resolve => {\n            var path = `api/v2/authorization/subjects/${this.get('guid')}`;\n            var url = this.get('application').pcV2Uri(path);\n            this.get('ajax')\n                .ajaxGet(url)\n                .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: Ember.computed('contactInfo.groupNumber.@each.value', 'contactInfo.groupNumber.@each.rel', function () {\n        return this.getFieldValue('contactInfo.groupNumber');\n    }),\n\n    //TODO: Delete these references to the policy model when group contact modal is deleted\n    numberOfRotations: Ember.computed('policy.stopRingingAfterRotations', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('stopRingingAfterRotations'));\n            })()\n        });\n    }),\n\n    rotateCallSeconds: Ember.computed('policy.rotateCallsSecs', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('rotateCallsSecs'));\n            })()\n        });\n    }),\n\n    emailNotificationEnabled: Ember.computed.reads('policy.sendEmailNotifications', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('sendEmailNotifications'));\n            })()\n        });\n    }),\n\n    voicemailEnabled: Ember.computed('policy.enabled', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('enabled'));\n            })()\n        });\n    }),\n\n    membershipChange: Ember.observer('membership.inclusions.[]', 'membership.exclusions.[]', function () {\n        var membership = this.get('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    /**\n     * We derive the Jabber ID for a group from the `_id` property.\n     * Normally, this is set in the group serializer.\n     * Search results do not go through the group serializer.\n     * We need to set the `_id` on the group entity so that `group.get('jid')` resolves properly.\n     * @returns\n     */\n    setIdForGroupEntity() {\n        const existingId = this.get('_id');\n        if (existingId) {\n            return;\n        }\n        const jid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (jid) {\n            const idParts = jid.split('@');\n            const id = idParts.length > 0 ? idParts[0] : '';\n            Ember.run(() => {\n                this.set('_id', id);\n            });\n        }\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            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'images.profilePictures');\n\n            this.notifyPropertyChange('profilePicture');\n        }\n    },\n\n    deleteGrant(grant) {\n        var path = `/api/v2/authorization/subjects/${this.get('id')}/scopes/${grant.get('scope.id')}/roles/${grant.get(\n            'role.id'\n        )}`;\n        var url = this.get('application').pcV2Uri(path);\n        return this.get('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 Ember from 'ember';\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\nconst { getOwner, computed, copy, typeOf, isPresent } = Ember;\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.get('subdomain') || netUtils.getPcApplicationsSubdomain();\n            let envDetails = this.get('envDetails');\n            let path = this.get('path');\n            let query = this.get('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            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derrived urlTemplate property instead of path property.'),\n                {\n                    path: this.get('path'),\n                    remoteData: {\n                        appId: this.get('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.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            subdomain: this.get('subdomain'),\n            envDetails: copy(this.get('envDetails'), deep),\n            path: this.get('path'),\n            query: this.get('query'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? copy(this.get('sandbox'), true) : this.get('sandbox'),\n            assets: copy(this.get('assets'), deep),\n            lifecycle: copy(this.get('lifecycle'), deep),\n            permissionsPolicy: deep ? copy(this.get('permissionsPolicy'), true) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default InternallyHostedApp;\n","import DS from 'ember-data';\n\nvar LibraryModel = DS.Model.extend({\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    responses: DS.attr()\n});\n\nexport default LibraryModel;\n","import Ember from 'ember';\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: Ember.inject.service(),\n    session: Ember.inject.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    floorplanImage: DS.attr(),\n    floorplanImageHistory: 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: Ember.computed('profileImage', 'parent.{images,isFulfilled}', 'images', function () {\n        let profileImages = this.get('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.get('images')) {\n            let images = this.get('images');\n            return images;\n        }\n\n        return undefined;\n    }),\n\n    floorCount: Ember.computed('sublocationOrder', function () {\n        var subs = this.get('sublocationOrder');\n\n        if (_.isEmpty(subs)) {\n            return 0;\n        }\n\n        return subs.length;\n    }),\n\n    type: Ember.computed('path', function () {\n        var path = this.get('path');\n\n        if (path && Array.isArray(path) && path.length > 0) {\n            return 'floor';\n        }\n\n        return 'location';\n    }),\n\n    isFloor: Ember.computed('type', function () {\n        return this.get('type') === 'floor';\n    }),\n\n    deleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    hasContactPerson: Ember.computed('contactPersonId', function () {\n        return this.get('contactPersonId') !== null && this.get('contactPersonId') !== undefined;\n    }),\n\n    contactPerson: Ember.computed('contactPersonId', function () {\n        var id = this.get('contactPersonId');\n        if (id) {\n            return this.store.find('person', id);\n        }\n    }),\n\n    floorplan: Ember.computed('floorplanImage', function () {\n        let images = this.get('floorplanImage');\n        if (!_.isEmpty(images)) {\n            let image = images.find(image => image.resolution === 'x1024');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    _parent: null,\n    parent: Ember.computed('type', 'path', function () {\n        if (this.get('type') === 'floor') {\n            let promise;\n            if (this.get('_parent')) {\n                promise = this.get('_parent');\n            } else {\n                promise = this.get('store').findRecord('location', this.get('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: Ember.RSVP.resolve(undefined)\n        });\n    }),\n\n    containsRichAddress: Ember.computed('address', function () {\n        let address = this.get('address');\n        return typeof address !== 'string';\n    }),\n\n    setFloor() {\n        return;\n    }\n});\n\nexport default LocationModel;\n","import Model from 'ember-data/model';\nimport attr from 'ember-data/attr';\nimport Ember from 'ember';\n\nexport default Model.extend({\n    //id on the model is the occurrence id, not the meeting id\n    roomId: attr(),\n    subject: attr(),\n    description: attr(),\n    organizer: attr(),\n\n    attendees: attr(),\n    notifyAttendees: attr(),\n\n    startDate: attr('iso-date'),\n    endDate: attr(),\n    duration: attr(),\n    recurringType: attr(),\n\n    version: attr(),\n    meeting: attr(), //object that holds the meeting id\n\n    meetingAttendees: Ember.computed('attendees', function () {\n        if (this.get('attendees')) {\n            return Ember.RSVP.resolve(this.get('attendees'));\n        }\n        return this.get('store')\n            .findRecord('meeting', this.get('id'), { reload: true })\n            .then(meeting => meeting.get('attendees'));\n    })\n});\n","define(\"connections-ui/models/message-communication\", [\"exports\", \"ember-purecloud-components/models/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.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.get('application').pcV2Uri(path);\n        const promise = this.get('ajax').request(url);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    orgDefaultCountryCode: computed(\n        'general.defaultCountryCode.@each.value',\n        'session.user.organization.defaultCountryCode',\n        '_orgDetails.content.defaultCountryCode',\n        function () {\n            const fieldValue = this.getFieldValue('general.defaultCountryCode');\n            if (fieldValue && fieldValue.value) {\n                return fieldValue.value;\n            }\n\n            const sessionUserOrgCountryCodeValue = this.get('session.user.organization.defaultCountryCode');\n            if (sessionUserOrgCountryCodeValue) {\n                return sessionUserOrgCountryCodeValue;\n            }\n\n            const orgDetails = this.get('_orgDetails.content');\n            if (orgDetails && orgDetails.defaultCountryCode) {\n                return orgDetails.defaultCountryCode;\n            }\n\n            return null;\n        }\n    ),\n\n    orgPreferences: computed('preferences.preferences.@each.value', function () {\n        const preferences = this.getFieldValue('preferences.preferences');\n        let parsedPreferences;\n        try {\n            parsedPreferences = JSON.parse(preferences.value);\n        } catch (err) {\n            parsedPreferences = {};\n        }\n        return parsedPreferences;\n    })\n});\n","define(\"connections-ui/models/participant\", [\"exports\", \"ember-purecloud-components/models/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { getEntityObjectId } from 'ember-purecloud-components/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\nconst { get, set, computed } = Ember;\n\nlet permissionRoutes = ['person.detail', 'person.detail.index', 'card.detail'];\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    _.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            Ember.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        if (this.hasRecord) {\n            changedKeys = this._changedKeys(data.attributes);\n        }\n\n        merge(this._data, data.attributes);\n\n        // Partial reloading is not a thing for people/groups\n        // So we've gotta clear the data that no longer exists\n        if (this.isReloading) {\n            clearProperties(this._data, data.attributes, changedKeys, type);\n        }\n\n        this.pushedData();\n\n        const record = this.record || this._record;\n        if (record) {\n            record._notifyProperties(changedKeys);\n        }\n        if (this.didInitializeData) {\n            this.didInitializeData();\n        }\n    } else {\n        _setupData.apply(this, arguments);\n    }\n};\n\nlet PersonModel = DS.Model.extend(EntityMixin, ChatUserMixin, EntityPresenceMixin, {\n    ajax: Ember.inject.service(),\n    search: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    _readWritePermissions: null,\n\n    _directReports: null,\n    _siblings: null,\n    _superiors: null,\n\n    namedPermissions: Ember.computed.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: computed.alias('expands'),\n    activities: computed.alias('_activities'),\n\n    // private values just used to simplify computed functions\n    _activityCall: computed.reads('activities.conversationSummary.call'),\n    _activityCallback: computed.reads('activities.conversationSummary.callback'),\n    _activityChat: computed.reads('activities.conversationSummary.message'),\n    _activityWebChat: computed.reads('activities.conversationSummary.chat'),\n    _activityEmail: computed.reads('activities.conversationSummary.email'),\n\n    guid: computed.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    init: function () {\n        this._super(...arguments);\n        this.set('presenceList', Ember.A());\n        this.set('personDetail', Ember.getOwner(this).lookup('controller:person/detail'));\n\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\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.get('totalCalls') + this.get('totalCallbacks'),\n            emails: this.get('totalEmails'),\n            chats: this.get('totalChats') + this.get('totalWebChats')\n        };\n    }),\n\n    title: Ember.computed('general.title.@each.value', function () {\n        var field = this.getFieldValue('general.title');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    department: Ember.computed('general.department.@each.value', function () {\n        var field = this.getFieldValue('general.department');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.email');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email_main: Ember.computed('contactInfo.email_main', function () {\n        var field = this.getFieldValue('contactInfo.email_main');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    phone: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.voice');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    integrationPhone: Ember.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: Ember.computed('agent', function () {\n        var field = this.getFieldValue('agent.name');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    uploadedProfilePictures: Ember.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: Ember.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    socialGroups: Ember.computed('groups.social.[]', function () {\n        return this.getGroupsByType('groups.social');\n    }),\n\n    officialGroups: Ember.computed('groups.official.[]', function () {\n        return this.getGroupsByType('groups.official');\n    }),\n\n    distributionGroups: Ember.computed('purecloud.distributionGroups', function () {\n        return this.getGroupsByType('purecloud.distributionGroups');\n    }),\n\n    ownedGroups: Ember.computed('id', function () {\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.get('search')\n                .performSearch(this.get('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: Ember.computed('relationships.manager.[]', 'relationships.manager.@each.value', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'guid') || Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('store').findRecord('person', managerId, BASE_PERSON);\n        } else {\n            promise = Ember.RSVP.resolve({});\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    managerSiblings: Ember.computed('manager', 'manager.isFulfilled', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('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 = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    otherRelationships: Ember.computed('relationships.relationships.[]', function () {\n        let values = this.getFieldValue('relationships.relationships');\n        let ids = values.mapBy('value');\n        let promise = Ember.RSVP.resolve([]);\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    groupedOtherRelationships: Ember.computed('relationships.relationships', function () {\n        var fieldValue = this.getFieldValue('relationships.relationships');\n\n        if (!fieldValue) {\n            return Ember.RSVP.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 = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    adminAssistants: Ember.computed('relationships.administrativeAssistant.[]', function () {\n        if (this.get('_adminAssistantsRequest')) {\n            return this.get('_adminAssistantsRequest');\n        }\n\n        let promise = Ember.RSVP.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            Ember.Logger.warn('adminAssistants had unexpected value', { field });\n            return DS.PromiseArray.create({ promise });\n        }\n\n        let ids = field.mapBy('value');\n        let cachedData = this.get('_adminAssistants');\n\n        // Check cached data and resolve with it if it matches\n        if (!!cachedData && cachedData.length > 0) {\n            let cachedIds = Ember.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: Ember.RSVP.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: Ember.computed(\n        '_superiors',\n        'path.[]',\n        'relationships.manager.[]',\n        'relationships.manager.@each.value',\n        function () {\n            if (this._loadingSuperiors && this.get('_superiors')) {\n                return this.get('_superiors');\n            }\n\n            const cache = this.get('_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.get('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.get('id'), BASE_PERSON)\n                .finally(() => (this._loadingSuperiors = false));\n            this.set('_superiors', superiors);\n            return superiors;\n        }\n    ),\n\n    directReports: Ember.computed('children.[]', function () {\n        if (this.get('_currentReportsRequest')) {\n            return DS.PromiseArray.create({\n                promise: this.get('_currentReportsRequest')\n            });\n        }\n\n        const id = this.get('id');\n        this.get('logger').info('Refreshing direct reports:', { id });\n\n        let promise = Ember.RSVP.resolve([]);\n\n        let children = this.get('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.get('_directReports');\n\n        // Check for the existence of the children prop\n        const dataDiscrepancy = !_.isEmpty(this.get('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(Ember.A(children).sort(), Ember.A(cachedReports).mapBy('id').sort());\n\n        if (doNotLoad) {\n            this.get('logger').info('No direct reports needed to be loaded:', { id });\n        } else if (cachedIsSame && this.get('_directReports')) {\n            this.get('logger').info('Resolving with cached direct reports:', { id });\n            promise = this.get('_directReports') || Ember.RSVP.resolve([]);\n        } else {\n            this.get('logger').info('Loading fresh direct reports', { id });\n            promise = this.store.findDirectReports('person', this.get('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: Ember.computed('jid', 'id', function () {\n        const jid = this.get('jid');\n        const entityId = getEntityObjectId(jid);\n        const id = entityId || this.get('id');\n        const promise = this.get('search').countHierarchyReports(id);\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    siblings: Ember.computed('manager', 'selfAndSiblings', function () {\n        var promise = this.get('selfAndSiblings')\n            .then(siblings => {\n                return siblings.filter(person => {\n                    return person.get('id') !== this.get('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: Ember.computed('manager', function () {\n        var promise = this.get('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: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve([])\n        });\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        let promise = new Ember.RSVP.Promise(resolve => {\n            resolve({\n                read: [],\n                write: []\n            });\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    roles: Ember.computed.reads('application.session.roleNames'),\n\n    /* TODO: Start moving these to permissions service */\n    isAdmin: Ember.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: Ember.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: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_admin') > -1;\n    }),\n\n    isNotBusy: Ember.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    isCommunicateUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.includes(this.get('application.session.namedPermissions'), 'unified_communications');\n    }),\n\n    updatePermissionsOnRouteChange: Ember.observer('application.currentRouteName', function () {\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n    }),\n\n    clearDirectReportsCache() {\n        this.set('_directReports', null);\n        this.set('children', []);\n    },\n\n    onProfilePage: function () {\n        var onProfilePage = false;\n        var route = this.get('application.currentRouteName');\n        if (route) {\n            onProfilePage = permissionRoutes.indexOf(this.get('application.currentRouteName')) > -1;\n        }\n\n        var personDetailController = this.get('personDetail');\n        if (onProfilePage && personDetailController) {\n            var personId = personDetailController.get('model.id');\n            return this.get('id') === personId;\n        }\n        return false;\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            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'uploads.images');\n        }\n    },\n\n    getGroupsByType: function (type) {\n        const field = this.get('fieldConfig').getFieldByKey(type);\n        if (!field) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.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 = Ember.RSVP.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 Ember.get(value, 'value.length') > 0;\n                }\n                return Ember.get(value, 'value.number.length') > 0 || Ember.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        Ember.set(primary, '_id', null);\n        Ember.set(primary, 'ref', entry.value);\n        Ember.set(primary, 'value', {\n            fieldId,\n            fieldPath: fieldPath\n        });\n\n        delete primary._id;\n        delete primary.rel;\n\n        Ember.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","define(\"connections-ui/models/presence\", [\"exports\", \"ember-purecloud-components/models/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\n\nconst { attr } = DS;\n\nconst { inject, computed } = Ember;\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    organization: attr(),\n    type: 'public-api-user',\n\n    intl: inject.service(),\n    session: inject.service(),\n\n    isSuper: false, // set by session service\n    isTrustee: false, // set by session service\n\n    person: computed.reads('session.person'),\n\n    isCloned: computed.bool('token.clonedUser'),\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.get('isSuper')) {\n            return 'super';\n        } else if (this.get('isTrustee')) {\n            return 'trustee';\n        } else if (this.get('isAdmin')) {\n            return 'admin';\n        } else {\n            return 'employee';\n        }\n    }),\n\n    isAdmin: computed('authorization.roles.@each.name', 'isSuper', function () {\n        if (this.get('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.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('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    cannedResponseLibraries: DS.attr({ defaultValue: { mode: 'All' } })\n});\n\nexport default QueueModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { inject, computed, RSVP, run } = Ember;\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: inject.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    session: inject.service('session'), // CM-5713: to get the value of userRecordingDownload feature toggle\n\n    date: computed('dateCreated', function () {\n        return this.get('dateCreated');\n    }),\n\n    // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n    userRecordingDownload: computed.readOnly('session.features.userRecordingDownload'),\n\n    mediaUri: computed.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.get('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.get('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 = this.get('userRecordingDownload') ? '/transcoding' : '/media'; // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n            const endpoint = adapter.buildURL('recordedCall', this.get('id') + apiName);\n            // CM-4671: User Recording Inbox UI: Use async flow to download long-duration user recordings\n            resolver = (resolve, reject) => {\n                this.get('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.get('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","define(\"connections-ui/models/recording\", [\"exports\", \"ember-purecloud-components/models/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import Ember from 'ember';\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: Ember.computed('_type', function () {\n        const type = this.get('_type');\n        return singularize(type);\n    })\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nvar ResponseModel = DS.Model.extend({\n    name: DS.attr(),\n    texts: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    libraries: DS.attr(),\n    substitutions: DS.attr(),\n    responseType: DS.attr(),\n    messagingTemplate: DS.attr(),\n    isOpen: DS.attr(),\n    libraryName: Ember.computed('libraries', function () {\n        var libraries = this.get('libraries');\n\n        return libraries && libraries.length ? libraries[0].name : '';\n    }),\n    isWhatsAppResponse: Ember.computed('responseType', 'messagingTemplate', function () {\n        return this.get('responseType') === 'MessagingTemplate' && !!this.get('messagingTemplate.whatsApp');\n    }),\n    language: Ember.computed.reads('messagingTemplate.whatsApp.language')\n});\n\nexport default ResponseModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    permissions: DS.attr(),\n    permissionPolicies: DS.attr(),\n    userCount: DS.attr('number'),\n    default: DS.attr('boolean'),\n    base: DS.attr('boolean'),\n    type: Ember.computed('default', function () {\n        return this.get('default')\n            ? this.get('intl').lookup('groups.roles.default')\n            : this.get('intl').lookup('groups.roles.custom');\n    })\n});\n","define(\"connections-ui/models/screenshare-communication\", [\"exports\", \"ember-purecloud-components/models/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/models/social-communication\", [\"exports\", \"ember-purecloud-components/models/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\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 Ember.Object.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.get('time')));\n        this.set('messageArray', Ember.A([]));\n    },\n\n    //required streaming service attributes, these are put back together from the individual models.\n    raw: Ember.computed('messageArray.@each.raw', function () {\n        return this.get('messageArray')\n            .map(message => message.get('raw'))\n            .join('');\n    }),\n\n    links: Ember.computed('messageArray.@each.links', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('links'))\n            .flatten()\n            .value();\n    }),\n\n    files: Ember.computed('messageArray.@each.files', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('files'))\n            .flatten()\n            .filter()\n            .value();\n    }),\n\n    mentions: Ember.computed('raw', function () {\n        let match;\n        let mentions = [];\n        const mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        const raw = this.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            let mention = match[0];\n            let oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        return mentions;\n    }),\n\n    hasMentionLinks: Ember.computed.gt('mentions.length', 0),\n\n    //unfortunately we have to remarkdown the message since these were all individual parts of a message\n    messageBody: Ember.computed('raw', function () {\n        return markdownToHtml(this.get('raw'));\n    }),\n\n    editableEndTime: Ember.computed('time', function () {\n        return moment(this.get('time'));\n    }),\n\n    failedMessages: Ember.computed('messageArray.@each.{sendError}', function () {\n        return _.chain(this.get('messageArray'))\n            .filter(message => message.get('sendError'))\n            .value();\n    }),\n\n    sendError: Ember.computed.gt('failedMessages.length', 0),\n\n    pending: Ember.computed('history', 'messageArray.@each.pending', 'totalMessages', function () {\n        if (this.get('history')) {\n            return false;\n        } else {\n            return this.get('messageArray.length') < this.get('totalMessages');\n        }\n    }),\n\n    addSplitMessage(message) {\n        const messages = this.get('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 DS from 'ember-data';\nimport Ember from 'ember';\n\nconst { computed } = Ember;\n\nconst StationModel = DS.Model.extend({\n    intl: Ember.inject.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.get('intl').lookup(`purecloud.station.status.${this.get('status').toLowerCase()}`);\n    }),\n\n    available: computed('status', function () {\n        return this.get('status').toLowerCase() === 'available';\n    }),\n\n    isWebrtc: computed('type', 'name', function () {\n        return this.get('type') === 'inin_webrtc_softphone';\n    }),\n\n    isRemoteStation: computed.equal('type', 'inin_remote')\n});\n\nStationModel.reopenClass({\n    apiEndpoint: 'v2/stations'\n});\n\nexport default StationModel;\n","import { hasKey, includes } from 'connections-ui/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    'getTokenFailure',\n    'loadFeatureToggles',\n    'setupTheme',\n    'setupUserAndTrustee',\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 Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../utils/dates';\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: Ember.inject.service(),\n\n    person: Ember.computed('personGuid', function () {\n        return this.store.find('person', this.get('personGuid'));\n    }),\n\n    isAdmin: Ember.computed('userType', function () {\n        return this.get('userType') === 'admin';\n    }),\n\n    isSuper: Ember.computed('userType', function () {\n        return this.get('userType') === 'super';\n    }),\n\n    userState: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: Ember.computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n\nUserModel.reopenClass({\n    apiEndpoint: 'v2/users'\n});\n\nexport default UserModel;\n","define(\"connections-ui/models/video-communication\", [\"exports\", \"ember-purecloud-components/models/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed } = Ember;\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: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    useVoicemailApp: true,\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        if (!this.get('useVoicemailApp')) {\n            this.loadParticipants();\n        }\n    },\n\n    type: 'voicemail',\n\n    date: computed('createdDate', function () {\n        return this.get('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.get('callerName') || this.get('callerAddress') || 'Not Available';\n    }),\n\n    dateFromNow: computed('createdDate', function () {\n        var createdDate = this.get('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.get('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.get('store').findRecord('group', id, { reload: false, backgroundReload: false });\n    }),\n\n    loadParticipants: function () {\n        if (this.get('callerUser') || this.get('isGroupVoicemail')) {\n            return;\n        }\n        const conversationId = this.get('conversation.id');\n        if (this.get('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            Ember.Logger.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                Ember.Logger.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.get('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.get('id') + '/media');\n\n            resolver = (resolve, reject) => {\n                this.get('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                            Ember.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 Ember.RSVP.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 Ember from 'ember';\n\nexport default Ember.Object.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","export default Ember.HTMLBars.template({\"id\":\"r9Qzlnt4\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"outlet\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/phone/template.hbs\"}});","import Resolver from 'ember-resolver';\nexport default Resolver;\n","import Ember from 'ember';\nimport config from './config/environment';\n\nexport const NOOP_TRANSITION = 'NOOP_TRANSITION';\n\nconst Router = Ember.Router.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\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                if (transition.isActive && !transition.isAborted) {\n                    this.trigger(NOOP_TRANSITION);\n                }\n            });\n        }\n        return transition;\n    }\n});\n\nRouter.map(function () {\n    this.route('maintenance');\n    this.route('no-access');\n    this.route('login');\n    this.route('login-oauth');\n\n    this.route('search');\n\n    this.route('person', { resetNamespace: true }, function () {\n        this.route('list');\n\n        this.route('detail', { path: ':person_id' }, function () {\n            this.route('edit');\n        });\n\n        this.route('new-detail', { path: 'new/:person_id' });\n    });\n\n    this.route('card', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':person_id' });\n        this.route('tree', { path: 'tree/:person_id' });\n    });\n\n    // to do, the link-tos to this route need to be replaced and proxied to\n    // a nav event in the parent frame\n    this.route('group', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':group_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('time-machine', { path: 'timemachine/*buildTag' });\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('engage.recording-management-redirect', {\n        path: 'admin/quality/recordings/screensessions',\n        resetNamespace: true\n    });\n});\n\nexport default Router;\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\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\n        if (url && url.indexOf('/admin/interactions') === 0) {\n            this.replaceWith('/analytics/interactions');\n        }\n    },\n\n    actions: {\n        didTransition() {},\n        gotoRoute(route) {\n            this.transitionTo(route);\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';\n\n// Use the uprotectedroutemixin to skip the custom, protected, default Ember.Route\nexport default Ember.Route.extend(UnprotectedRouteMixin, ApplicationRouteMixin, {\n    mediaProviders: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    purecloudOauth: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        this.get('session').on('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.get('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.transitionTo('maintenance');\n                return;\n            }\n        },\n\n        transitionToRoute(route, id) {\n            if (id) {\n                this.transitionTo(route, id);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        transitionToEntityDetail(entity) {\n            var route = entity.get('type') + '.detail';\n            this.transitionTo(route, entity.get('id'));\n        },\n\n        logout() {\n            var session = this.get('session');\n            session.logout();\n        },\n\n        linkTo(route, param) {\n            if (param) {\n                this.transitionTo(route, param);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        error(error, transition) {\n            Ember.Logger.error('Error transitioning route: ', {\n                error,\n                remoteData: { routeName: transition.targetName }\n            });\n            Ember.onerror(error);\n            return true;\n        },\n\n        performRecentSearch(recent, filter) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            this.transitionTo('search', {\n                queryParams: {\n                    query: recent.query,\n                    entity: filter,\n                    saveHistory: false\n                }\n            });\n        },\n\n        performSearch(query, filter, queryFacets) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            if (!queryFacets) {\n                queryFacets = '';\n            }\n\n            this.transitionTo(`/search-v2?entity=person&query=${query}`);\n            return;\n        },\n\n        togglePanel() {},\n        openPanel() {},\n        closePanel() {},\n        openPreferencesModal() {},\n        toggleCommunicationSidebarExpanded() {},\n        ensureRouteVisibility() {},\n\n        async openChatRoom(entity) {\n            let jid = '';\n\n            // Callers should pass an entity; but we still tolerate an accidental jid string.\n            if (typeof entity === 'string') {\n                Ember.Logger.warn('openChatRoom expected an entity, got a jid string', { jid: entity });\n                jid = entity;\n            } else if (entity && entity.get && typeof entity.get === 'function') {\n                jid = entity.get('jid');\n\n                // Search/list groups can omit chat jid until the full record is loaded.\n                if (!jid && entity.get('type') === 'group') {\n                    // Force a new fetch if that's the case; Search may have cached this group without a jid\n                    const id = entity.get('id') || entity.get('guid');\n                    if (id) {\n                        try {\n                            const group = await this.store.findRecord('group', id, { reload: true });\n                            jid = group.get('jid');\n                        } catch (err) {\n                            Ember.Logger.error('Failed to load group jid for chat', err);\n                        }\n                    } else {\n                        Ember.Logger.warn('Cannot open group chat: group has no jid, id, or guid');\n                    }\n                }\n            }\n\n            if (jid) this.get('embedded').startChatByJid(jid);\n        },\n\n        async openChatRoomWithVideo(id, useMediaProviders = false) {\n            if (!useMediaProviders) {\n                this.get('embedded').launchVideoWithPersonById(id);\n            }\n        },\n\n        startCallPersonById(id) {\n            this.get('embedded').startCallPersonById(id);\n        },\n\n        startCallByNumber(phoneNumber) {\n            this.get('embedded').startCallByNumber(phoneNumber);\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        let stateRestore = this.get('purecloudOauth').popRestoreState();\n        if (stateRestore) {\n            window.location = stateRestore.url;\n            return;\n        }\n        this._super();\n    },\n\n    sessionInvalidated() {\n        // Record the logout time to handle the logout bounce\n        this.get('purecloudOauth').recordLogoutTime();\n        this.set('application.errorState', { type: 'missingAuthenticator' });\n        this.transitionTo('maintenance');\n    },\n\n    onSessionInvalidationFailure() {\n        this.set('application.errorState', { type: 'sessionInvalidationFailure' });\n        this.transitionTo('maintenance');\n    },\n\n    beforeModel(transition) {\n        if (this.get('applicationService.errorState')) {\n            this.transitionTo('maintenance');\n            return;\n        }\n\n        if (Ember.get(transition, 'queryParams.mobile')) {\n            this.get('application').set('mobileQueryParameter', true);\n        }\n\n        return this._super(transition);\n    }\n});\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar CardDetailRoute = Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model: function (params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.cardView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel: function (model) {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n\n        var promises = [model.get('directReports'), model.get('manager'), model.get('managerSiblings')];\n        return Ember.RSVP.all(promises);\n    }\n});\n\nexport default CardDetailRoute;\n","import Ember from 'ember';\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 Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    store: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.tree'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/tree/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model(params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.treeView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel() {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/contacts');\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.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 Ember from 'ember';\nimport _ from 'lodash';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar GroupDetailRoute = Ember.Route.extend(ModelRouteMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Group Profile',\n\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        let namedPermissions = this.get('session.namedPermissions') || [];\n        let hasRolesView = _.includes(namedPermissions, 'authorization:role:view');\n        let hasGrantsEdit = _.includes(namedPermissions, 'authorization:grant:add');\n        return hasRolesView && hasGrantsEdit;\n    }),\n\n    updateParentRoute(groupId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        const newHash = `#/group-v2/${groupId}`;\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let controller = this.controllerFor('group.detail');\n            if (controller.get('isEditing')) {\n                let msg = this.get('intl').lookup('notification.group.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n            }\n\n            controller.set('isEditing', false);\n\n            return true;\n        }\n    },\n\n    model: function (params, transition) {\n        const id = params.group_id;\n\n        let currentModel = this.store.peekRecord('group', id);\n        if (currentModel && currentModel.get('isDeleted')) {\n            transition.abort();\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n            return;\n        }\n\n        this.updateParentRoute(id);\n\n        return this.store.findRecord('group', id, { include: 'policy' }).then(group => {\n            if (!group.get('guid') || isGuid(group.get('id'))) {\n                return group;\n            }\n            this.transitionTo('group.detail', group.get('guid'));\n        });\n    },\n\n    afterModel(group) {\n        let state = group.get('state');\n        if (state === 'deleted' || group.get('isDeleted')) {\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n\n            this.transitionTo('person.detail', this.get('session.person.id'));\n            return;\n        }\n\n        return group.reload().then(group => {\n            if (this.get('canEditRoles')) {\n                return group.getGrants();\n            } else {\n                return Ember.RSVP.resolve();\n            }\n        });\n    },\n\n    setupController(controller, model) {\n        this._super(controller, model);\n\n        this.set('routeTitle', model.get('name'));\n\n        let sidebar = this.get('sidebarService');\n        if (sidebar) {\n            sidebar.set('routeTitle', model.get('name'));\n        }\n\n        this.get('embedded').sendPageData({\n            helpPath: 'group.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n\nexport default GroupDetailRoute;\n","import Ember from 'ember';\n\nconst IndexRoute = Ember.Route.extend({\n    session: Ember.inject.service(),\n    permissions: Ember.inject.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 Ember.RSVP.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');\n            }\n\n            if (!personId) {\n                Ember.Logger.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            return this.transitionTo('person.detail', personId);\n        });\n    }\n});\n\nexport default IndexRoute;\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from 'connections-ui/services/session';\n\nconst { Route, inject, RSVP } = Ember;\n\nvar OAuth2LoginRoute = Route.extend(UnauthenticatedRouteMixin, {\n    controllerName: 'login-oauth',\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    purecloudOauth: inject.service(),\n    authenticator: null,\n\n    routeTitle: Ember.computed(function () {\n        return this.get('intl').lookup('auth.login');\n    }),\n\n    actions: {\n        mobileOfferDeclined() {\n            this.set('application.offerMobileApp', false);\n            return Ember.RSVP.resolve();\n        },\n        authenticate() {\n            return this._authenticate(this.modelFor(this.routeName));\n        }\n    },\n\n    beforeModel: function (transition) {\n        if (!this.get('authenticator')) {\n            let authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n            if (authenticator) {\n                this.set('authenticator', authenticator);\n            } else {\n                Ember.Logger.error(\"Failed to locate 'authenticator:directory' in Container.\");\n                this.set('application.errorState', { type: 'missingAuthenticator' });\n                return this.transitionTo('maintenance');\n            }\n        }\n\n        this._super(transition);\n\n        return this.get('intl').loadTranslations();\n    },\n\n    model: function () {\n        return Ember.Object.create(this.get('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.get('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, 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.get('session')\n                .authenticate('authenticator:directory', authData)\n                .then(resolve)\n                .catch(rejectionDetails => {\n                    if (rejectionDetails && rejectionDetails.reason === 'noToken') {\n                        if (window === window.parent) {\n                            // Not in an iframe. For the standalone mode for development.\n                            reject('unauthenticated');\n                            window.location = rejectionDetails.authUrl;\n                        } else {\n                            // In an iframe, in WebDirectory?\n                            reject('failure');\n                            this.set('application.errorState', {\n                                type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                                failedStep: 'getTokenFailure'\n                            });\n                            this.transitionTo('maintenance');\n                        }\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 === 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                        Ember.Logger.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 Ember from 'ember';\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 = Ember.Route.extend({\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return result;\n        } else {\n            return this.transitionTo('index');\n        }\n    }\n});\n\nexport default LoginRoute;\n","import Ember from 'ember';\nimport { Promise, resolve } from 'rsvp';\nimport UnrecoverableAppFailure, { isSessionBootstrapFailure } from 'connections-ui/models/unrecoverable-app-failure';\nimport { buildCommonTelemetryContext } from 'connections-ui/services/analytics';\nimport { hasKey } from 'connections-ui/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\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                if (!isSessionBootstrapFailure(errorState)) {\n                    addPageAction(\n                        'maintenanceMode',\n                        Object.assign(\n                            {\n                                failedStep: errorState.type\n                            },\n                            buildCommonTelemetryContext({\n                                applicationService: this.get('applicationService'),\n                                sessionService: this.get('session'),\n                                intlService: this.get('intl')\n                            })\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                // 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 Ember from 'ember';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Ember.Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.get('intl').loadTranslations();\n    }\n});\n","import EngageSupervisor from 'connections-ui/routes/engage-supervisor';\n\nexport default EngageSupervisor.extend();\n","import Ember from 'ember';\n\nimport ModelRouteMixin from '../../mixins/model-route';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\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 Ember.Route.extend(ModelRouteMixin, LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Person Profile',\n\n    getUserId(transition) {\n        const id = transition.params['person.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('person.detail', res[0].get('id'));\n                }\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: getUserId failed', {\n                    personId: id,\n                    error: err\n                });\n                this.transitionTo('person.detail', this.get('session.person.id'));\n            });\n    },\n\n    updateParentRoute(transition, userId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        let newHash;\n        if (transition.intent && transition.intent.url) {\n            const initialIntent = `#${transition.intent.url}`;\n            newHash = initialIntent.replace(/person/, 'person-v2');\n        } else {\n            newHash = `#/person-v2/${userId}`;\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let editing = this.get('controller.editing') && this.get('controller.editingSection');\n            if (editing) {\n                let msg = this.get('intl').lookup('notification.person.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n\n                this.set('controller.editing', false);\n                this.set('controller.editingSection', false);\n            }\n\n            return true;\n        }\n    },\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n        var id = transition.params['person.detail'].person_id;\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n            if (id === this.get('session.person.id')) {\n                // if (transition.params['person.detail'].person_id === this.get('session.person.id')) {\n                transition.abort();\n            }\n            return;\n        }\n\n        return Ember.RSVP.resolve(result)\n            .then(() => {\n                var person;\n\n                return this.getUserId(transition)\n                    .then(id => {\n                        this.updateParentRoute(transition, id);\n\n                        if (id === this.get('session.person.id')) {\n                            person = this.get('session.person');\n                        } else {\n                            person = this.store.recordForId('person', id);\n                        }\n\n                        if (\n                            person &&\n                            !person.get('isEmpty') &&\n                            !person.get('isSaving') &&\n                            !person.get('isLoading') &&\n                            !person.get('isReloading')\n                        ) {\n                            return person\n                                .reload()\n                                .then(function (p) {\n                                    p.rollbackAttributes();\n                                })\n                                .catch(err => {\n                                    this.get('logger').error(\n                                        'route/person: beforeModel failed at reload/rollback step',\n                                        {\n                                            personId: id,\n                                            error: err\n                                        }\n                                    );\n                                    return Ember.RSVP.reject();\n                                });\n                        } else {\n                            return true;\n                        }\n                    })\n                    .catch(err => {\n                        this.get('logger').error('route/person: beforeModel failed after getUserId step', {\n                            personId: id,\n                            error: err\n                        });\n                        return Ember.RSVP.reject();\n                    });\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: beforeModel operation failed', {\n                    personId: id,\n                    error: err\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    model(params) {\n        // We have a guid by this point due to the beforeModel hook performing a transition for us\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.store\n                .findRecord('public-api-user', params.person_id, {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => {\n                    if (params.person_id === this.get('session.person.id')) {\n                        resolve({\n                            user,\n                            person: this.get('session.person')\n                        });\n                        return;\n                    }\n                    user.get('profile')\n                        .then(profile => {\n                            resolve({\n                                user,\n                                person: profile\n                            });\n                        })\n                        .catch(reject);\n                })\n                .catch(reject);\n        });\n    },\n\n    setupController(controller, model) {\n        this._super.apply(this, arguments);\n\n        if (this.get('session.person.id') !== model.person.get('id')) {\n            controller.set('editing', false);\n        } else {\n            controller.set('editing', true);\n        }\n\n        this.set('routeTitle', model.person.get('name'));\n        this.get('embedded').sendPageData({\n            helpPath: 'person.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    routing: Ember.inject.service('-routing'),\n\n    routeTitle: '',\n\n    updateParentRoute(transition) {\n        let routing = this.get('routing');\n        let params = Object.values(transition.params).filter(param => {\n            return Object.values(param).length;\n        });\n        let url = routing.generateURL(transition.targetName, params, transition.queryParams);\n\n        const initialIntent = transition.intent.url ? `#${transition.intent.url}` : url;\n        let newHash;\n        if (initialIntent) {\n            newHash = initialIntent.replace(/search/, 'search-v2');\n        } else {\n            newHash = '#/search-v2';\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    model: function (params, transition) {\n        this.updateParentRoute(transition);\n    },\n\n    afterModel() {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.search').toString());\n        this.get('embedded').sendPageData({\n            helpPath: 'search',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { POOL_STATES } from '../../models/app-pool';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport appUtils from '../../utils/apps';\n\nconst { Route, inject, get, computed } = Ember;\n\nconst STANDALONE_APP_ROUTE_LOG_NS = 'Route';\n\nexport default Route.extend(LoggerMixin, {\n    apps: inject.service(),\n    intl: inject.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.get('appsProblem')) {\n            result = this.get('intl').lookup('apps.loadFailedTitle').toString();\n        } else if (this.get('unknownApp')) {\n            result = this.get('intl').lookup('apps.notFoundTitle').toString();\n        } else {\n            result = this.get('currAppName') || this.get('intl').lookup('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        if (this.get('apps.appsSupported')) {\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        } else {\n            // Apps are disabled.  go to index\n            return this.transitionTo('index');\n        }\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: Ember.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: Ember.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: Ember.get(initPoolState, 'name'),\n                                        rejectionPoolState: Ember.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 Ember from 'ember';\n\nconst { Route, inject, RSVP, Logger } = Ember;\n\nexport default Route.extend({\n    queryParams: {\n        targetRoute: {\n            refreshModel: true\n        }\n    },\n    application: inject.service(),\n    intl: inject.service(),\n\n    routeTitle() {\n        return this.get('intl').lookup('timemachine.title');\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 (['prod', 'fedramp'].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    actions: {\n        confirm() {\n            let currModel = this.modelFor(this.routeName);\n\n            if (currModel && currModel.redirectUrl) {\n                window.location = currModel.redirectUrl;\n            } else {\n                this.set('application.errorState', { type: 'timeMachineFailure' });\n                this.transitionTo('maintenance');\n            }\n        },\n\n        cancel() {\n            this.transitionTo('index');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\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: inject.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 Ember from 'ember';\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\nconst { computed } = Ember;\n\nexport default Ember.Object.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.getProperties(\n            'queries',\n            'aggregations',\n            'page',\n            'limit',\n            'types',\n            'returnFields'\n        );\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        Ember.assert(\n            `Operator must be one of: ${SEARCH_QUERY_OPERATORS}`,\n            _.includes(SEARCH_QUERY_OPERATORS, operator)\n        );\n        Ember.assert(`Type must be one of: ${SEARCH_QUERY_TYPES}`, _.includes(SEARCH_QUERY_TYPES, type));\n\n        if (type === 'QUERY_STRING') {\n            Ember.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        Ember.assert(`Type must be one of: ${SEARCH_AGGREGATE_TYPES}`, _.includes(SEARCH_AGGREGATE_TYPES, type));\n        if (type !== 'COUNT') {\n            Ember.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 Ember from 'ember';\nimport _ from 'lodash';\nimport RequestBuilder from './request-builder';\nimport { singularize } from 'ember-inflector';\n\nconst { computed, inject, RSVP, Service } = Ember;\n\nconst resourceTypes = [\n    'resource_article',\n    'resource_page',\n    'resource_faq',\n    'resource_glossary',\n    'resource_releasenote'\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: inject.service(),\n    store: inject.service(),\n    application: inject.service(),\n\n    apiEndpoint: computed.reads('_searchUrl'),\n    suggestEndpoint: computed.reads('_suggestUrl'),\n\n    _searchUrl: computed(function () {\n        return this.get('application').pcV2Uri('api/v2/search');\n    }),\n\n    _suggestUrl: computed('_searchUrl', function () {\n        return `${this.get('_searchUrl')}/suggest`;\n    }),\n\n    _docUrl: computed('_searchUrl', function () {\n        return this.get('application').pcV2Uri('api/v2/documentation/search');\n    }),\n\n    search(data) {\n        const url = this.get('_searchUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    suggest(data) {\n        const url = this.get('_suggestUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    searchDocumentation(data) {\n        const url = this.get('_docUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    modelResults(results) {\n        // turn search results into DS models\n        const store = this.get('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.get('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 = Ember.RSVP.resolve([]);\n\n        if (entity === 'all') {\n            aggregateResults = store.search(null, facetsRequest.get('data'));\n        }\n\n        const data = Ember.RSVP.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.get('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.get('store').search(null, requestBuilder.get('data'));\n    },\n\n    countHierarchyReports(personId) {\n        if (!personId) {\n            return RSVP.resolve(null);\n        }\n\n        const url = this.get('_searchUrl');\n        const data = {\n            types: ['users'],\n            query: [\n                {\n                    type: 'EXACT',\n                    operator: 'AND',\n                    value: personId,\n                    fields: ['path']\n                }\n            ],\n            pageNumber: 1,\n            pageSize: 1,\n            returnFields: ['path']\n        };\n\n        return this.get('ajax')\n            .post(url, { data })\n            .then(response => {\n                const total = response && response.total;\n                return typeof total === 'number' ? total : null;\n            })\n            .catch(() => null);\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 Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    searchService: inject.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 = Ember.RSVP.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                Ember.set(data, '_aggregations', aggregations);\n                Ember.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 = Ember.RSVP.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 Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\n\nimport Validators from '../components/entity-fields/validators';\n\nexport var filterMissingFields = function (record, json) {\n    _.forEach(record.fieldConfig.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let fieldPath = field.get('fieldPath');\n            let type = field.get('type');\n            let values = record.getFieldValue(fieldPath);\n            let splitField = fieldPath.split('.');\n            let sectionKey = splitField[0],\n                fieldKey = splitField[1];\n\n            let container = json[sectionKey] ? json[sectionKey][fieldKey] : null;\n\n            if (Validators[type] && container) {\n                let validator = Validators[type];\n                if (typeof validator.isEmpty === 'function') {\n                    if (!Array.isArray(values)) {\n                        values = [values];\n                    }\n\n                    let toRemove = _.filter(values, function (value) {\n                        let isEmpty = validator.isEmpty(value, record, field);\n                        if (!value || (value.value !== undefined && isEmpty)) {\n                            if (container) {\n                                Ember.Logger.info('Removing field value:', fieldPath, container);\n                                return true;\n                            }\n                        }\n                    });\n\n                    container.removeObjects(toRemove);\n                }\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    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                    data.id = data.id || data.guid || data._id;\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        data[primaryModelClass.modelName] = payload;\n\n        return this._super(store, primaryModelClass, data, id, requestType);\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","define(\"connections-ui/serializers/call-communication\", [\"exports\", \"ember-purecloud-components/serializers/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\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","define(\"connections-ui/serializers/callback-communication\", [\"exports\", \"ember-purecloud-components/serializers/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\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","define(\"connections-ui/serializers/chat-communication\", [\"exports\", \"ember-purecloud-components/serializers/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        payload.links = {\n            recordings: `/api/v2/conversations/${payload.id}/recordings`\n        };\n\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] = _.map(payload.entities, convo => {\n                convo.links = {\n                    recordings: `/api/v2/conversations/${convo.id}/recordings`\n                };\n\n                return convo;\n            });\n            payload = data;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/conversation\", [\"exports\", \"ember-purecloud-components/serializers/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\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        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/email-communication\", [\"exports\", \"ember-purecloud-components/serializers/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\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 RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\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, RelateFeaturesMixin, {\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';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('facebook')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('line')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('twitter')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('whatsapp')\n});\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';\nimport Ember from 'ember';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n    serializeIntoHash(data, type, record, options) {\n        Ember.merge(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 DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    extractId(modelClass, resourceHash) {\n        return resourceHash.subjectId + resourceHash.role.id + resourceHash.division.id;\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 ApplicationSerializer from './application';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport uuid from 'connections-ui/utils/uuid';\n\nconst { inject } = Ember;\n\nconst OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nexport default ApplicationSerializer.extend({\n    session: inject.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    applyJabberIdFromChat(payload) {\n        if (!payload) {\n            return;\n        }\n        const chatJid =\n            payload.contactInfo &&\n            payload.contactInfo.chat &&\n            payload.contactInfo.chat[0] &&\n            payload.contactInfo.chat[0].value &&\n            payload.contactInfo.chat[0].value.jid;\n        if (chatJid) {\n            payload._id = this.getJabberId(chatJid);\n        }\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            this.applyJabberIdFromChat(payload);\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                this.applyJabberIdFromChat(g);\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                g.mt = moment(g.dateModified).unix();\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 PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend();\n","import Ember from 'ember';\n\nimport PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    session: Ember.inject.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 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    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        const type = primaryModelClass.modelName;\n        const data = {\n            [type]: payload.entities\n        };\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/message-communication\", [\"exports\", \"ember-purecloud-components/serializers/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/serializers/participant\", [\"exports\", \"ember-purecloud-components/serializers/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport PurecloudSerializer from './purecloud';\nimport { filterMissingFields } from './application';\nimport LoggerMixin from '../mixins/logger';\n\nimport Validators from '../components/entity-fields/validators';\n\nfunction cleanFields(record) {\n    var config = record.fieldConfig;\n    _.forEach(config.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let type = field.get('type');\n\n            if (Validators[type]) {\n                let validator = Validators[type];\n                let values = record.getFieldValue(field.getFieldPath());\n\n                if (typeof validator.cleanFieldForEntity === 'function') {\n                    if (Array.isArray(values)) {\n                        _.forEach(values, function (value) {\n                            validator.cleanFieldForEntity(record, field, value);\n                        });\n                    } else {\n                        validator.cleanFieldForEntity(record, field, values);\n                    }\n                }\n            }\n        });\n    });\n}\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: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    serialize: function (snapshot, options) {\n        let record = snapshot.record;\n\n        cleanFields(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 PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\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","define(\"connections-ui/serializers/recording\", [\"exports\", \"ember-purecloud-components/serializers/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\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 (requestType === 'query' && payload.results && payload.results.entities) {\n            data[type] = payload.results.entities;\n            delete payload.results.entities;\n\n            payload = _.merge(data, { meta: payload.results });\n        } else if (requestType === 'findMany' && payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\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        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/screenshare-communication\", [\"exports\", \"ember-purecloud-components/serializers/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","define(\"connections-ui/serializers/social-communication\", [\"exports\", \"ember-purecloud-components/serializers/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\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 ApplicationSerializer from './application';\n\nexport default ApplicationSerializer.extend();\n","define(\"connections-ui/serializers/video-communication\", [\"exports\", \"ember-purecloud-components/serializers/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\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","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\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 'ember-purecloud-components/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 Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    countryCode: Ember.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\n        if (subMsgType === 'whatsapp') {\n            phoneNumber = phoneNumber.replace(wordCharsRegex, '');\n        } else if (subMsgType === 'open') {\n            return phoneNumber;\n        } else {\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            if (intlTelInputUtils.isValidNumber(phoneNumber, countryCode)) {\n                const extension = intlTelInputUtils.getExtension(phoneNumber, countryCode);\n                const e164 = intlTelInputUtils.formatNumber(\n                    phoneNumber,\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.get('countryCode'))\n        ) {\n            return this.formatAddress(addressParts[2]);\n        }\n        return addressParts.slice(1).join('');\n    },\n\n    formatOrLookupAddressForDisplay(address, country) {\n        return Ember.RSVP.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.get('store').peekAll('person').findBy('jid', result.jid);\n\n                if (existingRecord) {\n                    return new DS.PromiseObject({ promise: Ember.RSVP.resolve(existingRecord.get('name')) });\n                }\n\n                const promise = this.get('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 new DS.PromiseObject({ promise }); // has to be re-wrapped since we then/catch the original store promise\n            }\n\n            if (result.queueId) {\n                const promise = this.get('store')\n                    .findRecord('queue', result.queueId)\n                    .then(queue => queue.get('name'))\n                    .catch(() => fallback);\n                return new DS.PromiseObject({ promise });\n            }\n        } catch (e) {\n            // no op;\n        }\n\n        return new DS.PromiseObject({ promise: Ember.RSVP.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 new DS.PromiseObject({ promise: Ember.RSVP.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.get('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 = Ember.get(itemToFormat, 'rel.e164');\n        if (e164) {\n            return e164;\n        }\n        let number = Ember.get(itemToFormat, 'value.number');\n        number = number != null ? number.replace(/\\D/g, '') : void 0;\n        let extension = Ember.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 Ember from 'ember';\nimport _ from 'lodash';\nimport AjaxService from 'ember-ajax/services/ajax';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst RateLimitPromise = Ember.ObjectProxy.extend(Ember.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 = Ember.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 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, Ember.Evented, {\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    _timers: null,\n\n    authData: null,\n    currentRequest: {}, // { url: ..., options: ... }\n\n    enableRetryHeaderParsing: Ember.computed.reads('session.features.enableUIAjaxRetryHeader'),\n    enableAPIDomainRewrites: Ember.computed.reads('session.rewriteRootAPIRequests'),\n\n    headers: Ember.computed(function () {\n        return {\n            'Content-Type': 'application/json'\n        };\n    }),\n\n    trustedHosts: Ember.computed('application.purecloudV2BaseUri', function () {\n        const purecloudV2BaseUri = this.get('application.purecloudV2BaseUri');\n        const purecloudV2Host = _.startsWith(purecloudV2BaseUri, 'https://')\n            ? purecloudV2BaseUri.substring(8)\n            : purecloudV2BaseUri;\n\n        return [purecloudV2Host];\n    }),\n\n    init() {\n        this._super(...arguments);\n        this._timers = Ember.A([]);\n    },\n\n    willDestroy() {\n        if (this._timers) {\n            this._timers.forEach(timer => Ember.run.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 = Ember.run.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 }) => Ember.RSVP.resolve(response))\n            .catch(({ response }) => Ember.RSVP.reject(response));\n    },\n\n    addApiDomainIfMissing(url) {\n        if (this.get('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.get('enableRetryHeaderParsing');\n        const retryDisabled = options && !options.retry;\n        if (retryDisabled || !canParseHeaders) {\n            return this._super(...arguments);\n        }\n\n        if (!deferred) {\n            deferred = Ember.RSVP.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                    Ember.set(promiseProxy, 'isRateLimited', true);\n                    Ember.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 * as PlatformJS from 'platform';\n\nexport default Ember.Service.extend({});\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 Ember from 'ember';\nimport request from 'ember-ajax';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\nimport adapter from 'npm:webrtc-adapter';\nimport { APP_NAME } from './stash-logger';\nimport { EVENTS } from '../utils/hosted-context';\nimport netUtils from '../utils/net';\n// import { addPageAction } from '../utils/newrelic';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\n\nconst { computed, inject, observer } = Ember;\n\nconst BRIDGE_CONFIGURATION = {};\nconst deprecation = {\n    id: 'directory-core.deprecate-application-locale',\n    until: '6.0.0',\n    url: 'https://bitbucket.org/inindca/connections-ui/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    debugMasonry: 'debug-masonry'\n};\n\nexport default Ember.Service.extend({\n    ajax: inject.service(),\n    chat: inject.service(),\n    intl: inject.service(),\n    store: inject.service(),\n    cookies: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    preferences: inject.service(),\n    pigeon: inject.service(),\n    feature: inject.service(),\n    webrtc: inject.service(),\n    mediaProviders: inject.service(),\n    stashLogger: inject.service(),\n    embedded: inject.service(),\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: '',\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    debugSettings: {},\n\n    offerMobilePreference: true,\n    offerMobilePreferenceRetreived: false,\n\n    currentYear: new Date().getFullYear(),\n\n    offerMobileApp: computed(\n        'mobileQueryParameter',\n        'isMobile',\n        'offerMobilePreference',\n        'offerMobilePreferenceRetreived',\n        {\n            get() {\n                if (this.get('mobileQueryParameter') || !this.get('offerMobilePreferenceRetreived')) {\n                    return false;\n                }\n\n                return this.get('isMobile') && this.get('offerMobilePreference');\n            },\n            set(key, value) {\n                this.get('preferences').setPreference('offerMobileApp', value);\n                this.set('offerMobilePreference', value);\n            }\n        }\n    ),\n\n    orgName: computed.alias('session.org.name'),\n    orgShortName: computed.alias('session.org.shortName'),\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.get('pigeon');\n        pigeon.on('connect', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n\n        let hasRecentlyLostSubscriptions = false;\n        pigeon.on('no_longer_subscribed', () => {\n            if (!hasRecentlyLostSubscriptions) {\n                Ember.Logger.info('Resubscribing to pigeon after no_longer_subscribed');\n                hasRecentlyLostSubscriptions = true;\n                Ember.run.later(() => (hasRecentlyLostSubscriptions = false), 2000);\n                pigeon._registerTopics(); // trigger immediate resubscribe\n                return;\n            }\n            Ember.Logger.warn(\n                'Multiple no_longer_subscribed events, showing warning to user and stopping resubscribe.'\n            );\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\n        this.get('preferences')\n            .getPreference('offerMobileApp')\n            .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.get('pigeon').on('topicsRegistered', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n        this.get('pigeon').on('hawkSubscriptionError', err => {\n            this.get('stashLogger').error('Hawk Subscription Error', { err });\n        });\n\n        Ember.Logger.log('WebRTC Adapter loaded at application level', { adapter });\n    },\n\n    async openChatRoomWithVideo() {\n        // no op for now\n    },\n\n    destroy() {\n        if (this.get('csRunLater')) {\n            Ember.run.cancel(this.get('csRunLater'));\n        }\n        this._super(...arguments);\n    },\n\n    currentRouteClass: Ember.computed('currentRouteName', function () {\n        var name = this.get('currentRouteName');\n        if (name) {\n            return name.replace(/[./]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    isoLocale: computed.deprecatingAlias('intl.isoLocale', deprecation),\n    systemLocale: computed.deprecatingAlias('intl.systemLocale', deprecation),\n    iso2LocaleCountry: computed.deprecatingAlias('intl.iso2LocaleCountry', deprecation),\n    setLocale(locale) {\n        const message =\n            'The \"setLocale\" method in \"connections-ui/service/application\" has been deprecated. Please use \"service:intl\" for all locale information.';\n        Ember.deprecate(message, false, deprecation);\n        return this.get('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            Ember.Logger.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 guid = Ember.guidFor(this);\n        Ember.$(window)\n            .on(`focus.${guid}`, () => this.set('iframeFocused', false))\n            .on(`blur.${guid}`, () => {\n                if (!document) {\n                    return;\n                }\n                const nodeName = Ember.get(document, 'activeElement.nodeName');\n                if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                    this.set('iframeFocused', true);\n                }\n            });\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        const guid = Ember.guidFor(this);\n        Ember.$(document).on(`${visibilityChange}.${guid}`, () => {\n            this.set('browserHidden', document[hidden]);\n        });\n        Ember.$(window)\n            .on(`blur.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', true);\n                }\n            })\n            .on(`focus.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', false);\n                }\n            });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off('connect');\n        this.get('pigeon').off('topicsRegistered');\n        const pigeonUserSubscribed = this.get('pigeonUserSubcribed');\n        if (pigeonUserSubscribed) {\n            this.get('pigeon').off(pigeonUserSubscribed);\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(window).off(`.${guid}`);\n        Ember.$(document).off(`.${guid}`);\n    },\n\n    loadStreamingService() {\n        const authenticated = this.get('session.isAuthenticated');\n        if (isTesting || !authenticated) {\n            return Ember.RSVP.reject();\n        }\n        const scriptUri = this.realtimeScriptUri;\n        const streamingService = this.get('streaming');\n        streamingService.set('scriptUrl', scriptUri);\n        let features;\n        if (this.get('session.features')) {\n            features = Ember.RSVP.resolve(this.get('session.features'));\n        } else {\n            features = this.get('feature')\n                .getFeatureToggles('webrtcRelayOnly')\n                .catch(err => {\n                    Ember.Logger.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                Ember.Logger.info('Running in media helper mode');\n                this.set('mediaHelperMode', true);\n                Ember.Logger.info('Letting webrtcSdk set up media helper jid');\n            }\n\n            return streamingService.setupConnection({\n                jid: this.get('session.person.jid'),\n                accessToken: this.get('session.accessToken'),\n                iceTransportPolicy: res.webrtcRelayOnly ? 'relay' : 'all',\n                signalIceConnected: true,\n                disableEOCShortCircuit: true,\n                referenceStanza: true,\n                streamingServiceUri: this.get('streamingServiceUri'),\n                envDetails: this.get('envDetails'),\n                originAppName: APP_NAME,\n                originAppVersion: config.APP.semver,\n                originAppId: this.get('stashLogger.clientSessionId'),\n                splitHawkAndRealtime: true,\n                useServerSidePings: true,\n                customHeaders: {\n                    'Genesys-App': 'connections-ui-webui'\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 chatEnabled = this.get('session.org.hasChatEnabled');\n        const adminUIContext = this.get('adminUIContext');\n        const streamingService = this.get('streaming');\n        return this.loadStreamingService().then(() => {\n            if (authenticated && accessToken && chatEnabled && !adminUIContext) {\n                this.get('chat').set('enabled', true);\n\n                if (!this.get('pigeonUserSubscribed')) {\n                    const myGuid = this.get('session.person.guid');\n                    Ember.Logger.debug('Subscribing to user guid for system topic', { myGuid });\n                    this.set('pigeonUserSubscribed', myGuid);\n                    this.get('pigeon').on(myGuid, data => {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n                        Ember.Logger.debug('System topic', { data });\n                        if (data.systemTopicType === 'token_revoked') {\n                            this.get('session').invalidate({ notified: true });\n                        }\n                    });\n                }\n\n                return streamingService.connect(accessToken, jid).then(() => {\n                    this.get('pigeon')._registerTopics();\n                });\n            }\n        });\n    }).drop(),\n\n    /**\n     * This logic will ultimately be replaced by the pipeline\n     * script insertion logic, but we wanted to enabled with a\n     * feature toggle before migrating.\n     */\n    csEnabled: false,\n    csRunLater: null,\n    checkContentSquare: observer(\n        'session.features.ATLAS-536_EnableContentSquare',\n        'session.features.AGORA-137_connections-ui-contentsquare',\n        function () {\n            this.set(\n                'csRunLater',\n                Ember.run.later(() => {\n                    if (\n                        !this.get('csEnabled') &&\n                        this.get('session.features.ATLAS-536_EnableContentSquare') &&\n                        this.get('session.features.AGORA-137_connections-ui-contentsquare') &&\n                        !this.isDestroyed &&\n                        !this.isDestroying\n                    ) {\n                        const csLoaderScript = document.createElement('script');\n                        csLoaderScript.type = 'text/javascript';\n                        csLoaderScript.src = '/contentsquare/1632/loader.js';\n                        csLoaderScript.crossOrigin = 'anonymous';\n                        csLoaderScript.async = true;\n                        document.body.appendChild(csLoaderScript);\n                        this.set('csEnabled', true);\n                    }\n                }, 500)\n            );\n        }\n    ).on('init'),\n\n    syncStreamingConnectionToAuthState: observer(\n        'session.{isAuthenticated,accessToken}',\n        'session.org.hasChatEnabled',\n        'preferences.chat.disableStreaming',\n        function () {\n            this.get('streamingServiceConnect').perform();\n        }\n    ).on('init'),\n\n    syncVideoChatStateToAdminContext: observer(\n        'session.isAuthenticated',\n        _.debounce(function () {\n            if (this.get('adminUIContext')) {\n                this.set('session.features.videoChat', false);\n            }\n        }, 20)\n    ),\n\n    clearActiveRoomMessagesOnAppFocus: observer('browserHidden', function () {\n        if (this.get('browserHidden')) {\n            return;\n        }\n        this.get('_delayedRefocusChatRoom').perform();\n    }),\n\n    _delayedRefocusChatRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n        this.get('chat').refocusActiveRoom();\n    }),\n\n    displayTrialSupport() {\n        this.set('trialSupportDisplayed', true);\n    },\n\n    dismissTrialSupport() {\n        this.set('trialSupportDisplayed', false);\n    },\n\n    adminUIContext: false,\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    navigateTo(routeType, routeId, queryParams) {\n        let newHash = '';\n        if (routeType === 'group') {\n            newHash = `#/admin/groupprofile/${routeId}`;\n        } else if (routeType === 'person') {\n            newHash = `#/admin/users/${routeId}`;\n        } else if (routeType === 'search') {\n            const searchParams = Object.entries(queryParams)\n                .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n                .join('&');\n            if (searchParams) {\n                newHash = `#/search-v2/?${searchParams}`;\n            }\n        }\n\n        if (newHash && newHash !== window.top.location.hash) {\n            this.get('embedded').publishMessage('close', {}); // Close the \"Person Details\" in Users-UI\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    postMessageRouteChange(transition) {\n        if (!this.get('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        if (this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition']) {\n            // We are inside Users-UI, we can navigate through IFC.\n            this.navigateTo(routeType, routeId, transition.queryParams);\n        } else {\n            // We are inside Admin-UI, we navigate with a postMessage.\n            const data = {\n                type: 'directory:route:changed',\n                data: { routeType, routeId }\n            };\n            Ember.Logger.debug('postMessage -> window.parent', { data });\n            window.parent.postMessage(JSON.stringify(data), '*');\n        }\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    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: Ember.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: computed.or('belowMobileThreshold', 'isMobilePhone'),\n\n    showContextualHelp: computed('showTinyNavMenu', function () {\n        const person = this.get('session.person');\n        return this.get('showTinyNavMenu') && (person.get('isEngageAgent') || person.get('isAdmin'));\n    }),\n\n    isPopout: computed('isPef', 'currentRouteName', function () {\n        if (this.get('isPef')) {\n            return true;\n        }\n\n        const route = this.get('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        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    isScreenRecordingPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['engage.quality.quality.interactions.screen-recordings'];\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.get('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.get('currentRouteName');\n        const popoutRoutes = ['interaction', 'interactions'];\n        return popoutRoutes.includes(route);\n    }),\n\n    isAdminRoute: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\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        ];\n        return adminRoutes.some(r => route.search(r) === 0);\n    }),\n\n    _sendDiagnostics(data, uri) {\n        const request = {\n            url: this.pcUri(`api/v2/${uri}`),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(data),\n            cache: false,\n            context: this\n        };\n        function successHandler(data) {\n            Ember.Logger.debug('applicationService: sendFeedback', { id: data.id });\n            return data;\n        }\n        function errorHandler(jqXHR) {\n            Ember.onerror(jqXHR);\n            return jqXHR;\n        }\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendFeedback')\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.get('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.get('debug')) {\n            this.buildDebugSettings();\n        }\n    },\n\n    buildDebugSettings() {\n        const cookies = this.get('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        var masonry = params[COOKIES.debugMasonry],\n            masonryCookie = cookies.read(COOKIES.debugMasonry);\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        if (masonry !== undefined) {\n            masonry = masonry !== 'false';\n\n            this.set('debugSettings.masonry', masonry);\n            cookies.write(COOKIES.debugMasonry, masonry);\n        } else if (masonryCookie) {\n            masonryCookie = masonryCookie !== 'false';\n\n            this.set('debugSettings.masonry', masonryCookie);\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 Ember from 'ember';\nconst { RSVP, getOwner, typeOf, inject } = Ember;\n\nexport const SHOW_PROFILE_APP_API_ACTION_NAME = 'showProfile';\nexport const SHOW_GROUP_APP_API_ACTION_NAME = 'showGroup';\n\nconst DirectoryNavHandler = Ember.Object.extend({\n    session: inject.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.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('person.detail', 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.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('group.detail', groupId);\n            return resolve();\n        });\n    }\n});\n\nexport default DirectoryNavHandler;\n","import Ember from 'ember';\nimport pick from 'lodash/pick';\nimport pickBy from 'lodash/pickBy';\nimport mapKeys from 'lodash/mapKeys';\nimport omit from 'lodash/omit';\nconst { RSVP, inject } = Ember;\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 Ember.Object.extend({\n    notification: inject.service('notification-proxy'),\n    stashLogger: Ember.inject.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.get('notification');\n            const stashLogger = this.get('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\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","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport ENV from '../config/environment';\nimport appUtils 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';\n\nconst SHOW_HELP_APP_API_ACTION_NAME = 'showHelp';\nconst HIDE_HELP_APP_API_ACTION_NAME = 'hideHelp';\nconst SHOW_RC_ARTIFACT_APP_API_ACTION_NAME = 'showResourceCenterArtifact';\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];\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 = Ember.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 = Ember.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 (Ember.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 = Ember.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 Ember.Service.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    intl: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    standaloneAppPool: null,\n    standaloneAppPoolVisible: false, // true when an app route is active\n    widgetAppPool: null,\n    externalUrlExemptIntegrationTypeIds: Ember.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: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.standalone'),\n    widgetMaxActivePoolSize: Ember.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                {\n                    poolName: 'standaloneAppPool',\n                    getMaxActive: () => this.get('standaloneMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_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                Ember.getOwner(this).ownerInjection()\n            )\n        );\n        this.set(\n            'widgetAppPool',\n            AppPool.create(\n                {\n                    poolName: 'widgetAppPool',\n                    getMaxActive: () => this.get('widgetMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_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                Ember.getOwner(this).ownerInjection()\n            )\n        );\n\n        // Listen to local PC-sourced app messages\n        let localMsgListener = Ember.run.bind(this, '_handleLocalMsg');\n        this.set('_localMsgListener', localMsgListener);\n        Ember.$(window).on('message onmessage', localMsgListener);\n    },\n\n    appsSupported: Ember.computed(function () {\n        /* globals Modernizr */\n        return !!(Modernizr && Modernizr.sandbox);\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.get('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 (Ember.typeOf(typeId) !== 'string' || typeId.trim().length === 0) {\n            this.get('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 (Ember.typeOf(id) !== 'string' || id.trim().length === 0) {\n            this.get('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 (Ember.typeOf(config) !== 'object') {\n            this.get('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: Ember.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 (Ember.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            Ember.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.get('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.originalEvent.source || !this._isLocalMsg(evt.originalEvent.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.originalEvent.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.originalEvent.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.get('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 (\n                parseError.message === 'missingAction' &&\n                typeof evt.originalEvent.data === 'object' &&\n                evt.originalEvent.data.protocol\n            ) {\n                // Apps Protocol and no action\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg('(Local) sent an apps message with no action.'),\n                    evt.originalEvent.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.get('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 (Ember.typeOf(result) === 'boolean') {\n                        return result;\n                    } else {\n                        this.get('stashLogger').error(\n                            appUtils.buildApiLogMsg('Handler returned a non-boolean result from canHandle')\n                        );\n                    }\n                } catch (e) {\n                    this.get('stashLogger').error(\n                        appUtils.buildApiLogMsg('Handler threw an Error when running canHandle'),\n                        e\n                    );\n                }\n\n                return false;\n            });\n            if (availHandler) {\n                try {\n                    asyncHandlerPromise = availHandler.handle(apiCall);\n                } catch (error) {\n                    asyncHandlerPromise = Ember.RSVP.reject(error);\n                }\n            } else {\n                asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n            }\n        } else {\n            asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n        }\n        asyncHandlerPromise\n            .then(() => {\n                this._instrumentApiCall(apiCall);\n            })\n            .catch(reason => {\n                this.get('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.get('_localMsgListener');\n        if (localMsgListener) {\n            Ember.$(window).off('message onmessage', localMsgListener);\n            this.set('_localMsgListener', null);\n        }\n\n        // Clean up pools\n        [this.get('standaloneAppPool'), this.get('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.get('_remoteAppPromise');\n        let lastRequestTs = this.get('_remoteAppRequestTimestamp');\n\n        if (\n            !allAppsPromise ||\n            this.get('_bypassAppCache') ||\n            (lastRequestTs && now - lastRequestTs > REMOTE_APPS_CACHE_TTL_MILLIS)\n        ) {\n            allAppsPromise = new Ember.RSVP.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.get('application').pcV2Uri(`${APPS_BASE_URL}`);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        appsUrl += `?${Ember.$.param(queryParams, true)}`;\n\n        let headers = {};\n\n        const primaryLocale = this._getPrimaryLocale();\n        if (primaryLocale) {\n            headers['Accept-Language'] = primaryLocale;\n        }\n        if (this.get('_bypassAppCache')) {\n            headers['Cache-Control'] = 'no-cache';\n        }\n\n        this.get('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                                Ember.typeOf(Ember.get(currIntegration, 'integrationType.id')) === 'string' &&\n                                !_.isEmpty(Ember.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 (Ember.typeOf(isoLocale) === 'string' && Ember.isPresent(isoLocale)) {\n            return isoLocale;\n        } else {\n            this.get('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') || Ember.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: Ember.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.get('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        };\n\n        // Only attempt to parse communicationTypeFilter when specifed to differentiate undefined/null from []\n        if (!Ember.isNone(Ember.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        if (!internallyHosted) {\n            appProps.urlTemplate = Ember.get(config, 'properties.url');\n            result = App.create(Ember.getOwner(this).ownerInjection(), appProps);\n        } else {\n            appProps.subdomain = Ember.get(config, 'properties.subdomain');\n            appProps.envDetails = this.get('application.envDetails');\n            appProps.path = Ember.get(config, 'properties.path');\n            appProps.query = Ember.get(config, 'properties.query');\n\n            result = InternallyHostedApp.create(Ember.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 = Ember.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 = Ember.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 = Ember.get(config, `advanced`);\n                if (advanced) {\n                    const assetCategory = Ember.get(advanced, currAssetCategory);\n                    if (assetCategory) {\n                        const classNames = Ember.get(assetCategory, 'classNames');\n                        if (classNames) {\n                            const assets = Ember.get(result, 'assets');\n                            if (!Ember.get(assets, currAssetCategory)) {\n                                Ember.set(assets, currAssetCategory, { classNames });\n                            } else {\n                                Ember.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 = Ember.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 (Ember.typeOf(app.typeId) !== 'string' || app.typeId.trim().length === 0) {\n            throw new Error('invalidTypeId');\n        }\n\n        if (Ember.typeOf(app.id) !== 'string' || app.id.trim().length === 0) {\n            throw new Error('invalidId');\n        }\n\n        if (Ember.typeOf(app.name) !== 'string' || app.name.trim().length === 0) {\n            throw new Error('invalidName');\n        }\n\n        if (Ember.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 (Ember.typeOf(internalAppPath) !== 'string' || Ember.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 = Ember.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(Ember.typeOf(internalAppQuery)) < 0) {\n                throw new Error('invalidQuery');\n            }\n        }\n\n        if (Ember.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.get('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            ['interactionId', 'interactionType', 'enabledQueueIds', 'enabledCommunicationTypes'].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 Ember.get(ENV, 'purecloud-apps.internallyHostedIntegrationTypeIds').indexOf(integrationTypeId) >= 0;\n    },\n\n    _parseProp(obj, prop, validItems = null) {\n        let propVal = Ember.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 = Ember.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 = Ember.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 (Ember.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.get('stashLogger').warn(\n                appUtils.buildLogMsg('Missing/Invalid langTag provided to parse langTag specific prop', {\n                    remoteData: {\n                        langTag\n                    }\n                })\n            );\n\n            return undefined;\n        }\n\n        let result = Ember.get(obj, `${baseProp}.${langTag}.${langTagRelProp}`);\n\n        if (typeof result === 'undefined') {\n            // Check for lenient langTags\n            let baseObj = Ember.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 (Ember.typeOf(langKey) === 'string') {\n                    result = Ember.get(baseObj, `${langKey}.${langTagRelProp}`);\n                }\n            }\n        }\n\n        return result;\n    }\n});\n","define(\"connections-ui/services/asset-loader\", [\"exports\", \"ember-asset-loader/services/asset-loader\"], function (_exports, _assetLoader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _assetLoader.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getEntityObjectId, isDirectoryId } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP } = Ember;\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 Ember.Service.extend(LoggerMixin, {\n    store: Ember.inject.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.get('store').peekRecord(entityType, objectId);\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        if (objectId.indexOf('@') > -1) {\n            const possibleCache = this.get('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.get('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.get('peopleQueue');\n                break;\n            case 'group':\n                queue = this.get('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        Ember.run.debounce(this, this._scheduleQueues, 500);\n    },\n\n    _scheduleQueues() {\n        Ember.run.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.get('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.get('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 Ember from 'ember';\nimport _ from 'lodash';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\nimport ChatMessage from '../models/chat-message';\nimport ChatRoom from '../models/chat-room';\nimport ChatEvents from '../mixins/chat-service/chat-events';\nimport BatchDataRequests from '../mixins/batch-data-requests';\nimport MessageNotificationsMixin from '../mixins/chat-service/message-notifications';\nimport moment from '../utils/dates';\nimport timeoutPromise from '../utils/timeout-promise';\nimport { markdownToHtml } from '../utils/markdown';\nimport MessageSplitting from '../mixins/chat-service/message-splitting';\nimport {\n    compareJids,\n    getEntityObjectId,\n    isRoomJid,\n    isSupervisorJid,\n    isAcdJid\n} from 'ember-purecloud-components/utils/jid-helpers';\nimport { task, timeout } from 'ember-concurrency';\nimport { v4 as uuid } from 'uuid';\n\nconst Promise = Ember.RSVP.Promise;\nconst respondingTimeout = {};\nconst preferencePaths = {\n    interactionNotificationVolume: 'chat.interactionNotificationVolume',\n    chatNotificationVolume: 'chat.chatNotificationVolume'\n};\n\nconst mixins = [\n    Ember.Evented,\n    ChatEvents,\n    BatchDataRequests,\n    CacheChatRoomsMixin,\n    MessageNotificationsMixin,\n    MessageSplitting\n];\n\nexport const supportedChatWidgets = [\n    'jira',\n    'salesforce',\n    'pagerduty',\n    'videoNotification' // New stanza returned when using useVoltVideoMessages\n];\n\nexport default Ember.Service.extend(...mixins, {\n    batchDataRequests: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    // timeline: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    store: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    favorites: Ember.inject.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    // clean up after chat decomp goes GA\n    useChatBetaCleanUp: true,\n\n    canCorrectMessages: Ember.computed.reads('connected'),\n\n    initializePreferences: Ember.on('init', function () {\n        let preferences = this.get('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                Ember.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                Ember.Logger.error('Error getting preference:', {\n                    error: e,\n                    remoteData: {\n                        preference: 'roomHistoryStack'\n                    }\n                })\n            );\n    }),\n\n    isEditing: Ember.computed('activeRoom.messages.@each.isEditing', function () {\n        if (!this.get('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: Ember.computed('_chatNotificationVolume', {\n        get: function () {\n            return this.get('_chatNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.chatNotificationVolume, val);\n            this.set('_chatNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    _interactionNotificationVolume: 50,\n    interactionNotificationVolume: Ember.computed('_interactionNotificationVolume', {\n        get: function () {\n            return this.get('_interactionNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.interactionNotificationVolume, val);\n            this.set('_interactionNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    allowUserRemoval: false,\n\n    init() {\n        this._super(...arguments);\n        this._initNotificationVolumes();\n        this._setupRateLimitListener();\n        this._startWatchVideoParticipantCount();\n    },\n\n    _startWatchVideoParticipantCount() {},\n\n    _initNotificationVolumes: function () {\n        Ember.run.next(() => {\n            const preferences = this.get('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.get('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                    Ember.run.debounce(this, this._notifyRosterRateLimit, 500);\n                }\n            } catch (error) {\n                // Ignore error\n            }\n        }\n    },\n\n    _notifyRosterRateLimit() {\n        let title = this.get('intl').t('chat.roster.errors.rateLimit.title').toString();\n        let message = this.get('intl').t('chat.roster.errors.rateLimit.message').toString();\n        this.get('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            Ember.run.cancel(value);\n        });\n\n        this.get('ajax').off('rateLimited', this, this._handleRateLimit);\n    },\n\n    saveMutedRooms: Ember.observer('mutedRooms.[]', function () {\n        this.get('preferences').setPreference('chat.mutedRooms', JSON.stringify(this.get('mutedRooms')));\n    }),\n\n    saveRoomHistoryStack: Ember.observer('roomHistoryStack.[]', function () {\n        this.get('preferences').setPreference('chat.roomHistoryStack', JSON.stringify(this.get('roomHistoryStack')));\n    }),\n\n    addResponder(room, person) {\n        var responding, respondingTimeoutId;\n        if (!person.get('name') && isAcdJid(room)) {\n            person.set('name', this.get('intl').t('purecloud.acdInteraction.chats.customerName'));\n        }\n        if (person.get('id') !== this.get('session.person.id')) {\n            responding = this.get('responding');\n            if (!Object.prototype.hasOwnProperty.call(responding, room)) {\n                responding[room] = Ember.A();\n            }\n            responding[room].addObject(person.get('name'));\n            respondingTimeoutId = room + '-' + person.get('id');\n            Ember.run.cancel(respondingTimeout[respondingTimeoutId]);\n            respondingTimeout[respondingTimeoutId] = Ember.run.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.get('responding')[room])) {\n            this.get('responding')[room].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n        if (!_.isEmpty(this.get('responding')[from])) {\n            this.get('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.get('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.get('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.get('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.get('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                Ember.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                    Ember.run.cancel(timeoutIdentifier);\n                    if (error) {\n                        Ember.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 = Ember.run.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    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.get('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()}`;\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        if (!roomJid) {\n            roomJid = `adhoc-${uuid()}`;\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                    Ember.run(() => {\n                        Ember.run.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            Ember.Logger.error(`chat#leaveAcdRoom error for jid '${roomJid}'`, err);\n\n            return Ember.RSVP.reject(err);\n        });\n\n        return request;\n    },\n\n    newRoom(jid) {\n        return ChatRoom.create(\n            {\n                jid: jid,\n                objectId: getEntityObjectId(jid)\n            },\n            Ember.getOwner(this).ownerInjection()\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                });\n            } else {\n                this.inviteToRoom(room, person);\n                return Ember.RSVP.resolve();\n            }\n        }\n    },\n\n    inviteToRoom(room, user) {\n        this.get('streaming').inviteToRoom(room, user);\n    },\n\n    requestHistory(room, options) {\n        return new Promise((resolve, reject) => {\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.get('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.get('streaming').setStatus(status, this.get('session.person'));\n    },\n\n    openRoom(jid) {\n        return this.oldOpenRoom(jid);\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.get('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.get('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    async openChatRoomForPersonById() {},\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.get('roster');\n            await roster.getAllBadgeCounts();\n\n            // fetch recent messages\n            const activeRoom = this.get('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.get('firstRoomChosen')) {\n            return;\n        }\n        jid = room.get('jid');\n        historyStack = this.get('roomHistoryStack');\n        lastActiveRoom = this.get('roomHistoryStack.lastObject');\n        mostRecent = this.get('mostRecentActiveRoom');\n        if (!isSupervisorJid(jid)) {\n            if (!!this.get('popoutRoom')) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(this.get('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.get('selectHighestAppearingActiveRoom').perform();\n            }\n        }\n    },\n\n    selectHighestAppearingActiveRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        this.set('firstRoomChosen', true);\n        return this.getChatRoom(this.get('mostRecentActiveRoom')).then(room => this.changeActiveRoom(room));\n    }).drop(),\n\n    clearRoomNotificationCounts(room) {\n        return this.get('roster').clearRoomNotificationCounts(room);\n    },\n\n    changeActiveRoom(newActive) {\n        var previousActiveRoom;\n        previousActiveRoom = this.get('activeRoom');\n        return this.attemptRoomChange(newActive).then(() => {\n            this.removeRoomFromHistoryStack(newActive);\n            this.addRoomToHistoryStack(newActive);\n            if (previousActiveRoom) {\n                this.clearRoomNotificationCounts(newActive);\n                this.clearRoomUnreadMessages(previousActiveRoom);\n                previousActiveRoom.pruneMessages();\n            }\n\n            if (this.get('allowUserRemoval') && !newActive.isOneToOneRoom() && !newActive.get('isAcdRoom')) {\n                return this.setRoomDetails(newActive.get('jid'));\n            }\n            return newActive;\n        });\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.get('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.get('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        // depending on who calls updateVolumes, skip server could be undefined\n        // in those moments, we shouldn't need to 'save' the preference\n    },\n\n    removeRoomFromHistoryStack(room) {\n        if (room) {\n            return this.get('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.get('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.get('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.get('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    refocusActiveRoom() {},\n\n    activateRoom() {},\n\n    focusRoom(room) {\n        return this.get('streaming.connection').setFocused(room.get('jid'));\n    },\n\n    loadRecentHistoryForAllActiveRooms() {\n        let rooms = this.get('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 = Ember.RSVP.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 Ember.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            Ember.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.get('messagesPerHistoryRequest'));\n        } else {\n            room.set('moreHistoryAvailable', messages.length >= this.get('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.get('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    _resolveRealtimeDependentCalls: Ember.observer('connected', function () {\n        if (this.get('connected') && this.get('streamingConnectDeferred')) {\n            this.get('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.get('ajax')\n                .ajaxGet(this.get('application').pcV2Uri(`api/v2/chats/rooms/${jid}`))\n                .then(details => {\n                    room.processRoomDetails(details);\n                    return room;\n                })\n                .catch(err => {\n                    Ember.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.get('ajax').delete(\n                this.get('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.get('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 Ember.RSVP.hash({\n            room: this.getChatRoom(roomJid),\n            person: this.get('batchDataRequests').getChatUser(userJid)\n        });\n    },\n\n    loadUsersForHistory(historyMessages) {\n        var message;\n        if (_.isEmpty(historyMessages)) {\n            return Ember.RSVP.resolve(historyMessages);\n        }\n        return Ember.RSVP.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 = Ember.getOwner(this);\n        let messageBody = this.parseMessageBody(message);\n\n        delete message.body;\n\n        Ember.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.get('batchDataRequests')\n            .getChatUser(message.from)\n            .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                    Ember.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', Ember.Object.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                Ember.Object.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    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            return message.set('unread', !roomIsVisible || !windowFocused);\n        }\n    },\n\n    isActiveRoom(room) {\n        return this.isActiveRoomJid(Ember.get(room, 'jid'));\n    },\n\n    isActiveRoomJid(jid) {\n        return jid && this.get('activeRoom.jid') === jid;\n    },\n\n    isRoomVisible() {\n        return false;\n    },\n\n    isChatVisible() {\n        return false;\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() {\n        // no op for now\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.get('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.get('roster').incrementUnreadGroupMessage(messageModel, room);\n                }\n\n                if (this.get('permissions.canViewBusinessChat')) {\n                    this.sendNotification(messageModel);\n                }\n            });\n        });\n    }\n});\n","define(\"connections-ui/services/clock\", [\"exports\", \"ember-purecloud-components/services/clock\"], function (_exports, _clock) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clock.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport _ from 'lodash';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport moment from 'connections-ui/utils/dates';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport UriBuilder from '../mixins/conversation-uri-builder';\nimport participantStatus from '../utils/acdParticipantStatuses';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { inject, Evented } = Ember;\nconst { Promise } = Ember.RSVP;\nconst INTERACTION_TYPE = {\n    call: 'calls',\n    chat: 'chats',\n    email: 'emails',\n    callback: 'callbacks',\n    message: 'messages'\n};\n\nexport default Ember.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: inject.service(),\n    session: inject.service(),\n    store: inject.service(),\n    addressformat: inject.service(),\n    ajax: inject.service(),\n    phone: inject.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.get('_timers').forEach(item => Ember.run.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    /**\n     * Schedules a callback for an existing conversation.\n     *\n     * @param {Interaction} interaction - the interaction to schedule a callback for\n     * @param {object} data -\n     *              {array} callbackNumbers - the numbers for the callback\n     *              {string} callbackScheduledTime - ISO8601 string for when to send the callback\n     *                  {object} routingData -\n     *                  {array} preferredAgents - list of preferred agent ids\n     */\n    scheduleCallback(interaction, data) {\n        const customer = interaction.get('participantForCustomer');\n        let queueId = interaction.get('participantForCurrentUser.queueId') || customer.queueId;\n        const callbackUserName = customer.name ? customer.name.toString() : null;\n        const countryCode = this.get('addressformat.countryCode');\n        const id = interaction.get('id');\n\n        if (data && data.routingData) {\n            if (!data.routingData.queueId) {\n                Object.assign(data.routingData, { queueId: queueId });\n            } else {\n                queueId = data.routingData.queueId;\n            }\n        }\n\n        const uri = this.scheduleCallbackUri(id, customer.id);\n        const postData = Object.assign(\n            {},\n            {\n                callbackUserName: callbackUserName,\n                countryCode: countryCode,\n                queueId: queueId\n            },\n            data\n        );\n        const options = { data: postData };\n\n        return this.makeRequest(uri, 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 (!Ember.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 (!Ember.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\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', true);\n            }\n        });\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\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', false);\n            }\n        });\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 = Ember.get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && Ember.get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n        const hasPlacedCallsInCallback =\n            typeof Ember.get(interaction, 'participantForCurrentUser.calls.firstObject') === 'object';\n        if (\n            Ember.get(interaction, 'useCommunicationACW') &&\n            Ember.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) {\n        // PATCH /api/v2/conversations/emails/{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 options = { data: { state: participantStatus.PARKED } };\n\n        return this.makeRequest(url, options, 'patch');\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 (Ember.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.get('store').hasRecordForId('person', userId)) {\n                return Promise.resolve(this.get('store').peekRecord('person', userId));\n            }\n            return this.get('store')\n                .findRecord('person', userId)\n                .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 (Ember.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    saveProvisionalACW(interaction, { notes, wrapup }) {\n        if (!interaction) {\n            return Ember.RSVP.Promise.reject('No interaction provided.');\n        }\n\n        if (!notes && !wrapup) {\n            return Ember.RSVP.Promise.reject('Nothing to save to provisional ACW');\n        }\n\n        const interactionId = Ember.get(interaction, 'id');\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const mediaType = Ember.get(interaction, 'type');\n        const communicationId = Ember.get(interaction, 'communicationMedia.id');\n        const code = wrapup ? wrapup.id : Ember.get(interaction, 'selectedWrapupCode.id');\n        const name = wrapup ? wrapup.name : Ember.get(interaction, 'selectedWrapupCode.name');\n        notes = notes || Ember.get(interaction, 'notes');\n\n        let method = 'patch';\n        let url = this.participantUri(interactionId, userId, INTERACTION_TYPE[mediaType]);\n        let payload = {\n            wrapup: { provisional: true }\n        };\n\n        if (code && name) {\n            payload.wrapup.code = code;\n            payload.wrapup.name = name;\n        }\n\n        if (notes) {\n            payload.wrapup.notes = notes;\n        }\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            method = 'post';\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n            payload = payload.wrapup;\n        }\n\n        const options = { data: payload };\n        return this.makeRequest(url, options, method);\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    transfer(interaction, options, query, entityType = '') {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const interactionType = !this.get('session.features.acdTransferPermissions')\n            ? INTERACTION_TYPE[interaction.get('type')]\n            : null;\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.get('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.get('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.get('validationWaitTime');\n\n            const VALIDATION_TIMEOUT = Ember.run.later(function () {\n                return verifyViaAjax();\n            }, VALIDATION_INTERVAL);\n            this.get('_timers').push(VALIDATION_TIMEOUT);\n\n            if (!interaction) {\n                return valResolve();\n            }\n\n            checkForSuccessUpdate();\n            createObserver();\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                logger.debug(`ACD: validateActionSucceeded: Observer created on ${attributeToMonitor}`);\n                interaction.addObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function destroyObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer destroyed on ${attributeToMonitor}`);\n                interaction.removeObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function checkForSuccessUpdate() {\n                if (actionHasSucceeded()) {\n                    Ember.run.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 (Ember.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        if (this.get('session.features.acdTransferPermissions') && typeof destination === 'object' && entityType) {\n            data = destination;\n        }\n        const options = { data };\n        const url = this.consultUri(interactionId, customerId, INTERACTION_TYPE[interaction.get('type')], entityType);\n\n        return !customerId\n            ? Ember.RSVP.reject(new Error('customer not present'))\n            : 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')]);\n        const options = { data: { speakTo: 'BOTH' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.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')]);\n        const options = { data: { speakTo: 'CONFERENCE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.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')]);\n        const options = { data: { speakTo: 'DESTINATION' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.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')]);\n        const options = { data: { speakTo: 'OBJECT' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.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 url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\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 Ember.RSVP.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 Ember.RSVP.all([Ember.RSVP.resolve(res), this.makeRequest(url, mediaRequestOptions, 'post')]);\n            });\n        }\n\n        return Ember.RSVP.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 = Ember.get(interaction, 'participantForCurrentUser.id');\n        const interactionId = Ember.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 url = '/platform/api/v2/conversations/emails';\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    /**\n     * Initializes the draft to be ready for use in editor.\n     * @param {string} emailId: id of conversation\n     * @param {object} options: object containing draft options\n     * @param {object} query: endpoint query paramaters\n     * @returns promise\n     */\n    initializeDraft(emailId, options, query) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    /**\n     * Discards the draft to be ready for initializing once more.\n     * @param {string} emailId: id of conversation\n     * @param {object} query: enpoint query paramaters\n     * @returns promise\n     */\n    discardDraft(emailId, options, query = { autoFill: false, discard: true }) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    loadSMSHistory: function (interactionId) {\n        const url = this.smsHistoryUri(interactionId);\n        return this.makeRequest(url, {}, 'get').then(response => {\n            let messageIds = [];\n            _.each(response.participants, participant => {\n                _.each(participant.messages, message => {\n                    _.each(message.messages, msg => {\n                        messageIds.push(msg.messageId);\n                    });\n                });\n            });\n            return _.uniq(messageIds);\n        });\n    },\n\n    sendSMSMessage: function (interactionId, communicationId, message) {\n        const url = this.sendSMSMessageUri(interactionId, communicationId);\n        const timestamp = moment().utc().format();\n        const options = {\n            data: {\n                direction: 'outbound',\n                timestamp: timestamp\n            },\n            method: 'post'\n        };\n        if (this.get('session.features.acdNormalizedMessages')) {\n            if (\n                message.normalizedMessage &&\n                message.normalizedMessage.content &&\n                message.normalizedMessage.content.length > 0 &&\n                message.normalizedMessage.content[0].attachment\n            ) {\n                if (message.normalizedMessage.content[0].attachment.mime === 'image/vnd.genesys.sticker')\n                    options.data.stickerIds = [message.normalizedMessage.content[0].attachment.id];\n                else 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        } else {\n            if (message.media && message.media.length > 0 && message.attachmentId) {\n                options.data.mediaIds = [message.attachmentId];\n            } else if (message.stickers && message.stickers.length > 0) {\n                options.data.stickerIds = [message.stickers[0].id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.textBody;\n            }\n        }\n        return this.makeRequest(url, options);\n    },\n\n    createMediaAttachment: function (interactionId, communicationId) {\n        const url = this.createMediaAttachmentUri(interactionId, communicationId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    createMessage: function (options, useExistingConversation) {\n        const url = this.createCommunicationUri('messages');\n        const isExternalContact = Ember.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    getMediaAttachment: function (interactionId, communicationId, mediaId) {\n        const url = this.getMediaAttachmentUri(interactionId, communicationId, mediaId);\n        return this.makeRequest(url, {}, 'get');\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    getMessageSupportedContent: function (interaction) {\n        const subMessageType = interaction.get('subMessageType');\n        if (subMessageType) {\n            const integrationId = interaction.get(\n                'participantForCustomer.messages.firstObject.toAddress.addressNormalized'\n            );\n            const deploymentId = interaction.get('participantForCustomer.messages.firstObject.toAddress.addressRaw');\n            if (integrationId && subMessageType !== 'webmessaging') {\n                const integrationUri = this.getSupportedContentUri(subMessageType, integrationId);\n                return this.makeRequest(integrationUri, {}, 'get');\n            } else if (deploymentId) {\n                return this.getDeploymentConfig(deploymentId, true);\n            }\n        }\n\n        return Ember.RSVP.reject(\n            new Error('Missing integration Id or sub message type from interaction ', Ember.get(interaction, 'id'))\n        );\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 Ember.RSVP.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 Ember.RSVP.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 Ember.RSVP.reject(new Error(`Missing conversation Id: ${conversationId} or summary Id: ${summaryId}`));\n    }\n});\n","define(\"connections-ui/services/conversation\", [\"exports\", \"ember-purecloud-components/services/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import CookiesService from 'ember-cookies/services/cookies';\n\nexport default CookiesService;\n","import { observer } from '@ember/object';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, inject, computed, Evented } = Ember;\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: inject.service(),\n    webrtcSettings: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n    intl: inject.service(),\n    phone: inject.service(),\n    chat: inject.service(),\n    settings: inject.service(),\n    feature: inject.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: inject.service('notification-proxy'),\n    incomingInvitations: Ember.A(),\n    headset: inject.service(),\n\n    deviceUpdateDelay: 1500,\n    deviceChanges: null,\n    recentlyConnectedDevices: null,\n    allowDisableProfileNotifications: Ember.computed.readOnly(\n        'session.features.webrtcDisableDeviceProfileNotifications'\n    ),\n    // Returns settings once the webrtc-settings service has initialized and fetched settings.\n    profileSettingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n    allowDefaultProfiles: computed.reads('session.features.webrtcDefaultDeviceProfile'),\n    initProfiles: observer('allowDefaultProfiles', async function () {\n        // Fetch profiles again when we have a value here.\n        await this._fetchProfiles();\n    }),\n\n    async init() {\n        this._super(...arguments);\n        this.get('webrtcSdkService').on('mediaStateChange', this._handleMediaStateChange.bind(this));\n        this.get('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        const settings = await this.get('profileSettingsPromise');\n        const selectedProfile = (settings.directorySettings && settings.directorySettings.selectedProfile) || '';\n        const defaultProfileId = 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 && this.get('allowDefaultProfiles') ? 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.get('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.get('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.get('profileSettingsPromise');\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        if (this.get('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.get('profiles').findBy('id', this.get('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.get('camera') === camera;\n        const micMatches = this.get('microphone') === mic;\n        const outputDeviceMatches = !hasOutputDeviceSupport || this.get('outputDevice') === outputDevice;\n        const notificationDeviceMatches =\n            !hasOutputDeviceSupport || this.get('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.get('webrtcSdkService').setDevices(newDevices);\n            this.trigger('profileDevicesChanged', newDevices);\n        }\n    },\n\n    async _updateVolumes() {\n        const outputDeviceVolumes = await this._getVolumesForDevice(this.get('outputDevice'));\n        this.get('phone').updateVolumes(outputDeviceVolumes);\n\n        this.get('webrtcSdkService').setCallVolume(outputDeviceVolumes.callVolume);\n\n        const notificationDeviceVolumes = await this._getVolumesForDevice(this.get('notificationDevice'));\n        this.get('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        };\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.get('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                    Ember.run.later(() => this.trigger('showProfileSelection'));\n                }\n\n                notification.hide();\n            }\n        };\n    },\n\n    _openPhoneSettingsTab() {},\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 ? deviceA.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const formattedNameB = deviceB.label ? deviceB.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const hasSameName = formattedNameA === formattedNameB;\n\n        return hasSameId || hasSameName;\n    },\n\n    async _conditionallyShowToastForAddedDevices(addedDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && 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.get('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.get('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.get('notification').info(title, message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n        } else {\n            this.get('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.get('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.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        const selectableProfiles = this.get('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.get('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.get('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.get('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.get('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.get('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.get('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 Ember.A(this.get('profiles').filter(p => p.canBeSelected));\n    }),\n\n    async deleteProfile(profileId) {\n        const profiles = [].concat(this.get('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.get('selectedProfileId') === profileId) {\n            await this.setProfile('');\n        }\n\n        // Remove profile from stored profiles.\n        const settingsService = this.get('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.get('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.get('profileSettingsPromise');\n            settings.directorySettings.selectedProfile = profile.id;\n            settings.directorySettings.profiles = this.get('vanillaProfiles');\n\n            await this.get('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 Ember from 'ember';\nimport { Client } from 'iframe-coordinator/dist/client.js';\nimport { setCustomAttribute } from 'ember-purecloud-components/utils/newrelic-legacy';\nimport { getEnvDetails } from 'connections-ui/utils/net';\n\nconst { run } = Ember;\nconst defaultLocale = 'en-us';\nconst hostResponseTimeout = 10000;\nconst embeddedStatus = window.self !== window.parent;\nconst urlSearchParams = new URLSearchParams(window.location.search);\nconst isLocallyIntegrated = urlSearchParams.get('host-is-local') === 'false';\nconst integrationContext = urlSearchParams.get('context');\n\nexport const EmbeddedEvents = {\n    ENVIRONMENTAL_DATA: 'environmentalData',\n    NOTIFICATION: 'notificationEvent',\n    DISMISS_NOTIFICATION: 'dismissToast',\n    SHOW_NOTIFICATION: 'showToast',\n    PAGE_DATA: 'page.data',\n    LAUNCH_VIDEO_WITH_PERSON_BY_ID: 'launchVideoWithPersonById',\n    LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID: 'launchVideoProviderWithPersonById',\n    START_CHAT_WITH_PERSON_BY_ID: 'startChatWithPersonById',\n    UPDATE_PROFILE_IMAGE: 'updateProfileImage',\n    START_CHAT_BY_JID: 'startChatByJid',\n    FAVORITE_ENTITY_BY_ID: 'favoriteEntityById',\n    START_CALL_PERSON_BY_ID: 'callPersonById',\n    START_CALL_BY_NUMBER: 'phone.makeCall',\n    USER_GENERAL_FIELD_UPDATED: 'userGeneralFieldUpdated',\n    EMERGENCY_ADDR_UPDATED: 'emergencyAddrUpdated',\n    STREAMING_TOPIC_SUBSCRIBE: 'streamingTopicSubscribe',\n    STREAMING_TOPIC_UNSUBSCRIBE: 'streamingTopicUnsubscribe'\n};\n\nconst LISTENERS = {\n    NOTIFICATION_ACTION: 'toastAction',\n    ENTITY_FAVORITE_ACTION: 'entityFavoriteAction',\n    STREAMING_TOPIC_MESSAGE: 'streamingTopicMessage',\n    STREAMING_TOPIC_SUBSCRIBE_ERROR: 'streamingTopicSubscribeError'\n};\n\nclass IframeClientTimeoutError extends Error {\n    constructor(event, timeout) {\n        super('Iframe coordinator client event listener timed out');\n        this.name = 'IframeClientTimeoutError';\n        this.event = event;\n        this.timeout = timeout;\n    }\n}\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    stashLogger: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    application: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    session: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n\n    isEmbedded: embeddedStatus,\n\n    getHostOrigin() {\n        let env = getEnvDetails();\n        if (isLocallyIntegrated) {\n            return `https://apps.${env.runtime.currentDomainName}/`;\n        }\n        // Hardcoding localhost:4300 breaks IFC publish (postMessage targetOrigin mismatch → silent drop)\n        return window.location.origin;\n    },\n\n    setLocale(locale) {\n        if (!locale) {\n            return;\n        }\n\n        setCustomAttribute('uiLanguage', locale);\n        return this.get('intl').setLocale(locale);\n    },\n\n    checkForHostRedirect() {\n        // noop for now\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initializeFrame();\n    },\n\n    async initializeFrame() {\n        await this.initializeClient();\n    },\n\n    async initializeClient() {\n        if (integrationContext === 'adminui') {\n            this.set('application.adminUIContext', true);\n        }\n\n        // Do not initialize client if not rendered in a frame\n        if (!this.get('isEmbedded')) {\n            this.setLocale(defaultLocale);\n            return;\n        }\n\n        // Only initialize client once\n        if (this.get('client')) {\n            return;\n        }\n\n        const client = new Client({\n            hostOrigin: this.getHostOrigin()\n        });\n\n        this.set('client', client);\n\n        const environmentalDataListener = new Promise((resolve, reject) => {\n            client.addListener(EmbeddedEvents.ENVIRONMENTAL_DATA, data => {\n                this.set('hostRootUrl', data.hostRootUrl);\n\n                if (data.custom) {\n                    this.set('application.browserHidden', data.custom.browserHidden);\n                }\n\n                resolve(this.setLocale(data.locale));\n            });\n\n            run.later(\n                this,\n                () => reject(new IframeClientTimeoutError(EmbeddedEvents.ENVIRONMENTAL_DATA, hostResponseTimeout)),\n                hostResponseTimeout\n            );\n        });\n\n        client.start();\n\n        try {\n            await environmentalDataListener;\n        } catch (e) {\n            if (\n                this.get('application.adminUIContext') &&\n                !(this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition'])\n            ) {\n                return; // We are embedded in Admin-UI, and we don't need IFC,\n                // only when we are embedded in Web-Directory or Users-UI, we needs IFC.\n            }\n            this.setLocale(defaultLocale);\n            this.get('stashLogger').error(e.message, e);\n        }\n\n        this.registerEventHandlers();\n    },\n\n    //==========================================================\n    // Handle events from IFC\n    //==========================================================\n\n    registerEventHandlers() {\n        if (!this.get('client')) {\n            return;\n        }\n\n        const client = this.get('client');\n        Object.keys(LISTENERS).forEach(key => {\n            client.messaging.addListener(LISTENERS[key], event => {\n                if (event && event.payload) {\n                    this[LISTENERS[key]](event);\n                }\n            });\n        });\n    },\n\n    toastAction(event) {\n        const { action, id } = event.payload;\n        this.get('notification').handleNotificationAction(action, id);\n    },\n\n    entityFavoriteAction(event) {\n        this.get('favorites').handleEntityFavoriteAction(event.payload);\n    },\n\n    streamingTopicMessage(message) {\n        this.get('pigeon').onMessage('streaming', message.payload);\n    },\n    streamingTopicSubscribeError(message) {\n        this.get('pigeon').onSubscriptionError(message.payload);\n    },\n\n    //==========================================================\n    // Publish events to IFC\n    //==========================================================\n\n    requestNotification(notification) {\n        const client = this.get('client');\n\n        if (!client || !notification) {\n            return;\n        }\n        client.requestNotification(notification);\n    },\n\n    publishMessage(topic, payload) {\n        const client = this.get('client');\n\n        if (!topic || !payload || !client) {\n            return;\n        }\n\n        return client.publish({\n            topic,\n            payload\n        });\n    },\n\n    dismissNotification(id) {\n        this.publishMessage(EmbeddedEvents.DISMISS_NOTIFICATION, { id });\n    },\n\n    showNotification(options) {\n        this.publishMessage(EmbeddedEvents.SHOW_NOTIFICATION, { options });\n    },\n\n    notifyAcdCount(count) {\n        this.publishMessage(EmbeddedEvents.ACDCOUNT_EVENT, { count });\n    },\n\n    sendSidebarEvent(event, panel, key, value) {\n        if (!this.get('isEmbedded')) {\n            return;\n        }\n\n        const options = {\n            type: event\n        };\n\n        if (panel) {\n            options.panel = panel;\n        }\n\n        if (key) {\n            options.key = key;\n        }\n\n        if (value) {\n            options.value = value;\n        }\n\n        this.publishMessage(EmbeddedEvents.SIDEBAR_EVENT, options);\n    },\n\n    sendNavigationEvent({ hash }) {\n        const client = this.get('client');\n\n        if (!client || !hash) return;\n\n        const url = new URL(window.location.origin);\n        url.hash = hash;\n\n        if (!url) {\n            this.get('stashLogger').error('Unable to parse provided hash into url.', {\n                hash\n            });\n            return;\n        }\n\n        client.requestNavigation({ url: url.href });\n    },\n\n    sendPageData(options) {\n        this.publishMessage(EmbeddedEvents.PAGE_DATA, options);\n    },\n\n    launchVideoWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    launchVideoProviderWithPersonById(personId, providerId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID, { personId, providerId });\n    },\n\n    startChatWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    notifyUserGeneralFieldUpdated(entityId) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, {});\n        }\n    },\n\n    notifyEmergencyAddrUpdated() {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADDR_UPDATED, {});\n    },\n\n    notifyUpdateProfileImage(images, entityJid) {\n        this.publishMessage(EmbeddedEvents.UPDATE_PROFILE_IMAGE, {\n            image: images,\n            entityJid\n        });\n    },\n\n    startChatByJid(jid) {\n        if (!jid) return;\n        this.publishMessage(EmbeddedEvents.START_CHAT_BY_JID, { jid: jid.toString() });\n    },\n\n    favoriteEntityById(options) {\n        this.publishMessage(EmbeddedEvents.FAVORITE_ENTITY_BY_ID, options);\n    },\n\n    startCallPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CALL_PERSON_BY_ID, personId.toString());\n    },\n\n    startCallByNumber(phoneNumber) {\n        this.publishMessage(EmbeddedEvents.START_CALL_BY_NUMBER, { phoneNumber });\n    },\n\n    entityGeneralFieldUpdated(entityId, field) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, field);\n        }\n    },\n\n    emergencyAdrUpdated(emergencyAdr) {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADR_UPDATED, emergencyAdr);\n    },\n\n    streamingTopicSubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_SUBSCRIBE, topic);\n    },\n\n    streamingTopicUnsubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_UNSUBSCRIBE, topic);\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport EmergencyLocationUtil from '../utils/emergency-location-util';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject } = Ember;\n\nconst POLL_INTERVAL = 1200000; //20min\n\nexport default Ember.Service.extend({\n    session: inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    addressformat: inject.service(),\n    embedded: inject.service(),\n\n    eLocation: null,\n    isAuthenticated: computed.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.get('eLocation'),\n                eLocationInlineWarning: this.get('eLocationInlineWarning'),\n                primaryVoice: this.get('primaryVoice'),\n                isEligibleForE911: this.get('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.get('addressformat').formatAddress(phoneNumber);\n\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('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.get('application').pcV2Uri(`api/v2/users/me`);\n        if (userId) {\n            url = this.get('application').pcV2Uri(`api/v2/users/${userId}`);\n        }\n        return this.get('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.get('addressformat').formatAddress(\n                            primaryPhoneObject.address || primaryPhoneObject.display\n                        );\n                        this.set('primaryVoice', {\n                            number,\n                            display: this.get('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.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                );\n                return Ember.RSVP.reject({\n                    err: 'No primary number found',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                });\n            })\n            .catch(err => {\n                if (err.softError) {\n                    return Ember.RSVP.reject(err);\n                }\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                );\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: this.get('intl').lookup('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.get('application').pcV2Uri(\n            'api/v2/carrierservices/integrations/emergencylocations/verifyphonenumber'\n        );\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('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 Ember.RSVP.resolve({\n                    supported: false\n                });\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.reject({\n                    err,\n                    softError: this.get('intl').lookup('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                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                this.clearElocation();\n                const defaultMessage = this.get('intl').lookup('emergencyLocation.errors.e911LocationLookup', {\n                    number: this.get('primaryVoice.display')\n                });\n\n                const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err, defaultMessage));\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n\n                return Ember.RSVP.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.get('isDestroyed') || this.get('isDestroying')) {\n            return Ember.RSVP.resolve();\n        }\n        if (!this.get('isAuthenticated')) {\n            return Ember.RSVP.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.get('intl').lookup('emergencyLocation.errors.e911NotEligible')\n                };\n            })\n            .catch(errObject => {\n                const messageBody = errObject.softError;\n                if (messageBody && !this.get('eLocationInlineWarning')) {\n                    this.set('eLocationInlineWarning', messageBody);\n                }\n\n                return Ember.RSVP.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.get('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        Ember.run.later(() => {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n        }, 100);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        clearInterval(this.get('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.get('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.get('ajax')\n            .post(url, options)\n            .catch(err => {\n                let errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                return Ember.RSVP.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","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_ACTIVE_DRAWER_EVENT = 'system.event.drawerselect';\n\nconst eventsService = Service.extend(Evented, {\n    triggerEvent(event: any, payload: any) {\n        console.log('jrr: event triggered', {\n            event,\n            payload\n        });\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 Ember from 'ember';\nimport { createContactPojo } from 'connections-ui/utils/acd';\nconst { Service, inject, setProperties, get, computed } = Ember;\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(Ember.Evented, {\n    store: inject.service(),\n    pigeon: inject.service(),\n    names: inject.service(),\n    permissions: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    _trackedContacts: [],\n    contacts: computed.oneWay('_trackedContacts'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n        this.set('contactCallbackData', []);\n        this.get('pigeon').on(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('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(Ember.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.get('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.get('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.get('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.get('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.get('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     * 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 = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n            ? ModelBuilder.create(payload, Ember.getOwner(this).ownerInjection())\n            : ModelBuilder(payload);\n        const externalContactId = get(currInteraction, 'participantForCustomer.externalContactId');\n        currInteraction.destroy();\n\n        if (prevRaw) {\n            const prevInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n                ? ModelBuilder.create(prevRaw, Ember.getOwner(this).ownerInjection())\n                : ModelBuilder(prevRaw);\n            const previousContactId = get(prevInteraction, 'participantForCustomer.externalContactId');\n            prevInteraction.destroy();\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 = Ember.get(contact, 'division.id') || '*';\n\n        if (!this.get('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.get('contactCallbackData').findBy('contactId', contactId);\n\n        if (!contactData) {\n            this.get('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.get('_trackedContacts').findBy('id', contactId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(contact));\n        }\n        if (canonicalId !== contactId && !this.get('_trackedContacts').findBy('id', canonicalId)) {\n            this.get('_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.get('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.get('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.get('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.get('trackedContactIds');\n        const trackedContacts = this.get('_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.get('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.get('_trackedContacts');\n                const contactCallbackData = this.get('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                        Ember.run.schedule('actions', this, '_invokeCallbacks', callbacks, eventData);\n                        this.trigger(type, eventData);\n                    }\n                }\n            } catch (e) {\n                this.get('logger').error('ACD Relate: Error occurred when handling external contact change event', {\n                    remoteData: {\n                        contactId\n                    }\n                });\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, observer, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, LoggerMixin, {\n    intl: inject.service(),\n    ajax: inject.service(),\n    chat: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    embedded: inject.service(),\n\n    initialized: false,\n\n    _favorites: null,\n    favoritePromise: Ember.RSVP.defer(),\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _favorites: []\n        });\n\n        this.loadFavoritesForSessionPerson();\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                this.favoritePromise.resolve(this.get('_favorites'));\n                return;\n            }\n\n            if (this.get('session.isAuthenticated') && this.get('session.person')) {\n                if (this.get('initialized')) {\n                    this.favoritePromise.resolve(this.get('_favorites'));\n                } else {\n                    this.initFavorites().then(\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        },\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        }\n                    );\n                }\n            }\n        }\n    ),\n\n    initFavorites() {\n        return this.getFavorites().then(peopleAndGroups => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.setFavorites(peopleAndGroups);\n            this.set('initialized', true);\n        });\n    },\n\n    getFavorites() {\n        return this.get('store')\n            .findFavorites()\n            .then(data => {\n                return this._handleHiddenGroups(data);\n            });\n    },\n\n    getLoadedFavorites() {\n        return this.favoritePromise.promise;\n    },\n\n    setFavorites(peopleAndGroups) {\n        const favorites = _.chain([])\n            .concat(peopleAndGroups)\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    // Handle favorite action performed in Web-Directory.\n    async handleEntityFavoriteAction(event) {\n        if (!event) {\n            return;\n        }\n        if (event.action === 'Favorited') {\n            if (!event.data || !event.data.entityType || !event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = await this.get('store').findRecord(event.data.entityType, event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').addObject(entity);\n            entity.set('isFavorite', true);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: true,\n                action: 'Favorited'\n            });\n        } else if (event.action === 'Unfavorited') {\n            if (!event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = this.get('_favorites').findBy('id', event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').removeObject(entity);\n            entity.set('isFavorite', false);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: false,\n                action: 'Unfavorited'\n            });\n        }\n    },\n\n    favoriteEntity(entity) {\n        // Trigger a favorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: true\n        });\n    },\n\n    unfavoriteEntity(entity) {\n        // Trigger an unfavorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: false\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    _handleHiddenGroups(models) {\n        const loadedIds = [...models.mapBy('entityId'), ...models.mapBy('guid'), ...models.mapBy('_id')].filter(\n            id => !!id\n        );\n        models._payload\n            .filter(object => object.entityType === 'group')\n            .forEach(object => {\n                const guid = object.entityId;\n                if (!_.includes(loadedIds, guid)) {\n                    // group wasn't loaded due to permissions\n                    const placeholder = this.get('store').push({\n                        data: {\n                            type: 'group',\n                            id: guid,\n                            attributes: {\n                                guid: guid,\n                                general: {\n                                    name: []\n                                }\n                            }\n                        }\n                    });\n\n                    this.logger.info('Favorites: Adding placeholder', { guid });\n\n                    models.pushObject(placeholder);\n                }\n            });\n\n        return models;\n    }\n});\n","define(\"connections-ui/services/feature\", [\"exports\", \"ember-purecloud-components/services/feature\"], function (_exports, _feature) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _feature.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport AjaxService from 'ember-ajax/services/ajax';\n\nexport default AjaxService.extend({\n    application: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    trustedHosts: Ember.computed.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    async uploadGreetingWithPreSigned(file, groupId) {\n        const urlPath = `api/v2/groups/${groupId}/greetings/uploads`;\n        const presignedUrl = this.get('application').pcV2Uri(urlPath);\n        try {\n            const presignedUrlResponse = await this.get('ajax').post(presignedUrl, {\n                data: {\n                    tags: {\n                        ownerType: 'group',\n                        ownerId: groupId,\n                        name: 'voicemail',\n                        greetingType: 'voicemail'\n                    },\n                    fileName: file.name,\n                    contentType: file.type\n                }\n            });\n            await this.get('ajax').raw(presignedUrlResponse.url, {\n                contentType: false,\n                processData: false,\n                data: file,\n                method: 'PUT',\n                noAuthorizationHeader: true, // Prevent to use the classic GC Auth header\n                headers: presignedUrlResponse.headers,\n                dataType: 'text' // Upload will have an empty response\n            });\n            Ember.Logger.info(`Successful voicemail greeting upload: \"${file.name}\"`);\n        } catch (err) {\n            Ember.Logger.error('Error uploading voicemail file:', { error: err });\n            throw err;\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            Ember.Logger.error('<file-upload/faxUploadWithHeaders> file is undefined!');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, {\n    session: inject.service(),\n\n    isFullScreen: false,\n\n    handleFullScreenChange: function () {\n        Ember.run(() => {\n            if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                let fullScreen = document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement;\n                this.set('isFullScreen', !!fullScreen);\n\n                if (!this.get('isFullScreen')) {\n                    this.endFullScreen();\n                }\n            }\n        });\n    },\n\n    init() {\n        this._super(...arguments);\n        Ember.$(document).on('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.$(document).off('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    startFullScreen(isAcd = false, requestingElem) {\n        //Ensure messengerElement in under orgspan-app element to support toast notification while in fullscreen\n        const messengerElement = Ember.$('ul.messenger');\n        const orgspanApp = Ember.$('.orgspan-app');\n        if (!Ember.$.contains(orgspanApp, messengerElement)) {\n            messengerElement.appendTo(orgspanApp);\n        }\n\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').addClass('hosted-fullscreen');\n        } else {\n            const elem = requestingElem ? $(requestingElem)[0] : $('.orgspan-app')[0];\n            const requestFullscreen =\n                elem.requestFullscreen ||\n                elem.webkitRequestFullscreen ||\n                elem.mozRequestFullScreen ||\n                elem.msRequestFullscreen;\n            requestFullscreen.apply(elem);\n        }\n\n        if (!isAcd) {\n            $('.orgspan-app').removeClass('fullscreen-v1');\n            $('.orgspan-app').addClass('fullscreen-v2');\n        } else {\n            $('.orgspan-app').removeClass('fullscreen-v2');\n            $('.orgspan-app').addClass('fullscreen-v1');\n        }\n\n        this.trigger('startFullscreen');\n    },\n\n    endFullScreen() {\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').removeClass('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 Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/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 Ember.Service.extend(LoggerMixin, {\n    currentPosition: {},\n    store: Ember.inject.service(),\n    session: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    application: Ember.inject.service(),\n    streaming: Ember.inject.service(),\n    geoUtil,\n    uuid: uuid,\n\n    isEnabled: Ember.computed.reads('isSwitchedOn'),\n    isSwitchedOn: false,\n\n    intervalReference: null,\n    isStarted: Ember.computed.and('geoWatchId', 'intervalReference'),\n\n    init() {\n        this._super(...arguments);\n        let context = this.get('application.hostedContext');\n        if (context && context.isHosted()) {\n            this.get('_desktopStart').perform();\n        } else {\n            this.get('start').perform();\n        }\n\n        this.get('geoUtil').setContext(context);\n    },\n\n    _lastReport: null,\n    report: Ember.observer('isSwitchedOn', 'streaming.connected', 'clientId', function () {\n        this.logger.debug(`GEOLOCATION: report observer fired`);\n        if (!this.get('isSwitchedOn') || !this.get('streaming.connected')) {\n            return;\n        }\n        const lastReport = this.get('_lastReport');\n        if (lastReport && moment().diff(lastReport, 'minutes') < REPORT_FREQUENCY_IN_MINUTES) {\n            return;\n        }\n        const clientId = this.get('clientId');\n        if (!clientId) {\n            return;\n        }\n        if (!this.get('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.get('_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.get('start').perform();\n        } else {\n            this.logger.debug('GEOLOCATION: desktop preference off', prefs);\n            try {\n                let result = yield this.get('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.get('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.get('preferences').getPreference('geolocation.clientId');\n            this.logger.debug(`GEOLOCATION: client id is ${clientId}`);\n            if (!clientId) {\n                clientId = this.get('uuid').generate();\n                try {\n                    yield this.get('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.get('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            if (!this.get('session').get('isAuthenticated')) {\n                //geolocation is requested at session authentication, if we are authenticated we got it\n                yield this.get('session').refreshPublicApiUser('geolocation');\n            }\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.get('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 Ember from 'ember';\nimport _ from 'lodash';\n\n// service for tracking a group's assigned roles and those roles' associated divisions\nexport default Ember.Service.extend({\n    // key: \"The role id\n    // value: An object containing the following\n    //      id: \"The role id\"\n    //      role: \"The role object\"\n    //      divisions: \"An array of division objects assigned to the role\"\n    _map: {},\n\n    changeCount: 0,\n\n    list: Ember.computed('_map', 'changeCount', function () {\n        return _.map(this.get('_map'), roleWithDivisions => {\n            return roleWithDivisions;\n        });\n    }),\n\n    addRole(roleId, { divisions, id, role }) {\n        this.get('_map')[roleId] = { divisions, id, role };\n        this.incrementChangeCount();\n    },\n\n    removeRole(roleId) {\n        delete this.get('_map')[roleId];\n        this.incrementChangeCount();\n    },\n\n    getRoleWithDivisions(roleId) {\n        return this.get('_map')[roleId];\n    },\n\n    setMap(assignedRolesMap) {\n        this.clear();\n        this.set('_map', assignedRolesMap);\n    },\n\n    incrementChangeCount() {\n        this.set('changeCount', this.get('changeCount') + 1);\n    },\n\n    containsRole(roleId) {\n        return !!this.get('_map')[roleId];\n    },\n\n    clear() {\n        this.incrementChangeCount();\n        this.set('_map', {});\n    }\n});\n","define(\"connections-ui/services/headset\", [\"exports\", \"ember-softphone-integration/services/headset\"], function (_exports, _headset) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _headset.default;\n    }\n  });\n});\n","define(\"connections-ui/services/iframe-state\", [\"exports\", \"ember-purecloud-components/services/iframe-state\"], function (_exports, _iframeState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _iframeState.default;\n    }\n  });\n});\n","import Service from 'smoke-and-mirrors/services/in-viewport';\n\nexport default Service;\n","import Ember from 'ember';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport moment from 'connections-ui/utils/dates';\nimport { batchEntityIds } from './store';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\nconst { computed, inject } = Ember;\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';\nconst USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT = 'gcucc.ui.useIntegrationPresenceSourceDirectorySearch';\nconst REDUCE_PRESENCE_POLLING_FT = 'gcucc-ui-PCUCC-3734';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    apps: inject.service(),\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    phoneIntegrations: inject.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.get('presencePollIntervalSec') * 1000;\n    }),\n\n    reducePresencePolling: computed('session.features', function () {\n        return this.getFeatureToggle(REDUCE_PRESENCE_POLLING_FT);\n    }),\n\n    useIntegrationPresenceDirectorySearch: Ember.computed('session.features', function () {\n        return this.getFeatureToggle(USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT);\n    }),\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    alreadyTriggeredPresenceInterval: false,\n\n    triggerPresenceInterval: Ember.on(\n        'init',\n        // set up an observer to fire when integrations change\n        Ember.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.get('alreadyTriggeredPresenceInterval')) {\n                this.toggleProperty('alreadyTriggeredPresenceInterval');\n                this.trigger(INTEGRATIONS_LOADED_EVENT);\n            }\n        })\n    ),\n\n    presenceUpdateInterval: Ember.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.get('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 = Ember.run.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.get('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.get('presenceIntervalTimers');\n        this.get('logger').info('Stopping all presence intervals due to 401', {\n            intervals: this.get('presenceIntervalTimers')\n        });\n        Object.keys(timers).forEach(timerKey => {\n            Ember.run.cancel(this.get(`presenceIntervalTimers.${timerKey}`));\n        });\n    },\n    removePresenceInterval(integration) {\n        this.get('logger').info(`Stopping the presence interval for ${integration.key}`, {\n            integration\n        });\n        const timer = this.get(`presenceIntervalTimers.${integration.key}`);\n        Ember.run.cancel(timer);\n    },\n\n    async updateSessionData(integration) {\n        const url = this.get('application').pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integration.key}/auth/users/status`\n        );\n        const sessionData = await this.get('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            if (this.get('reducePresencePolling')) {\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) {\n                        return;\n                    }\n                }\n            }\n            // try looking at the cache instead of making an api call\n            const users = this.get('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                    if (this.get('reducePresencePolling')) {\n                        this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n                    }\n                }\n            } else {\n                // log no users found\n                this.get('logger').info(\n                    `services/phone-integration: (${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.get('logger').error(`services/phone-integration: 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.get('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.get('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 (\n                    err.payload &&\n                    err.payload.message === 'Session not available, new authorization code must be defined!'\n                ) {\n                    authError = err;\n                    this.get('logger').warn(\n                        `services/phone-integration: 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') === Ember.get(presenceResponse, 'userId'));\n        if (user) {\n            const presence = {\n                source: Ember.get(presenceResponse, 'source'),\n                message: Ember.get(presenceResponse, 'message'),\n                modifiedDate: Ember.get(presenceResponse, 'modifiedDate'),\n                presenceDefinition: Ember.get(presenceResponse, 'presenceDefinition')\n            };\n            Ember.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.get('intl').t('integrationPresence.errors.auth.title');\n            // show specific toast with action handler\n            let message = this.get('intl').t(`integrationPresence.errors.auth.${integration.key}.message`);\n            this.get('notification').show({\n                title: title,\n                message: message,\n                hideAfter: 8,\n                type: 'info',\n                clickHandler: () => {}\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.get('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 = Ember.get(user, 'integrationPhone');\n            let integrationKey = integrationPhone && integrationPhone.value.integration;\n            const integrationConfig = this.get('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.get('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.get('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 Ember from 'ember';\nexport default Ember.Service.extend({});\n","define(\"connections-ui/services/interval\", [\"exports\", \"ember-purecloud-components/services/interval\"], function (_exports, _interval) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _interval.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport IntlService from 'ember-intl/services/intl';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport config from 'connections-ui/config/environment';\nimport moment from 'connections-ui/utils/dates';\nimport escape from 'connections-ui/utils/escape';\nimport missingMessage from 'connections-ui/utils/intl/missing-message';\nimport { getEnvCookieDomain } from 'connections-ui/utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { get, inject, computed, RSVP } = Ember;\n\nconst addServerPrefix = function (key) {\n    return `server_translations.${key}`;\n};\n\nconst safeString = function (s) {\n    return Ember.String.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};\n\nexport default IntlService.extend({\n    ajax: inject.service(),\n    cookies: inject.service(),\n    application: inject.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.get('baseLocale');\n    }),\n\n    isRTL: computed('isoLocale', function () {\n        const isoLocale = this.get('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.get('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.get('isoLocale').split('-');\n        if (region) {\n            return `${locale}-${region.toUpperCase()}`;\n        }\n        return locale;\n    }),\n\n    t(key, opts, noEscape) {\n        if (!key) {\n            Ember.Logger.warn('There was no key provided to translate.');\n            return '';\n        }\n\n        if (noEscape === true) {\n            return this._super(key, opts);\n        }\n        if (!opts) {\n            return this._super(key);\n        }\n\n        return this._super(key, escape(opts));\n    },\n\n    _initialLocale() {\n        const authLocale = this.get('cookies').read(localeCookie);\n        const systemLocale = this.get('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.get('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, replacements, suppressError) {\n        if (this.exists(addServerPrefix(key))) {\n            return this.getWithServerKey(key);\n        }\n\n        if (!this.exists(key)) {\n            if (!isTesting && this.get('loaded')) {\n                Ember.Logger.warn('Undefined intl key', { key, locale: this.get('locale') });\n            }\n            return missingMessage(key, [this.get('locale')], suppressError);\n        }\n\n        //Achieves parity with old i18n functionality: all HTML was allowed in all translation strings\n        return safeString(this.t(key, replacements || {}));\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.get('baseLocale');\n        if (!validLocales.includes(baseLocale)) {\n            validLocales.push(baseLocale);\n        }\n\n        if (validLocales.length) {\n            // Set the moment locale\n            const lang = moment.locale(validLocales[0]);\n\n            // Set HTML locale (moment.locale returns just the language portion)\n            Ember.$('html').attr('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 = Ember.assign(dynamicCookieOptions, localeCookieOptions);\n            this.get('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    isLocale12Hour() {\n        return moment.localeData(this.get('locale')).longDateFormat('LT').indexOf('A') > -1;\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.get('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                        get(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.get('baseLocale');\n        const isoLocale = this.get('isoLocale');\n        const locales = [baseLocale];\n        if (isoLocale !== baseLocale) {\n            locales.push(isoLocale);\n        }\n        const translations = locales.map(locale => {\n            let cache = get(this, '_cache');\n            const cached = get(cache, locale);\n            if (cached) {\n                return Ember.RSVP.resolve(cached);\n            }\n            return this.loadLanguage(locale);\n        });\n        return Ember.RSVP.all(translations).then(() => {\n            this.set('loaded', true);\n            this.get('_loadedResolve')();\n        });\n    },\n\n    setupServerTranslations() {\n        // go ahead and kick off local file loading\n        this.loadTranslations();\n\n        const locale = this.get('isoLocale');\n        const url = this.get('application').pcV2Uri('api/v2/languages/translations/organization');\n\n        const defaultRequest = this.get('ajax').request(url, {\n            data: {\n                language: 'en-us'\n            }\n        });\n\n        let localeRequest = Ember.RSVP.resolve({});\n        if (locale !== 'en-us') {\n            localeRequest = this.get('ajax').request(url, {\n                data: {\n                    language: locale\n                }\n            });\n        }\n\n        return Ember.RSVP.allSettled([defaultRequest, localeRequest])\n            .then(([defaultTranslationsResult, localeTranslationsResult]) => {\n                const defaultTranslations = defaultTranslationsResult.value;\n                const localeTranslations = localeTranslationsResult.value;\n\n                if (!defaultTranslations) {\n                    Ember.Logger.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                Ember.Logger.warn(\"Couldn't load API translations:\", { err });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { PROVIDER_ID as INTERNAL_VIDEO_PROVIDER_ID } from 'connections-ui/media-providers/purecloud';\nimport LoggerMixin from '../mixins/logger';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n\n    defaultVideoProviders: null,\n\n    activeProvider: null,\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: Ember.computed('activeProvider.type', function () {\n        return this.get('activeProvider.type') === 'video';\n    }),\n\n    enabled: Ember.computed.or('teamsEnabled', 'zoomMeetingsEnabled'),\n    zoomMeetingsEnabled: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    teamsEnabled: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    // Internal\n\n    handleLogout(blockLogoutCb) {\n        if (this.get('usingVideoProvider')) {\n            blockLogoutCb('add', this);\n\n            let title = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.title');\n            let message = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.message');\n            this.get('notification').error(title, message);\n        } else {\n            blockLogoutCb('remove', this);\n        }\n    },\n\n    lookup(providerName, user, chatRoom) {\n        const provider = Ember.getOwner(this).lookup(`media-provider:${providerName}`);\n        provider.set('user', user);\n        provider.set('room', chatRoom);\n        provider.set('debug', this.get('debug'));\n        provider.loadData();\n        return provider;\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\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 Ember from 'ember';\nimport ENV from '../config/environment';\n\nconst { computed, Service } = Ember;\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: computed(function() {\n    /*\n      everywhere except test, this property will be overwritten\n      by the initializer that appends the modal container div\n      to the DOM. because initializers don't run in unit/integration\n      tests, this is a nice fallback.\n    */\n    if (ENV.environment === 'test') {\n      return 'ember-testing';\n    }\n  })\n});\n","import Ember from 'ember';\nimport MomentService from 'ember-moment/services/moment';\nimport config from '../config/environment';\n\nconst { get } = Ember;\n\nexport default MomentService.extend({\n  defaultFormat: get(config, 'moment.outputFormat')\n});\n","import Ember from 'ember';\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.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.get('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').lookup('purecloud.acdInteraction.relate.misc.fullName', {\n                    familyName,\n                    givenName,\n                    optionalMiddleName\n                });\n            } else {\n                return familyName;\n            }\n        }\n        return givenName;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Evented } = Ember;\n\nexport default Ember.Service.extend(Evented, {\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _notificationId: 0,\n    _actionHandles: {},\n    _clickHandlers: [],\n\n    nextNotificationId: Ember.computed('_notificationId', function () {\n        const currentNotificationId = this.get('_notificationId');\n        return (currentNotificationId || 0) + 1;\n    }),\n\n    _cleanUpHandlers(id) {\n        const handles = this.get('_actionHandles');\n        delete handles[id];\n    },\n\n    handleNotificationAction(action, id) {\n        const handles = this.get('_actionHandles');\n        const clickHandlers = this.get('_clickHandlers');\n\n        if (handles[id]) {\n            const handler = _.find(handles[id], v => {\n                return v.actionKey === action;\n            });\n\n            if (handler && typeof handler.action === 'function') {\n                handler.action(handler.target);\n                this._cleanUpHandlers(id);\n            } else if (handler && handler.target && handler.target[handler.actionKey]) {\n                handler.target[handler.actionKey](handler.target);\n                this._cleanUpHandlers(id);\n            } else {\n                this.get('logger').error('Attempted to invoke undefined notification handler.');\n            }\n\n            this.set('_actionHandles', handles);\n        }\n\n        if (action === 'clickHandlerTriggered') {\n            if (typeof clickHandlers[id] === 'function') {\n                clickHandlers[id]();\n            } else {\n                this.get('logger').error(\n                    `Attempted to trigger a click handler that isnt a function or was not registered. Click handler at id: ${id} is ${clickHandlers[\n                        id\n                    ].toString()}\\n`\n                );\n            }\n        }\n    },\n\n    requestNotification(title, message = '', custom = {}, type = 'info') {\n        let options = _.pick(custom, [\n            'id',\n            'hideAfter',\n            'tag',\n            'type',\n            'forceBrowserNotification',\n            'icon',\n            'showCloseButton',\n            'messageStyle',\n            'shouldShowPopup',\n            'shouldPlaySound',\n            'markdownToHtml',\n            'fallbackToInBrowser',\n            'showNotificationEverywhere'\n        ]);\n\n        // Legacy api was tag only. Copy as id for events, etc.\n        if (options.tag && !options.id) {\n            options.id = options.tag;\n        }\n\n        // Escape safe srings\n        if (title && title.string) {\n            title = title.string;\n        }\n\n        // Set notification id\n        if (!options.id) {\n            const nextNotificationId = this.get('nextNotificationId');\n            const generatedIdentifier = `connections-ui-notification-${nextNotificationId}`;\n\n            // Add an ID to the notification so it can be associated with notification actions from the iframe host\n            options.id = generatedIdentifier;\n            options.tag = generatedIdentifier;\n\n            // Messages after this one should have a different gnerated identifier\n            this.incrementProperty('_notificationId');\n        }\n\n        if (custom.clickHandler) {\n            let clickHandlers = this.get('_clickHandlers') || [];\n            let clickHandlerFunction = custom.clickHandler;\n            let id = options.id;\n            if (!clickHandlers[id] && typeof clickHandlerFunction === 'function') {\n                clickHandlers[id] = clickHandlerFunction;\n            }\n            options.clickHandler = true;\n        }\n\n        // Store action handles\n        if (custom.actionHandlers && custom.target) {\n            let handles = this.get('_actionHandles') || [];\n            let id = options.id;\n\n            if (!handles[id]) {\n                handles[id] = {};\n            }\n\n            // Normalize and store handlers\n            _.forEach(custom.actionHandlers, (value, key) => {\n                let action, label;\n                if (value.action) {\n                    action = value.action;\n                    label = value.label;\n                } else {\n                    action = '';\n                    label = value;\n                }\n\n                handles[id][key] = {\n                    actionKey: key,\n                    action: action,\n                    target: custom.target,\n                    label: label\n                };\n            });\n\n            this.set('_actionHandles', handles);\n\n            // Normalize labels before sending to web-dir\n            let handlers = {};\n            _.forEach(custom.actionHandlers, (value, key) => {\n                if (value.action) {\n                    handlers[key] = value.label;\n                } else {\n                    handlers[key] = value;\n                }\n            });\n\n            options.actionHandlers = handlers;\n        }\n\n        options.type = type;\n\n        const notification = {\n            message,\n            custom: options\n        };\n\n        if (title) {\n            notification.title = title;\n        }\n        this.get('embedded').requestNotification(notification);\n        return notification;\n    },\n\n    info(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').info(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'info');\n    },\n\n    error(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').error(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'error');\n    },\n\n    success(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').success(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'success');\n    },\n\n    dismiss(id) {\n        if (!this.get('embedded.isEmbedded')) {\n            this._cleanUpHandlers(id);\n            return this.get('notification').dismissNotification(id);\n        }\n        this.get('embedded').dismissNotification(id);\n    },\n\n    // TODO: we'll need to replumb defined action handlers\n    // on this legacy option for things like answering from toasts\n    show(options) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').show(options);\n        }\n        return this.requestNotification(options.title, options.message, options, options.type);\n    }\n});\n","define(\"connections-ui/services/notification\", [\"exports\", \"ember-purecloud-components/services/notification\"], function (_exports, _notification) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notification.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst {\n    inject: { service },\n    RSVP: { resolve }\n} = Ember;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    ajax: service(),\n    application: service(),\n\n    /**\n     * Fetches organization settings from the API\n     * @returns {Promise} A promise that resolves with the updated preferences\n     */\n    fetchOrgSettings(orgSettings) {\n        const path = 'api/v2/organizations/settings';\n        const url = this.get('application').pcV2Uri(path);\n\n        return this.get('ajax')\n            .ajaxGet(url)\n            .then(response => {\n                // Create or update the orgSettings object\n                if (!orgSettings) {\n                    orgSettings = Ember.Object.create();\n                }\n\n                orgSettings.set('freeSeating', response.freeSeating);\n                orgSettings.set('popoutAuthForIframes', response.popoutAuthForIframes);\n\n                return orgSettings;\n            })\n            .catch(error => {\n                this.logger.error('Failed to fetch org settings:', { error });\n                return resolve({});\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, Service } = Ember;\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: inject.service(),\n\n    permissions: computed.reads('session.permissions'),\n    rolePermissions: computed.reads('session.roleNames'), //Deprecated\n    allowedOrgPermissions: computed.reads('session.allowedOrgPermissions'),\n    trusteeOrg: computed.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.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, '_');\n        });\n    }),\n\n    donutPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    validateDonutPermission: function (permission, division = '*') {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.get('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(\n            this.get('donutPermissions'),\n            permission,\n            this.get('allowedOrgPermissions'),\n            division.trim()\n        );\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.get('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.get('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.get('directoryPermissions');\n        return _.includes(permissions, 'person_administration');\n    }),\n\n    canViewQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:view');\n    }),\n\n    canViewQueueObservations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:queueObservation:view');\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    canViewAcdCoBrowseForChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:chat:escalate')\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    hasVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:*:*');\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.get('hasAgentSupervisorAccess')\n        );\n    }),\n\n    hasAgentSupervisorAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorAgentDetails:view') && this.get('canViewUsers');\n    }),\n\n    hasRelateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:*:*');\n    }),\n\n    hasExternalContactsViewContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:view');\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.get('hasUnifiedCommunications');\n            const legacyUnifiedCommunicationsPermission = _.includes(\n                this.get('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    conferenceEnabled: true,\n\n    canCallForward: computed('phoneEnabled', 'donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:callForwarding:edit') && this.get('phoneEnabled');\n    }),\n\n    canRecord: computed('rolePermissions', 'donutPermisions', 'allowedOrgPermissions.[]', function () {\n        const canRecord = this.validateDonutPermission('conversation:call:record');\n        const isBusinessUserOrSupervisor =\n            this.get('rolePermissions').indexOf('businessUser') > -1 ||\n            this.get('rolePermissions').indexOf('supervisor') > -1;\n        return isBusinessUserOrSupervisor || canRecord;\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    canViewUsers: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user: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    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    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    canViewIntegrationPresence: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('integration:presence:view');\n    }),\n\n    canViewUCIntegrations: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:unifiedCommunications:view');\n    }),\n\n    canViewPresenceDefinition: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('presence:presenceDefinition:view');\n    }),\n\n    canViewSummary: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:summary:view');\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","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nconst { computed, inject } = Ember;\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 Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    integrationsPresence: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n\n    integrations: computed('allApps', 'permissions.donutPermissions', 'permissions.allowedOrgPermissions', function () {\n        const allApps = this.get('allApps');\n        return allApps.filter(this._isValidIntegrationTab.bind(this));\n    }),\n\n    allApps: [],\n    integrationConfigs: [],\n\n    onAuthenticated: Ember.on(\n        'init',\n        Ember.observer('session.isAuthenticated', async function () {\n            // only try to fetch configs if we're authenticated\n            if (this.get('session.isAuthenticated') && !this.get('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.get('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.get('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.get('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.get('application').pcV2Uri(`api/v2/users/${person.get('id')}`);\n                const user = await this.get('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    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    _fetchConfigs() {\n        let allConfigsPromise = new Ember.RSVP.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.get('application').pcV2Uri(CONFIGS_API_URL_V2);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        configsUrl += `?${Ember.$.param(queryParams, true)}`;\n        if (!this.get('permissions.canViewUCIntegrations')) {\n            resolve(configs); //empty result because no permission\n            return;\n        }\n        this.get('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            Ember.typeOf(Ember.get(config, 'id')) === 'string' &&\n            Ember.typeOf(Ember.get(config, 'ucIntegrationKey.id')) === 'string'\n        );\n    },\n\n    _mapIntegrationConfig(config) {\n        const key = Ember.get(config, 'ucIntegrationKey.id');\n\n        const i10n = Ember.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: Ember.get(config, 'id'),\n            key,\n            integrationPresenceSource: Ember.get(config, 'integrationPresenceSource'),\n            icon: Ember.get(config, 'icon.vector'),\n            badgeIcons: {\n                light: Ember.get(config, 'badgeIcons.light.vector'),\n                dark: Ember.get(config, 'badgeIcons.dark.vector')\n            },\n            translation,\n            pbxPermission: Ember.get(config, 'pbxPermission'),\n            pollingEnabled: Ember.get(config, 'polledPresence'),\n            pollIntervalSec: Ember.get(config, 'pollIntervalSec'),\n            includeBadge: Ember.get(config, 'includeBadge')\n        };\n    },\n\n    _isValidIntegrationTab(clientApp) {\n        const key = Ember.get(clientApp, 'key');\n        const hasUcIntegrationKey = key && key !== '';\n        const pbxPermission = Ember.get(clientApp, 'pbxPermission');\n        // gate the integration tab based on pbx permission\n        if (pbxPermission !== undefined) {\n            const permissionService = this.get('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.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\n\n// models\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\n\n// mixins\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport AcdUtilitiesMixin from 'connections-ui/mixins/acd-utilities';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport UriBuilderMixin from 'connections-ui/mixins/conversation-uri-builder';\nimport ActiveCallMixin from 'connections-ui/mixins/phone-service/active-call';\nimport CallControlsMixin from 'connections-ui/mixins/phone-service/call-controls';\nimport CallForwardMixin from 'connections-ui/mixins/phone-service/call-forward';\nimport ConversationManagerMixin from 'connections-ui/mixins/phone-service/conversation-manager';\nimport EventsMixin from 'connections-ui/mixins/phone-service/events';\nimport PhoneNotificationsMixin from 'connections-ui/mixins/phone-service/notifications';\nimport StationMixin from 'connections-ui/mixins/phone-service/station';\n\n// utils\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport QueuedProcessingChain from 'connections-ui/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 { computed, inject, observer, Evented, Logger } = Ember;\n\nconst VOICEMAIL_URL = '@127.0.0.1;user=voicemail';\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 Ember.Service.extend(Evented, ...mixins, {\n    isDefinedAndLengthGreaterThan: isDefinedAndLengthGreaterThan,\n\n    // services\n    session: inject.service(),\n    application: inject.service(),\n    pigeon: inject.service(),\n    streaming: inject.service(),\n    communication: inject.service(),\n    permissions: inject.service(),\n    webrtc: inject.service(),\n    intl: inject.service(),\n    addressformat: inject.service(),\n    notification: inject.service('notification-proxy'),\n    ajax: inject.service(),\n    preferences: inject.service(),\n    externalContacts: inject.service(),\n    headset: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    applicationController: null, // needed?\n\n    _processingChain: null,\n    _contactObservers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n        this._initializeProcessingChain();\n        try {\n            this.get('preferences')\n                .getPreference('phone.thisBrowserIsTheOneToAnswerFrom')\n                .then(value => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('thisBrowserIsTheOneToAnswerFrom', value);\n                    }\n                });\n\n            this.get('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.get('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 = Ember.get(payload, 'participants');\n                    const isAgentCall = participants.any(party => party.purpose && party.purpose === 'agent');\n\n                    const participant = _.last(participants.filterBy('userId', this.get('personGuid')));\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                        interactionModel = ConversationModel.create(payload, Ember.getOwner(this).ownerInjection());\n                        if (isAgentCall && Ember.get(interactionModel, 'callState.initialState') === 'connected') {\n                            // i.e. call was auto answered\n                            this.trigger('autoAnswer', Ember.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.get('headset').answerCall(payload.id, this.get('connectedConversations.length') >= 1);\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.get('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 }) => {\n                    const modelsToDestroy = [];\n                    const buildModel = rawData => {\n                        const conversationModel = ConversationModel.create(\n                            rawData,\n                            Ember.getOwner(this).ownerInjection()\n                        );\n                        Ember.set(conversationModel, 'type', 'call');\n                        modelsToDestroy.push(conversationModel);\n\n                        const interactionModel = Ember.Object.create({});\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.get('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: '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                        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                            Ember.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                        Ember.set(interactionModel, 'consultParticipantId', consultParticipantId);\n                    }\n\n                    if (shouldUpdate) {\n                        if (newInteraction) this.get('conversations').pushObject(interactionModel);\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 }) => {\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.get('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.get('_throttledRemoveDisconnectedConversations').perform();\n                }\n            }\n        ]);\n    },\n\n    _onMyConversationEvent(conversation) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        if (!conversation || !conversation.id) return;\n        this.get('_processingChain').enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        this.fetchActiveCallConversations()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this.get('_processingChain').enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.get('logger').error('ACD Phone Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                this.get('_throttledRemoveDisconnectedConversations').perform();\n            });\n    },\n\n    _getCallState(interaction) {\n        const participant = interaction.get('participants').findBy('userId', this.get('personGuid'));\n        if (!participant) {\n            Logger.error(\n                `Expected to find person {{personGuid}} on conversation {{conversationId}} but person was not found`,\n                { personGuid: this.get('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    fetchActiveCallConversations() {\n        const url = this.pcUri(`api/${this.get('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: computed.reads('session.person.presence'),\n    onQueue: computed.equal('presence', 'on_queue'),\n    carrierPigeonConnected: computed.reads('pigeon.connected'),\n\n    // permissions\n    enabled: computed.reads('permissions.phoneEnabled'),\n    conferenceEnabled: computed.reads('permissions.conferenceEnabled'),\n    canRecord: computed.reads('permissions.canRecord'),\n    canCallForward: computed.reads('permissions.canCallForward'),\n\n    // user info\n    user: computed.reads('session.publicApiUser'),\n    personGuid: computed.reads('session.person.guid'),\n\n    // stations and phone permissions\n    phoneDisabled: computed('webrtc.canUseWebrtcSoftphone', 'station.isWebrtc', function () {\n        return this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone');\n    }),\n\n    phoneDisabledMessage: computed('phoneDisabled', 'webrtc.{hasMicrophone,audioCallCapable}', function () {\n        if (this.get('phoneDisabled') === false) {\n            return '';\n        }\n        const webrtc = this.get('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.get('intl').lookup(key).toString();\n    }),\n    phoneAvailable: computed('noStationSelected', 'phoneDisabled', function () {\n        return !(this.get('noStationSelected') || this.get('phoneDisabled'));\n    }),\n    stationHasPersistentConnection: computed.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.get('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.get('preferences').setPreference(\n            'phone.thisBrowserIsTheOneToAnswerFrom',\n            this.get('thisBrowserIsTheOneToAnswerFrom')\n        );\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.get('application').pcV2Uri(\n            `api/v2/conversations/calls/${conversationId}/participants/${participantId}/communications/${communicationId}`\n        );\n    },\n    generateConversationUrl(conversationId) {\n        return this.get('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            Ember.get(conversation, 'participants').forEach(party => {\n                const communication = this.getParticipantCall(party) || Ember.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 = Ember.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    },\n    // end utils\n\n    // UI state helpers\n    isInteractionViewOpen: false,\n    isShowCallControlsViewOpen: false,\n    showFloatingCalls: false,\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 (\n                this.get('isShowCallControlsViewOpen') ||\n                (this.get('isInteractionViewOpen') && state === 'connected')\n            ) {\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.get('activeCall');\n\n            const isAlertingCallACD =\n                alertingCall &&\n                Ember.get(alertingCall, 'isAgentCall') &&\n                !Ember.get(alertingCall, 'myselfIsMonitor') &&\n                !Ember.get(alertingCall, 'myselfIsCoach') &&\n                !Ember.get(alertingCall, 'myselfIsBarged')\n                    ? true\n                    : false;\n            return !isAlertingCallACD && hasIncomingNonAcdCalls;\n        }\n    ),\n    // end UI state helpers\n\n    activeRoom: null,\n\n    bootstrapPurecloudApiOnAuth: observer('session.isAuthenticated', 'enabled', 'canCallForward', function () {\n        if (!this.get('enabled')) {\n            return;\n        }\n        if (this.get('session.isAuthenticated')) {\n            if (this.get('canCallForward')) {\n                this.fetchCallForwarding();\n            }\n            if (!isTesting && !this.get('loaded')) {\n                this.set('loaded', true);\n                this.doLoginAssociationLogic();\n                return this.get('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.get('phoneDisabledMessage');\n            const title = this.get('intl').t('notification.purecloud.selectPhone.selectPhone');\n            return this.get('notification').error(title, message);\n        }\n    }),\n\n    refreshPublicApiUser() {\n        return this.get('session').refreshPublicApiUser();\n    },\n\n    handleMuteParticipants: observer('activeConversations.@each.isMuted', function () {\n        this.get('activeConversations').forEach(conversation => {\n            if (conversation.get('webrtcSession')) {\n                let webrtcConversation = this.get('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.get('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 url = this.replaceUri(conversationId, participantId, null, 'calls');\n                return this.makeRequest(url, options, 'post').then(() => {\n                    this._handleCallTransferred();\n                });\n            })\n            .catch(error => {\n                const title = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.error');\n                const message = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.transferToVoicemail');\n                this.get('notification').error(title, message);\n                this.get('logger').error('Error while tranferring to voicemail', { error });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport { get, observer } from '@ember/object';\nimport { copy } from 'ember-copy';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, Evented, inject, run, computed } = Ember;\n\nconst topicPriority = {\n    presence: 1,\n    routingStatus: 2,\n    conversationsummary: 3,\n    other: 4,\n    outofoffice: 5,\n    geolocation: 6\n};\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    connected: false,\n    topics: A(),\n    priorityTopics: A(),\n    customTopicNames: {},\n    registerTopicsDebouncePeriod: 1000,\n    embedded: inject.service(),\n\n    prioritizedTopics: computed('topics.length', function () {\n        const sortedTopics = this.get('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    // eslint-disable-next-line no-unused-vars\n    initialize({ features, subscribeUrl, publicApiUser, accessToken }) {\n        if (this.get('initialized')) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.logger.info('CXNUI-CP: Initializing', {\n                userId: get(publicApiUser, 'id'),\n                features\n            });\n        } else {\n            this.logger.warn('CXNUI-CP: pigeon service not provided with api user');\n        }\n\n        this.set('initialized', true);\n    },\n\n    registerPriorityTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        this.get('priorityTopics').addObject(topic);\n\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterPriorityTopic(topic) {\n        this.get('priorityTopics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    registerTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        this.get('topics').unshiftObject(topic);\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterTopic(topic) {\n        this.get('topics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    _observeTopics: observer('priorityTopics.[]', 'topics.[]', 'connected', 'initialized', function () {\n        if (this.get('connected') && this.get('initialized')) {\n            this.set(\n                'registerDebounce',\n                run.debounce(this, this._registerTopics, this.get('registerTopicsDebouncePeriod'))\n            );\n        }\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.get('topicKeepAlive'));\n        run.cancel(this.get('registerDebounce'));\n    },\n\n    _registerTopics() {\n        run.cancel(this.get('topicKeepAlive'));\n        const topicKeepAlive = run.later(\n            this,\n            function () {\n                this.logger.info('CXNUI-CP: _register: topicKeepAlive triggered');\n                this._registerTopics();\n            },\n            23 * 60 * 60 * 1000 // 23h\n        );\n        this.set('topicKeepAlive', topicKeepAlive);\n\n        const prioritizedTopics = this.get('prioritizedTopics');\n        const priorityTopics = this.get('priorityTopics');\n        const topics = [...priorityTopics, ...prioritizedTopics];\n\n        if (!this.get('connected')) {\n            this.set('connected', true);\n            this.trigger('connect');\n        }\n\n        topics.forEach(topic => this.get('embedded').streamingTopicSubscribe(topic));\n        this.trigger('topicsRegistered', topics);\n    },\n\n    triggerTopicEvent(topic, eventName, eventBody, data, source) {\n        this.logger.debug('CXNUI-CP: topic triggered', {\n            source,\n            carrierPigeonTopic: eventName,\n            update: eventBody\n        });\n        this.trigger(eventName, copy(eventBody), copy(data));\n    },\n\n    onMessage(source, data) {\n        if (!data) {\n            return;\n        }\n\n        const topic = data.topicName;\n        const eventBody = data.eventBody;\n        const eventName = this.get('customTopicNames')[topic] || eventFromTopic(topic);\n\n        if (topic !== 'channel.metadata') {\n            this.triggerTopicEvent(topic, eventName, eventBody, data, source);\n        }\n\n        if (topic !== eventName) {\n            this.triggerTopicEvent(topic, topic, eventBody, data, source);\n        }\n    },\n\n    onSubscriptionError(error) {\n        this.trigger('hawkSubscriptionError', error);\n    }\n});\n","import Ember from 'ember';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport safeSet from 'connections-ui/utils/safeSet';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { on, get, set, run, inject, computed, RSVP, Service } = Ember;\n\nconst PREFERENCE_LOAD_TIME_ALLOWANCE = 5000;\n\nexport default Service.extend(LoggerMixin, {\n    logger: inject.service('stash-logger'),\n    session: inject.service(),\n    feature: inject.service(),\n    ajax: inject.service(),\n    application: inject.service(),\n\n    namespaces: [\n        'chat',\n        'geolocation',\n        'notifications',\n        'webrtc',\n        'test',\n        'widgets',\n        'meta',\n        'meetings',\n        'phone',\n        'scripts',\n        'deviceVolumes',\n        'panelManager',\n        'panelManagerLayoutTemplateV1',\n        'agentUiMainstage',\n        'interactions',\n        'relateSparkification'\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.get('namespaces').map(namespace => {\n            return localforage.getItem(namespace).then(data => {\n                run(() => this._initializeNamespace(namespace, data));\n            });\n        });\n\n        const ready = timeoutPromise(\n            RSVP.all(promises),\n            PREFERENCE_LOAD_TIME_ALLOWANCE,\n            'preferences#registerNamespaces'\n        )\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', Ember.Object.create());\n    }),\n\n    getPreference(path) {\n        const ready = this.get('ready');\n        return ready.then(() => {\n            return this._getPreference(path);\n        });\n    },\n\n    setPreference(path, value, persist = true) {\n        const ready = this.get('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) {\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, Ember.Object.create(value));\n            } else {\n                this.set(path, value);\n            }\n\n            return localforage.setItem(path, value);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        let currentNamespaceObject = this.get(namespace);\n        if (!currentNamespaceObject) {\n            this.set(namespace, Ember.Object.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                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.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.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        let enableServicePromise = RSVP.resolve();\n\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        return enableServicePromise;\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, Ember.Object.create(data));\n        }\n    },\n\n    _isNotDead() {\n        return !this.get('isDestroyed') && !this.get('isDestroying');\n    },\n\n    _enableSync() {\n        const logger = this.get('logger');\n        const settingsPath = this.get('settingsPath');\n        const settingsUrl = this.get('application').pcV2Uri(settingsPath);\n        const ajax = this.get('ajax');\n\n        if (this.get('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                promises.push(this._setPreference(namespace, data, false));\n            }\n        });\n\n        return RSVP.all(promises).then(() => {\n            return Ember.RSVP.resolve();\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.get('namespaces'));\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport StreamingService from 'ember-purecloud-components/services/streaming';\nimport moment from '../utils/dates';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\n\nconst { inject, observer, run, Service } = Ember;\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: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    pigeon: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    batchDataRequests: inject.service(),\n    presenceService: inject.service('presence'),\n    permissions: inject.service(),\n\n    phoneIntegrations: inject.service(),\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.get('pigeon').on(key, this, this.events[value]));\n\n        this.set('trackedGuids', Ember.Object.create());\n        this.subscribeToMyself();\n        this.get('streaming').subscribeToConnection(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').off(key, this, this.events[value]));\n    },\n\n    _getPresenceDefinition(presence) {\n        if (typeof presence === 'string') {\n            return this.get('session').getPresence(presence);\n        } else {\n            return this.get('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.get('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.get('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.get('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.get('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                Ember.run.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.get('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    _alertDeletedPresence(presence) {\n        const intl = this.get('intl');\n        const title = intl.t('chat.presence.errorSettingDeletedPresence.title');\n        const message = intl.t('chat.presence.errorSettingDeletedPresence.message');\n        this.get('notification').error(title, message);\n\n        this.get('presenceService').removeDeletedPresence(presence);\n    },\n\n    changeRoutingStatus(status) {\n        const id = this.get('session.person.guid');\n        const url = this.get('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.get('ajax')\n            .put(url, { data })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Error when changing routing status', {\n                    error\n                });\n            });\n    },\n\n    doUserPresenceStatusChanged(person, statusUpdate) {\n        const { source } = statusUpdate;\n        const phoneIntegrations = this.get('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            Ember.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] = Ember.Object.create(statusUpdate);\n                person.notifyPropertyChange('presenceList');\n            } else {\n                person.get('presenceList').pushObject(Ember.Object.create(statusUpdate));\n            }\n        }\n    },\n\n    doUserPrimaryPresenceSourceChanged(person, statusUpdate) {\n        let newSource = statusUpdate.source;\n        const phoneIntegrations = this.get('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        Ember.run.join(() => {\n            this.get('batchDataRequests')\n                .getUser(presenceEvent.userId)\n                .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    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.get('intl');\n            const title = intl.t('notification.purecloud.errorSkillsRouting.title');\n            const message = intl.t('notification.purecloud.errorSkillsRouting.message');\n            this.get('notification').error(title, message);\n        }\n    },\n\n    events: {\n        conversationSummaryEvent(conversationSummary, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.conversationSummary', conversationSummary);\n                    });\n            });\n        },\n\n        outOfOfficeEvent(outOfOfficeDef, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('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            Ember.run.join(() => {\n                this.get('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            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.presence', 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                Ember.run.join(() => {\n                    this.get('batchDataRequests')\n                        .getUser(guid)\n                        .then(person => {\n                            person.set('activities.geolocation', geolocation);\n                        });\n                });\n            }\n        }\n    }\n});\n","import { 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 'ember-purecloud-components/mixins/logger';\nimport Presence from 'ember-purecloud-components/models/presence';\nimport { formatPresenceLanguageLabelLocale } from 'ember-purecloud-components/utils/intl';\nimport TimeoutPromise from 'ember-purecloud-components/utils/timeout-promise';\nimport groupBy from 'lodash.groupby';\nimport isEmpty from 'lodash.isempty';\nimport RSVP from 'rsvp';\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: computed.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.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary);\n    }),\n\n    allActivePresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary).reject(presence => presence.get('deactivated'));\n    }),\n\n    primaryPresences: computed('presenceDefinitions.[]', function () {\n        return this.get('presenceDefinitions')\n            .filter(presence => {\n                if (Object.prototype.hasOwnProperty.call(presence, 'type')) {\n                    return presence.type.toLowerCase() === 'system';\n                }\n            })\n            .map(presence => {\n                return Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n            });\n    }),\n\n    secondaryPresences: computed('allSecondaryPresences.[]', function () {\n        const presences = this.get('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.get('presenceDefinitions') || [])\n            .filter(presence => {\n                return Object.prototype.hasOwnProperty.call(presence, 'type') && presence.type.toLowerCase() === 'user';\n            })\n            .map(presence => {\n                return Presence.create({ 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.get('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.get('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.get('logger').error('Presence: Could not get presence definitions:', {\n                    error\n                });\n\n                this.set('presenceDefinitions', []);\n\n                Ember.Logger.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            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.get('application').pcV2Uri('api/v2/presence/definitions');\n        return this.get('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.get('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.get('primaryPresences');\n        const secondary = this.get('secondaryPresences')[presenceString.toLowerCase()];\n\n        let collection = primary;\n        if (!isEmpty(secondary)) {\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() === presenceString.toLowerCase() ||\n                    systemPresence.toLowerCase() === presenceString.toLowerCase().replace(/-|\\s/g, '_'));\n            if (mapHasPresence || mapHasSystemPresence) {\n                return rawPresence;\n            }\n        });\n    },\n\n    getPresenceDefinition(presence) {\n        const presenceMap = this.get('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.get('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.get('presenceDefinitions').removeObject(presence);\n    },\n\n    findPresence(id, presenceDef = false) {\n        if (!id) {\n            return RSVP.resolve({});\n        }\n\n        const currentPresence = this.get('presenceDefinitions').find(presence => presence.id === id);\n        if (currentPresence) {\n            const instance = Presence.create(\n                {\n                    presence: currentPresence\n                },\n                getOwner(this).ownerInjection()\n            );\n            return RSVP.resolve(instance);\n        }\n\n        const url = this.get('application').pcV2Uri(['api/v2/presence/definitions', id]);\n        return this.get('ajax')\n            .request(url)\n            .then(presence => {\n                const model = Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n\n                this.get('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.get('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                                const instance = Presence.create(\n                                    {\n                                        presence: newPresence\n                                    },\n                                    getOwner(this).ownerInjection()\n                                );\n                                this.get('outOfBandPresenceDefinitions').addObject(instance);\n                                return instance;\n                            }\n                            return false;\n                        });\n                    }\n                }\n                this.get('logger').error('Presence: Couldnt find given presence', {\n                    error,\n                    remoteData: {\n                        presenceId: id\n                    }\n                });\n            });\n    },\n\n    setUsersStatus(entity, status) {\n        const url = this.get('application').pcV2Uri(['api/v2/users', get(entity, 'id'), 'presences/PURECLOUD']);\n        return this.get('ajax').patch(url, {\n            contentType: 'application/json',\n            data: {\n                message: status\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport moment from '../utils/dates';\n\nconst LOGOUT_BOUNCE_COOKIE_NAME = 'lastLogoutTimestamp';\nconst LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS = 5000;\nconst LOGOUT_BOUNCE_THREASHOLD_MILLIS = 5000;\n\nconst { inject, typeOf, Logger, Service } = 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: inject.service(),\n    session: inject.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    /**\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.get('_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.get('cookies').write(LOGOUT_BOUNCE_COOKIE_NAME, '' + now.valueOf(), cookieOptions);\n    },\n\n    _clearLogoutTime() {\n        this.get('cookies').clear(LOGOUT_BOUNCE_COOKIE_NAME);\n    },\n\n    _isInLogoutBounce() {\n        let result = false;\n\n        let now = moment();\n        let lastLogout = Number(this.get('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 Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\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';\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 Ember.Service.extend(Ember.Evented, LoggerMixin, RelateFeaturesMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    addressformat: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    names: Ember.inject.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: Ember.computed.alias('route'),\n    relateFrameOrigin: null,\n    profileVerificationEventName: PROFILE_VERIFICATION_EVENT_NAME,\n    showProfileEventName: SHOW_PROFILE_EVENT_NAME,\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    findMatchingExternalContacts(searchTerm, pageOffset, pageSize, expandField, originator) {\n        if (!searchTerm) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        let url = this.get('application').pcUri(CONTACTS_ENDPOINT);\n\n        if (this.get('addressformat').isValidNumber(searchTerm, null, STRICT)) {\n            searchTerm = this.get('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.get('ajax').ajaxGet(url + `?${Ember.$.param(data)}`, {\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() {},\n\n    getEngineHelp(currentRouteName) {\n        const contextHelpUrls = this.get('contextHelpUrls') || {};\n        const path = Ember.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.propertyWillChange('redirectRoute');\n        this.set('redirectRoute', navEvent);\n        this.propertyDidChange('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.get('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.get('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.get('profileVerificationEventName'), verificationInteractionData);\n        this.processFrameVerificationEvent(verificationInteractionData);\n    },\n\n    closeRelateFrame(isClosedInteraction) {\n        if (!isClosedInteraction) {\n            this.trigger(this.get('showProfileEventName'), true);\n        }\n    },\n\n    postMessage(message) {\n        try {\n            const relateIframe = $(RELATE_FRAME_ID).get(0);\n            if (!relateIframe) {\n                return;\n            }\n\n            relateIframe.contentWindow.postMessage(message, this.get('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.get('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 Ember.RSVP.reject({});\n        }\n        const { url, data, TIME_OUT } = queryData;\n        const adapterCache = this.get('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            Ember.run.cancel(timer);\n        }\n        timer = Ember.run.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.get('adapterCache');\n        const { timer } = adapterCache[key] || {};\n        if (timer) {\n            Ember.run.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","define(\"connections-ui/services/resize-detector\", [\"exports\", \"ember-element-resize-detector/services/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Service, { inject } from '@ember/service';\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\nexport default class ScreenMediaService extends Service {\n    application = inject('application');\n    session = inject('session');\n    logger = inject('stash-logger');\n\n    // set this through Orgpsan for testing\n    allowScreenRecordingInBrowser!: false;\n    debugScreenSelectionOpen = false;\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","define(\"connections-ui/services/scroll-activity\", [\"exports\", \"ember-user-activity/services/scroll-activity\"], function (_exports, _scrollActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _scrollActivity.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { isAbortError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport EsaSessionService from 'ember-simple-auth/services/session';\nimport _ from 'lodash';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport FieldConfig from '../field-config/field-config';\nimport moment from '../utils/dates';\nimport featureToggles from '../utils/feature-toggles';\nimport { addPageAction, setCustomAttribute } from '../utils/newrelic';\nimport { getLoggableRequestFailureDetails } from '../utils/request';\nimport { executeChain, isChainStepFailure } from '../utils/serial-processing-chain';\nimport { loadTheme, setThemeCookie } from '../utils/theme-loader';\nimport { buildCommonTelemetryContext } from './analytics';\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\nexport default EsaSessionService.extend(LoggerMixin, {\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    clock: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    cookies: Ember.inject.service(),\n    application: Ember.inject.service(),\n    featureService: Ember.inject.service('feature'),\n    presence: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n    // Store conflicts with ESA Session Service property\n    dataStore: Ember.inject.service('store'),\n    permissionService: Ember.inject.service('permissions'),\n    orgSettings: Ember.inject.service('orgSettings'),\n\n    accessToken: null,\n\n    person: null,\n    presenceMap: Ember.computed.reads('presence.presenceDefinitions'),\n\n    user: null, // Legacy - Directory session user - Move to permissions where possible.\n    namedPermissions: Ember.computed.reads('permissions'), // Backwards compatibility - Directory namedPermissions now point to public-api permissions\n\n    permissions: Ember.computed.reads('publicApiUser.authorization.permissions'),\n    roleNames: Ember.computed.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    init() {\n        this._super(...arguments);\n\n        let deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n            this.set('readWritePermissionsDeferred', deferred);\n        }\n    },\n\n    // isAuthenticated conflicts with ESA Session Service property\n    isAuthenticated: Ember.computed('session.isAuthenticated', 'user', 'person', function () {\n        return this.get('session.isAuthenticated') && !_.isEmpty(this.get('user'));\n    }),\n\n    hasAppAccess: Ember.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.get('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: Ember.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.get('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: Ember.computed(function () {\n        const deferred = this.get('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 Ember.RSVP.defer().promise;\n        }\n        return deferred.promise;\n    }),\n\n    useEmailDraftEvent: true,\n\n    popoutAuthForIframes: Ember.computed('org.orgSettings.popoutAuthForIframes', function () {\n        return !!this.get('org.orgSettings.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: Ember.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, Ember.getOwner(this));\n    },\n\n    createPresences: function () {\n        return this.get('presence').loadPresences();\n    },\n\n    loadAllowedOrgPermissions: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/permissions?pageSize=99999');\n        return this.get('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 Ember.RSVP.reject('orgPermissionsFetchFailure');\n            });\n    },\n\n    loadOrgProducts: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/products');\n        return this.get('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 Ember.RSVP.reject('orgProductsFetchFailure');\n            });\n    },\n\n    async getOrganizationTranscriptSettings() {\n        const ajax = this.get('ajax');\n        const application = this.get('application');\n        const hasPermission = (this.get('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    getPresence(presence) {\n        return this.get('presence').getPresence(presence);\n    },\n\n    authenticateWithSession(forceDirectory = false) {\n        if (this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n\n        this.set('authInProgress', true);\n\n        const bootstrapStartTime = performance.now();\n\n        return executeChain(\n            [\n                {\n                    stepDesc: 'loadFeatureToggles',\n                    process: () => this.getFeatures()\n                },\n                {\n                    stepDesc: 'loadOrgPermissions',\n                    process: () => this.loadAllowedOrgPermissions()\n                },\n                {\n                    stepDesc: 'setupTheme',\n                    processSync: () => setThemeCookie(loadTheme(this))\n                },\n                {\n                    stepDesc: 'setupUserAndTrustee',\n                    process: () => {\n                        if (!forceDirectory) {\n                            return this.trusteeBootstrap();\n                        }\n\n                        return Ember.RSVP.resolve();\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 Ember.RSVP.resolve();\n                        }\n\n                        const path = 'api/v2/apps/legacy/session';\n                        const url = this.get('application').pcV2Uri(path);\n                        const data = { lang: this.get('intl.isoLocale') };\n                        return this.get('ajax')\n                            .post(url, { data })\n                            .then(data => this.establishSession(data));\n                    }\n                },\n                {\n                    stepDesc: 'initServerTranslations',\n                    process: () => this.get('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 Ember.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                        const hasAssistantsQueueViewPermission = (this.get('namedPermissions') || []).some(perm => {\n                            return perm.indexOf('assistants:queue:view') > -1;\n                        });\n                        if (hasAssistantsQueueViewPermission) {\n                            return this.loadOrgProducts();\n                        }\n                    }\n                },\n                {\n                    stepDesc: 'loadOrgTranscriptSettings',\n                    process: () => this.getOrganizationTranscriptSettings()\n                },\n                {\n                    stepDesc: 'loadPerson',\n                    processSync: () => this.get('person')\n                }\n                // DO NOT add additional processing blocks here unless it is REQUIRED for app bootstrap\n            ],\n            {\n                loggingConfig: {\n                    logger: this.get('stashLogger'),\n                    logMsgPrefix: 'Session Bootstrap Chain: '\n                }\n            }\n        )\n            .then(() => {\n                this.set('authInProgress', false);\n                const bootstrapDuration = performance.now() - bootstrapStartTime;\n                addPageAction('sessionBootstrapSuccess', {\n                    duration: bootstrapDuration\n                });\n            })\n            .catch(reason => {\n                this.set('authInProgress', false);\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.get('application'),\n                    sessionService: this,\n                    intlService: this.get('intl')\n                });\n                const loggableRequestFailureDetails = getLoggableRequestFailureDetails(error);\n\n                this.get('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                return Ember.RSVP.reject({\n                    type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                    failedStep,\n                    status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                    legacyInvalidSessionToken\n                });\n            });\n    },\n\n    trusteeBootstrap() {\n        const expands = ['fieldconfigs', 'organization'];\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.refreshPublicApiUser(expands)\n                .then(data => {\n                    this.setServerTimeOffset();\n                    moment.now = () => {\n                        const offset = this.get('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                    // 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.get('dataStore')\n                        .find('person', user.get('id'))\n                        .then(person => {\n                            this.set('person', person);\n\n                            // the profile load was triggerred by refreshPublicApiUser(expands) above\n\n                            resolve(person);\n                        })\n                        .catch(error => {\n                            const serverError = Ember.get(error, 'errors.0');\n                            if (serverError && serverError.status === 404) {\n                                this.set('user.isTrustee', true);\n\n                                const person = this.get('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.get('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: Ember.observer('user', function () {\n        if (_.isEmpty(this.get('user')) && !this.get('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\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 Ember.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.get('logoutSinceUnauthorized')) {\n            this.set('shouldPreventLogout', false);\n            this.set('logoutSinceUnauthorized', false);\n        }\n        if (!logoutPromise) {\n            logoutPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this.set('logoutInProgress', true);\n\n                Ember.RSVP.resolve().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 = Ember.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    addRemoveBlockers(action, blocker) {\n        let arr = this.get('blockers');\n        if (action === 'add') {\n            arr.pushObject(blocker);\n        }\n        if (action === 'remove') {\n            arr.removeObject(blocker);\n        }\n        this.get('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.get('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 Ember.RSVP.reject(reason);\n        });\n    },\n\n    setupStoreData(type, data) {\n        let store = this.get('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    /**\n     * Safely checks if a feature flag is enabled, ensuring features are loaded first\n     * @param {string} featureName - The name of the feature flag to check\n     * @returns {boolean} - Whether the feature is enabled\n     */\n    isFeatureEnabled(featureName) {\n        if (!this.get('features')) {\n            return false;\n        }\n        return !!this.get(`features.${featureName}`);\n    },\n\n    establishSession(data, redirect) {\n        let response = data.res;\n\n        if (!_.isEmpty(redirect)) {\n            Ember.run.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.get('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            this.set('org', org);\n            this.get('orgSettings')\n                .fetchOrgSettings(this.get('org.orgSettings'))\n                .then(orgSettings => {\n                    this.set('org.orgSettings', orgSettings);\n                })\n                .catch(error => {\n                    this.logger.error('Error fetching org settings:', error);\n                });\n        }\n\n        const cookieProxyPerson = this.get('cookies').read('proxyPerson');\n        const personId = cookieProxyPerson || user.get('personGuid');\n\n        if (personId && !person) {\n            let store = this.get('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.get('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 Ember.RSVP.Promise(resolve => {\n            this.set('authInProgress', false);\n            if (!Ember.get(user, 'isSuper')) {\n                return resolve(person);\n            }\n            let superPerson = this.get('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.get('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    getFeatures: function (forceUpdate = false) {\n        const featureService = this.get('featureService');\n\n        const localFeatures = [];\n        // filters out the feature toggles that are locally set to `false`\n        Object.entries(featureToggles).forEach(([key, value]) => (value ? localFeatures.push(key) : null));\n\n        return featureService\n            .getFeatureToggles(...localFeatures, forceUpdate)\n            .then(features => {\n                // Sometimes it's nicer to just have a list of all of the enabled features\n                this.set('features', features);\n\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 Ember.RSVP.reject(error);\n            });\n    },\n\n    setServerTimeOffset: Ember.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.get('isAuthenticated')) {\n            const t0 = moment(new Date());\n            const url = this.get('application').pcV2Uri(BASE_URI);\n            this.get('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(\n                        `Session timer offset: Server time offset is ${this.get('offset') / 1000} seconds`\n                    );\n                    this.set('sessionTimers', {\n                        serverTimet1: t1.format(),\n                        clientTimet3: t3.format(),\n                        clientTimet0: t0.format(),\n                        offsetCalculated: this.get('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.get('presenceSubscription');\n        const pigeon = this.get('pigeon');\n        const channelId = this.get('accessToken');\n        const subscribeUrl = this.get('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.get('features'),\n            publicApiUser: this.get('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 Ember.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.get('application').pcV2Uri(['api/v2/apps/session']);\n        return this.get('ajax')\n            .post(url, {\n                xhrFields: {\n                    withCredentials: true\n                },\n                headers: {\n                    Authorization: `bearer ${this.get('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 Ember.RSVP.resolve();\n            });\n    },\n\n    refreshPublicApiUser(expand) {\n        const url = this.get('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        ];\n\n        //make a unique request during session initialization\n        if (!this.get('isAuthenticated')) {\n            if (this.get('publicApiUser')) {\n                return this.get('publicApiUser');\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        } else {\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\n        return this.get('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                    Ember.Logger.warn('Failed to fetch purecloud user in session:', { error });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    resetPassword(type, email, newPassword, resetToken, currentPassword) {\n        Ember.assert('Please specify `set` or `change` as reset type', type);\n\n        if (type === 'set') {\n            Ember.assert('Please specify reset token to set password', resetToken);\n        }\n\n        let url;\n        let data;\n\n        if (type === 'change') {\n            Ember.assert('Please provide the current password', currentPassword);\n\n            url = this.get('application').pcV2Uri('api/v2/users/me/password');\n            data = {\n                oldPassword: currentPassword,\n                newPassword: newPassword\n            };\n        } else if (type === 'set') {\n            url = this.get('application').uri('api/v1/setPassword');\n            data = {\n                email: email,\n                password: newPassword,\n                verifyPassword: newPassword,\n                resetToken: resetToken\n            };\n        }\n\n        return this.get('ajax').post(url, { data });\n    },\n\n    publicApiUserObserver: Ember.observer('publicApiUser', function () {\n        const user = this.get('publicApiUser');\n        const version = this.get('application.semver');\n\n        if (user && user.id) {\n            setCustomAttribute('User Id', user.id);\n        }\n        if (user && user.organization && user.organization.id) {\n            setCustomAttribute('Organization Id', user.organization.id);\n        }\n        if (user && user.organization && user.organization.name) {\n            setCustomAttribute('Organization', user.organization.name);\n        }\n        if (version) {\n            setCustomAttribute('App Version', version);\n        }\n    }),\n\n    // Forward ESA Events from internal session to this session service\n    _setupSessionInvalidationFailed: Ember.on('init', function () {\n        const session = this.get('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: Ember.on('willDestroy', function () {\n        const session = this.get('session');\n        if (session) {\n            session.off('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    })\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getThemeList } from '../utils/theme-loader';\n\nconst { computed, inject, run, Service, Evented } = Ember;\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    permissions: inject.service(),\n    ajax: inject.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: computed.not('session.user.isTrustee'),\n    canShowAgentGreeting: computed.bool('session.features.ACT-1205'),\n    canShowGeneralPreference: computed.alias('_isDesktop'),\n    canShowPasswordPreference: computed('session.isAuthenticated', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return false;\n        }\n\n        return this.get('session.isAuthenticated');\n    }),\n\n    canShowNotificationsPreference: computed('_isDesktop', '_isDesktopUnifiedPreferences', function () {\n        if (BrowserUtils.isIE) {\n            return false;\n        }\n\n        const isDesktop = this.get('_isDesktop');\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n        return !(isDesktop && !isUnified);\n    }),\n\n    canShowVoiceMailPinPreference: computed.and('permissions.hasVoicemailAccess', 'permissions.phoneEnabled'),\n\n    canShowDirectRoutingPreference: computed.alias('directRouting.canViewOwnSettings'),\n\n    _commonPreferenceComponents: computed('_isDesktopUnifiedPreferences', function () {\n        const isUnified = this.get('_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            theme: 'application-preferences/theme-picker',\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        'session.features.webUiDarkTheme',\n        'canShowAgentGreeting',\n        function () {\n            const intl = this.get('intl');\n            const components = this.get('_commonPreferenceComponents');\n            return [\n                {\n                    key: 'chat',\n                    name: intl.lookup('preferences.tabs.chat'),\n                    canShow: this.get('canShowChatPreference'),\n                    component: components.chat\n                },\n                {\n                    key: 'general',\n                    name: intl.lookup('preferences.tabs.general'),\n                    canShow: this.get('canShowGeneralPreference'),\n                    component: components.general\n                },\n                {\n                    key: 'language',\n                    name: intl.lookup('preferences.tabs.language'),\n                    canShow: true,\n                    component: components.language\n                },\n                {\n                    key: 'notifications',\n                    name: intl.lookup('preferences.tabs.notifications'),\n                    canShow: this.get('canShowNotificationsPreference'),\n                    component: components.notifications\n                },\n                {\n                    key: 'password',\n                    name: intl.lookup('preferences.tabs.password'),\n                    canShow: this.get('canShowPasswordPreference'),\n                    component: components.password\n                },\n                {\n                    key: 'pin',\n                    name: intl.lookup('preferences.tabs.pin'),\n                    canShow: this.get('canShowVoiceMailPinPreference'),\n                    component: components.pin\n                },\n                {\n                    key: 'sound',\n                    name: intl.lookup('preferences.tabs.sound'),\n                    canShow: true,\n                    component: components.sound\n                },\n                {\n                    key: 'theme',\n                    name: intl.lookup('preferences.tabs.theme'),\n                    canShow: getThemeList(this.get('session')).length > 1,\n                    component: components.theme\n                },\n                {\n                    key: 'video',\n                    name: intl.lookup('preferences.tabs.video'),\n                    canShow: true,\n                    component: components.video\n                },\n                {\n                    key: 'direct_routing',\n                    name: intl.lookup('preferences.tabs.direct-routing'),\n                    canShow: this.get('canShowDirectRoutingPreference'),\n                    component: components.direct_routing\n                },\n                {\n                    key: 'agent_greeting',\n                    name: intl.lookup('preferences.tabs.agent-greeting'),\n                    canShow: this.get('canShowAgentGreeting'),\n                    component: components.agent_greeting\n                }\n            ];\n        }\n    ),\n\n    commonPreferencesSortOrder: computed(function () {\n        return [\n            'notifications',\n            'general',\n            'theme',\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.get('commonPreferences');\n        const customPreferences = this.get('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.get('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.get('customPreferences').concat(newPreference));\n    },\n\n    removePreference(key) {\n        const customPreferences = this.get('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.get('preferences');\n        const preference = preferences.find(preference => preference.key === preferenceKey);\n        return preference && preference.canShow;\n    },\n\n    openPreference(preferenceKey) {\n        return new Ember.RSVP.Promise(resolve => {\n            const preferences = this.get('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.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        try {\n            const { sendEmailNotifications } = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n            return sendEmailNotifications;\n        } catch (err) {\n            this.get('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.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        return this.get('ajax').patch(url, {\n            data: {\n                sendEmailNotifications\n            },\n            timeout: 5000\n        });\n    }\n});\n","define(\"connections-ui/services/sound\", [\"exports\", \"ember-purecloud-components/services/sound\"], function (_exports, _sound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sound.default;\n    }\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 Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport { LOG_LEVELS } from 'ember-purecloud-components/utils/logger';\nimport { v4 as uuid } from 'uuid';\nimport { isTesting } from 'connections-ui/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;\n\nconst TRUNCATED_TRACE_MESSAGE = 'TRUNCATED LOG: ';\nexport const APP_NAME = 'connections-ui-webui';\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 Ember.Service.extend({\n    MAX_INTERNAL_LOG_ITEMS: 1000,\n    internalLogs: [],\n\n    logCounts: null,\n    failureCount: 0,\n\n    _originalLogger: Ember.Logger,\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    conversation: Ember.inject.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('logCounts', {});\n        this.set('clientSessionId', uuid());\n        LOG_LEVELS.forEach(level => this.set(`logCounts.${level}`, 0));\n        this.bindLogMethods();\n        this.resetLogLimit();\n    },\n\n    loggingOptions: Ember.computed('session.org.orgPreferences.loggerOptions', 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            // 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    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.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\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.get('application');\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                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.get('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            data = extractRawData(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(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    _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    bufferLog(level, topic, ...itemsToLog) {\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                // expose 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                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                        if (isLocal && DEBUG) {\n                            console.debug('local-only error', itemsToLog[j]);\n                        }\n                        return logResult;\n                    }\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.get('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\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.get('logs').pushObject(trace);\n        }\n\n        if (logLocal || level.toLowerCase() === 'error') {\n            this.get('internalLogs').pushObject({ topic, level, itemsToLog: itemsToLog, time: moment().toISOString() });\n\n            if (this.get('internalLogs.length') > this.MAX_INTERNAL_LOG_ITEMS) {\n                this.get('internalLogs').shiftObject();\n            }\n        }\n\n        this.get('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: Ember.observer('logs.[]', 'backOffTask.isRunning', 'session.isAuthenticated', function () {\n        this.get('_saveLogsTask').perform();\n    }),\n\n    _saveLogsTask: task(function* () {\n        const logs = this.get('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.get('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.get('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.get('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.get('exponentialBackoff').getInterval());\n    }),\n\n    immediateSaveLogs() {\n        const logs = this.get('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 Ember.RSVP.resolve();\n\n        // this._originalLogger.log('STASH-LOGGER: sendLogTraces', traces, this);\n        const data = JSON.stringify({\n            app: {\n                appId: 'connections-ui-webui',\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 Ember.RSVP.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        };\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendLogTraces');\n    },\n\n    _resetLogsOnSuccessfulSave() {\n        this.set('failureCount', 0);\n        this.resetLogLimit();\n        this.get('exponentialBackoff').reset();\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\n\nimport ApplicationAdapter from '../adapters/application';\nimport PromiseArray from '../utils/promise-array';\n\nimport GroupStoreMixin from '../group/store-mixin';\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(GroupStoreMixin, SearchStoreMixin, {\n    session: Ember.inject.service(),\n\n    adapter: ApplicationAdapter,\n\n    applicationAdapter() {\n        return Ember.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        Ember.assert('You tried to load a query but you have no adapter (for ' + type + ')', adapter);\n        Ember.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 = Ember.RSVP.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 = Ember.RSVP.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                Ember.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: Ember.computed.reads('content.meta')\n        });\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2().then(result => {\n            addPageAction('conn-ui-fav-load', {\n                'conn-ui-fav-nb': result ? result.length : 0\n            });\n            return result;\n        });\n    },\n\n    findFavoritesPublicApiV2() {\n        const promiseLabel = 'Store: Application#findFavoritesPublicApiV2';\n        const adapter = this.adapterFor('application');\n        const result = adapter.findFavorites(this);\n        const promise = Ember.RSVP.Promise.resolve(result, promiseLabel).then(res => {\n            const promises = [];\n            const personResult = res.filter(item => item.entityType === 'person');\n            if (personResult.length) {\n                promises.push(this.findMany('person', Ember.A(personResult).mapBy('entityId'), FL['person']));\n            }\n            const groupResult = res.filter(item => item.entityType === 'group');\n            if (groupResult.length) {\n                promises.push(this.findMany('group', Ember.A(groupResult).mapBy('entityId'), FL['group']));\n            }\n            if (promises.length) {\n                return Ember.RSVP.Promise.all(promises).then(function (favorites) {\n                    return {\n                        payload: res,\n                        collection: favorites.flat()\n                    };\n                });\n            } else {\n                return {\n                    payload: res,\n                    collection: []\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 = Ember.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 Ember.RSVP.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        if (type === 'person' && this.get('session.features.enableUIAjaxRetryHeader')) {\n            return new Ember.RSVP.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                Ember.RSVP.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 Ember.RSVP.Promise((resolve, reject) => {\n            window.async.mapLimit(\n                batches,\n                batchLimit,\n                function (batch, callback) {\n                    Ember.run.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                    Ember.run.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","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service } = Ember;\n\nconst StreamingService = Service.extend(LoggerMixin, {\n    connection: {},\n    connected: false,\n    connectedV2: false,\n    v2Deferred: null,\n    v2Promise: null,\n\n    init() {\n        this._super(...arguments);\n        const deferred = Ember.RSVP.defer();\n        this.set('v2Deferred', deferred);\n        this.set('v2Promise', deferred.promise);\n    },\n\n    connect() {\n        return this.get('connectionPromise') || Ember.RSVP.resolve();\n    },\n\n    subscribeToConnection() {},\n\n    setStatus() {\n        return Ember.RSVP.reject(new Error('Entity is required'));\n    },\n\n    setRoomInactive() {},\n\n    inviteToRoom() {},\n\n    setupConnection() {\n        if (this.get('connectionPromise')) {\n            return this.get('connectionPromise');\n        }\n\n        const connectionPromise = Ember.RSVP.resolve();\n        this.set('connectionPromise', connectionPromise);\n        return connectionPromise;\n    }\n});\n\nexport default StreamingService;\n","define(\"connections-ui/services/text-measurer\", [\"exports\", \"ember-text-measurer/services/text-measurer\"], function (_exports, _textMeasurer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _textMeasurer.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-activity\", [\"exports\", \"ember-user-activity/services/user-activity\"], function (_exports, _userActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userActivity.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-idle\", [\"exports\", \"ember-user-activity/services/user-idle\"], function (_exports, _userIdle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userIdle.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar set = Ember.set;\n\nexport default Ember.Service.extend({\n  init: function() {\n    set(this, 'cache', {});\n  }\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-chrome\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-chrome\"], function (_exports, _jabraChrome) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraChrome.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-native\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-native\"], function (_exports, _jabraNative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraNative.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/plantronics\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/plantronics\"], function (_exports, _plantronics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronics.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/sennheiser\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/sennheiser\"], function (_exports, _sennheiser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.default;\n    }\n  });\n  Object.defineProperty(_exports, \"eventTypes\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.eventTypes;\n    }\n  });\n  Object.defineProperty(_exports, \"events\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.events;\n    }\n  });\n});\n","import UserIdleService from 'ember-user-activity/services/user-activity';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 seconds\n    activeEvents: [] // no listeners by default\n});\n","// app/services/user-idle.js\nimport UserIdleService from 'ember-user-activity/services/user-idle';\nimport Ember from 'ember';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 second\n\n    userActivity: Ember.inject.service('videoActivity'),\n\n    setListening(value) {\n        if (value) {\n            this.get('userActivity').enableEvent('mousemove');\n        } else {\n            this.get('userActivity').disableEvent('mousemove');\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\nimport Evented from '@ember/object/evented';\n\nimport Service from '@ember/service';\nimport {\n    ApplicationService,\n    IntlService,\n    PhoneService,\n    SessionService,\n    StashLoggerService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { WebrtcSettingsService } from './webrtc-settings';\nimport {\n    IExtendedMediaSession,\n    ISdkMediaState,\n    IPendingSession,\n    IStation,\n    ISdkConversationUpdateEvent,\n    IStartSoftphoneSessionParams,\n    SessionTypes,\n    IEndSessionRequest,\n    ISessionMuteRequest,\n    IConversationHeldRequest,\n    GenesysCloudWebrtcSdk,\n    IPendingSessionActionParams\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 ComputedProperty from '@ember/object/computed';\nimport EmberObject from '@ember/object';\nimport { addPageAction } from '../utils/newrelic';\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 BasicConversationLegacy extends EmberObject {\n    id: string;\n    shouldAutoProceedWebrtc: boolean;\n    acceptedByClient: boolean;\n    isOutbound: 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 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    webrtcSettings: WebrtcSettingsService;\n    ajax: AjaxServiceClass;\n    intl: IntlService;\n\n    logger: StashLoggerService;\n    sdk: GenesysCloudWebrtcSdk;\n\n    pendingSessions: Ember.MutableArray<IPendingSessionEmber>;\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    userId: ComputedProperty<string>;\n    hasActiveSoftphoneConversation: boolean;\n    hasActiveSoftphoneSession: boolean;\n    _instrumentSdkUsage(sdkFunction: string): void;\n    isPersistentConnection: ComputedProperty<boolean>;\n    useSdk: ComputedProperty<boolean>;\n    useHeadsets: ComputedProperty<boolean>;\n    settingsPromise: ComputedProperty<IWebrtcSettings>;\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    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}\n\nexport default Service.extend(LoggerMixin, Evented, {\n    init(this: WebrtcSdkService) {\n        (this as any)._super(...arguments);\n\n        this.set('session', {} as SessionService);\n        this.set('application', {} as ApplicationService);\n        this.set('phone', {} as PhoneService);\n        this.set('webrtcSettings', {} as WebrtcSettingsService);\n        this.set('ajax', {} as AjaxServiceClass);\n        this.set('intl', {} as IntlService);\n        this.set('pendingSessions', Ember.A());\n        this.set('headsetState', 'noVendor');\n        this.set('showPermissionsModal', false);\n        this.set('sdk', {} as GenesysCloudWebrtcSdk);\n        this.set('station', {} as IStation);\n        this.set('mediaState', {} as ISdkMediaState);\n        this.set('previousAutoAnswerProps', { pendingSessions: [], conversationsToAutoAnswer: [] });\n        this.set('lastConversationUpdate', {} as ISdkConversationUpdateEvent);\n        this.set('hasActiveSoftphoneConversation', false);\n        this.set('hasActiveSoftphoneSession', false);\n        this.set('userId', '');\n        this.set('isPersistentConnection', false);\n        this.set('useSdk', false);\n        this.set('useHeadsets', false);\n        this.set('settingsPromise', {} as IWebrtcSettings);\n    },\n\n    _instrumentSdkUsage(sdkFunction: string) {\n        const pageActionName = `used-webrtc-sdk-${sdkFunction}`;\n        addPageAction(pageActionName);\n    },\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(this: WebrtcSdkService, _startParams: IStartSoftphoneSessionParams) {\n        this._instrumentSdkUsage('startSoftphoneSession');\n    },\n\n    setDevices(this: WebrtcSdkService, _devices: MediaDevices) {\n        this._instrumentSdkUsage('setDevices');\n    },\n\n    setCallVolume(this: WebrtcSdkService, _volume: number) {\n        this._instrumentSdkUsage('setCallVolume');\n    },\n\n    ensureVideoPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureVideoPermissions');\n    },\n\n    ensureAudioPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureAudioPermissions');\n    },\n\n    acceptPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('acceptPendingSession');\n    },\n\n    rejectPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('rejectPendingSession');\n    },\n\n    findRemainingSessionsBasedOnParams(this: WebrtcSdkService, _conversationId: string, _sessionType?: SessionTypes) {\n        this._instrumentSdkUsage('findRemainingSessionsBasedOnParams');\n        return null;\n    },\n\n    endSession(this: WebrtcSdkService, _endSessionParams: IEndSessionRequest) {\n        this._instrumentSdkUsage('endSession');\n    },\n\n    setMute(this: WebrtcSdkService, _muteOptions: ISessionMuteRequest) {\n        this._instrumentSdkUsage('setMute');\n    },\n\n    setHold(this: WebrtcSdkService, _heldOptions: IConversationHeldRequest) {\n        this._instrumentSdkUsage('setHold');\n    },\n\n    endAllSoftphoneSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('endAllSoftphoneSessions');\n    },\n\n    getAllActiveSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('getAllActiveSessions');\n        return [];\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, resolve } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\n\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport {\n    IntlService,\n    NotificationService,\n    PreferencesService,\n    SessionService,\n    StashLoggerService,\n    ApplicationService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport { IDirectorySettings, IGeneralSettings, IWebrtcSettings } from '../types/webrtc-settings.type';\n\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    ajax: AjaxServiceClass;\n    preferences: PreferencesService;\n    session: SessionService;\n    logger: StashLoggerService;\n    notification: NotificationService;\n    intl: IntlService;\n    application: ApplicationService;\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    notification: inject('notification'),\n    intl: inject('intl'),\n    application: inject('application'),\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    async _waitForAccessToken(this: WebrtcSettingsService) {\n        if (this.get('session.accessToken') || (isTesting && !this.reallyWaitForToken)) {\n            return;\n        }\n\n        return new Promise(resolve => {\n            const handler = () => {\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        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n        const promise = this.get('ajax')\n            .request(settingsUrl)\n            .then(settings => Ember.Object.create(settings))\n            .catch(e => this.logger.error('Failed to fetch webrtc settings', { err: e }))\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        const existingPromise = this.get('_updatePromise') || resolve();\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n\n        const promise = existingPromise\n            .then(() => {\n                this.get('ajax').request(settingsUrl, {\n                    method: 'PATCH',\n                    dataType: 'text',\n                    data: settings\n                });\n            })\n            .catch(e => this.logger.error('Failed to update webrtc settings', { err: e }))\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    },\n\n    _checkAndFixSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // If some important settings are missing, set some defaults.\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 defaults.', settings);\n            // Set the settings locally if fixes were applied and return true.\n            // These do NOT persist automatically.\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\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>(settingPath: K | string, value: IWebrtcSettings[K]) {\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                Ember.set(ref, piece, value);\n            } else {\n                Ember.set(ref, piece, ref[piece] || {});\n            }\n\n            ref = ref[piece];\n        });\n\n        // only update the top-level object\n        const topLevelKey = pieces[0];\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","define(\"connections-ui/services/webrtc\", [\"exports\", \"ember-webrtc-components/services/webrtc\"], function (_exports, _webrtc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtc.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\nimport netUtils from '../utils/net';\n\nconst DEFAULT_STORAGE_KEY = 'connections_ui_auth';\n\nconst CURRENT_PROP = 'authenticated';\n\nlet BaseStore = LocalStorageStore;\nlet storageKey = DEFAULT_STORAGE_KEY;\n\nif (config.environment === 'development') {\n    try {\n        let currEnvDetails = netUtils.getEnvDetails();\n        if (currEnvDetails && currEnvDetails.local) {\n            storageKey = `${DEFAULT_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n        }\n    } catch (e) {\n        // Unknown env, prob testing ... just use base storage key\n    }\n}\n\nexport default BaseStore.extend({\n    init() {\n        let storeProps = {\n            key: storageKey\n        };\n        this.setProperties(storeProps);\n        this._super(...arguments);\n    },\n\n    restore() {\n        return this._super(...arguments).then(data => {\n            let payload = data[CURRENT_PROP] || {};\n            // Force our ESA authenticator to get a token from the host.\n            payload.authenticator = 'authenticator:directory';\n            return {\n                [CURRENT_PROP]: payload\n            };\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kKl62LJd\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/agent-ui.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"y+Bia1zY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canSelectDevices\\\"]],[33,[\\\"not\\\"],[[28,[\\\"webrtc\\\",\\\"canUseWebrtcSoftphone\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"webrtc-issues\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"callForwardingActive\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEnableCallForwarding\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"forward-calls \\\",[33,[\\\"if\\\"],[[28,[\\\"webrtcStation\\\"]],\\\"webrtc-station\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-sm btn-link-bordered btn-block begin-forwarding\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"callForwarding\\\"],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.enableCallForwarding\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"call-forwarding-v2\\\"],null,[[\\\"configuringCallForwarding\\\"],[[28,[\\\"configuringCallForwarding\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/call-forwarding-partial.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"59cslhog\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.cardView\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner-nav\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"currentPerson\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-view-icon-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\",\\\"setCurrentPerson\\\"],[[28,[\\\"model\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setCurrentPerson\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"aFUOXhwO\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"card-tree\\\"],null,[[\\\"model\\\"],[[28,[\\\"model\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/tree.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"jBs6fTqh\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"canViewBusinessChat\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-access\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"strong\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessErrorTitle\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessError\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/chat-room.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"0kkMWKWy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"hidden\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showSeparatorBefore\\\"]]],null,{\\\"statements\\\":[[1,[28,[\\\"previous\\\",\\\"separator\\\"]],false]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"template\\\"]]],null,{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[1,[26,[\\\"title\\\"]],false]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"showSeparatorAfter\\\"]]],null,{\\\"statements\\\":[[1,[26,[\\\"separator\\\"]],false]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/document-title.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"FHUG/v5v\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"media-item webhooks collapsible \\\",[33,[\\\"unless\\\"],[[28,[\\\"expanded\\\"]],\\\"collapsed\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"collapse-toggle btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpanded\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"expanded\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksTitle\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-details\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[13],[0,\\\" \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksDetails\\\"]]],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks-collapsible.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"iy8S2P5P\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-item webhooks collapsed\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"status \\\",[26,[\\\"webhooksStatus\\\"]]]]],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks.hbs\"}});","define(\"connections-ui/templates/components/x-select\", [\"exports\", \"emberx-select/templates/components/x-select\"], function (_exports, _xSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xSelect.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"KKBGetCl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"group-profile\\\"],null,[[\\\"model\\\",\\\"isEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/group/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"55yjh1Xz\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.index\\\"],null],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/index.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Bgiz6Huu\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"login-oauth\\\"],null,[[\\\"offerMobileApp\\\",\\\"mobileOfferDeclined\\\",\\\"authenticate\\\"],[[28,[\\\"model\\\",\\\"offerMobileApp\\\"]],[33,[\\\"route-action\\\"],[\\\"mobileOfferDeclined\\\"],null],[33,[\\\"route-action\\\"],[\\\"authenticate\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/login-oauth.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"09fWonJq\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"title text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"titleKey\\\"],null]],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasDesc\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"desc text-center\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"descKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"action-container text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"actionKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reloadApp\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"unrecoverableAppFailure.reloadApp\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/maintenance.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"nv+hrZq0\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissionsHeader\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissions\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"logout\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.logout\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/no-access.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"t3+KfQhb\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-station-notification\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-phone-off\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.noPhoneSelected\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link action-open-station-picker-v2\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openStationPicker\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"select-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.change\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-angle-right\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/partials/-no-station-notification.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"XmYZvT94\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-profile\\\"],null,[[\\\"entity\\\",\\\"user\\\",\\\"editing\\\",\\\"editEmergencyLocation\\\",\\\"setEditingSection\\\"],[[28,[\\\"model\\\",\\\"person\\\"]],[28,[\\\"model\\\",\\\"user\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setEditingSection\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/person/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"moJeOwBU\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dialpadShouldSendDtmf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"dtmf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"show-dtmf-dialpad\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openDtmfDialPad\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.openDialpad\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRecord\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"record\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"record\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRecording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"add-participant\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAddParticipants\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.addParticipant\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"conversation\\\",\\\"onConference\\\"]],[28,[\\\"isMonitoring\\\"]],[28,[\\\"isCoaching\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"conversation\\\",\\\"onConsult\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"transfer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"transfer\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.transfer.default\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"eligibleCallsToMerge\\\"]],[28,[\\\"isConnected\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"merge\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"merge\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.merge\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"flagInteraction\\\",\\\"isRunning\\\"]],[28,[\\\"unflagInteraction\\\",\\\"isRunning\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFlagged\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"unflag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.unflagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"class\\\",\\\"flag-icon\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/purecloud/partials/conversation-controls-menu.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Wq9VakQB\",\"block\":\"{\\\"statements\\\":[[19,\\\"partials/signup-reset\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/templates/reset-password.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"HGIIpodG\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"search-page\\\"],null,[[\\\"entity\\\",\\\"query\\\",\\\"queryFacets\\\",\\\"saveHistory\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"query\\\"]],[28,[\\\"queryFacets\\\"]],[28,[\\\"saveHistory\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/search.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"NjP1jyRV\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/third-party/app-embed.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"z5f7z+A1\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"time-machine-confirmation\\\"],null,[[\\\"buildTag\\\",\\\"confirm\\\",\\\"cancel\\\"],[[28,[\\\"model\\\",\\\"buildTag\\\"]],[33,[\\\"route-action\\\"],[\\\"confirm\\\"],null],[33,[\\\"route-action\\\"],[\\\"cancel\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/time-machine.hbs\"}});","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","define(\"connections-ui/transforms/json\", [\"exports\", \"ember-data-change-tracker/transforms/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _json.default;\n    }\n  });\n});\n","define(\"connections-ui/transforms/object\", [\"exports\", \"ember-data-change-tracker/transforms/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _object.default;\n    }\n  });\n});\n","define(\"connections-ui/types/agent-assist.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/conversation.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","export * from './maybe.type';\nexport * from './conversation.type';\nexport * from './pigeon.type';\n","define(\"connections-ui/types/maybe.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/pigeon.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/webrtc-settings.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","import { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { UnionFromTuple, assertNever } from 'connections-ui/utils/types';\nimport { AppContext } from './apps';\n\nexport const COMMUNICATION_TYPE_SINGULAR = ['call', 'email', 'message', 'chat', 'callback'] as const;\ntype 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({ type, payload }: AppContext): string | undefined {\n    switch (type) {\n        case 'conversation': {\n            return payload.get('participantForCurrentUser.queueId') || payload.get('participantForQueue.queueId');\n        }\n        default: {\n            assertNever(type);\n        }\n    }\n}\n","export const replaceHtmlSpecialChars = (str: string): string =>\n    str\n        ?.replace(/&quot;/g, '\"')\n        .replace(/&#39;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&')\n        .replace(/&#8217;/g, \"'\");\n","import _ from 'lodash';\nimport Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\nimport moment from 'connections-ui/utils/dates';\n\nconst { typeOf, get } = Ember;\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        Ember.Logger.error('Unable to clone and set the interaction metadata for interaction', {\n            err,\n            remoteData: {\n                interactionId: Ember.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 = Ember.A(calls).some(call => {\n            const code = Ember.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 customerParticipants =\n            participants.filter(({ purpose }) => purpose === 'customer' || purpose === 'external') || Ember.A([]);\n\n        const hasMultipleCustomers = customerParticipants.length > 1;\n\n        if (hasMultipleCustomers) {\n            const consultParticipantId =\n                get(interaction, 'consultParticipantId') || customerParticipants.mapBy('consultParticipantId').pop();\n            const isCallOrCallback = interaction.get('isCall') || interaction.get('isCallback');\n\n            if (isCallOrCallback) {\n                if (consultParticipantId) {\n                    return customerParticipants.findBy('id', consultParticipantId);\n                } else {\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                    let participant;\n                    for (let i = 0; i < customerParticipants.length; i++) {\n                        let customer = customerParticipants[i];\n\n                        const communicationType = pluralize(type).camelize();\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\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    Ember.Logger.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","export const MEDIA_TYPES = {\n    CHAT: 'chat',\n    EMAIL: 'email',\n    VOICE: 'voice'\n};\n\nexport const STAT_KEYS = {\n    ABANDONED: 'tAbandon',\n    ACW: 'tAcw',\n    ANSWERED: 'tAnswered',\n    CUSTOMERS_WAITING: 'oWaiting',\n    HANDLE: 'tHandle',\n    HELD: 'tHeld',\n    INTERACTING: 'oInteracting',\n    IVR: 'tIvr',\n    OFFERED: 'nOffered',\n    OVERSLA: 'nOverSla',\n    SERVICE_LEVEL: 'serviceLevel',\n    SERVICE_TARGET: 'serviceTarget',\n    TALK: 'tTalk',\n    TIME_IN_STATUS: 'tIS', // tIS.<Status ID> ms  The time in status for the given status id. At status change time.\n    TRANSFERRED: 'nTransferred',\n    WAIT_TIME: 'tWait',\n    ACTIVE_MEMBERS: 'nActive', // Number of active members\n    MEMBERS: 'nMembers' // Active members\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 { buildSymbolMap } from 'connections-ui/utils/boolean-expressions';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport const _buildAppProviderComputed = function (providerConfig) {\n    let dependencies = ['permissions.donutPermissions.[]', 'session.features'];\n    let keys = Object.keys(providerConfig);\n    keys.forEach(currKey => {\n        if (providerConfig[currKey].dependencies) {\n            dependencies = [...dependencies, ...providerConfig[currKey].dependencies];\n        }\n    });\n    dependencies = [...new Set(dependencies)];\n    let evaluateProviderExpression = function (expr, features, permissions) {\n        return buildSymbolMap(expr, {\n            ft: keyName => {\n                return features[keyName];\n            },\n            perm: keyName => {\n                return permissions.validateDonutPermission(keyName);\n            },\n            bool: keyName => {\n                return keyName === 'true';\n            }\n        });\n    };\n    return computed(...dependencies, function () {\n        let validProviders = [];\n        const permissions = this.get('permissions');\n        const features = this.get('session.features');\n        keys.forEach(currKey => {\n            const boolExpr = providerConfig[currKey].boolExpr;\n            const oldProvider = providerConfig[currKey].providerInstance;\n            let validProvider;\n            if (boolExpr) {\n                try {\n                    validProvider = providerConfig[currKey].evaluator(\n                        evaluateProviderExpression(boolExpr, features, permissions)\n                    );\n                } catch (error) {\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                    providerConfig[currKey].providerInstance = getOwner(this).lookup('app-provider:' + currKey);\n                }\n                validProviders.push(providerConfig[currKey].providerInstance);\n            } else {\n                if (oldProvider) {\n                    oldProvider.destroy();\n                    providerConfig[currKey].providerInstance = null;\n                }\n            }\n        });\n        return validProviders;\n    });\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 'connections-ui/utils/types';\nimport { RenderedInstanceState } 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 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 is 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 { assertNever, hasKey } from './types';\nimport { AppDef, AppLogDetails, Asset } from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload } from '@connections-ui/services';\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';\nconst LOG_SEPARATOR = ' - ';\n\nexport * as AppsV2 from '@genesys/apps-v2-host';\n\ntype 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};\n\nexport type AppContext = ConversationAppContext;\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\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    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'].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 (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n            return false;\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","import { noop } from 'lodash';\n\nexport 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> = noop;\n    let reject: PromiseReject<T> = noop;\n\n    const promise = new Promise<T>((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve, reject };\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","define(\"connections-ui/utils/browser\", [\"exports\", \"ember-purecloud-components/utils/browser\"], function (_exports, _browser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _browser.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/code-utils\", [\"exports\", \"ember-purecloud-components/utils/code-utils\"], function (_exports, _codeUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _codeUtils.default;\n    }\n  });\n});\n","export function isGuid(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isAppleURN(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^urn:mbid:/);\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\n/**\n * Convert size in bytes to KB, MB, GB or GB.\n * @param contentLength file size in bytes to be converted against.\n * @returns {string} the converted value with the correct unit.\n */\nexport function formatSize(contentLength: number): string {\n    const units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(contentLength) / Math.log(1000));\n\n    if (!+contentLength) return '0bytes';\n    return `${parseFloat((contentLength / Math.pow(1000, i)).toFixed(1))}${units[i]}`;\n}\n","/*\n  DEPRECATION NOTICE:  this file has been moved to `ember-purecloud-components`\n  and will be removed.  Please use './node_modules/ember-purecloud-components/addon/utils/dates.js'\n  instead.\n*/\n\nimport moment from 'ember-purecloud-components/utils/dates';\nimport {\n    displayDateRelativeToToday,\n    generateCurrentInterval,\n    splitIntervalString,\n    timeInMillis\n} from 'ember-purecloud-components/utils/dates';\n\nexport default moment;\n\nexport { displayDateRelativeToToday, generateCurrentInterval, splitIntervalString, timeInMillis };\n","define(\"connections-ui/utils/debug-backburner\", [\"exports\", \"ember-purecloud-components/utils/debug-backburner\"], function (_exports, _debugBackburner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugBackburner.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/debug-rsvp\", [\"exports\", \"ember-purecloud-components/utils/debug-rsvp\"], function (_exports, _debugRsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugRsvp.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/display-geolocation\", [\"exports\", \"ember-purecloud-components/utils/display-geolocation\"], function (_exports, _displayGeolocation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _displayGeolocation.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/email-types/draft-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email-types/email-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email\", [\"exports\", \"ember-purecloud-components/utils/email\"], function (_exports, _email) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _email.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/ember-types\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\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","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😆',\n        '😂',\n        '😉',\n        '😏',\n        '😊',\n        '😍',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😝',\n        '😜',\n        '😢',\n        '😭',\n        '😨',\n        '😰',\n        '😱',\n        '😠',\n        '😕',\n        '🙁',\n        '😮',\n        '😦',\n        '😧',\n        '😑',\n        '😶',\n        '😒',\n        '😬',\n        '😳',\n        '😞',\n        '😓',\n        '😅',\n        '😇',\n        '😔',\n        '😪',\n        '🥳',\n        '😷',\n        '😺',\n        '😹',\n        '😻',\n        '😼',\n        '🙀',\n        '😿',\n        '😾',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '🙌',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '🙌🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '🙌🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '🙌🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '🙌🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '🙌🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📢',\n        '📣',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    people: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊',\n        '👶',\n        '👦',\n        '👧',\n        '👨',\n        '👩',\n        '👴',\n        '👵',\n        '👨‍🎓',\n        '👩‍🎓',\n        '👨‍🏫',\n        '👩‍🏫',\n        '👨‍🌾',\n        '👩‍🌾',\n        '👨‍🍳',\n        '👩‍🍳',\n        '👨‍🔧',\n        '👩‍🔧',\n        '👨‍🏭',\n        '👩‍🏭',\n        '👨‍💼',\n        '👩‍💼',\n        '👨‍🔬',\n        '👩‍🔬',\n        '👨‍💻',\n        '👩‍💻',\n        '👨‍🎤',\n        '👩‍🎤',\n        '👨‍🎨',\n        '👩‍🎨',\n        '👨‍✈️',\n        '👩‍✈️',\n        '👨‍🚀',\n        '👩‍🚀',\n        '👨‍🚒',\n        '👩‍🚒',\n        '👮',\n        '🕵',\n        '💂',\n        '👷',\n        '💇🏼',\n        '🚶',\n        '🏃',\n        '🛌',\n        '🏇',\n        '🏂',\n        '🏌',\n        '🏄',\n        '🚣',\n        '🏊',\n        '⛹',\n        '🏋',\n        '🚴',\n        '🚵',\n        '👪',\n        '👨‍👩‍👦',\n        '👨‍👩‍👧',\n        '👨‍👩‍👧‍👦',\n        '👨‍👩‍👦‍👦',\n        '👨‍👩‍👧‍👧',\n        '👨‍👨‍👦',\n        '👨‍👨‍👧',\n        '👨‍👨‍👧‍👦',\n        '👨‍👨‍👦‍👦',\n        '👨‍👨‍👧‍👧',\n        '👩‍👩‍👦',\n        '👩‍👩‍👧',\n        '👩‍👩‍👧‍👦',\n        '👩‍👩‍👦‍👦',\n        '👩‍👩‍👧‍👧',\n        '💪',\n        '👈',\n        '👉',\n        '☝',\n        '👇',\n        '✌',\n        '🖐',\n        '✋',\n        '👌',\n        '👍',\n        '👎',\n        '👊',\n        '👋',\n        '✍',\n        '👏'\n    ],\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","define(\"connections-ui/utils/emoji\", [\"exports\", \"ember-purecloud-components/utils/emoji\"], function (_exports, _emoji) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emoji.default;\n    }\n  });\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 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 (Ember.String.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 { messagingChannelTypes, getDisplayOrScreenName, messagingChannelTypeFor } from './message-channels';\nimport Ember from 'ember';\nimport { CHANNEL_MODEL_TYPE } from 'connections-ui/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    Ember.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    const channelRecordData = channelRecord.data;\n    const changedAttributes = channelRecord.changedAttributes();\n    const messagingChannelType = messagingChannelTypeFor(channelRecordData.type);\n    const modelKey = `${messagingChannelType.modelKey}`;\n    const modelProperties = Object.keys(messagingChannelType.modelProperties()[modelKey]);\n    Ember.run.join(() => {\n        if (channelRecordData.isNewChannel) {\n            // Set up the new channel and its id(s)\n            contact.set(`${modelKey}`, channelRecordData[`${modelKey}`]);\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","export default {\n    acdDivisionPresenceProfileToggle: true, // Secondary translation fix for regions | ACE-3661\n    acdHybridToastNoActiveQueue: true, // Partially Enabled | ACE-1440\n    acdNormalizedMessages: true, // ACE-2199\n    acdOutboundWhatsApp: true, // PURE-2802 | ACE-2511\n    acdSecurePause: true, // ACE-2443\n    acdTransferPermissions: true, //PURE-4261\n    'ACT-1205': true, // ACT-1205 Adding Agent Greeting from Agent UI Settings to Preferences\n    'AGORA-137_connections-ui-contentsquare': true,\n    'ATLAS-536_EnableContentSquare': true,\n    auraACWGadgets: true, //AURA-88\n    'comui-disable-legacy-api-url': true,\n    conversationSummary3256: true, // ATEAM-1229\n    digitalFirstPURE2942: true,\n    'EC-760': true,\n    emergencyLocation: true,\n    enableUIAjaxRetryHeader: true,\n    epcDecompPresenceLabel: true,\n    'gcucc-ui-PCUCC-3734': true, // PCUCC-3734\n    'gcucc.ui.useIntegrationPresenceSourceDirectorySearch': true, // PCUCC-1007\n    groupProileNoIndividualsSave: true, // PLUG-188\n    hawkClientScreenShare: true,\n    interactionNameQueueCallingQueue: true, // ACE-1872\n    notificationOutputPicker: true,\n    'PAUI-80.PeopleUiDecomposition': true, // AGORA-446\n    playRecordingFromSelectedOutput: true,\n    'PURE-3256_useConversationDetails': true, // // ATEAM-1229\n    'PURE-6186_Scripter_Gadget_GCUI': true, // CC-4815\n    'PURE-7064_search_favorites': true,\n    'PURE3301-dynamicGroups': true,\n    'qm.release.evaluation.assignee': true, // WEM-742\n    'qm.release.evaluation.disputes': true, // WEM-689\n    relateDynamicSchema: true,\n    showVideoInThumbnail: true, // Show video on thumbnail if there is a screen stream, and participant is major, and video is not muted\n    userRecordingDownload: true, // CM-5713: feature toggle for new API to download user recordings for Calls.\n    webrtcClientNetworkProbeAutoAdjust: true,\n    webrtcDefaultDeviceProfile: true, //PURE-5609\n    webrtcDisableDeviceProfileNotifications: true, // PURE-5609\n    webrtcMMSDnsCheck: true,\n    webrtcRelayOnly: true,\n    webrtcTrackBasedActions: true,\n    webUiDarkTheme: true\n} as const;\n","export const imageTypes = [\n    'apng',\n    'avif',\n    'bmp',\n    'cur',\n    'eps',\n    'gif',\n    'ico',\n    'jpeg',\n    'jpg',\n    'png',\n    'svg',\n    'svg+xml',\n    'tif',\n    'tiff',\n    'webp'\n] as const;\nexport type ImageType = (typeof imageTypes)[number];\n\nexport const audioTypes = [\n    'aac',\n    'aif',\n    'aifc',\n    'aiff',\n    'caf',\n    'flac',\n    'm4a',\n    'm4r',\n    'mogg',\n    'mp3',\n    'oga',\n    'ogg',\n    'pcm',\n    'wav',\n    'wave',\n    'wma',\n    'wmf'\n] as const;\nexport type AudioType = (typeof audioTypes)[number];\n\nexport const videoTypes = [\n    '3g2',\n    '3gp',\n    'amv',\n    'asf',\n    'avi',\n    'f4a',\n    'f4b',\n    'f4p',\n    'f4v',\n    'flv',\n    'gifv',\n    'm4p',\n    'm4v',\n    'mkv',\n    'mng',\n    'mod',\n    'mov',\n    'mp2',\n    'mp4',\n    'mpe',\n    'mpeg',\n    'mpg',\n    'mpv',\n    'mxf',\n    'nsv',\n    'ogv',\n    'qt',\n    'rm',\n    'roq',\n    'rrc',\n    'svi',\n    'vob',\n    'webm',\n    'wmv',\n    'yuv'\n] as const;\nexport type VideoType = (typeof videoTypes)[number];\n\nexport const textDocTypes = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'odt', 'txt'] as const;\nexport type TextDocType = (typeof textDocTypes)[number];\n\nexport const pdfTypes = ['pdf'] as const;\nexport type PdfType = (typeof pdfTypes)[number];\n\nexport const powerPointTypes = ['key', 'pptx', 'pptm', 'ppt'] as const;\nexport type PowerPointType = (typeof powerPointTypes)[number];\n\nexport const excelTypes = ['xlsx', 'xls'] as const;\nexport type ExcelType = (typeof excelTypes)[number];\n","import Ember from 'ember';\n\nfunction _isSafeToFocus(selector) {\n    const currentSelectedElement = Ember.$(window.document.activeElement);\n\n    switch (selector) {\n        case '#roster-action-answer-button button':\n            // interaction roster\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.incoming-controls button.answer-call':\n            // active-call-entry\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.answer-call-action-bar button.answer-call':\n            // call toast\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        default:\n            return false;\n    }\n}\n\nexport function doFocus(component, selector) {\n    Ember.run.scheduleOnce('afterRender', component, function () {\n        const target = component.$(selector);\n        if (target) {\n            target.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        Ember.run.next(() => {\n            doFocus(scope, selector);\n        });\n    }\n}\n","import Ember from 'ember';\nconst geolocation = navigator.geolocation;\n\nconst GeolocationUtil = Ember.Object.create({\n    hostedContext: null,\n\n    setContext(context) {\n        this.hostedContext = context;\n    },\n    fetchCurrentPostion() {\n        let context = this.get('hostedContext');\n        if (context !== null && context.isHosted() && context.requiresNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPosition' });\n        } else {\n            return new Ember.RSVP.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","import request from 'ember-ajax';\n\n// see https://github.com/Giphy/GiphyAPI\n\nclass Giphy {\n    constructor(options) {\n        options = options || {};\n        this.baseUrl = 'https://api.giphy.com/v1/gifs';\n        this.apiKey = options.apiKey || 'fsibTNreYj3Co';\n    }\n\n    search(query, limit, offset) {\n        const url = `${this.baseUrl}/search`;\n        const data = {\n            q: query,\n            api_key: this.apiKey,\n            rating: 'pg',\n            fmt: 'json',\n            limit,\n            offset\n        };\n        return request(url, { data }).then(res => (Array.isArray(res.data) ? res.data : []));\n    }\n\n    random(query) {\n        const url = `${this.baseUrl}/random`;\n        const data = {\n            tag: query,\n            api_key: this.apiKey\n        };\n        return request(url, { data }).then(res => res && res.data);\n    }\n}\n\nexport default new Giphy({});\n","const gsm7Chars = [\n    '@',\n    '£',\n    '$',\n    '¥',\n    'è',\n    'é',\n    'ù',\n    'ì',\n    'ò',\n    'Ç',\n    '\\n',\n    'Ø',\n    'ø',\n    '\\r',\n    'Å',\n    'å',\n    'Δ',\n    '_',\n    'Φ',\n    'Γ',\n    'Λ',\n    'Ω',\n    'Π',\n    'Ψ',\n    'Σ',\n    'Θ',\n    'Ξ',\n    'Æ',\n    'æ',\n    'ß',\n    'É',\n    ' ',\n    '!',\n    '\"',\n    '#',\n    '¤',\n    '%',\n    '&',\n    \"'\",\n    '(',\n    ')',\n    '*',\n    '+',\n    ',',\n    '-',\n    '.',\n    '/',\n    '0',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    ':',\n    ';',\n    '<',\n    '=',\n    '>',\n    '?',\n    '¡',\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n    'P',\n    'Q',\n    'R',\n    'S',\n    'T',\n    'U',\n    'V',\n    'W',\n    'X',\n    'Y',\n    'Z',\n    'Ä',\n    'Ö',\n    'Ñ',\n    'Ü',\n    '§',\n    '¿',\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    'ä',\n    'ö',\n    'ñ',\n    'ü',\n    'à'\n];\nconst gsm7CharsExt = ['\\f', '^', '{', '}', '\\\\', '[', '~', ']', '|', '€'];\n\nexport default { gsm7Chars, gsm7CharsExt };\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { PUBLIC_ENVS } from './net';\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 = Ember.Object.extend(Ember.Evented, {\n    applicationService: Ember.inject.service('application'),\n    logger: Ember.inject.service('stash-logger'),\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    _additionalPreferences: [],\n    _requiresNativeGeolocation: 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 = Ember.getOwner(this);\n        this.set('applicationController', owner.lookup('controller:application'));\n    },\n\n    isHosted: function () {\n        return this._hostType !== null;\n    },\n\n    isHostedProp: Ember.computed(function () {\n        return this.isHosted();\n    }),\n\n    requiresNativeGeolocation: function () {\n        return this._requiresNativeGeolocation;\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    isMac: function () {\n        return this._operatingSystem === 'Mac';\n    },\n\n    isWindows: function () {\n        return this._operatingSystem === 'Windows';\n    },\n\n    getAdditionalPreferences: function () {\n        return this._additionalPreferences;\n    },\n\n    doTerminateApplication: function (completion) {\n        this.get('logger').log('in doTerminationApplication with completion: ' + completion);\n        setTimeout(function () {\n            if (completion) {\n                completion();\n            }\n        }, 2000);\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()) {\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.get('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.get('logger').log('Region: ' + region + ' URL: ' + url);\n                    window._HostedContextFunctions.sendRegionToDesktop(region, url);\n                } else {\n                    this.get('logger').error(`Unable to send region to desktop.  Unknown Region '${region}'`);\n                }\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending region to desktop', { error: e });\n        }\n    },\n\n    getShareableScreens() {\n        return this.requestDesktopPromise({\n            cmd: 'getShareableScreens'\n        });\n    },\n\n    requestDesktopPromise: function (cmd) {\n        return new Ember.RSVP.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                this.get('logger').error('Error requesting desktop promise', {\n                    error: e\n                });\n                reject();\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","const INSTAGRAM_PROP = {\n    FILE_SIZE: 8,\n    MESSAGE_TYPE: 'instagram',\n    CHARACTER_LIMIT: 1000\n};\n\nexport default INSTAGRAM_PROP;\n","import Ember from 'ember';\n\nconst I18N_FALLBACKS = {\n    selectedCountry: 'Selected country',\n    countryList: 'List of countries',\n    searchPlaceholder: 'Search',\n    zeroSearchResults: 'No Results Found',\n    oneSearchResult: '1 result found',\n    multipleSearchResults: '${count} results found'\n};\n\nfunction translate(intl, key, fallback, opts) {\n    try {\n        if (!intl || typeof intl.t !== 'function') {\n            return fallback;\n        }\n        if (typeof intl.exists === 'function' && !intl.exists(key)) {\n            return fallback;\n        }\n        const value = opts ? intl.t(key, opts) : intl.t(key);\n        if (value == null) {\n            return fallback;\n        }\n        const text = value.toString();\n        return text || fallback;\n    } catch (e) {\n        return fallback;\n    }\n}\n\nexport function getLocalizedCountryName(iso2, intl, fallbackName) {\n    if (!iso2) {\n        return fallbackName || '';\n    }\n\n    try {\n        const locale = (intl.get('isoLocale') || 'en-us').split('-')[0];\n        if (typeof Intl !== 'undefined' && Intl.DisplayNames) {\n            const displayNames = new Intl.DisplayNames([locale], { type: 'region' });\n            const name = displayNames.of(iso2.toUpperCase());\n            if (name) {\n                return name;\n            }\n        }\n    } catch (e) {\n        // Intl.DisplayNames unavailable or unsupported locale — fall back below\n    }\n\n    return fallbackName || iso2.toUpperCase();\n}\n\nexport function buildSelectedCountryAriaLabel(intl, countryData, fieldName) {\n    const selectedCountryLabel = translate(\n        intl,\n        'entity.fieldTypes.phone.countrySelector.selectedCountry',\n        I18N_FALLBACKS.selectedCountry\n    );\n\n    const countryName =\n        countryData && countryData.iso2 ? getLocalizedCountryName(countryData.iso2, intl, countryData.name) : '';\n\n    const phoneType = fieldName ? String(fieldName).trim() : '';\n\n    if (phoneType && countryName) {\n        const fallback = `${phoneType}, ${countryName}, ${selectedCountryLabel}`;\n        return translate(intl, 'entity.fieldTypes.phone.countrySelector.selectedCountryWithField', fallback, {\n            name: phoneType,\n            country: countryName,\n            selectedCountry: selectedCountryLabel\n        });\n    }\n\n    if (phoneType) {\n        return `${phoneType}, ${selectedCountryLabel}`;\n    }\n\n    if (countryName) {\n        return `${countryName}, ${selectedCountryLabel}`;\n    }\n\n    return selectedCountryLabel;\n}\n\nexport function updateSelectedCountryAriaLabel($input, intl, fieldName) {\n    if (!$input || !$input.length || !$input.intlTelInput) {\n        return;\n    }\n\n    const selectedFlag = $input.closest('.iti').find('.iti__selected-flag')[0];\n    if (!selectedFlag) {\n        return;\n    }\n\n    try {\n        const countryData = $input.intlTelInput('getSelectedCountryData');\n        selectedFlag.setAttribute('aria-label', buildSelectedCountryAriaLabel(intl, countryData, fieldName));\n    } catch (e) {\n        // Plugin may not be fully initialised yet\n    }\n}\n\nexport function setupIntlTelInputAccessibility($input, intl, fieldName) {\n    if (!$input || !$input.length) {\n        return;\n    }\n\n    const update = () => updateSelectedCountryAriaLabel($input, intl, fieldName);\n\n    $input.off('countrychange.intlTelInputA11y');\n    $input.on('countrychange.intlTelInputA11y', update);\n    Ember.run.next(update);\n}\n\nexport function buildIntlTelInputI18n(intl) {\n    return {\n        selectedCountryAriaLabel: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.selectedCountry',\n            I18N_FALLBACKS.selectedCountry\n        ),\n        countryListAriaLabel: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.countryList',\n            I18N_FALLBACKS.countryList\n        ),\n        searchPlaceholder: translate(intl, 'components.navMenu.search', I18N_FALLBACKS.searchPlaceholder),\n        zeroSearchResults: translate(intl, 'groups.expressions.noResults', I18N_FALLBACKS.zeroSearchResults),\n        oneSearchResult: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.oneSearchResult',\n            I18N_FALLBACKS.oneSearchResult\n        ),\n        multipleSearchResults: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.multipleSearchResults',\n            I18N_FALLBACKS.multipleSearchResults\n        )\n    };\n}\n\nexport function buildIntlTelInputOptions(intl, application, extraOptions = {}) {\n    const urlprefix = (application && application.get && application.get('urlprefix')) || '';\n    return {\n        nationalMode: false,\n        utilsScript: `${urlprefix}assets/intltelinput/utils.js`,\n        i18n: buildIntlTelInputI18n(intl),\n        ...extraOptions\n    };\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 * from 'ember-purecloud-components/utils/jid-helpers';\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","define(\"connections-ui/utils/logger\", [\"exports\", \"ember-purecloud-components/utils/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst hljs = window.hljs;\nhljs.configure({\n    languages: [\n        'bash',\n        'clojure',\n        'coffeescript',\n        'cpp',\n        'cs',\n        'css',\n        'elm',\n        'go',\n        'xml',\n        'handlebars',\n        'http',\n        'ini',\n        'java',\n        'javascript',\n        'json',\n        'makefile',\n        'objectivec',\n        'python',\n        'ruby',\n        'rust',\n        'sql',\n        'swift',\n        'typescript'\n    ]\n});\n\nconst markdown = window.markdownit;\n\nconst md = markdown({\n    html: false,\n    linkify: true,\n    typographer: false,\n    highlight(code, lang) {\n        if (lang === 'no-highlight') {\n            return Ember.Handlebars.Utils.escapeExpression(code);\n        } else if (lang) {\n            try {\n                return hljs.highlight(lang, code).value;\n            } catch (e) {\n                return Ember.Handlebars.Utils.escapeExpression(code);\n            }\n        } else {\n            return hljs.highlightAuto(code).value;\n        }\n    }\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 _ from 'lodash';\n\nconst LAYOUTS = {};\n\nfunction registerLayout(layoutId, layout) {\n    deregisterLayout(layoutId);\n    LAYOUTS[layoutId] = layout;\n}\n\nfunction deregisterLayout(layoutId) {\n    LAYOUTS[layoutId] = null;\n    delete LAYOUTS[layoutId];\n}\n\nfunction rerunLayouts() {\n    _.forOwn(LAYOUTS, layout => {\n        if (layout && layout.rerun) {\n            layout.rerun();\n        }\n    });\n}\n\nexport { registerLayout, deregisterLayout, rerunLayouts };\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","// 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 serviceDiscovery from '@genesys/service-discovery-web-internal';\n\nconst VALID_LOCAL_HOSTNAMES = ['localhost', 'localhost.mypurecloud.com'];\n\n// Change me if you want to proxy locally to a higher environment.\nconst TARGET_ENV = 'dev';\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 getPcApplicationsSubdomain = (_window = window) => {\n    // window passed in for testing\n    const subdomain = _window.location.hostname.split('.')[0];\n    return subdomain.toLowerCase() === 'app' ? 'app' : 'apps';\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: ['prod', 'fedramp'], 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    url = url.replace(/connections-ui/, TARGET_ENV);\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: ['prod', 'fedramp'].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","define(\"connections-ui/utils/newrelic-legacy\", [\"exports\", \"ember-purecloud-components/utils/newrelic-legacy\"], function (_exports, _newrelicLegacy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _newrelicLegacy.default;\n    }\n  });\n});\n","import Ember from 'ember';\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            Ember.Logger.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                Ember.Logger.error('Invalid attributes for addPageAction ->', {\n                    remoteData: {\n                        actionName,\n                        attrType: typeof attributes\n                    }\n                });\n                return;\n            } else {\n                const reservedKeys = ['accountId', 'timestamp', 'appId'];\n                attributes = Object.fromEntries(\n                    Object.entries(attributes)\n                        .map<[string, any] | null>(([key, value]) => {\n                            if (reservedKeys.includes(key)) {\n                                Ember.Logger.warn('Invalid reserved keys 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            Ember.Logger.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            Ember.Logger.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            Ember.Logger.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 Ember from 'ember';\nimport moment from './dates';\n\nconst { typeOf, Service, Application, get } = Ember;\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];\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    // Return null for all other cases: 'function', 'symbol', 'filelist', 'class', 'error'\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    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","/**\n * A common regex for many different number formats. Includes the following and more:\n *\n * 18005551234\n * 1 800 555 1234\n * +1 800 555-1234\n * +86 800 555 1234\n * 1-800-555-1234\n * 1 (800) 555-1234\n * (800)555-1234\n * (800) 555-1234\n * (800)5551234\n * 800-555-1234\n * 800.555.1234\n * 800 555 1234x5678\n * 8005551234 x5678\n * 1    800    555-1234\n * 1----800----555-1234\n */\nconst PHONE_NUMBER_REGEX = /^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$/;\n\n/**\n * Tests the value provided against a phone number regex to determine if the number is valid.\n * @param value phone number to test against\n * @returns boolean depicting whether or not the number provided is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n    return value ? PHONE_NUMBER_REGEX.test(value.trim()) : false;\n}\n","import type { Models } from 'purecloud-platform-client-internal-v2';\n\nexport function activityCounter(\n    contactCenter: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number,\n    enterprise: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number\n): number {\n    let contactCenterCount = 0;\n    let enterpriseCount = 0;\n\n    if (typeof contactCenter === 'number') {\n        contactCenterCount = contactCenter;\n    } else if (contactCenter && contactCenter.active) {\n        contactCenterCount = contactCenter.active;\n    }\n\n    if (typeof enterprise === 'number') {\n        enterpriseCount = enterprise;\n    } else if(enterprise && enterprise.active){\n        enterpriseCount = enterprise.active;\n    }\n\n    return contactCenterCount + enterpriseCount;\n}\n","/**\n * Checks if the presence source is a default presence source.\n * @param {string} source the presence source to check\n * @param {boolean} useDefaultName should we use 'default' as a presence source\n * @returns\n */\nexport function isDefaultPresence(source) {\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) {\n    return source && source.toLowerCase() === 'purecloud';\n}\n","export * from 'ember-purecloud-components/utils/presence';\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction tap(proxy, promise) {\n    Ember.set(proxy, 'isFulfilled', false);\n    Ember.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            Ember.set(proxy, 'isFulfilled', true);\n            Ember.set(proxy, 'content', content);\n\n            Ember.set(proxy, 'content._payload', payload);\n            Ember.set(proxy, '_payload', payload);\n\n            return content;\n        },\n        function (reason) {\n            Ember.set(proxy, 'isRejected', true);\n            Ember.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: Ember.computed({\n        get() {\n            throw Ember.Logger.error(\"PromiseProxy's promise must be set\");\n        },\n\n        set(key, promise) {\n            return tap(this, promise);\n        }\n    })\n});\n","import _ from 'lodash';\n\nexport function parseQueryParams() {\n    var obj = {};\n    var params = window.location.search.slice(1).split('&');\n\n    _.each(params, 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 Ember from 'ember';\nimport { v4 as uuid } from 'uuid';\n\nconst { computed, typeOf } = Ember;\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 = Ember.Object.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            };\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                            Ember.Logger.error(this._buildLoggerMessage('Exception thrown in process chain'), {\n                                event,\n                                error,\n                                remoteData: {\n                                    chainLabel: this.get('_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            Ember.Logger.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.get('_safeLabel'),\n                        chainIndex: 0\n                    }\n                }\n            );\n\n            return;\n        }\n\n        const chain = this._chain;\n        if (chain && chain.length > 0) {\n            Ember.Logger.debug(this._buildLoggerMessage('Processing Event through chain'), {\n                event,\n                remoteData: {\n                    chainLabel: this.get('_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            Ember.Logger.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.get('_safeLabel'),\n                        chainIndex,\n                        processorLabel: label\n                    }\n                }\n            );\n\n            return;\n        }\n\n        let processorResult;\n        try {\n            Ember.Logger.debug(this._buildLoggerMessage('Running Processor'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            processorResult = await process(context);\n        } catch (e) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor threw or rejected'), {\n                context,\n                e,\n                remoteData: {\n                    chainLabel: this.get('_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            Ember.Logger.error(this._buildLoggerMessage('Processor returned unallowed value'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label,\n                    processorResultType\n                }\n            });\n            return;\n        }\n\n        if (processorResult === false) {\n            Ember.Logger.info(this._buildLoggerMessage('Processor haulted chain'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_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.get('_safeLabel'), msg].join(' - ');\n    },\n\n    _safeLabel: computed('label', '_defaultLabel', function () {\n        const { label, _defaultLabel } = this.getProperties('label', '_defaultLabel');\n        return label || _defaultLabel;\n    }),\n\n    _isLifecycleValid() {\n        const lifecycleContainer = this.get('lifecycleContainer');\n\n        return !(\n            this.get('isDestroying') ||\n            this.get('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 { 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","define(\"connections-ui/utils/routing-status\", [\"exports\", \"ember-purecloud-components/utils/routing-status\"], function (_exports, _routingStatus) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routingStatus.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default function (object, property, value) {\n    const { set } = Ember;\n    if (property && isSafe(object)) {\n        return set(object, property, value);\n    }\n}\n\nexport function isSafe(object) {\n    const { get } = Ember;\n    return object && !(get(object, 'isDestroyed') || get(object, 'isDestroying'));\n}\n","import { Promise, resolve, reject } from 'rsvp';\nimport type { StashLoggerLogPayload, StashLoggerService } from '@connections-ui/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","interface CacheItem<T> {\n    value: T;\n    timestamp: number;\n}\n\nexport default class SimpleCache {\n    private cache: Map<string, CacheItem<any>> = new Map();\n\n    set(id: string, value: any, ttlMinutes = 60): void {\n        const expirationTime = Date.now() + ttlMinutes * 60 * 1000;\n        this.cache.set(id, { value, timestamp: expirationTime });\n    }\n\n    get<T>(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","const SMS_PROP = {\n    FILE_SIZE: 5\n};\n\nexport default SMS_PROP;\n","import Ember from 'ember';\nimport computed from 'ember-computed';\nimport Howler from 'howler-but-with-updates';\nimport { isTesting } from './testing';\n\nconst Howl = Howler.Howl;\n\n// Recorder from: https://github.com/chris-rudmin/Recorderjs\nconst { MediaRecorder } = window;\n\nexport default Ember.Object.extend(Ember.Evented, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    recording: false,\n\n    blob: null,\n    recorder: null,\n\n    deferred: null,\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) return;\n        this.setupRecorder();\n    },\n\n    destroy() {\n        this._super(...arguments);\n        if (this.recorder) {\n            this.recorder.clearStream();\n            this.recorder.audioContext.suspend();\n        }\n    },\n\n    mimeType: computed(function () {\n        const mimeTypes = ['audio/mp3', 'audio/ogg', 'audio/wav', 'audio/webm'];\n        return mimeTypes.find(mimeType => MediaRecorder.isTypeSupported(mimeType));\n    }),\n\n    format: computed('mimeType', function () {\n        // Forcing OGG for now\n        // return _.last(this.get('mimeType').split('/'));\n        return 'ogg';\n    }),\n\n    blobURL: computed('blob', function () {\n        const blob = this.get('blob');\n        if (blob) {\n            return this.getBlobUrl(blob);\n        }\n\n        return null;\n    }),\n\n    setupRecorder() {\n        this.deferred = Ember.RSVP.defer();\n        this.loadEncoder()\n            .then(encoderPath => {\n                this.recorder = new window.Recorder({\n                    encoderPath\n                });\n\n                const context = this.recorder.audioContext;\n                if (context && context.state === 'suspended') {\n                    return context.resume();\n                }\n            })\n            .then(() => {\n                this.recorder.addEventListener('streamReady', this._streamReady.bind(this));\n                this.recorder.addEventListener('stop', this._stoppedRecording.bind(this));\n                this.recorder.addEventListener('dataAvailable', this._onDataAvailable.bind(this));\n\n                this.deferred.resolve();\n            });\n    },\n\n    reset() {\n        this.set('blob', null);\n    },\n\n    startRecording() {\n        this.deferred.promise.then(() => {\n            this.recorder.initStream();\n\n            this.set('blob', null);\n            this.set('chunks', []);\n        });\n    },\n\n    resumeRecording() {\n        this.recorder.resume();\n    },\n\n    pauseRecording() {\n        this.recorder.pause();\n    },\n\n    stopRecording() {\n        this.recorder.stop();\n    },\n\n    createHowlFromBlob(blob) {\n        const blobUrl = URL.createObjectURL(blob);\n        return new Howl({\n            src: [blobUrl],\n            loop: false,\n            format: [this.get('format')],\n            html5: true\n        });\n    },\n\n    getBlobUrl(blob) {\n        return URL.createObjectURL(blob);\n    },\n\n    loadEncoder() {\n        return this._loadSoundRecorder().then(() => this._loadWorker());\n    },\n\n    _onDataAvailable(event) {\n        const blob = new Blob([event.detail], { type: 'audio/ogg' });\n        this.set('blob', blob);\n\n        this.trigger('blobready');\n    },\n\n    _streamReady() {\n        this.set('recording', true);\n        this.recorder.start();\n    },\n\n    _stoppedRecording() {\n        this.set('recording', false);\n    },\n\n    _loadSoundRecorder() {\n        if (window.Recorder) {\n            return Ember.RSVP.resolve();\n        }\n\n        const path = 'assets/recorder.min.js';\n        return new Ember.RSVP.Promise(resolve => {\n            Ember.$.getScript(path, function success() {\n                resolve();\n            });\n        });\n    },\n\n    _loadWorker() {\n        const path = 'assets/workers/encoderWorker.min.js';\n        return Ember.$.get(path).then(contents => {\n            const blob = new Blob([contents]);\n            return window.URL.createObjectURL(blob);\n        });\n    }\n});\n","export const MESSAGING_SUBTYPES = [\n    'apple',\n    'facebook',\n    'instagram',\n    'line',\n    'open',\n    'sms',\n    'twitter',\n    'wechat',\n    'whatsapp',\n    'webmessaging'\n] as const;\n","import ENV from 'connections-ui/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 { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport { getEnvCookieDomain } from './net';\n\n/**\n * The current theme that the user has saved based on cookie value\n */\nlet currentTheme = null;\n\n/**\n * The name of the cookie being set.\n */\nexport const THEME_COOKIE = 'pureCloudTheme';\n/**\n * The time in seconds that the cookie will expire\n */\nexport const TEN_YEARS = 315360000; // in seconds\n\n/**\n * List of all possible themes that could be supported based on feature toggles and base classes. Key/value pair\n * to make sure values don't differ throughout the logic.\n * Please add a note next to the theme key/value detailing the ticket and feature toggle associated with it.\n *\n * Future Todo: We should move away from tacking on `-theme` to the end of the classes.\n */\nexport const THEME_CLASSES = {\n    LIGHT: 'light-theme', // default theme, always supported\n    DARK: 'dark-theme', // FT - webUiDarkTheme\n    BASE: 'purecloud-theme' // Legacy theme needed for app styling / TODO: Remove upon theme rework\n};\n/**\n * This is the theme that the app defaults to if a theme is not saved or selected yet.\n */\nexport const DEFAULT_THEME = THEME_CLASSES.LIGHT;\n/**\n * This is an array of the base themes that are always supported no matter what. Other themes may need to be hidden behind a feature toggle.\n */\nexport const BASE_THEME_LIST = [THEME_CLASSES.LIGHT];\n\n/**\n * This is the current theme list to select from. This function calculates all supported themes\n * based on feature toggles and returns a value of all themes that can be supported.\n * DEV NOTE: Add all new theme logic to this function to determine what themes to return.\n */\nexport function getThemeList(session) {\n    let extraThemes = [];\n\n    // Only check feature toggle based themes if session with features object is provided\n    if (session && session.features) {\n        if (session.features.webUiDarkTheme) {\n            extraThemes.push(THEME_CLASSES.DARK);\n        }\n    }\n\n    return [...BASE_THEME_LIST, ...extraThemes].sort((a, b) => {\n        if (a > b) {\n            return 1;\n        } else if (b > a) {\n            return -1;\n        } else {\n            return 0;\n        }\n    });\n}\n\n/**\n * Loads in the theme from the browsers cookies if there was a theme already set.\n * @param {string} cookies a long string of cookies that are character separated\n * @returns A new theming object used to set the applications theme\n */\nexport function loadTheme(session, cookies = document.cookie) {\n    const cookie = cookies\n        .split(/;[ \\t]?/)\n        .map(cookie => {\n            const [name, theme] = cookie.split('=');\n            return { name, theme };\n        })\n        .find(({ name }) => name === THEME_COOKIE);\n\n    if (cookie && getThemeList(session).find(theme => theme === cookie.theme)) {\n        return cookie;\n    } else {\n        return { theme: DEFAULT_THEME };\n    }\n}\n\n/**\n * Returns the current theme value being applied to the app\n * @returns the current theme value\n */\nexport function getThemeClass() {\n    return currentTheme;\n}\n\n/**\n * Sets the class of the provided element with the provided theme. Also removes the old theme class from the same element (if found), and sets the\n * `currentTheme` to the new value.\n * @param {{theme: THEME_CLASSES, element: HTMLELement}} param0 any object that contains at least the new theme and element to apply the class to.\n */\nexport function setThemeClass({ theme = THEME_CLASSES.LIGHT, element = document.body } = {}) {\n    if (currentTheme) {\n        element.classList.remove(currentTheme);\n    }\n\n    if (!element.classList.contains(THEME_CLASSES.BASE)) {\n        element.classList.add(THEME_CLASSES.BASE);\n    }\n\n    if (!element.classList.contains(theme)) {\n        element.classList.add(theme);\n    }\n\n    currentTheme = theme;\n}\n\n/**\n * Sets the theme cookie on the application to determine how the application should be styled when loaded in. 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 {{theme: THEME_CLASSES, duration: number, path: string, protocol: string, domain: string, setCookie: function, userAgent: string}} param0 an object used to set the new cookie value regarding the application theme\n */\nexport function setThemeCookie({\n    theme = THEME_CLASSES.LIGHT,\n    duration = TEN_YEARS,\n    path = '/',\n    protocol = _getCurrProtocol(),\n    domain = getEnvCookieDomain(),\n    setCookie = _setCookie, // mainly used for testing\n    userAgent = _getCurrUserAgent()\n} = {}) {\n    let cookieStmt = `${THEME_COOKIE}=${theme};path=${path};domain=${domain};max-age=${duration}`;\n\n    if (protocol === 'https:') {\n        cookieStmt += `;Secure`;\n    }\n\n    if (userAgent && typeof userAgent === 'string' && isSameSiteNoneCompatible(userAgent)) {\n        cookieStmt += `;SameSite=None`;\n    }\n\n    setCookie(cookieStmt);\n    setThemeClass({ theme });\n}\n\n/**\n * Resets the current theme back to undefined\n * Mainly used for testing purposes\n */\nexport function resetTheme() {\n    currentTheme = null;\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 */\nfunction _setCookie(cookie) {\n    document.cookie = cookie;\n}\n\n/**\n * Returns the windows current protocol. Expected `https:`\n * @returns the windows protocol\n */\nfunction _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 */\nfunction _getCurrUserAgent() {\n    if (navigator && navigator.userAgent) {\n        return navigator.userAgent;\n    }\n\n    return undefined;\n}\n","define(\"connections-ui/utils/timeout-promise\", [\"exports\", \"ember-purecloud-components/utils/timeout-promise\"], function (_exports, _timeoutPromise) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _timeoutPromise.default;\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';\n// Assuming the provider and app id for Schedule Callbacks\nconst SCHEDULE_CALLBACK_GADGET_PANEL_ID = 'scheduleCallback&scheduleCallbackProvider';\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        dependentFeatureToggles: ['conversationSummary3256', 'PURE-3256_useConversationDetails'],\n        active: features => {\n            return features.conversationSummary3256 && features['PURE-3256_useConversationDetails'];\n        }\n    },\n    reverseDetails: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CONVERSATION_DETAILS_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'details'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return [...deprecatedConversationSummaryPanelIds, CONVERSATION_DETAILS_GADGET_PANEL_ID].includes(appDefId);\n        },\n        transformAppDefId: () => {\n            return 'details';\n        },\n        active: features => {\n            return !transformationMaps.details.active(features);\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: features => {\n            return features['auraACWGadgets'];\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: features => {\n            return features['auraACWGadgets'];\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: () => true\n    },\n    reverseResponses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CANNED_RESPONSES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'responses'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'responses';\n        },\n        active: features => {\n            return !transformationMaps.responses.active(features);\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        dependentFeatureToggles: ['scheduleCallbackGadget'], // assumption for the ft\n        active: features => {\n            return features['scheduleCallbackGadget']; // assumption for the ft\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","const TWITTER_PROP = {\n    FILE_SIZE: 3,\n    MESSAGE_TYPE: 'twitter'\n};\n\nexport default TWITTER_PROP;\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","const APPS_URI_V2 = 'api/v2/apps';\nconst BASE_URI_V2 = 'api/v2/conversations';\nconst PC_BASE_URI = 'platform';\n\nconst SEND_MESSAGING_TYPING_URI = 'messages/{conversationId}/communications/{communicationId}/typing';\nconst GET_APPS_DOWNLOAD_URI = 'downloads/{downloadId}?contentDisposition=INLINE';\n\n/**\n * Replaces patterns param names with provided values.\n * @param path - the string path to replace\n * @param values - the replacement values\n */\nfunction paramReplace(path: string, baseUri: string, values: Record<string, string>) {\n    for (const [key, value] of Object.entries(values)) {\n        const pattern = new RegExp(`\\{${key}\\}`);\n        path = path.replace(pattern, value);\n    }\n    return `/${PC_BASE_URI}/${baseUri}/${path}`;\n}\n\nexport default function UriBuilder() {\n    return {\n        /**\n         * Path to notify a message conversation's typing state\n         * @param conversationId - the conversation guid\n         * @param communicationId - the communication guid\n         */\n        sendMessagingTypingUri(conversationId: string, communicationId: string) {\n            const params = { conversationId, communicationId };\n            return paramReplace(SEND_MESSAGING_TYPING_URI, BASE_URI_V2, params);\n        },\n\n        /**\n         * Path to retrieve the download URL for the specified download.\n         * Used for cookie authentication.\n         * @param downloadId - the download guid\n         */\n        getAppsDownloadUri(downloadId: string) {\n            const params = { downloadId };\n            return paramReplace(GET_APPS_DOWNLOAD_URI, APPS_URI_V2, params);\n        }\n    };\n}\n","define(\"connections-ui/utils/uuid-generator\", [\"exports\", \"ember-uuid/utils/uuid-generator\"], function (_exports, _uuidGenerator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.default;\n    }\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v4;\n    }\n  });\n});\n","import { v4 } from 'uuid';\n\nfunction generate() {\n    return v4();\n}\n\nexport default {\n    generate\n};\n","define(\"connections-ui/utils/video-frame-checker\", [\"exports\", \"ember-webrtc-troubleshoot/utils/video-frame-checker\"], function (_exports, _videoFrameChecker) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoFrameChecker.default;\n    }\n  });\n});\n","const WEBMESSAGING_PROP = {\n    CHARACTER_LIMIT: 4000,\n    FILE_SIZE: 25\n};\n\nexport default WEBMESSAGING_PROP;\n","define(\"connections-ui/validators/alias\", [\"exports\", \"ember-cp-validations/validators/alias\"], function (_exports, _alias) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _alias.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/belongs-to\", [\"exports\", \"ember-cp-validations/validators/belongs-to\"], function (_exports, _belongsTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _belongsTo.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/collection\", [\"exports\", \"ember-cp-validations/validators/collection\"], function (_exports, _collection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _collection.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/confirmation\", [\"exports\", \"ember-cp-validations/validators/confirmation\"], function (_exports, _confirmation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _confirmation.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/date\", [\"exports\", \"ember-cp-validations/validators/date\"], function (_exports, _date) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _date.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/dependent\", [\"exports\", \"ember-cp-validations/validators/dependent\"], function (_exports, _dependent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dependent.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/ds-error\", [\"exports\", \"ember-cp-validations/validators/ds-error\"], function (_exports, _dsError) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dsError.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/exclusion\", [\"exports\", \"ember-cp-validations/validators/exclusion\"], function (_exports, _exclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/format\", [\"exports\", \"ember-cp-validations/validators/format\"], function (_exports, _format) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _format.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/has-many\", [\"exports\", \"ember-cp-validations/validators/has-many\"], function (_exports, _hasMany) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hasMany.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/inclusion\", [\"exports\", \"ember-cp-validations/validators/inclusion\"], function (_exports, _inclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/length\", [\"exports\", \"ember-cp-validations/validators/length\"], function (_exports, _length) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _length.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/messages\", [\"exports\", \"ember-intl-cp-validations/validators/messages\"], function (_exports, _messages) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messages.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/number\", [\"exports\", \"ember-cp-validations/validators/number\"], function (_exports, _number) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _number.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/presence\", [\"exports\", \"ember-cp-validations/validators/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant-v2/model\", [\"exports\", \"ember-webrtc-components/models/video-participant-v2\"], function (_exports, _videoParticipantV) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipantV.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant/model\", [\"exports\", \"ember-webrtc-components/models/video-participant\"], function (_exports, _videoParticipant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipant.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    templateName: 'card/tree/tree',\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    attachTextInputListeners: Ember.on('didInsertElement', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.on('keydown', event => event.stopPropagation());\n    }),\n\n    removeTextInputListeners: Ember.on('willClearRender', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.off('keydown');\n    })\n});\n","define(\"connections-ui/webrtc-conversation/model\", [\"exports\", \"ember-webrtc-components/models/webrtc-conversation\"], function (_exports, _webrtcConversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversation.default;\n    }\n  });\n});\n","define('connections-ui/config/environment', ['ember'], function(Ember) {\n  var prefix = 'connections-ui';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(unescape(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","if (!runningTests) {\n  require(\"connections-ui/app\")[\"default\"].create({\"version\":\"1.14.0\",\"semver\":\"1.14.0+86-master-7977504f22fcd274ee91c2d238c03f7595b90325\",\"urlprefix\":\"/connections-ui/build-assets/1.14.0-86/\",\"buildNumber\":\"86\",\"libs\":{\"@purecloud/ember-purecloud-components\":\"13.6.7\",\"@purecloud/ember-softphone-integration\":\"1.0.8\"},\"INTL_LANGUAGES\":{\"ar\":\"العربية (beta)\",\"cs\":\"Čeština\",\"da\":\"Dansk\",\"de\":\"Deutsch\",\"en-us\":\"English\",\"es\":\"Español\",\"fi\":\"Suomi\",\"fr-ca\":\"Français (Canada) (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\":\"connections-ui\"});\n}\n"]}