@tuki-io/tuki-widgets 0.0.219-dev.54 → 0.0.219-dev.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/contact-center/cc-import/cc-import.module.d.ts +13 -0
- package/contact-center/cc-import/cc-import.service.d.ts +85 -0
- package/contact-center/cc-import/components/import-contact-center-panel/import-contact-center-panel.component.d.ts +56 -0
- package/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.component.d.ts +77 -0
- package/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.types.d.ts +3 -0
- package/contact-center/cc-import/constants/cc-import.constants.d.ts +37 -0
- package/contact-center/cc-import/mock/cc-import.mock.d.ts +4 -0
- package/contact-center/cc-import/types/cc-import.d.ts +73 -0
- package/contact-center/cc-import/types/uccx.d.ts +109 -0
- package/contact-center/cc-readiness/cc-readiness.module.d.ts +3 -3
- package/contact-center/public-api.d.ts +8 -0
- package/contact-center/shared/api.endpoints.d.ts +25 -0
- package/contact-center/shared/api.service.d.ts +3 -1
- package/contact-center/shared/components/card/card.component.d.ts +13 -0
- package/contact-center/shared/dcp-api.service.d.ts +15 -0
- package/contact-center/shared/shared.module.d.ts +11 -5
- package/esm2020/contact-center/cc-import/cc-import.module.mjs +45 -0
- package/esm2020/contact-center/cc-import/cc-import.service.mjs +228 -0
- package/esm2020/contact-center/cc-import/components/import-contact-center-panel/import-contact-center-panel.component.mjs +144 -0
- package/esm2020/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.component.mjs +243 -0
- package/esm2020/contact-center/cc-import/components/import-contact-center-wizard/import-contact-center-wizard.types.mjs +3 -0
- package/esm2020/contact-center/cc-import/constants/cc-import.constants.mjs +62 -0
- package/esm2020/contact-center/cc-import/mock/cc-import.mock.mjs +78 -0
- package/esm2020/contact-center/cc-import/types/cc-import.mjs +2 -0
- package/esm2020/contact-center/cc-import/types/uccx.mjs +24 -0
- package/esm2020/contact-center/cc-readiness/cc-readiness.module.mjs +7 -6
- package/esm2020/contact-center/cc-readiness/cc-readiness.service.mjs +1 -1
- package/esm2020/contact-center/cc-readiness/widgets/licences-requirement/licences-requirement.component.mjs +7 -7
- package/esm2020/contact-center/cc-readiness/widgets/summary-grid/summary-grid.component.mjs +2 -2
- package/esm2020/contact-center/public-api.mjs +9 -1
- package/esm2020/contact-center/shared/api.endpoints.mjs +26 -1
- package/esm2020/contact-center/shared/api.service.mjs +8 -3
- package/esm2020/contact-center/shared/components/card/card.component.mjs +24 -0
- package/esm2020/contact-center/shared/dcp-api.service.mjs +26 -0
- package/esm2020/contact-center/shared/shared.module.mjs +15 -5
- package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +2 -2
- package/esm2020/di2mt/widgets/upgrade-overview/cards/pending-activation-users/pending-activation-users.component.mjs +17 -17
- package/esm2020/lib/widgets.component.mjs +9 -9
- package/esm2020/lib/widgets.module.mjs +1 -1
- package/esm2020/lib/widgets.service.mjs +1 -1
- package/esm2020/locations/public-api.mjs +1 -1
- package/esm2020/locations/src/app.constants.mjs +1 -1
- package/esm2020/locations/src/location-confirm-dialog/location-confirm-dialog.component.mjs +3 -3
- package/esm2020/locations/src/locations.component.mjs +3 -3
- package/esm2020/locations/src/locations.module.mjs +1 -1
- package/esm2020/locations/src/material.module.mjs +1 -1
- package/esm2020/locations/src/services/api.service.mjs +1 -1
- package/esm2020/locations/src/services/locations.service.mjs +1 -1
- package/esm2020/locations/src/types/location.mjs +1 -1
- package/esm2020/locations/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/meetings/src/app.constants.mjs +1 -1
- package/esm2020/meetings/src/components/live-meetings/live-meetings.component.mjs +3 -3
- package/esm2020/meetings/src/components/meeting-spaces/meeting-spaces.component.mjs +3 -3
- package/esm2020/meetings/src/meetings.component.mjs +3 -3
- package/esm2020/meetings/src/meetings.module.mjs +1 -1
- package/esm2020/meetings/src/services/live-meetings.service.mjs +1 -1
- package/esm2020/meetings/src/services/meeting-spaces.service.mjs +1 -1
- package/esm2020/meetings/src/types/live-meeting.mjs +1 -1
- package/esm2020/meetings/src/types/meeting-space.mjs +1 -1
- package/esm2020/meetings/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/public-api.mjs +1 -1
- package/esm2020/user-creation/src/app.constants.mjs +1 -1
- package/esm2020/user-creation/src/classes/notification.mjs +1 -1
- package/esm2020/user-creation/src/classes/site.mjs +1 -1
- package/esm2020/user-creation/src/environments/environment.mjs +1 -1
- package/esm2020/user-creation/src/interfaces/user-creation-wizard.interfaces.mjs +1 -1
- package/esm2020/user-creation/src/shared/components/notification/notification.component.mjs +3 -3
- package/esm2020/user-creation/src/shared/pipes/truncate.pipe.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/notification.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/user-creation-api.service.mjs +1 -1
- package/esm2020/user-creation/src/shared/services/utils.mjs +1 -1
- package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-creation/src/utils/build-savable-end-user.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-default-prefix.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +1 -1
- package/esm2020/user-creation/src/utils/device-name-validation.mjs +1 -1
- package/esm2020/user-creation/src/utils/model.mjs +1 -1
- package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +1 -1
- package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +3 -3
- package/esm2020/user-device-manage/public-api.mjs +4 -1
- package/esm2020/user-device-manage/src/app.constants.mjs +9 -3
- package/esm2020/user-device-manage/src/associate-lines/associate-lines.component.mjs +311 -0
- package/esm2020/user-device-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/deviceProfile.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/site-defaults.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-device-manage/src/classes/types.mjs +1 -1
- package/esm2020/user-device-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +1 -1
- package/esm2020/user-device-manage/src/device-info/device-info.component.mjs +3 -3
- package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +34 -17
- package/esm2020/user-device-manage/src/device-settings/device-settings.component.mjs +207 -0
- package/esm2020/user-device-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-device-manage/src/line-key-config/line-key-config.component.mjs +401 -0
- package/esm2020/user-device-manage/src/material.module.mjs +1 -1
- package/esm2020/user-device-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-device-manage/src/pipes/mac-address.pipe.mjs +1 -1
- package/esm2020/user-device-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/device.service.mjs +32 -2
- package/esm2020/user-device-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/user.service.mjs +34 -6
- package/esm2020/user-device-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-device-manage/src/services/validation.service.mjs +1 -1
- package/esm2020/user-device-manage/src/user-device-manage.module.mjs +19 -4
- package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/public-api.mjs +1 -1
- package/esm2020/user-manage/src/app.constants.mjs +1 -1
- package/esm2020/user-manage/src/classes/device.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association-interface.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-association.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-call-info-display.mjs +1 -1
- package/esm2020/user-manage/src/classes/line-directory.mjs +1 -1
- package/esm2020/user-manage/src/classes/line.mjs +1 -1
- package/esm2020/user-manage/src/classes/notification.mjs +1 -1
- package/esm2020/user-manage/src/classes/pagination.mjs +1 -1
- package/esm2020/user-manage/src/classes/recording-options.mjs +1 -1
- package/esm2020/user-manage/src/classes/simplified-user.mjs +1 -1
- package/esm2020/user-manage/src/classes/table-data.mjs +1 -1
- package/esm2020/user-manage/src/classes/translation-pattern.mjs +1 -1
- package/esm2020/user-manage/src/classes/user-list.mjs +1 -1
- package/esm2020/user-manage/src/common-functions.mjs +1 -1
- package/esm2020/user-manage/src/device-list/device-list.component.mjs +3 -3
- package/esm2020/user-manage/src/device-list/device-row/device-row.component.mjs +3 -3
- package/esm2020/user-manage/src/environments/environment.mjs +1 -1
- package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +1 -1
- package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +3 -3
- package/esm2020/user-manage/src/material.module.mjs +1 -1
- package/esm2020/user-manage/src/notifications/notification.component.mjs +3 -3
- package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dcp-api.service.mjs +1 -1
- package/esm2020/user-manage/src/services/dns.service.mjs +1 -1
- package/esm2020/user-manage/src/services/line.service.mjs +1 -1
- package/esm2020/user-manage/src/services/notification.service.mjs +1 -1
- package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/user-manage/src/services/site-settings.service.mjs +1 -1
- package/esm2020/user-manage/src/services/sorting-utils.service.mjs +1 -1
- package/esm2020/user-manage/src/services/user.service.mjs +1 -1
- package/esm2020/user-manage/src/services/utils.service.mjs +1 -1
- package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +3 -3
- package/esm2020/user-manage/src/user-info/user-info.component.mjs +3 -3
- package/esm2020/user-manage/src/user-manage-widget.component.mjs +2 -2
- package/esm2020/user-manage/src/user-manage.module.mjs +1 -1
- package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +3 -3
- package/esm2020/users-list/public-api.mjs +1 -1
- package/esm2020/users-list/src/app.constants.mjs +1 -1
- package/esm2020/users-list/src/classes/app-location.mjs +1 -1
- package/esm2020/users-list/src/classes/device.mjs +1 -1
- package/esm2020/users-list/src/classes/line.mjs +1 -1
- package/esm2020/users-list/src/classes/move-user.mjs +1 -1
- package/esm2020/users-list/src/classes/notification.mjs +1 -1
- package/esm2020/users-list/src/classes/simlified-user.mjs +1 -1
- package/esm2020/users-list/src/classes/table-data.mjs +1 -1
- package/esm2020/users-list/src/classes/user-list.mjs +1 -1
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +3 -3
- package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +3 -3
- package/esm2020/users-list/src/services/api-webex.service.mjs +1 -1
- package/esm2020/users-list/src/services/api.service.mjs +1 -1
- package/esm2020/users-list/src/services/dns.service.mjs +1 -1
- package/esm2020/users-list/src/services/events-communication.service.mjs +1 -1
- package/esm2020/users-list/src/services/notification.service.mjs +1 -1
- package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +1 -1
- package/esm2020/users-list/src/services/site-settings.service.mjs +1 -1
- package/esm2020/users-list/src/services/user.service.mjs +1 -1
- package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +3 -3
- package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/users-list/src/utils/common-functions.mjs +1 -1
- package/esm2020/users-list/src/utils/notifications/notification.component.mjs +3 -3
- package/esm2020/users-list/src/utils/utils.service.mjs +1 -1
- package/esm2020/workspaces/public-api.mjs +1 -1
- package/esm2020/workspaces/src/app.constants.mjs +1 -1
- package/esm2020/workspaces/src/components/workspace-detail/workspace-detail.component.mjs +17 -4
- package/esm2020/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.mjs +66 -0
- package/esm2020/workspaces/src/components/workspaces-filters/workspaces-filters.component.mjs +3 -3
- package/esm2020/workspaces/src/components/workspaces-table/workspaces-table.component.mjs +6 -3
- package/esm2020/workspaces/src/material.module.mjs +1 -1
- package/esm2020/workspaces/src/services/api.service.mjs +1 -1
- package/esm2020/workspaces/src/services/workspace-detail.service.mjs +43 -1
- package/esm2020/workspaces/src/services/workspaces-migration.service.mjs +1 -1
- package/esm2020/workspaces/src/services/workspaces.service.mjs +2 -1
- package/esm2020/workspaces/src/types/workspace.mjs +1 -1
- package/esm2020/workspaces/src/utils/app-loader/app-loader.mjs +3 -3
- package/esm2020/workspaces/src/utils/device-icon.mjs +1 -1
- package/esm2020/workspaces/src/workspaces.component.mjs +8 -8
- package/esm2020/workspaces/src/workspaces.module.mjs +4 -1
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs +999 -128
- package/fesm2015/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-locations.mjs +6 -6
- package/fesm2015/tuki-io-tuki-widgets-locations.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-meetings.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +6 -6
- package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +1029 -51
- package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +12 -12
- package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs +151 -25
- package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
- package/fesm2015/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2015/tuki-io-tuki-widgets.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs +990 -128
- package/fesm2020/tuki-io-tuki-widgets-contact-center.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +20 -20
- package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-locations.mjs +6 -6
- package/fesm2020/tuki-io-tuki-widgets-locations.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-meetings.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +6 -6
- package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +1012 -50
- package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +18 -18
- package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +12 -12
- package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs +142 -25
- package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
- package/fesm2020/tuki-io-tuki-widgets.mjs +8 -8
- package/fesm2020/tuki-io-tuki-widgets.mjs.map +1 -1
- package/package.json +1 -1
- package/user-device-manage/public-api.d.ts +3 -0
- package/user-device-manage/src/app.constants.d.ts +6 -0
- package/user-device-manage/src/associate-lines/associate-lines.component.d.ts +95 -0
- package/user-device-manage/src/classes/device.d.ts +15 -0
- package/user-device-manage/src/classes/deviceProfile.d.ts +5 -0
- package/user-device-manage/src/device-associated-line/device-associated-line.component.d.ts +1 -0
- package/user-device-manage/src/device-manage-widget.component.d.ts +6 -1
- package/user-device-manage/src/device-settings/device-settings.component.d.ts +53 -0
- package/user-device-manage/src/line-key-config/line-key-config.component.d.ts +84 -0
- package/user-device-manage/src/services/device.service.d.ts +6 -1
- package/user-device-manage/src/services/user.service.d.ts +2 -1
- package/user-device-manage/src/user-device-manage.module.d.ts +10 -7
- package/workspaces/src/components/workspace-detail/workspace-detail.component.d.ts +6 -1
- package/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.d.ts +25 -0
- package/workspaces/src/components/workspaces-table/workspaces-table.component.d.ts +1 -0
- package/workspaces/src/services/workspace-detail.service.d.ts +2 -0
- package/workspaces/src/types/workspace.d.ts +19 -0
- package/workspaces/src/workspaces.module.d.ts +8 -7
- package/contact-center/cc-readiness/components/card/card.component.d.ts +0 -6
- package/esm2020/contact-center/cc-readiness/components/card/card.component.mjs +0 -13
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { HttpClientModule } from '@angular/common/http';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { MatStepperModule } from '@angular/material/stepper';
|
|
5
|
+
import { NgApexchartsModule } from 'ng-apexcharts';
|
|
6
|
+
import { SharedModule } from '../shared/shared.module';
|
|
7
|
+
import { ImportContactCenterPanelComponent } from './components/import-contact-center-panel/import-contact-center-panel.component';
|
|
8
|
+
import { ImportContactCenterWizardComponent } from './components/import-contact-center-wizard/import-contact-center-wizard.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class CcImportModule {
|
|
11
|
+
}
|
|
12
|
+
CcImportModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13
|
+
CcImportModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: CcImportModule, declarations: [ImportContactCenterPanelComponent,
|
|
14
|
+
ImportContactCenterWizardComponent], imports: [CommonModule,
|
|
15
|
+
HttpClientModule,
|
|
16
|
+
NgApexchartsModule,
|
|
17
|
+
MatStepperModule,
|
|
18
|
+
SharedModule], exports: [ImportContactCenterPanelComponent,
|
|
19
|
+
ImportContactCenterWizardComponent] });
|
|
20
|
+
CcImportModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportModule, imports: [CommonModule,
|
|
21
|
+
HttpClientModule,
|
|
22
|
+
NgApexchartsModule,
|
|
23
|
+
MatStepperModule,
|
|
24
|
+
SharedModule] });
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportModule, decorators: [{
|
|
26
|
+
type: NgModule,
|
|
27
|
+
args: [{
|
|
28
|
+
declarations: [
|
|
29
|
+
ImportContactCenterPanelComponent,
|
|
30
|
+
ImportContactCenterWizardComponent
|
|
31
|
+
],
|
|
32
|
+
imports: [
|
|
33
|
+
CommonModule,
|
|
34
|
+
HttpClientModule,
|
|
35
|
+
NgApexchartsModule,
|
|
36
|
+
MatStepperModule,
|
|
37
|
+
SharedModule
|
|
38
|
+
],
|
|
39
|
+
exports: [
|
|
40
|
+
ImportContactCenterPanelComponent,
|
|
41
|
+
ImportContactCenterWizardComponent
|
|
42
|
+
]
|
|
43
|
+
}]
|
|
44
|
+
}] });
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtaW1wb3J0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1pbXBvcnQvY2MtaW1wb3J0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQ25JLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGtGQUFrRixDQUFDOztBQW1CdEksTUFBTSxPQUFPLGNBQWM7OzRHQUFkLGNBQWM7NkdBQWQsY0FBYyxpQkFmbkIsaUNBQWlDO1FBQ2pDLGtDQUFrQyxhQUdsQyxZQUFZO1FBQ1osZ0JBQWdCO1FBQ2hCLGtCQUFrQjtRQUNsQixnQkFBZ0I7UUFDaEIsWUFBWSxhQUdaLGlDQUFpQztRQUNqQyxrQ0FBa0M7NkdBRzdCLGNBQWMsWUFYbkIsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixrQkFBa0I7UUFDbEIsZ0JBQWdCO1FBQ2hCLFlBQVk7NEZBT1AsY0FBYztrQkFqQjFCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFO3dCQUNWLGlDQUFpQzt3QkFDakMsa0NBQWtDO3FCQUNyQztvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixZQUFZO3FCQUNmO29CQUNELE9BQU8sRUFBRTt3QkFDTCxpQ0FBaUM7d0JBQ2pDLGtDQUFrQztxQkFDckM7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTdGVwcGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc3RlcHBlcic7XHJcbmltcG9ydCB7IE5nQXBleGNoYXJ0c01vZHVsZSB9IGZyb20gJ25nLWFwZXhjaGFydHMnO1xyXG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tICcuLi9zaGFyZWQvc2hhcmVkLm1vZHVsZSc7XHJcbmltcG9ydCB7IEltcG9ydENvbnRhY3RDZW50ZXJQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9pbXBvcnQtY29udGFjdC1jZW50ZXItcGFuZWwvaW1wb3J0LWNvbnRhY3QtY2VudGVyLXBhbmVsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEltcG9ydENvbnRhY3RDZW50ZXJXaXphcmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvaW1wb3J0LWNvbnRhY3QtY2VudGVyLXdpemFyZC9pbXBvcnQtY29udGFjdC1jZW50ZXItd2l6YXJkLmNvbXBvbmVudCc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICAgICAgSW1wb3J0Q29udGFjdENlbnRlclBhbmVsQ29tcG9uZW50LFxyXG4gICAgICAgIEltcG9ydENvbnRhY3RDZW50ZXJXaXphcmRDb21wb25lbnRcclxuICAgIF0sXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEh0dHBDbGllbnRNb2R1bGUsXHJcbiAgICAgICAgTmdBcGV4Y2hhcnRzTW9kdWxlLFxyXG4gICAgICAgIE1hdFN0ZXBwZXJNb2R1bGUsXHJcbiAgICAgICAgU2hhcmVkTW9kdWxlXHJcbiAgICBdLFxyXG4gICAgZXhwb3J0czogW1xyXG4gICAgICAgIEltcG9ydENvbnRhY3RDZW50ZXJQYW5lbENvbXBvbmVudCxcclxuICAgICAgICBJbXBvcnRDb250YWN0Q2VudGVyV2l6YXJkQ29tcG9uZW50XHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDY0ltcG9ydE1vZHVsZSB7IH1cclxuIl19
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { delay, forkJoin, map, of, switchMap } from 'rxjs';
|
|
3
|
+
import { API } from '../shared/api.endpoints';
|
|
4
|
+
import { APIService } from '../shared/api.service';
|
|
5
|
+
import { DcpApiService } from '../shared/dcp-api.service';
|
|
6
|
+
import { COMPATIBILITY_THRESHOLDS, OVERVIEW_ENTITY_GROUPS } from './constants/cc-import.constants';
|
|
7
|
+
import { mockContactCenterEntities, mockContactCenters } from './mock/cc-import.mock';
|
|
8
|
+
import { CALL_FLOW_MIGRATED } from './types/uccx';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/** Simulated network latency for the mock responses, so loading states are exercised. */
|
|
11
|
+
const MOCK_LATENCY_MS = 300;
|
|
12
|
+
export class CcImportService {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.api = inject(APIService);
|
|
15
|
+
this.dcpApi = inject(DcpApiService);
|
|
16
|
+
/**
|
|
17
|
+
* Answer everything from `mock/cc-import.mock.ts` instead of calling the backend.
|
|
18
|
+
*
|
|
19
|
+
* Note this is all-or-nothing: with it off, the contact-center list, the entity
|
|
20
|
+
* overview and the import all hit real endpoints. Compatibility scoring is the
|
|
21
|
+
* exception - see {@link resolveCompatibility}.
|
|
22
|
+
*/
|
|
23
|
+
this.useMockData = true;
|
|
24
|
+
}
|
|
25
|
+
setToken(token) {
|
|
26
|
+
this.api.token = token;
|
|
27
|
+
this.dcpApi.token = token;
|
|
28
|
+
}
|
|
29
|
+
setHost(host) {
|
|
30
|
+
this.api.apiUrl = host;
|
|
31
|
+
}
|
|
32
|
+
/** Base URL of the dcp host, which serves the UCCX application list. */
|
|
33
|
+
setDcpHost(dcpHost) {
|
|
34
|
+
this.dcpApi.apiUrl = dcpHost;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Every UCCX contact center Tuki can import.
|
|
38
|
+
*
|
|
39
|
+
* A "contact center" is a UCCX application. The list comes from the dcp
|
|
40
|
+
* application cache; whether each one has already been imported is joined on from
|
|
41
|
+
* the per-AEF-script call-flow migration states.
|
|
42
|
+
*/
|
|
43
|
+
fetchContactCenters(customerId) {
|
|
44
|
+
if (this.useMockData) {
|
|
45
|
+
return of(mockContactCenters()).pipe(delay(MOCK_LATENCY_MS));
|
|
46
|
+
}
|
|
47
|
+
return forkJoin({
|
|
48
|
+
applications: this.dcpApi.fetch(API.UCCX.APPLICATION_NAMES(customerId)),
|
|
49
|
+
callFlows: this.api.fetch(API.UCCX.CALL_FLOW_MIGRATION_STATUSES(customerId))
|
|
50
|
+
}).pipe(map(({ applications, callFlows }) => this.toContactCenters(this.asArray(applications), this.asArray(callFlows))));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Application-centric entity breakdown: everything Tuki will create on import.
|
|
54
|
+
*
|
|
55
|
+
* Note this only ever returns entities the backend has actually linked to the
|
|
56
|
+
* application. Where that linkage is missing the groups come back empty rather
|
|
57
|
+
* than padded with unrelated entities of the right type.
|
|
58
|
+
*/
|
|
59
|
+
fetchContactCenterEntities(customerId, contactCenter) {
|
|
60
|
+
if (this.useMockData) {
|
|
61
|
+
return of(mockContactCenterEntities(contactCenter)).pipe(delay(MOCK_LATENCY_MS));
|
|
62
|
+
}
|
|
63
|
+
return this.fetchApplicationItems(customerId, contactCenter.applicationName).pipe(map(items => ({
|
|
64
|
+
applicationId: contactCenter.applicationId,
|
|
65
|
+
groups: this.groupEntities(items)
|
|
66
|
+
})));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Kicks off the UCCX -> Webex Contact Center import of one contact center, as a
|
|
70
|
+
* single migration unit: every entity of the application goes in one request.
|
|
71
|
+
*
|
|
72
|
+
* The endpoint is synchronous and answers with an XLSX tracker rather than a job
|
|
73
|
+
* id - execution and progress tracking are defined in a separate ticket.
|
|
74
|
+
*
|
|
75
|
+
* @param siteId required by the backend when a Resource Group is in scope.
|
|
76
|
+
* @param locationId required by the backend when a Trigger is in scope.
|
|
77
|
+
*/
|
|
78
|
+
importContactCenter(customerId, applicationId, siteId, locationId) {
|
|
79
|
+
if (this.useMockData) {
|
|
80
|
+
return of({ applicationId, accepted: true }).pipe(delay(MOCK_LATENCY_MS));
|
|
81
|
+
}
|
|
82
|
+
return this.fetchApplicationItems(customerId, applicationId).pipe(switchMap(items => {
|
|
83
|
+
const payload = {
|
|
84
|
+
uccxItemsList: items.length ? [items.map(item => ({ ...item, migrate: true }))] : []
|
|
85
|
+
};
|
|
86
|
+
return this.api.post(API.UCCX.MIGRATE(customerId), payload, { siteId, locationId }, { responseType: 'blob' });
|
|
87
|
+
}), map((report) => ({
|
|
88
|
+
applicationId,
|
|
89
|
+
accepted: true,
|
|
90
|
+
report: report instanceof Blob ? report : undefined
|
|
91
|
+
})));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Every UCCX entity belonging to one application, gathered across the batches.
|
|
95
|
+
*
|
|
96
|
+
* UCCX batches hold one entity type each, so this reads them all and keeps the
|
|
97
|
+
* items whose `applicationName` matches. The narrowing is done here rather than
|
|
98
|
+
* through the endpoint's own `applicationName` param because that param answers
|
|
99
|
+
* `[]` on dev2 even for items that plainly carry the name.
|
|
100
|
+
*/
|
|
101
|
+
fetchApplicationItems(customerId, applicationName) {
|
|
102
|
+
return this.api.fetch(API.UCCX.BATCHES(customerId)).pipe(switchMap(response => {
|
|
103
|
+
const batches = this.asArray(response);
|
|
104
|
+
if (!batches.length) {
|
|
105
|
+
return of([]);
|
|
106
|
+
}
|
|
107
|
+
return forkJoin(batches.map(batch => this.api.fetch(API.UCCX.BATCH_ITEMS(customerId, batch.id))
|
|
108
|
+
.pipe(map((wrapper) => this.flattenItems(wrapper))))).pipe(map(perBatch => this.dedupeItems(perBatch.flat().filter(item => item.applicationName === applicationName))));
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
/** The items endpoint nests items one level; older responses come back flat. */
|
|
112
|
+
flattenItems(wrapper) {
|
|
113
|
+
const items = wrapper?.uccxItemsList ?? [];
|
|
114
|
+
const flattened = Array.isArray(items[0])
|
|
115
|
+
? items.flat()
|
|
116
|
+
: items;
|
|
117
|
+
return flattened.filter(Boolean);
|
|
118
|
+
}
|
|
119
|
+
/** The same entity can be carried by more than one batch. */
|
|
120
|
+
dedupeItems(items) {
|
|
121
|
+
const seen = new Set();
|
|
122
|
+
return items.filter(item => {
|
|
123
|
+
const key = `${item.type}::${item.name}::${item.sourceUCCXIp}`;
|
|
124
|
+
if (seen.has(key)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
seen.add(key);
|
|
128
|
+
return true;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
groupEntities(items) {
|
|
132
|
+
const remaining = new Map();
|
|
133
|
+
items.forEach(item => {
|
|
134
|
+
const names = remaining.get(item.type) ?? [];
|
|
135
|
+
names.push(item.name);
|
|
136
|
+
remaining.set(item.type, names);
|
|
137
|
+
});
|
|
138
|
+
const groups = OVERVIEW_ENTITY_GROUPS.map(group => {
|
|
139
|
+
const collected = [];
|
|
140
|
+
group.types.forEach(type => {
|
|
141
|
+
collected.push(...(remaining.get(type) ?? []));
|
|
142
|
+
remaining.delete(type);
|
|
143
|
+
});
|
|
144
|
+
return { label: group.label, items: collected };
|
|
145
|
+
});
|
|
146
|
+
// Anything the backend returned that has no group of its own keeps its raw
|
|
147
|
+
// type as a label, rather than being dropped from the overview.
|
|
148
|
+
remaining.forEach((names, type) => groups.push({ label: type, items: names }));
|
|
149
|
+
return groups;
|
|
150
|
+
}
|
|
151
|
+
toContactCenters(applications, callFlows) {
|
|
152
|
+
return applications
|
|
153
|
+
.filter(application => !!application?.name)
|
|
154
|
+
.map(application => {
|
|
155
|
+
const uccxIp = application.uccx?.host;
|
|
156
|
+
const scriptName = this.toScriptName(application);
|
|
157
|
+
const compatibilityStatus = this.resolveCompatibility(application);
|
|
158
|
+
const contactCenter = {
|
|
159
|
+
// UCCX identifies an application by name - it is what the entity
|
|
160
|
+
// records link back to - so it doubles as the widget's key.
|
|
161
|
+
applicationId: application.name,
|
|
162
|
+
applicationName: application.name,
|
|
163
|
+
scriptName,
|
|
164
|
+
uccxIp,
|
|
165
|
+
compatibilityStatus,
|
|
166
|
+
migrationState: this.resolveMigrationState(application, scriptName, uccxIp, callFlows),
|
|
167
|
+
// Per the ticket, "requires review" is exactly the set that can go
|
|
168
|
+
// to either destination.
|
|
169
|
+
customerAssistCapable: compatibilityStatus === 'requires-review'
|
|
170
|
+
};
|
|
171
|
+
return contactCenter;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/** UCCX wraps the backing script as `SCRIPT[Foo.aef]`; the widget shows `Foo.aef`. */
|
|
175
|
+
toScriptName(application) {
|
|
176
|
+
const raw = application.scriptName ?? application.aefFiles?.[0] ?? '';
|
|
177
|
+
return raw.replace(/^SCRIPT\[(.*)\]$/, '$1');
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Whether Tuki has already imported this contact center.
|
|
181
|
+
*
|
|
182
|
+
* The application record carries its own `migrationStatus`, but it is null
|
|
183
|
+
* throughout dev2, so this falls back to the per-AEF-script call-flow state.
|
|
184
|
+
*/
|
|
185
|
+
resolveMigrationState(application, scriptName, uccxIp, callFlows) {
|
|
186
|
+
if (application.migrationStatus) {
|
|
187
|
+
return application.migrationStatus === CALL_FLOW_MIGRATED ? 'migrated' : 'not-migrated';
|
|
188
|
+
}
|
|
189
|
+
const callFlow = callFlows.find(flow => flow.scriptName === scriptName && (!uccxIp || flow.uccxIp === uccxIp));
|
|
190
|
+
return callFlow?.status === CALL_FLOW_MIGRATED ? 'migrated' : 'not-migrated';
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Turns an AEF compatibility score into a status.
|
|
194
|
+
*
|
|
195
|
+
* The scoring API does not exist yet - the AEF step mapping is still a pending
|
|
196
|
+
* input on the ticket - so when the backend sends no score every contact center
|
|
197
|
+
* falls back to "requires review": the status that offers both destinations and
|
|
198
|
+
* claims nothing about compatibility we have not actually measured.
|
|
199
|
+
*
|
|
200
|
+
* Once the backend returns `compatibilityScore`, the thresholds below take over
|
|
201
|
+
* with no further change here.
|
|
202
|
+
*/
|
|
203
|
+
resolveCompatibility(application) {
|
|
204
|
+
const score = application.compatibilityScore;
|
|
205
|
+
if (typeof score !== 'number') {
|
|
206
|
+
return 'requires-review';
|
|
207
|
+
}
|
|
208
|
+
if (score >= COMPATIBILITY_THRESHOLDS.migratable) {
|
|
209
|
+
return 'migratable';
|
|
210
|
+
}
|
|
211
|
+
if (score >= COMPATIBILITY_THRESHOLDS.requiresReview) {
|
|
212
|
+
return 'requires-review';
|
|
213
|
+
}
|
|
214
|
+
return 'unsupported';
|
|
215
|
+
}
|
|
216
|
+
asArray(value) {
|
|
217
|
+
return Array.isArray(value) ? value : [];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
CcImportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
221
|
+
CcImportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportService, providedIn: 'root' });
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CcImportService, decorators: [{
|
|
223
|
+
type: Injectable,
|
|
224
|
+
args: [{
|
|
225
|
+
providedIn: 'root'
|
|
226
|
+
}]
|
|
227
|
+
}] });
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtaW1wb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvY29udGFjdC1jZW50ZXIvY2MtaW1wb3J0L2NjLWltcG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25HLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBUXRGLE9BQU8sRUFDSCxrQkFBa0IsRUFNckIsTUFBTSxjQUFjLENBQUM7O0FBRXRCLHlGQUF5RjtBQUN6RixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFLNUIsTUFBTSxPQUFPLGVBQWU7SUFINUI7UUFJcUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QixXQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWhEOzs7Ozs7V0FNRztRQUNILGdCQUFXLEdBQUcsSUFBSSxDQUFDO0tBa1F0QjtJQWhRRyxRQUFRLENBQUMsS0FBYTtRQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFL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QyxDQUFDLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLFVBQVUsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFM0UsT0FBTyxRQUFRLEVBQUUsTUFBTSxLQUFLLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNLLG9CQUFvQixDQUFDLFdBQTRCO1FBQ3JELE1BQU0sS0FBSyxHQUFJLFdBQStDLENBQUMsa0JBQWtCLENBQUM7UUFFbEYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDM0IsT0FBTyxpQkFBaUIsQ0FBQztTQUM1QjtRQUNELElBQUksS0FBSyxJQUFJLHdCQUF3QixDQUFDLFVBQVUsRUFBRTtZQUM5QyxPQUFPLFlBQVksQ0FBQztTQUN2QjtRQUNELElBQUksS0FBSyxJQUFJLHdCQUF3QixDQUFDLGNBQWMsRUFBRTtZQUNsRCxPQUFPLGlCQUFpQixDQUFDO1NBQzVCO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQUVPLE9BQU8sQ0FBSSxLQUFjO1FBQzdCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDcEQsQ0FBQzs7NkdBNVFRLGVBQWU7aUhBQWYsZUFBZSxjQUZaLE1BQU07NEZBRVQsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGVsYXksIGZvcmtKb2luLCBtYXAsIG9mLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQVBJIH0gZnJvbSAnLi4vc2hhcmVkL2FwaS5lbmRwb2ludHMnO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGNwQXBpU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kY3AtYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDT01QQVRJQklMSVRZX1RIUkVTSE9MRFMsIE9WRVJWSUVXX0VOVElUWV9HUk9VUFMgfSBmcm9tICcuL2NvbnN0YW50cy9jYy1pbXBvcnQuY29uc3RhbnRzJztcclxuaW1wb3J0IHsgbW9ja0NvbnRhY3RDZW50ZXJFbnRpdGllcywgbW9ja0NvbnRhY3RDZW50ZXJzIH0gZnJvbSAnLi9tb2NrL2NjLWltcG9ydC5tb2NrJztcclxuaW1wb3J0IHtcclxuICAgIENvbnRhY3RDZW50ZXIsXHJcbiAgICBDb250YWN0Q2VudGVyQ29tcGF0aWJpbGl0eVN0YXR1cyxcclxuICAgIENvbnRhY3RDZW50ZXJFbnRpdGllcyxcclxuICAgIENvbnRhY3RDZW50ZXJFbnRpdHlHcm91cCxcclxuICAgIEltcG9ydFJlc3VsdFxyXG59IGZyb20gJy4vdHlwZXMvY2MtaW1wb3J0JztcclxuaW1wb3J0IHtcclxuICAgIENBTExfRkxPV19NSUdSQVRFRCxcclxuICAgIENhbGxGbG93TWlncmF0aW9uU3RhdHVzLFxyXG4gICAgVWNjeEFwcGxpY2F0aW9uLFxyXG4gICAgVWNjeEJhdGNoLFxyXG4gICAgVWNjeEl0ZW0sXHJcbiAgICBVY2N4SXRlbXNXcmFwcGVyXHJcbn0gZnJvbSAnLi90eXBlcy91Y2N4JztcclxuXHJcbi8qKiBTaW11bGF0ZWQgbmV0d29yayBsYXRlbmN5IGZvciB0aGUgbW9jayByZXNwb25zZXMsIHNvIGxvYWRpbmcgc3RhdGVzIGFyZSBleGVyY2lzZWQuICovXHJcbmNvbnN0IE1PQ0tfTEFURU5DWV9NUyA9IDMwMDtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2NJbXBvcnRTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBpID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkY3BBcGkgPSBpbmplY3QoRGNwQXBpU2VydmljZSk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbnN3ZXIgZXZlcnl0aGluZyBmcm9tIGBtb2NrL2NjLWltcG9ydC5tb2NrLnRzYCBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhlIGJhY2tlbmQuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGlzIGlzIGFsbC1vci1ub3RoaW5nOiB3aXRoIGl0IG9mZiwgdGhlIGNvbnRhY3QtY2VudGVyIGxpc3QsIHRoZSBlbnRpdHlcclxuICAgICAqIG92ZXJ2aWV3IGFuZCB0aGUgaW1wb3J0IGFsbCBoaXQgcmVhbCBlbmRwb2ludHMuIENvbXBhdGliaWxpdHkgc2NvcmluZyBpcyB0aGVcclxuICAgICAqIGV4Y2VwdGlvbiAtIHNlZSB7QGxpbmsgcmVzb2x2ZUNvbXBhdGliaWxpdHl9LlxyXG4gICAgICovXHJcbiAgICB1c2VNb2NrRGF0YSA9IHRydWU7XHJcblxyXG4gICAgc2V0VG9rZW4odG9rZW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXBpLnRva2VuID0gdG9rZW47XHJcbiAgICAgICAgdGhpcy5kY3BBcGkudG9rZW4gPSB0b2tlbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRIb3N0KGhvc3Q6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYXBpLmFwaVVybCA9IGhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEJhc2UgVVJMIG9mIHRoZSBkY3AgaG9zdCwgd2hpY2ggc2VydmVzIHRoZSBVQ0NYIGFwcGxpY2F0aW9uIGxpc3QuICovXHJcbiAgICBzZXREY3BIb3N0KGRjcEhvc3Q6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGNwQXBpLmFwaVVybCA9IGRjcEhvc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVyeSBVQ0NYIGNvbnRhY3QgY2VudGVyIFR1a2kgY2FuIGltcG9ydC5cclxuICAgICAqXHJcbiAgICAgKiBBIFwiY29udGFjdCBjZW50ZXJcIiBpcyBhIFVDQ1ggYXBwbGljYXRpb24uIFRoZSBsaXN0IGNvbWVzIGZyb20gdGhlIGRjcFxyXG4gICAgICogYXBwbGljYXRpb24gY2FjaGU7IHdoZXRoZXIgZWFjaCBvbmUgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZCBpcyBqb2luZWQgb24gZnJvbVxyXG4gICAgICogdGhlIHBlci1BRUYtc2NyaXB0IGNhbGwtZmxvdyBtaWdyYXRpb24gc3RhdGVzLlxyXG4gICAgICovXHJcbiAgICBmZXRjaENvbnRhY3RDZW50ZXJzKGN1c3RvbWVySWQ6IG51bWJlcik6IE9ic2VydmFibGU8Q29udGFjdENlbnRlcltdPiB7XHJcbiAgICAgICAgaWYgKHRoaXMudXNlTW9ja0RhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG1vY2tDb250YWN0Q2VudGVycygpKS5waXBlKGRlbGF5KE1PQ0tfTEFURU5DWV9NUykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHtcclxuICAgICAgICAgICAgYXBwbGljYXRpb25zOiB0aGlzLmRjcEFwaS5mZXRjaChBUEkuVUNDWC5BUFBMSUNBVElPTl9OQU1FUyhjdXN0b21lcklkKSksXHJcbiAgICAgICAgICAgIGNhbGxGbG93czogdGhpcy5hcGkuZmV0Y2goQVBJLlVDQ1guQ0FMTF9GTE9XX01JR1JBVElPTl9TVEFUVVNFUyhjdXN0b21lcklkKSlcclxuICAgICAgICB9KS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHsgYXBwbGljYXRpb25zLCBjYWxsRmxvd3MgfSkgPT4gdGhpcy50b0NvbnRhY3RDZW50ZXJzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hc0FycmF5PFVjY3hBcHBsaWNhdGlvbj4oYXBwbGljYXRpb25zKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuYXNBcnJheTxDYWxsRmxvd01pZ3JhdGlvblN0YXR1cz4oY2FsbEZsb3dzKVxyXG4gICAgICAgICAgICApKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBsaWNhdGlvbi1jZW50cmljIGVudGl0eSBicmVha2Rvd246IGV2ZXJ5dGhpbmcgVHVraSB3aWxsIGNyZWF0ZSBvbiBpbXBvcnQuXHJcbiAgICAgKlxyXG4gICAgICogTm90ZSB0aGlzIG9ubHkgZXZlciByZXR1cm5zIGVudGl0aWVzIHRoZSBiYWNrZW5kIGhhcyBhY3R1YWxseSBsaW5rZWQgdG8gdGhlXHJcbiAgICAgKiBhcHBsaWNhdGlvbi4gV2hlcmUgdGhhdCBsaW5rYWdlIGlzIG1pc3NpbmcgdGhlIGdyb3VwcyBjb21lIGJhY2sgZW1wdHkgcmF0aGVyXHJcbiAgICAgKiB0aGFuIHBhZGRlZCB3aXRoIHVucmVsYXRlZCBlbnRpdGllcyBvZiB0aGUgcmlnaHQgdHlwZS5cclxuICAgICAqL1xyXG4gICAgZmV0Y2hDb250YWN0Q2VudGVyRW50aXRpZXMoY3VzdG9tZXJJZDogbnVtYmVyLCBjb250YWN0Q2VudGVyOiBDb250YWN0Q2VudGVyKTogT2JzZXJ2YWJsZTxDb250YWN0Q2VudGVyRW50aXRpZXM+IHtcclxuICAgICAgICBpZiAodGhpcy51c2VNb2NrRGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobW9ja0NvbnRhY3RDZW50ZXJFbnRpdGllcyhjb250YWN0Q2VudGVyKSkucGlwZShkZWxheShNT0NLX0xBVEVOQ1lfTVMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQXBwbGljYXRpb25JdGVtcyhjdXN0b21lcklkLCBjb250YWN0Q2VudGVyLmFwcGxpY2F0aW9uTmFtZSkucGlwZShcclxuICAgICAgICAgICAgbWFwKGl0ZW1zID0+ICh7XHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklkOiBjb250YWN0Q2VudGVyLmFwcGxpY2F0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICBncm91cHM6IHRoaXMuZ3JvdXBFbnRpdGllcyhpdGVtcylcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEtpY2tzIG9mZiB0aGUgVUNDWCAtPiBXZWJleCBDb250YWN0IENlbnRlciBpbXBvcnQgb2Ygb25lIGNvbnRhY3QgY2VudGVyLCBhcyBhXHJcbiAgICAgKiBzaW5nbGUgbWlncmF0aW9uIHVuaXQ6IGV2ZXJ5IGVudGl0eSBvZiB0aGUgYXBwbGljYXRpb24gZ29lcyBpbiBvbmUgcmVxdWVzdC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgZW5kcG9pbnQgaXMgc3luY2hyb25vdXMgYW5kIGFuc3dlcnMgd2l0aCBhbiBYTFNYIHRyYWNrZXIgcmF0aGVyIHRoYW4gYSBqb2JcclxuICAgICAqIGlkIC0gZXhlY3V0aW9uIGFuZCBwcm9ncmVzcyB0cmFja2luZyBhcmUgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIHRpY2tldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2l0ZUlkICAgICByZXF1aXJlZCBieSB0aGUgYmFja2VuZCB3aGVuIGEgUmVzb3VyY2UgR3JvdXAgaXMgaW4gc2NvcGUuXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25JZCByZXF1aXJlZCBieSB0aGUgYmFja2VuZCB3aGVuIGEgVHJpZ2dlciBpcyBpbiBzY29wZS5cclxuICAgICAqL1xyXG4gICAgaW1wb3J0Q29udGFjdENlbnRlcihcclxuICAgICAgICBjdXN0b21lcklkOiBudW1iZXIsXHJcbiAgICAgICAgYXBwbGljYXRpb25JZDogc3RyaW5nLFxyXG4gICAgICAgIHNpdGVJZD86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvbklkPzogc3RyaW5nXHJcbiAgICApOiBPYnNlcnZhYmxlPEltcG9ydFJlc3VsdD4ge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZU1vY2tEYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZjxJbXBvcnRSZXN1bHQ+KHsgYXBwbGljYXRpb25JZCwgYWNjZXB0ZWQ6IHRydWUgfSkucGlwZShkZWxheShNT0NLX0xBVEVOQ1lfTVMpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQXBwbGljYXRpb25JdGVtcyhjdXN0b21lcklkLCBhcHBsaWNhdGlvbklkKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoaXRlbXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogVWNjeEl0ZW1zV3JhcHBlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICB1Y2N4SXRlbXNMaXN0OiBpdGVtcy5sZW5ndGggPyBbaXRlbXMubWFwKGl0ZW0gPT4gKHsgLi4uaXRlbSwgbWlncmF0ZTogdHJ1ZSB9KSldIDogW11cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLnBvc3QoXHJcbiAgICAgICAgICAgICAgICAgICAgQVBJLlVDQ1guTUlHUkFURShjdXN0b21lcklkKSxcclxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLFxyXG4gICAgICAgICAgICAgICAgICAgIHsgc2l0ZUlkLCBsb2NhdGlvbklkIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgbWFwKChyZXBvcnQ6IEJsb2IpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklkLFxyXG4gICAgICAgICAgICAgICAgYWNjZXB0ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZXBvcnQ6IHJlcG9ydCBpbnN0YW5jZW9mIEJsb2IgPyByZXBvcnQgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZXJ5IFVDQ1ggZW50aXR5IGJlbG9uZ2luZyB0byBvbmUgYXBwbGljYXRpb24sIGdhdGhlcmVkIGFjcm9zcyB0aGUgYmF0Y2hlcy5cclxuICAgICAqXHJcbiAgICAgKiBVQ0NYIGJhdGNoZXMgaG9sZCBvbmUgZW50aXR5IHR5cGUgZWFjaCwgc28gdGhpcyByZWFkcyB0aGVtIGFsbCBhbmQga2VlcHMgdGhlXHJcbiAgICAgKiBpdGVtcyB3aG9zZSBgYXBwbGljYXRpb25OYW1lYCBtYXRjaGVzLiBUaGUgbmFycm93aW5nIGlzIGRvbmUgaGVyZSByYXRoZXIgdGhhblxyXG4gICAgICogdGhyb3VnaCB0aGUgZW5kcG9pbnQncyBvd24gYGFwcGxpY2F0aW9uTmFtZWAgcGFyYW0gYmVjYXVzZSB0aGF0IHBhcmFtIGFuc3dlcnNcclxuICAgICAqIGBbXWAgb24gZGV2MiBldmVuIGZvciBpdGVtcyB0aGF0IHBsYWlubHkgY2FycnkgdGhlIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmV0Y2hBcHBsaWNhdGlvbkl0ZW1zKGN1c3RvbWVySWQ6IG51bWJlciwgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVjY3hJdGVtW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hcGkuZmV0Y2goQVBJLlVDQ1guQkFUQ0hFUyhjdXN0b21lcklkKSkucGlwZShcclxuICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmFzQXJyYXk8VWNjeEJhdGNoPihyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWJhdGNoZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mPFVjY3hJdGVtW10+KFtdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oYmF0Y2hlcy5tYXAoYmF0Y2ggPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwaS5mZXRjaChBUEkuVUNDWC5CQVRDSF9JVEVNUyhjdXN0b21lcklkLCBiYXRjaC5pZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgod3JhcHBlcjogVWNjeEl0ZW1zV3JhcHBlcikgPT4gdGhpcy5mbGF0dGVuSXRlbXMod3JhcHBlcikpKVxyXG4gICAgICAgICAgICAgICAgKSkucGlwZShtYXAocGVyQmF0Y2ggPT4gdGhpcy5kZWR1cGVJdGVtcyhcclxuICAgICAgICAgICAgICAgICAgICBwZXJCYXRjaC5mbGF0KCkuZmlsdGVyKGl0ZW0gPT4gaXRlbS5hcHBsaWNhdGlvbk5hbWUgPT09IGFwcGxpY2F0aW9uTmFtZSlcclxuICAgICAgICAgICAgICAgICkpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgaXRlbXMgZW5kcG9pbnQgbmVzdHMgaXRlbXMgb25lIGxldmVsOyBvbGRlciByZXNwb25zZXMgY29tZSBiYWNrIGZsYXQuICovXHJcbiAgICBwcml2YXRlIGZsYXR0ZW5JdGVtcyh3cmFwcGVyOiBVY2N4SXRlbXNXcmFwcGVyIHwgbnVsbCk6IFVjY3hJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gd3JhcHBlcj8udWNjeEl0ZW1zTGlzdCA/PyBbXTtcclxuICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBBcnJheS5pc0FycmF5KGl0ZW1zWzBdKVxyXG4gICAgICAgICAgICA/IChpdGVtcyBhcyBVY2N4SXRlbVtdW10pLmZsYXQoKVxyXG4gICAgICAgICAgICA6IChpdGVtcyBhcyB1bmtub3duIGFzIFVjY3hJdGVtW10pO1xyXG4gICAgICAgIHJldHVybiBmbGF0dGVuZWQuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBUaGUgc2FtZSBlbnRpdHkgY2FuIGJlIGNhcnJpZWQgYnkgbW9yZSB0aGFuIG9uZSBiYXRjaC4gKi9cclxuICAgIHByaXZhdGUgZGVkdXBlSXRlbXMoaXRlbXM6IFVjY3hJdGVtW10pOiBVY2N4SXRlbVtdIHtcclxuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gYCR7aXRlbS50eXBlfTo6JHtpdGVtLm5hbWV9Ojoke2l0ZW0uc291cmNlVUNDWElwfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBncm91cEVudGl0aWVzKGl0ZW1zOiBVY2N4SXRlbVtdKTogQ29udGFjdENlbnRlckVudGl0eUdyb3VwW10ge1xyXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcclxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IHJlbWFpbmluZy5nZXQoaXRlbS50eXBlKSA/PyBbXTtcclxuICAgICAgICAgICAgbmFtZXMucHVzaChpdGVtLm5hbWUpO1xyXG4gICAgICAgICAgICByZW1haW5pbmcuc2V0KGl0ZW0udHlwZSwgbmFtZXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBncm91cHM6IENvbnRhY3RDZW50ZXJFbnRpdHlHcm91cFtdID0gT1ZFUlZJRVdfRU5USVRZX0dST1VQUy5tYXAoZ3JvdXAgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb2xsZWN0ZWQ6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICAgIGdyb3VwLnR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0ZWQucHVzaCguLi4ocmVtYWluaW5nLmdldCh0eXBlKSA/PyBbXSkpO1xyXG4gICAgICAgICAgICAgICAgcmVtYWluaW5nLmRlbGV0ZSh0eXBlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiBncm91cC5sYWJlbCwgaXRlbXM6IGNvbGxlY3RlZCB9O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBBbnl0aGluZyB0aGUgYmFja2VuZCByZXR1cm5lZCB0aGF0IGhhcyBubyBncm91cCBvZiBpdHMgb3duIGtlZXBzIGl0cyByYXdcclxuICAgICAgICAvLyB0eXBlIGFzIGEgbGFiZWwsIHJhdGhlciB0aGFuIGJlaW5nIGRyb3BwZWQgZnJvbSB0aGUgb3ZlcnZpZXcuXHJcbiAgICAgICAgcmVtYWluaW5nLmZvckVhY2goKG5hbWVzLCB0eXBlKSA9PiBncm91cHMucHVzaCh7IGxhYmVsOiB0eXBlLCBpdGVtczogbmFtZXMgfSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JvdXBzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9Db250YWN0Q2VudGVycyhcclxuICAgICAgICBhcHBsaWNhdGlvbnM6IFVjY3hBcHBsaWNhdGlvbltdLFxyXG4gICAgICAgIGNhbGxGbG93czogQ2FsbEZsb3dNaWdyYXRpb25TdGF0dXNbXVxyXG4gICAgKTogQ29udGFjdENlbnRlcltdIHtcclxuICAgICAgICByZXR1cm4gYXBwbGljYXRpb25zXHJcbiAgICAgICAgICAgIC5maWx0ZXIoYXBwbGljYXRpb24gPT4gISFhcHBsaWNhdGlvbj8ubmFtZSlcclxuICAgICAgICAgICAgLm1hcChhcHBsaWNhdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1Y2N4SXAgPSBhcHBsaWNhdGlvbi51Y2N4Py5ob3N0O1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IHRoaXMudG9TY3JpcHROYW1lKGFwcGxpY2F0aW9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhdGliaWxpdHlTdGF0dXMgPSB0aGlzLnJlc29sdmVDb21wYXRpYmlsaXR5KGFwcGxpY2F0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250YWN0Q2VudGVyOiBDb250YWN0Q2VudGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVDQ1ggaWRlbnRpZmllcyBhbiBhcHBsaWNhdGlvbiBieSBuYW1lIC0gaXQgaXMgd2hhdCB0aGUgZW50aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkcyBsaW5rIGJhY2sgdG8gLSBzbyBpdCBkb3VibGVzIGFzIHRoZSB3aWRnZXQncyBrZXkuXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JZDogYXBwbGljYXRpb24ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbk5hbWU6IGFwcGxpY2F0aW9uLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0TmFtZSxcclxuICAgICAgICAgICAgICAgICAgICB1Y2N4SXAsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eVN0YXR1cyxcclxuICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25TdGF0ZTogdGhpcy5yZXNvbHZlTWlncmF0aW9uU3RhdGUoYXBwbGljYXRpb24sIHNjcmlwdE5hbWUsIHVjY3hJcCwgY2FsbEZsb3dzKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBQZXIgdGhlIHRpY2tldCwgXCJyZXF1aXJlcyByZXZpZXdcIiBpcyBleGFjdGx5IHRoZSBzZXQgdGhhdCBjYW4gZ29cclxuICAgICAgICAgICAgICAgICAgICAvLyB0byBlaXRoZXIgZGVzdGluYXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJBc3Npc3RDYXBhYmxlOiBjb21wYXRpYmlsaXR5U3RhdHVzID09PSAncmVxdWlyZXMtcmV2aWV3J1xyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFjdENlbnRlcjtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVDQ1ggd3JhcHMgdGhlIGJhY2tpbmcgc2NyaXB0IGFzIGBTQ1JJUFRbRm9vLmFlZl1gOyB0aGUgd2lkZ2V0IHNob3dzIGBGb28uYWVmYC4gKi9cclxuICAgIHByaXZhdGUgdG9TY3JpcHROYW1lKGFwcGxpY2F0aW9uOiBVY2N4QXBwbGljYXRpb24pOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHJhdyA9IGFwcGxpY2F0aW9uLnNjcmlwdE5hbWUgPz8gYXBwbGljYXRpb24uYWVmRmlsZXM/LlswXSA/PyAnJztcclxuICAgICAgICByZXR1cm4gcmF3LnJlcGxhY2UoL15TQ1JJUFRcXFsoLiopXFxdJC8sICckMScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciBUdWtpIGhhcyBhbHJlYWR5IGltcG9ydGVkIHRoaXMgY29udGFjdCBjZW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGFwcGxpY2F0aW9uIHJlY29yZCBjYXJyaWVzIGl0cyBvd24gYG1pZ3JhdGlvblN0YXR1c2AsIGJ1dCBpdCBpcyBudWxsXHJcbiAgICAgKiB0aHJvdWdob3V0IGRldjIsIHNvIHRoaXMgZmFsbHMgYmFjayB0byB0aGUgcGVyLUFFRi1zY3JpcHQgY2FsbC1mbG93IHN0YXRlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc29sdmVNaWdyYXRpb25TdGF0ZShcclxuICAgICAgICBhcHBsaWNhdGlvbjogVWNjeEFwcGxpY2F0aW9uLFxyXG4gICAgICAgIHNjcmlwdE5hbWU6IHN0cmluZyxcclxuICAgICAgICB1Y2N4SXA6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjYWxsRmxvd3M6IENhbGxGbG93TWlncmF0aW9uU3RhdHVzW11cclxuICAgICk6IENvbnRhY3RDZW50ZXJbJ21pZ3JhdGlvblN0YXRlJ10ge1xyXG4gICAgICAgIGlmIChhcHBsaWNhdGlvbi5taWdyYXRpb25TdGF0dXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uLm1pZ3JhdGlvblN0YXR1cyA9PT0gQ0FMTF9GTE9XX01JR1JBVEVEID8gJ21pZ3JhdGVkJyA6ICdub3QtbWlncmF0ZWQnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY2FsbEZsb3cgPSBjYWxsRmxvd3MuZmluZChmbG93ID0+XHJcbiAgICAgICAgICAgIGZsb3cuc2NyaXB0TmFtZSA9PT0gc2NyaXB0TmFtZSAmJiAoIXVjY3hJcCB8fCBmbG93LnVjY3hJcCA9PT0gdWNjeElwKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjYWxsRmxvdz8uc3RhdHVzID09PSBDQUxMX0ZMT1dfTUlHUkFURUQgPyAnbWlncmF0ZWQnIDogJ25vdC1taWdyYXRlZCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUdXJucyBhbiBBRUYgY29tcGF0aWJpbGl0eSBzY29yZSBpbnRvIGEgc3RhdHVzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBzY29yaW5nIEFQSSBkb2VzIG5vdCBleGlzdCB5ZXQgLSB0aGUgQUVGIHN0ZXAgbWFwcGluZyBpcyBzdGlsbCBhIHBlbmRpbmdcclxuICAgICAqIGlucHV0IG9uIHRoZSB0aWNrZXQgLSBzbyB3aGVuIHRoZSBiYWNrZW5kIHNlbmRzIG5vIHNjb3JlIGV2ZXJ5IGNvbnRhY3QgY2VudGVyXHJcbiAgICAgKiBmYWxscyBiYWNrIHRvIFwicmVxdWlyZXMgcmV2aWV3XCI6IHRoZSBzdGF0dXMgdGhhdCBvZmZlcnMgYm90aCBkZXN0aW5hdGlvbnMgYW5kXHJcbiAgICAgKiBjbGFpbXMgbm90aGluZyBhYm91dCBjb21wYXRpYmlsaXR5IHdlIGhhdmUgbm90IGFjdHVhbGx5IG1lYXN1cmVkLlxyXG4gICAgICpcclxuICAgICAqIE9uY2UgdGhlIGJhY2tlbmQgcmV0dXJucyBgY29tcGF0aWJpbGl0eVNjb3JlYCwgdGhlIHRocmVzaG9sZHMgYmVsb3cgdGFrZSBvdmVyXHJcbiAgICAgKiB3aXRoIG5vIGZ1cnRoZXIgY2hhbmdlIGhlcmUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVzb2x2ZUNvbXBhdGliaWxpdHkoYXBwbGljYXRpb246IFVjY3hBcHBsaWNhdGlvbik6IENvbnRhY3RDZW50ZXJDb21wYXRpYmlsaXR5U3RhdHVzIHtcclxuICAgICAgICBjb25zdCBzY29yZSA9IChhcHBsaWNhdGlvbiBhcyB7IGNvbXBhdGliaWxpdHlTY29yZT86IG51bWJlciB9KS5jb21wYXRpYmlsaXR5U2NvcmU7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcmUgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAncmVxdWlyZXMtcmV2aWV3JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjb3JlID49IENPTVBBVElCSUxJVFlfVEhSRVNIT0xEUy5taWdyYXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnbWlncmF0YWJsZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY29yZSA+PSBDT01QQVRJQklMSVRZX1RIUkVTSE9MRFMucmVxdWlyZXNSZXZpZXcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdyZXF1aXJlcy1yZXZpZXcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ3Vuc3VwcG9ydGVkJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzQXJyYXk8VD4odmFsdWU6IHVua25vd24pOiBUW10ge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIGFzIFRbXSA6IFtdO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { catchError, finalize, of } from 'rxjs';
|
|
3
|
+
import { CcImportService } from '../../cc-import.service';
|
|
4
|
+
import { CHART_COLORS, IMPORT_PANEL_SLICES, IMPORT_PANEL_TITLE, IMPORT_PANEL_TOOLTIP } from '../../constants/cc-import.constants';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "ng-apexcharts";
|
|
8
|
+
import * as i3 from "@angular/material/tooltip";
|
|
9
|
+
import * as i4 from "../../../shared/components/card/card.component";
|
|
10
|
+
/**
|
|
11
|
+
* "Import Contact center" panel: how many UCCX contact centers were detected, how many
|
|
12
|
+
* have been imported, and an Import button that asks the host to open the import wizard.
|
|
13
|
+
*/
|
|
14
|
+
export class ImportContactCenterPanelComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
/** Serve mock data instead of calling the UCCX migration API. */
|
|
17
|
+
this.useMockData = true;
|
|
18
|
+
/**
|
|
19
|
+
* Asked for the import wizard, carrying the contact centers already loaded here so
|
|
20
|
+
* the wizard opens without refetching them. The host renders
|
|
21
|
+
* `cc-import-contact-center-wizard` as a page in response.
|
|
22
|
+
*/
|
|
23
|
+
this.importRequested = new EventEmitter();
|
|
24
|
+
this.ccImportService = inject(CcImportService);
|
|
25
|
+
this.title = IMPORT_PANEL_TITLE;
|
|
26
|
+
this.tooltip = IMPORT_PANEL_TOOLTIP;
|
|
27
|
+
this.segments = [];
|
|
28
|
+
this.total = 0;
|
|
29
|
+
this.loading = false;
|
|
30
|
+
this.error = false;
|
|
31
|
+
this.contactCenters = [];
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
// Render an empty donut up front so the template never reads unset chart options,
|
|
35
|
+
// including when load() bails out because the widget has no credentials yet.
|
|
36
|
+
this.buildViewModel();
|
|
37
|
+
this.load();
|
|
38
|
+
}
|
|
39
|
+
ngOnChanges(changes) {
|
|
40
|
+
const reloadTriggers = ['customerId', 'host', 'dcpHost', 'token', 'useMockData'];
|
|
41
|
+
if (reloadTriggers.some(input => changes[input] && !changes[input].firstChange)) {
|
|
42
|
+
this.load();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ngOnDestroy() {
|
|
46
|
+
this.subscription?.unsubscribe();
|
|
47
|
+
}
|
|
48
|
+
onImport() {
|
|
49
|
+
this.importRequested.emit(this.contactCenters);
|
|
50
|
+
}
|
|
51
|
+
/** Call after an import has run so the donut picks up the new counts. */
|
|
52
|
+
refresh() {
|
|
53
|
+
this.load();
|
|
54
|
+
}
|
|
55
|
+
load() {
|
|
56
|
+
const customerId = Number(this.customerId);
|
|
57
|
+
this.ccImportService.useMockData = this.useMockData;
|
|
58
|
+
if (!this.useMockData && (!customerId || !this.token)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (this.host) {
|
|
62
|
+
this.ccImportService.setHost(this.host);
|
|
63
|
+
}
|
|
64
|
+
if (this.dcpHost) {
|
|
65
|
+
this.ccImportService.setDcpHost(this.dcpHost);
|
|
66
|
+
}
|
|
67
|
+
if (this.token) {
|
|
68
|
+
this.ccImportService.setToken(this.token);
|
|
69
|
+
}
|
|
70
|
+
this.subscription?.unsubscribe();
|
|
71
|
+
this.loading = true;
|
|
72
|
+
this.error = false;
|
|
73
|
+
this.subscription = this.ccImportService.fetchContactCenters(customerId)
|
|
74
|
+
.pipe(catchError(error => {
|
|
75
|
+
console.error('Unable to load the contact centers', error);
|
|
76
|
+
this.error = true;
|
|
77
|
+
return of([]);
|
|
78
|
+
}), finalize(() => this.loading = false))
|
|
79
|
+
.subscribe(contactCenters => {
|
|
80
|
+
this.contactCenters = contactCenters;
|
|
81
|
+
this.buildViewModel();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
buildViewModel() {
|
|
85
|
+
this.total = this.contactCenters.length;
|
|
86
|
+
this.segments = IMPORT_PANEL_SLICES.map(slice => {
|
|
87
|
+
const count = this.contactCenters.filter(slice.match).length;
|
|
88
|
+
return {
|
|
89
|
+
label: slice.label,
|
|
90
|
+
color: slice.color,
|
|
91
|
+
tooltip: slice.tooltip,
|
|
92
|
+
count,
|
|
93
|
+
percentage: this.total > 0 ? Math.round((count / this.total) * 100) : 0
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
this.chartOptions = this.buildChartOptions();
|
|
97
|
+
}
|
|
98
|
+
buildChartOptions() {
|
|
99
|
+
const charted = this.segments.filter(segment => segment.count > 0);
|
|
100
|
+
const isEmpty = charted.length === 0;
|
|
101
|
+
return {
|
|
102
|
+
series: isEmpty ? [1] : charted.map(segment => segment.count),
|
|
103
|
+
labels: isEmpty ? ['No contact centers'] : charted.map(segment => segment.label),
|
|
104
|
+
colors: isEmpty ? [CHART_COLORS.webexContactCenter] : charted.map(segment => segment.color),
|
|
105
|
+
chart: {
|
|
106
|
+
type: 'donut',
|
|
107
|
+
height: 150,
|
|
108
|
+
width: 150,
|
|
109
|
+
sparkline: { enabled: true }
|
|
110
|
+
},
|
|
111
|
+
legend: { show: false },
|
|
112
|
+
plotOptions: {
|
|
113
|
+
pie: {
|
|
114
|
+
expandOnClick: false,
|
|
115
|
+
donut: { size: '72%' }
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
dataLabels: { enabled: false },
|
|
119
|
+
tooltip: { enabled: !isEmpty },
|
|
120
|
+
states: {
|
|
121
|
+
active: { filter: { type: 'none', value: 0 } }
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
ImportContactCenterPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportContactCenterPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
127
|
+
ImportContactCenterPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ImportContactCenterPanelComponent, selector: "cc-import-contact-center-panel", inputs: { customerId: "customerId", host: "host", dcpHost: "dcpHost", token: "token", useMockData: "useMockData" }, outputs: { importRequested: "importRequested" }, usesOnChanges: true, ngImport: i0, template: "<tk-card [title]=\"title\" [dense]=\"true\">\r\n <ng-container ngProjectAs=\"card-title-adornment\">\r\n <span class=\"cc-import-panel__info\" [matTooltip]=\"tooltip\">\r\n <ng-container *ngTemplateOutlet=\"infoIcon\"></ng-container>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div class=\"cc-import-panel__body\" *ngIf=\"!loading && !error; else panelState\">\r\n <div class=\"cc-import-panel__chart\">\r\n <apx-chart\r\n [series]=\"chartOptions.series\"\r\n [chart]=\"chartOptions.chart\"\r\n [labels]=\"chartOptions.labels\"\r\n [colors]=\"chartOptions.colors\"\r\n [legend]=\"chartOptions.legend\"\r\n [plotOptions]=\"chartOptions.plotOptions\"\r\n [dataLabels]=\"chartOptions.dataLabels\"\r\n [tooltip]=\"chartOptions.tooltip\"\r\n [states]=\"chartOptions.states\"\r\n ></apx-chart>\r\n <div class=\"cc-import-panel__chart-center\">\r\n <span class=\"cc-import-panel__chart-total\">{{ total | number }}</span>\r\n <span class=\"cc-import-panel__chart-caption\">Contact Center</span>\r\n </div>\r\n </div>\r\n\r\n <ul class=\"cc-import-panel__legend\">\r\n <li class=\"cc-import-panel__legend-item\" *ngFor=\"let segment of segments\">\r\n <span class=\"cc-import-panel__legend-marker\" [style.backgroundColor]=\"segment.color\"></span>\r\n <span class=\"cc-import-panel__legend-label\">{{ segment.label }}</span>\r\n <span class=\"cc-import-panel__info\" [matTooltip]=\"segment.tooltip\">\r\n <ng-container *ngTemplateOutlet=\"infoIcon\"></ng-container>\r\n </span>\r\n <span class=\"cc-import-panel__legend-value\">{{ segment.count | number }} ({{ segment.percentage }}%)</span>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <ng-template #panelState>\r\n <div class=\"cc-import-panel__state\" *ngIf=\"loading\">Loading contact centers\u2026</div>\r\n <div class=\"cc-import-panel__state cc-import-panel__state--error\" *ngIf=\"!loading && error\">\r\n Unable to load contact centers.\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"cc-import-panel__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"cc-import-panel__button\"\r\n [disabled]=\"loading || error\"\r\n (click)=\"onImport()\"\r\n >\r\n Import\r\n </button>\r\n </div>\r\n </ng-container>\r\n</tk-card>\r\n\r\n<ng-template #infoIcon>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\r\n <path d=\"M8 7.2v4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n <circle cx=\"8\" cy=\"5\" r=\"0.85\" fill=\"currentColor\" />\r\n </svg>\r\n</ng-template>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;box-sizing:border-box;font-family:Inter,Inter,sans-serif}.cc-import-panel__info{display:inline-flex;align-items:center;color:#636363;cursor:help}.cc-import-panel__body{display:flex;align-items:center;gap:1.5rem;flex-wrap:wrap;width:100%}.cc-import-panel__chart{position:relative;width:150px;height:150px;flex-shrink:0}.cc-import-panel__chart-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.cc-import-panel__chart-total{font-size:1.625rem;line-height:1.1;color:#252525}.cc-import-panel__chart-caption{font-size:.6875rem;color:#636363}.cc-import-panel__legend{display:flex;flex-direction:column;gap:.625rem;margin:0;padding:0;list-style:none;min-width:17.5rem;flex:1}.cc-import-panel__legend-item{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:#636363}.cc-import-panel__legend-marker{width:10px;height:10px;border-radius:2px;flex-shrink:0}.cc-import-panel__legend-label{color:#252525}.cc-import-panel__legend-value{margin-left:auto;white-space:nowrap}.cc-import-panel__state{font-size:.875rem;color:#636363}.cc-import-panel__state--error{color:#bc1e1b}.cc-import-panel__actions{display:flex;margin-top:auto}.cc-import-panel__button{display:inline-flex;align-items:center;gap:.25rem;padding:.5rem 1rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:6.25rem;font-family:inherit;font-size:.875rem;font-weight:500;color:#000000f2;cursor:pointer;white-space:nowrap}.cc-import-panel__button:hover:not(:disabled){background:#ededed}.cc-import-panel__button:disabled{color:#babcc5;border-color:#dfe3e7;cursor:not-allowed}@media (max-width: 560px){.cc-import-panel__legend{min-width:0}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ChartComponent, selector: "apx-chart", inputs: ["chart", "annotations", "colors", "dataLabels", "series", "stroke", "labels", "legend", "markers", "noData", "fill", "tooltip", "plotOptions", "responsive", "xaxis", "yaxis", "forecastDataPoints", "grid", "states", "title", "subtitle", "theme", "autoUpdateSeries"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4.CardComponent, selector: "tk-card", inputs: ["title", "dense"] }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
128
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ImportContactCenterPanelComponent, decorators: [{
|
|
129
|
+
type: Component,
|
|
130
|
+
args: [{ selector: 'cc-import-contact-center-panel', template: "<tk-card [title]=\"title\" [dense]=\"true\">\r\n <ng-container ngProjectAs=\"card-title-adornment\">\r\n <span class=\"cc-import-panel__info\" [matTooltip]=\"tooltip\">\r\n <ng-container *ngTemplateOutlet=\"infoIcon\"></ng-container>\r\n </span>\r\n </ng-container>\r\n\r\n <ng-container ngProjectAs=\"card-content\">\r\n <div class=\"cc-import-panel__body\" *ngIf=\"!loading && !error; else panelState\">\r\n <div class=\"cc-import-panel__chart\">\r\n <apx-chart\r\n [series]=\"chartOptions.series\"\r\n [chart]=\"chartOptions.chart\"\r\n [labels]=\"chartOptions.labels\"\r\n [colors]=\"chartOptions.colors\"\r\n [legend]=\"chartOptions.legend\"\r\n [plotOptions]=\"chartOptions.plotOptions\"\r\n [dataLabels]=\"chartOptions.dataLabels\"\r\n [tooltip]=\"chartOptions.tooltip\"\r\n [states]=\"chartOptions.states\"\r\n ></apx-chart>\r\n <div class=\"cc-import-panel__chart-center\">\r\n <span class=\"cc-import-panel__chart-total\">{{ total | number }}</span>\r\n <span class=\"cc-import-panel__chart-caption\">Contact Center</span>\r\n </div>\r\n </div>\r\n\r\n <ul class=\"cc-import-panel__legend\">\r\n <li class=\"cc-import-panel__legend-item\" *ngFor=\"let segment of segments\">\r\n <span class=\"cc-import-panel__legend-marker\" [style.backgroundColor]=\"segment.color\"></span>\r\n <span class=\"cc-import-panel__legend-label\">{{ segment.label }}</span>\r\n <span class=\"cc-import-panel__info\" [matTooltip]=\"segment.tooltip\">\r\n <ng-container *ngTemplateOutlet=\"infoIcon\"></ng-container>\r\n </span>\r\n <span class=\"cc-import-panel__legend-value\">{{ segment.count | number }} ({{ segment.percentage }}%)</span>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <ng-template #panelState>\r\n <div class=\"cc-import-panel__state\" *ngIf=\"loading\">Loading contact centers\u2026</div>\r\n <div class=\"cc-import-panel__state cc-import-panel__state--error\" *ngIf=\"!loading && error\">\r\n Unable to load contact centers.\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"cc-import-panel__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"cc-import-panel__button\"\r\n [disabled]=\"loading || error\"\r\n (click)=\"onImport()\"\r\n >\r\n Import\r\n </button>\r\n </div>\r\n </ng-container>\r\n</tk-card>\r\n\r\n<ng-template #infoIcon>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\r\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.2\" />\r\n <path d=\"M8 7.2v4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\r\n <circle cx=\"8\" cy=\"5\" r=\"0.85\" fill=\"currentColor\" />\r\n </svg>\r\n</ng-template>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap\";:host{display:block;box-sizing:border-box;font-family:Inter,Inter,sans-serif}.cc-import-panel__info{display:inline-flex;align-items:center;color:#636363;cursor:help}.cc-import-panel__body{display:flex;align-items:center;gap:1.5rem;flex-wrap:wrap;width:100%}.cc-import-panel__chart{position:relative;width:150px;height:150px;flex-shrink:0}.cc-import-panel__chart-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.cc-import-panel__chart-total{font-size:1.625rem;line-height:1.1;color:#252525}.cc-import-panel__chart-caption{font-size:.6875rem;color:#636363}.cc-import-panel__legend{display:flex;flex-direction:column;gap:.625rem;margin:0;padding:0;list-style:none;min-width:17.5rem;flex:1}.cc-import-panel__legend-item{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:#636363}.cc-import-panel__legend-marker{width:10px;height:10px;border-radius:2px;flex-shrink:0}.cc-import-panel__legend-label{color:#252525}.cc-import-panel__legend-value{margin-left:auto;white-space:nowrap}.cc-import-panel__state{font-size:.875rem;color:#636363}.cc-import-panel__state--error{color:#bc1e1b}.cc-import-panel__actions{display:flex;margin-top:auto}.cc-import-panel__button{display:inline-flex;align-items:center;gap:.25rem;padding:.5rem 1rem;background:#fff;border:1px solid rgba(0,0,0,.5019607843);border-radius:6.25rem;font-family:inherit;font-size:.875rem;font-weight:500;color:#000000f2;cursor:pointer;white-space:nowrap}.cc-import-panel__button:hover:not(:disabled){background:#ededed}.cc-import-panel__button:disabled{color:#babcc5;border-color:#dfe3e7;cursor:not-allowed}@media (max-width: 560px){.cc-import-panel__legend{min-width:0}}\n"] }]
|
|
131
|
+
}], propDecorators: { customerId: [{
|
|
132
|
+
type: Input
|
|
133
|
+
}], host: [{
|
|
134
|
+
type: Input
|
|
135
|
+
}], dcpHost: [{
|
|
136
|
+
type: Input
|
|
137
|
+
}], token: [{
|
|
138
|
+
type: Input
|
|
139
|
+
}], useMockData: [{
|
|
140
|
+
type: Input
|
|
141
|
+
}], importRequested: [{
|
|
142
|
+
type: Output
|
|
143
|
+
}] } });
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LWNvbnRhY3QtY2VudGVyLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1pbXBvcnQvY29tcG9uZW50cy9pbXBvcnQtY29udGFjdC1jZW50ZXItcGFuZWwvaW1wb3J0LWNvbnRhY3QtY2VudGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9jb250YWN0LWNlbnRlci9jYy1pbXBvcnQvY29tcG9uZW50cy9pbXBvcnQtY29udGFjdC1jZW50ZXItcGFuZWwvaW1wb3J0LWNvbnRhY3QtY2VudGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUgsT0FBTyxFQUFnQixVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7QUFlbEk7OztHQUdHO0FBTUgsTUFBTSxPQUFPLGlDQUFpQztJQUw5QztRQVdJLGlFQUFpRTtRQUN4RCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUU1Qjs7OztXQUlHO1FBQ08sb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUUvQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUdsRCxVQUFLLEdBQUcsa0JBQWtCLENBQUM7UUFDM0Is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c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9JLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwZXhDaGFydCwgQXBleERhdGFMYWJlbHMsIEFwZXhMZWdlbmQsIEFwZXhOb25BeGlzQ2hhcnRTZXJpZXMsIEFwZXhQbG90T3B0aW9ucywgQXBleFN0YXRlcywgQXBleFRvb2x0aXAgfSBmcm9tICduZy1hcGV4Y2hhcnRzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2NJbXBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2MtaW1wb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDSEFSVF9DT0xPUlMsIElNUE9SVF9QQU5FTF9TTElDRVMsIElNUE9SVF9QQU5FTF9USVRMRSwgSU1QT1JUX1BBTkVMX1RPT0xUSVAgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvY2MtaW1wb3J0LmNvbnN0YW50cyc7XHJcbmltcG9ydCB7IENvbnRhY3RDZW50ZXIsIEltcG9ydFBhbmVsU2VnbWVudCB9IGZyb20gJy4uLy4uL3R5cGVzL2NjLWltcG9ydCc7XHJcblxyXG5pbnRlcmZhY2UgUGFuZWxDaGFydE9wdGlvbnMge1xyXG4gICAgc2VyaWVzOiBBcGV4Tm9uQXhpc0NoYXJ0U2VyaWVzO1xyXG4gICAgY2hhcnQ6IEFwZXhDaGFydDtcclxuICAgIGxhYmVsczogc3RyaW5nW107XHJcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xyXG4gICAgbGVnZW5kOiBBcGV4TGVnZW5kO1xyXG4gICAgcGxvdE9wdGlvbnM6IEFwZXhQbG90T3B0aW9ucztcclxuICAgIGRhdGFMYWJlbHM6IEFwZXhEYXRhTGFiZWxzO1xyXG4gICAgdG9vbHRpcDogQXBleFRvb2x0aXA7XHJcbiAgICBzdGF0ZXM6IEFwZXhTdGF0ZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBcIkltcG9ydCBDb250YWN0IGNlbnRlclwiIHBhbmVsOiBob3cgbWFueSBVQ0NYIGNvbnRhY3QgY2VudGVycyB3ZXJlIGRldGVjdGVkLCBob3cgbWFueVxyXG4gKiBoYXZlIGJlZW4gaW1wb3J0ZWQsIGFuZCBhbiBJbXBvcnQgYnV0dG9uIHRoYXQgYXNrcyB0aGUgaG9zdCB0byBvcGVuIHRoZSBpbXBvcnQgd2l6YXJkLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NjLWltcG9ydC1jb250YWN0LWNlbnRlci1wYW5lbCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW1wb3J0LWNvbnRhY3QtY2VudGVyLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2ltcG9ydC1jb250YWN0LWNlbnRlci1wYW5lbC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbXBvcnRDb250YWN0Q2VudGVyUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIGN1c3RvbWVySWQhOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBob3N0ITogc3RyaW5nO1xyXG4gICAgLyoqIEJhc2UgVVJMIG9mIHRoZSBkY3AgaG9zdCwgd2hpY2ggc2VydmVzIHRoZSBVQ0NYIGFwcGxpY2F0aW9uIGxpc3QuICovXHJcbiAgICBASW5wdXQoKSBkY3BIb3N0ITogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XHJcbiAgICAvKiogU2VydmUgbW9jayBkYXRhIGluc3RlYWQgb2YgY2FsbGluZyB0aGUgVUNDWCBtaWdyYXRpb24gQVBJLiAqL1xyXG4gICAgQElucHV0KCkgdXNlTW9ja0RhdGEgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXNrZWQgZm9yIHRoZSBpbXBvcnQgd2l6YXJkLCBjYXJyeWluZyB0aGUgY29udGFjdCBjZW50ZXJzIGFscmVhZHkgbG9hZGVkIGhlcmUgc29cclxuICAgICAqIHRoZSB3aXphcmQgb3BlbnMgd2l0aG91dCByZWZldGNoaW5nIHRoZW0uIFRoZSBob3N0IHJlbmRlcnNcclxuICAgICAqIGBjYy1pbXBvcnQtY29udGFjdC1jZW50ZXItd2l6YXJkYCBhcyBhIHBhZ2UgaW4gcmVzcG9uc2UuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBpbXBvcnRSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbnRhY3RDZW50ZXJbXT4oKTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNjSW1wb3J0U2VydmljZSA9IGluamVjdChDY0ltcG9ydFNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgcmVhZG9ubHkgdGl0bGUgPSBJTVBPUlRfUEFORUxfVElUTEU7XHJcbiAgICByZWFkb25seSB0b29sdGlwID0gSU1QT1JUX1BBTkVMX1RPT0xUSVA7XHJcblxyXG4gICAgc2VnbWVudHM6IEltcG9ydFBhbmVsU2VnbWVudFtdID0gW107XHJcbiAgICBjaGFydE9wdGlvbnMhOiBQYW5lbENoYXJ0T3B0aW9ucztcclxuICAgIHRvdGFsID0gMDtcclxuICAgIGxvYWRpbmcgPSBmYWxzZTtcclxuICAgIGVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb250YWN0Q2VudGVyczogQ29udGFjdENlbnRlcltdID0gW107XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVuZGVyIGFuIGVtcHR5IGRvbnV0IHVwIGZyb250IHNvIHRoZSB0ZW1wbGF0ZSBuZXZlciByZWFkcyB1bnNldCBjaGFydCBvcHRpb25zLFxyXG4gICAgICAgIC8vIGluY2x1ZGluZyB3aGVuIGxvYWQoKSBiYWlscyBvdXQgYmVjYXVzZSB0aGUgd2lkZ2V0IGhhcyBubyBjcmVkZW50aWFscyB5ZXQuXHJcbiAgICAgICAgdGhpcy5idWlsZFZpZXdNb2RlbCgpO1xyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCByZWxvYWRUcmlnZ2VycyA9IFsnY3VzdG9tZXJJZCcsICdob3N0JywgJ2RjcEhvc3QnLCAndG9rZW4nLCAndXNlTW9ja0RhdGEnXTtcclxuICAgICAgICBpZiAocmVsb2FkVHJpZ2dlcnMuc29tZShpbnB1dCA9PiBjaGFuZ2VzW2lucHV0XSAmJiAhY2hhbmdlc1tpbnB1dF0uZmlyc3RDaGFuZ2UpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkltcG9ydCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmltcG9ydFJlcXVlc3RlZC5lbWl0KHRoaXMuY29udGFjdENlbnRlcnMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBDYWxsIGFmdGVyIGFuIGltcG9ydCBoYXMgcnVuIHNvIHRoZSBkb251dCBwaWNrcyB1cCB0aGUgbmV3IGNvdW50cy4gKi9cclxuICAgIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1c3RvbWVySWQgPSBOdW1iZXIodGhpcy5jdXN0b21lcklkKTtcclxuICAgICAgICB0aGlzLmNjSW1wb3J0U2VydmljZS51c2VNb2NrRGF0YSA9IHRoaXMudXNlTW9ja0RhdGE7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy51c2VNb2NrRGF0YSAmJiAoIWN1c3RvbWVySWQgfHwgIXRoaXMudG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhvc3QpIHtcclxuICAgICAgICAgICAgdGhpcy5jY0ltcG9ydFNlcnZpY2Uuc2V0SG9zdCh0aGlzLmhvc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5kY3BIb3N0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2NJbXBvcnRTZXJ2aWNlLnNldERjcEhvc3QodGhpcy5kY3BIb3N0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudG9rZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jY0ltcG9ydFNlcnZpY2Uuc2V0VG9rZW4odGhpcy50b2tlbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNjSW1wb3J0U2VydmljZS5mZXRjaENvbnRhY3RDZW50ZXJzKGN1c3RvbWVySWQpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5hYmxlIHRvIGxvYWQgdGhlIGNvbnRhY3QgY2VudGVycycsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Y8Q29udGFjdENlbnRlcltdPihbXSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoY29udGFjdENlbnRlcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWN0Q2VudGVycyA9IGNvbnRhY3RDZW50ZXJzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFZpZXdNb2RlbCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkVmlld01vZGVsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudG90YWwgPSB0aGlzLmNvbnRhY3RDZW50ZXJzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IElNUE9SVF9QQU5FTF9TTElDRVMubWFwKHNsaWNlID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmNvbnRhY3RDZW50ZXJzLmZpbHRlcihzbGljZS5tYXRjaCkubGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHNsaWNlLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IHNsaWNlLmNvbG9yLFxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogc2xpY2UudG9vbHRpcCxcclxuICAgICAgICAgICAgICAgIGNvdW50LFxyXG4gICAgICAgICAgICAgICAgcGVyY2VudGFnZTogdGhpcy50b3RhbCA+IDAgPyBNYXRoLnJvdW5kKChjb3VudCAvIHRoaXMudG90YWwpICogMTAwKSA6IDBcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGFydE9wdGlvbnMgPSB0aGlzLmJ1aWxkQ2hhcnRPcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZENoYXJ0T3B0aW9ucygpOiBQYW5lbENoYXJ0T3B0aW9ucyB7XHJcbiAgICAgICAgY29uc3QgY2hhcnRlZCA9IHRoaXMuc2VnbWVudHMuZmlsdGVyKHNlZ21lbnQgPT4gc2VnbWVudC5jb3VudCA+IDApO1xyXG4gICAgICAgIGNvbnN0IGlzRW1wdHkgPSBjaGFydGVkLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2VyaWVzOiBpc0VtcHR5ID8gWzFdIDogY2hhcnRlZC5tYXAoc2VnbWVudCA9PiBzZWdtZW50LmNvdW50KSxcclxuICAgICAgICAgICAgbGFiZWxzOiBpc0VtcHR5ID8gWydObyBjb250YWN0IGNlbnRlcnMnXSA6IGNoYXJ0ZWQubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5sYWJlbCksXHJcbiAgICAgICAgICAgIGNvbG9yczogaXNFbXB0eSA/IFtDSEFSVF9DT0xPUlMud2ViZXhDb250YWN0Q2VudGVyXSA6IGNoYXJ0ZWQubWFwKHNlZ21lbnQgPT4gc2VnbWVudC5jb2xvciksXHJcbiAgICAgICAgICAgIGNoYXJ0OiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9udXQnLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxNTAsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxyXG4gICAgICAgICAgICAgICAgc3BhcmtsaW5lOiB7IGVuYWJsZWQ6IHRydWUgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsZWdlbmQ6IHsgc2hvdzogZmFsc2UgfSxcclxuICAgICAgICAgICAgcGxvdE9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHBpZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZE9uQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRvbnV0OiB7IHNpemU6ICc3MiUnIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF0YUxhYmVsczogeyBlbmFibGVkOiBmYWxzZSB9LFxyXG4gICAgICAgICAgICB0b29sdGlwOiB7IGVuYWJsZWQ6ICFpc0VtcHR5IH0sXHJcbiAgICAgICAgICAgIHN0YXRlczoge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB7IGZpbHRlcjogeyB0eXBlOiAnbm9uZScsIHZhbHVlOiAwIH0gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8dGstY2FyZCBbdGl0bGVdPVwidGl0bGVcIiBbZGVuc2VdPVwidHJ1ZVwiPlxyXG4gIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJjYXJkLXRpdGxlLWFkb3JubWVudFwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJjYy1pbXBvcnQtcGFuZWxfX2luZm9cIiBbbWF0VG9vbHRpcF09XCJ0b29sdGlwXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmZvSWNvblwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiY2FyZC1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19ib2R5XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhZXJyb3I7IGVsc2UgcGFuZWxTdGF0ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19jaGFydFwiPlxyXG4gICAgICAgIDxhcHgtY2hhcnRcclxuICAgICAgICAgIFtzZXJpZXNdPVwiY2hhcnRPcHRpb25zLnNlcmllc1wiXHJcbiAgICAgICAgICBbY2hhcnRdPVwiY2hhcnRPcHRpb25zLmNoYXJ0XCJcclxuICAgICAgICAgIFtsYWJlbHNdPVwiY2hhcnRPcHRpb25zLmxhYmVsc1wiXHJcbiAgICAgICAgICBbY29sb3JzXT1cImNoYXJ0T3B0aW9ucy5jb2xvcnNcIlxyXG4gICAgICAgICAgW2xlZ2VuZF09XCJjaGFydE9wdGlvbnMubGVnZW5kXCJcclxuICAgICAgICAgIFtwbG90T3B0aW9uc109XCJjaGFydE9wdGlvbnMucGxvdE9wdGlvbnNcIlxyXG4gICAgICAgICAgW2RhdGFMYWJlbHNdPVwiY2hhcnRPcHRpb25zLmRhdGFMYWJlbHNcIlxyXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiY2hhcnRPcHRpb25zLnRvb2x0aXBcIlxyXG4gICAgICAgICAgW3N0YXRlc109XCJjaGFydE9wdGlvbnMuc3RhdGVzXCJcclxuICAgICAgICA+PC9hcHgtY2hhcnQ+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNjLWltcG9ydC1wYW5lbF9fY2hhcnQtY2VudGVyXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNjLWltcG9ydC1wYW5lbF9fY2hhcnQtdG90YWxcIj57eyB0b3RhbCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19jaGFydC1jYXB0aW9uXCI+Q29udGFjdCBDZW50ZXI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHVsIGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19sZWdlbmRcIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJjYy1pbXBvcnQtcGFuZWxfX2xlZ2VuZC1pdGVtXCIgKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19sZWdlbmQtbWFya2VyXCIgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJzZWdtZW50LmNvbG9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYy1pbXBvcnQtcGFuZWxfX2xlZ2VuZC1sYWJlbFwiPnt7IHNlZ21lbnQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNjLWltcG9ydC1wYW5lbF9faW5mb1wiIFttYXRUb29sdGlwXT1cInNlZ21lbnQudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5mb0ljb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19sZWdlbmQtdmFsdWVcIj57eyBzZWdtZW50LmNvdW50IHwgbnVtYmVyIH19ICh7eyBzZWdtZW50LnBlcmNlbnRhZ2UgfX0lKTwvc3Bhbj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICA8L3VsPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNwYW5lbFN0YXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19zdGF0ZVwiICpuZ0lmPVwibG9hZGluZ1wiPkxvYWRpbmcgY29udGFjdCBjZW50ZXJz4oCmPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYy1pbXBvcnQtcGFuZWxfX3N0YXRlIGNjLWltcG9ydC1wYW5lbF9fc3RhdGUtLWVycm9yXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBlcnJvclwiPlxyXG4gICAgICAgIFVuYWJsZSB0byBsb2FkIGNvbnRhY3QgY2VudGVycy5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjYy1pbXBvcnQtcGFuZWxfX2FjdGlvbnNcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiY2MtaW1wb3J0LXBhbmVsX19idXR0b25cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGVycm9yXCJcclxuICAgICAgICAoY2xpY2spPVwib25JbXBvcnQoKVwiXHJcbiAgICAgID5cclxuICAgICAgICBJbXBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC90ay1jYXJkPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpbmZvSWNvbj5cclxuICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiNi41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgLz5cclxuICAgIDxwYXRoIGQ9XCJNOCA3LjJ2NFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiAvPlxyXG4gICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjVcIiByPVwiMC44NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiAvPlxyXG4gIDwvc3ZnPlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|