{"version":3,"sources":["webpack://Polecat/webpack/universalModuleDefinition","webpack://Polecat/webpack/bootstrap","webpack://Polecat/delegated ./node_modules/react/index.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/prop-types/index.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/lodash/lodash.js from dll-reference vendor","webpack://Polecat/./src/lib/redux/create-action.js","webpack://Polecat/./src/lib/i18n/translation-key-wrapper.js","webpack://Polecat/./src/lib/i18n/configured-i18n-provider-component.js","webpack://Polecat/./src/lib/i18n/index.js","webpack://Polecat/./src/components/layout/layout-component.js","webpack://Polecat/./src/components/layout/index.js","webpack://Polecat/delegated ./node_modules/classnames/index.js from dll-reference vendor","webpack://Polecat/./src/lib/maps/map-constants.js","webpack://Polecat/./src/lib/tracker.js","webpack://Polecat/./src/lib/global.js","webpack://Polecat/./src/universal/config.js","webpack://Polecat/./src/universal/fetch.js","webpack://Polecat/./ui/src/button/button.js","webpack://Polecat/./ui/src/button/index.js","webpack://Polecat/./src/tracking/schema-types/schema-types.js","webpack://Polecat/./src/tracking/schema-types/index.js","webpack://Polecat/./src/tracking/track-event.js","webpack://Polecat/./src/tracking/index.js","webpack://Polecat/./src/tracking/contexts/client-platform/client-platform-context.js","webpack://Polecat/./src/tracking/contexts/client-platform/index.js","webpack://Polecat/./src/tracking/contexts/organization/organization-context.js","webpack://Polecat/./src/tracking/contexts/user/user-context.js","webpack://Polecat/./src/tracking/define-event/define-event.js","webpack://Polecat/./src/tracking/define-event/index.js","webpack://Polecat/./src/tracking/events/integration-events.js","webpack://Polecat/./src/tracking/events/connection-events.js","webpack://Polecat/./src/tracking/events/dashboard-events.js","webpack://Polecat/./src/tracking/events/screen-events.js","webpack://Polecat/./src/tracking/events/generic-events.js","webpack://Polecat/./src/tracking/events/group-events.js","webpack://Polecat/./src/tracking/events/user-events.js","webpack://Polecat/./src/tracking/events/widget-events.js","webpack://Polecat/./src/tracking/events/loop-events.js","webpack://Polecat/./src/tracking/events/scheduled-post-events.js","webpack://Polecat/./src/tracking/events/index.js","webpack://Polecat/delegated ./node_modules/react-redux/es/index.js from dll-reference vendor","webpack://Polecat/./src/lib/redux/create-error-action.js","webpack://Polecat/./src/universal/spreadsheet-helpers.js","webpack://Polecat/./src/services/management-service.js","webpack://Polecat/./src/universal-config/actions/universal-query-actions.js","webpack://Polecat/./src/universal-config/actions/universal-config-actions.js","webpack://Polecat/delegated ./node_modules/d3/d3.js from dll-reference vendor","webpack://Polecat/./src/universal-config/actions/universal-bootstrap-actions.js","webpack://Polecat/./src/people/helpers.js","webpack://Polecat/./src/groups/actions/groups-actions.js","webpack://Polecat/./ui/src/icon/icon.js","webpack://Polecat/./ui/src/icon/index.js","webpack://Polecat/external \"vendor\"","webpack://Polecat/./src/dashboard/actions/dashboard-actions.js","webpack://Polecat/./src/toast/actions/index.js","webpack://Polecat/delegated ./node_modules/react-dom/index.js from dll-reference vendor","webpack://Polecat/./src/widget-menu/actions/widget-menu-actions.js","webpack://Polecat/./src/services/logo-upload-service.js","webpack://Polecat/./src/services/custom-css-upload-service.js","webpack://Polecat/./src/customize/actions/customize-actions.js","webpack://Polecat/./ui/src/loading-spinner/loading-spinner.js","webpack://Polecat/./ui/src/loading-spinner/index.js","webpack://Polecat/./src/dashboard/themes/theme-constants.js","webpack://Polecat/./src/lib/humanise-number.js","webpack://Polecat/./src/universal-config/graph.js","webpack://Polecat/./src/hoc/hide-body-scrollbars.js","webpack://Polecat/./src/components/modal/index.js","webpack://Polecat/./src/spreadsheet-config/helpers.js","webpack://Polecat/./src/toast/actions/toast-actions.js","webpack://Polecat/./src/universal-config/ui-field-options.js","webpack://Polecat/./src/universal/lib/timespan.js","webpack://Polecat/./src/universal/transformers/universal/helpers.js","webpack://Polecat/./src/lib/url/url.js","webpack://Polecat/./src/router.js","webpack://Polecat/./src/widget/actions/widget-actions.js","webpack://Polecat/./src/universal/transformers/spreadsheet/helpers.js","webpack://Polecat/./src/lib/widget-service.js","webpack://Polecat/./src/hoc/layout-style.scss","webpack://Polecat/./src/lib/gecko-view.js","webpack://Polecat/./src/lib/has-legacy-service.js","webpack://Polecat/./src/data-sources/data-sources-helpers.js","webpack://Polecat/./src/data-source-connector/actions/init-flow-action.js","webpack://Polecat/./src/data-source-connector/actions/data-source-connector-actions.js","webpack://Polecat/./src/salesforce-config/constants/salesforce-config-constants.js","webpack://Polecat/./src/tracking/constants.js","webpack://Polecat/./src/lib/dom-helper.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/selection-helpers.js","webpack://Polecat/./src/visualisation/helpers.js","webpack://Polecat/./src/components/menu/drop-item/drop-item-component.js","webpack://Polecat/./src/components/menu/drop-item/index.js","webpack://Polecat/./src/spreadsheet-config/actions/spreadsheet-config-actions.js","webpack://Polecat/./src/services/active-dashboard-service.js","webpack://Polecat/./src/manage-screens/actions/manage-screens-actions.js","webpack://Polecat/./src/toast/toast-constants.js","webpack://Polecat/./src/universal/transformers/pegasus/helpers.js","webpack://Polecat/./src/file-picker/actions/picker-actions.js","webpack://Polecat/./src/widget/constants/widget-location-constants.js","webpack://Polecat/delegated ./node_modules/react-router/esm/react-router.js from dll-reference vendor","webpack://Polecat/./src/dataset-config/lib/group-fields.js","webpack://Polecat/./src/dataset-config/actions/dataset-actions.js","webpack://Polecat/delegated ./node_modules/react-apollo/lib/react-apollo.esm.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/graphql-tag/src/index.js from dll-reference vendor","webpack://Polecat/./src/widget-menu/widget-menu-style.scss","webpack://Polecat/./src/lib/colour-brewer.js","webpack://Polecat/./src/widget-menu/widget-number-format/widget-number-format-connector.js","webpack://Polecat/./src/widget-menu/widget-number-format/index.js","webpack://Polecat/./src/widget-menu/widget-status-indicator-form/widget-status-indicator-form-connector.js","webpack://Polecat/./src/widget-menu/widget-status-indicator-form/index.js","webpack://Polecat/./src/widget-menu/copy-widget-modal/copy-widget-modal-component.js","webpack://Polecat/./src/widget-menu/copy-widget-modal/copy-widget-modal-connector.js","webpack://Polecat/./src/widget-menu/copy-widget-modal/index.js","webpack://Polecat/./src/compact-config/compact-config-connector.js","webpack://Polecat/./src/compact-config/index.js","webpack://Polecat/./src/widget-menu/widget-menu-positioner/index.js","webpack://Polecat/./src/widget-menu/widget-menu-positioner/widget-menu-positioner-connector.js","webpack://Polecat/./src/widget-menu/widget-menu-component.js","webpack://Polecat/delegated ./node_modules/moment/moment.js from dll-reference vendor","webpack://Polecat/./src/lib/path.js","webpack://Polecat/./src/universal/lib/parse-number.js","webpack://Polecat/./src/components/list-item/list-item-component.js","webpack://Polecat/./src/components/list-item/index.js","webpack://Polecat/./src/customize/components/customize/customize-style.scss","webpack://Polecat/./ui/src/image/image.js","webpack://Polecat/./ui/src/image/index.js","webpack://Polecat/./src/lib/config-mapper.js","webpack://Polecat/./src/universal/services/metadata/facebook-ads.js","webpack://Polecat/./src/universal/services/metadata/freshdesk.js","webpack://Polecat/./src/universal/services/metadata/google-analytics.js","webpack://Polecat/./src/universal/services/metadata/hubspot.js","webpack://Polecat/./src/universal/services/metadata/intercom.js","webpack://Polecat/./src/universal/services/metadata/pipedrive.js","webpack://Polecat/./src/universal/services/metadata/spacecargo.js","webpack://Polecat/./src/universal/services/metadata/zendesk.js","webpack://Polecat/./src/universal/services/metadata/zendesk-chat.js","webpack://Polecat/./src/universal/services/presets/facebook-ads.js","webpack://Polecat/./src/universal/services/presets/freshdesk.js","webpack://Polecat/./src/universal/services/presets/google-analytics.js","webpack://Polecat/./src/universal/services/presets/hubspot.js","webpack://Polecat/./src/universal/services/presets/pipedrive.js","webpack://Polecat/./src/universal/services/presets/spacecargo.js","webpack://Polecat/./src/universal/services/presets/zendesk.js","webpack://Polecat/./src/universal/services/presets/zendesk-chat.js","webpack://Polecat/./src/universal/services/presets/intercom.js","webpack://Polecat/./src/universal/services/universal-service.js","webpack://Polecat/delegated ./node_modules/localforage/dist/localforage.nopromises.js from dll-reference vendor","webpack://Polecat/./ui/src/button-group/button-group.js","webpack://Polecat/./ui/src/button-group/index.js","webpack://Polecat/./src/dashboard/graphql-dashboard-helpers.js","webpack://Polecat/./src/dashboard/dashboard-layout/constants.js","webpack://Polecat/./src/universal-config/reducer/ui-query-reducer/other-ui-query-reducer-methods.js","webpack://Polecat/delegated ./node_modules/react-transition-group/esm/index.js from dll-reference vendor","webpack://Polecat/./src/checkpoints.js","webpack://Polecat/./src/tracking/session-tracker/tracker-helpers.js","webpack://Polecat/./src/tracking/session-tracker/session-tracker.js","webpack://Polecat/./src/tracking/session-tracker/index.js","webpack://Polecat/./src/user/actions/user-actions.js","webpack://Polecat/./src/universal/serializers/visualisations/default.js","webpack://Polecat/./src/universal/serializers/visualisations/line-chart.js","webpack://Polecat/./src/universal/serializers/visualisations/column-chart.js","webpack://Polecat/./src/universal/serializers/visualisations/bar-chart.js","webpack://Polecat/./src/universal/serializers/visualisations/number-serializer.js","webpack://Polecat/./src/universal/serializers/visualisations/leaderboard-serializer.js","webpack://Polecat/./src/universal/serializers/visualisations/geckometer-serializer.js","webpack://Polecat/./src/universal/serializers/visualisations/text-serializer.js","webpack://Polecat/./src/universal/serializers/visualisations/table-serializer.js","webpack://Polecat/./src/universal/serializers/visualisations/index.js","webpack://Polecat/./src/universal/serializers/index.js","webpack://Polecat/./src/components/form/input/input-component.js","webpack://Polecat/./src/components/form/input/index.js","webpack://Polecat/./src/components/tabs/index.js","webpack://Polecat/./src/lib/maps/maps.js","webpack://Polecat/./src/lib/maps/index.js","webpack://Polecat/./src/services/concierge-service/apollo-client.js","webpack://Polecat/./src/universal/services/spreadsheet-service.js","webpack://Polecat/./src/services/permission-service.js","webpack://Polecat/./src/components/menu/drop-item/drop-item-style.scss","webpack://Polecat/./src/dashboard/dashboard-constants.js","webpack://Polecat/./src/visualisation/prop-types.js","webpack://Polecat/./src/components/framed-formatted-number/framed-formatted-number-component.js","webpack://Polecat/./src/components/framed-formatted-number/index.js","webpack://Polecat/./src/actions/helpers.js","webpack://Polecat/delegated ./node_modules/hsluv/hsluv.js from dll-reference vendor","webpack://Polecat/./src/customize/customize-constants.js","webpack://Polecat/./src/components/card/card-style.scss","webpack://Polecat/./src/visualisation/rag-instrument-visualisation/rag-instrument-visualisation-component.js","webpack://Polecat/./src/visualisation/rag-instrument-visualisation/index.js","webpack://Polecat/./src/visualisation/table/table-fixed-padding.js","webpack://Polecat/./src/visualisation/text/no-heading-text-component.js","webpack://Polecat/./src/components/instrument/instrument-helpers.js","webpack://Polecat/./src/lib/service.js","webpack://Polecat/./src/components/list/list-component.js","webpack://Polecat/./src/components/list/index.js","webpack://Polecat/./src/lib/widget-storage.js","webpack://Polecat/./src/lib/user-permissions.js","webpack://Polecat/delegated ./node_modules/moment-timezone/index.js from dll-reference vendor","webpack://Polecat/./src/tracking/contexts/dashboard/dashboard-context.js","webpack://Polecat/./src/tracking/contexts/dashboard/index.js","webpack://Polecat/./src/lib/bugsnag/bugsnag.js","webpack://Polecat/./src/lib/bugsnag/index.js","webpack://Polecat/./src/admin/actions/loop-actions.js","webpack://Polecat/./src/components/table/table-component.js","webpack://Polecat/./src/components/table/index.js","webpack://Polecat/./src/services/dashboard-service.js","webpack://Polecat/./src/components/card/card-component.js","webpack://Polecat/./src/components/card/togglable-card-component.js","webpack://Polecat/./src/components/card/index.js","webpack://Polecat/./src/lib/geckometer.js","webpack://Polecat/./src/instrument-menu/actions/instrument-menu-actions.js","webpack://Polecat/./src/visualisation/table/table-style.scss","webpack://Polecat/./src/hooks/use-can-user-edit.js","webpack://Polecat/./src/hooks/use-dashboard-query-props.js","webpack://Polecat/./src/services/concierge-service/graphql/dashboard-query-fragments.js","webpack://Polecat/./src/hooks/use-current-dashboard-customization.js","webpack://Polecat/./src/hooks/use-current-dashboard.js","webpack://Polecat/./src/hooks/use-drag-helper.js","webpack://Polecat/./src/hooks/use-drag-layer-helper.js","webpack://Polecat/./src/hooks/use-drop-helper.js","webpack://Polecat/./src/hooks/use-feature-flags.js","webpack://Polecat/./src/hooks/use-allowances.js","webpack://Polecat/./src/hooks/use-dashboard-title.js","webpack://Polecat/./src/hooks/use-dashboard-layout-type.js","webpack://Polecat/./src/hooks/use-click-outside-listener.js","webpack://Polecat/./src/hooks/use-mobile-detect.js","webpack://Polecat/./src/hooks/use-enter-and-escape.js","webpack://Polecat/./src/hooks/use-is-free-plan.js","webpack://Polecat/./src/hooks/index.js","webpack://Polecat/./src/components/menu/drop-menu/drop-menu-component.js","webpack://Polecat/./src/components/menu/drop-menu/index.js","webpack://Polecat/./src/widget/edit-widget/actions/edit-widget-actions.js","webpack://Polecat/./src/universal-config/mirage/mirage-actions.js","webpack://Polecat/delegated ./node_modules/@apollo/react-hooks/lib/react-hooks.esm.js from dll-reference vendor","webpack://Polecat/./src/components/service-icon/service-icon-component.js","webpack://Polecat/./src/components/service-icon/index.js","webpack://Polecat/./src/components/bubble/bubble-component.js","webpack://Polecat/./src/components/bubble/index.js","webpack://Polecat/./src/components/info-bubble/info-bubble-component.js","webpack://Polecat/./src/components/info-bubble/index.js","webpack://Polecat/./src/dashboard/box-layout/box-layout-constants.js","webpack://Polecat/./ui/src/button/button.scss","webpack://Polecat/./src/components/menu/drop-menu/drop-menu-style.scss","webpack://Polecat/./src/universal-config/components/status-indicators-form/status-indicators-form-style.scss","webpack://Polecat/./src/universal-config/actions/universal-config-save-actions.js","webpack://Polecat/./src/widget-data/actions/widget-data-actions.js","webpack://Polecat/./ui/src/alert/alert.js","webpack://Polecat/./ui/src/alert/index.js","webpack://Polecat/delegated ./node_modules/react-router-dom/esm/react-router-dom.js from dll-reference vendor","webpack://Polecat/./src/components/confirm-modal/index.js","webpack://Polecat/./src/async-component-loader/async-component-loader-component.js","webpack://Polecat/./src/async-component-loader/async-component-loader-connector.js","webpack://Polecat/./src/async-component-loader/index.js","webpack://Polecat/./src/react-renderer/react-renderer.js","webpack://Polecat/./src/react-renderer/index.js","webpack://Polecat/./src/spreadsheet-config/spreadsheets-config-constants.js","webpack://Polecat/./src/components/tooltip/tooltip-component.js","webpack://Polecat/./src/components/tooltip/index.js","webpack://Polecat/./src/universal-config/universal-config-helpers.js","webpack://Polecat/./src/universal-config/query-helpers.js","webpack://Polecat/./src/data-source-connector/actions/init-data-source-action.js","webpack://Polecat/./src/universal/services/salesforce-service.js","webpack://Polecat/./src/universal/services/index.js","webpack://Polecat/./src/universal/services/dataset-service.js","webpack://Polecat/./src/services/service-picker.js","webpack://Polecat/./src/widget/widget-style.scss","webpack://Polecat/./src/toast/components/toast/toast-root-component.js","webpack://Polecat/./src/toast/components/toast/toast-component.js","webpack://Polecat/./src/toast/components/toast/index.js","webpack://Polecat/./src/spreadsheet-config/actions/spreadsheet-actions.js","webpack://Polecat/./src/lib/maps/map-data.js","webpack://Polecat/./node_modules/immutability-helper/index.js","webpack://Polecat/delegated ./node_modules/react-dnd/dist/esm/index.js from dll-reference vendor","webpack://Polecat/./src/lib/pretty-date-format.js","webpack://Polecat/./src/universal-config/mirage/mirage-helpers.js","webpack://Polecat/./src/visualisation/geckometer/geckometer-style.scss","webpack://Polecat/./src/sharing-menu/sharing-menu-style.scss","webpack://Polecat/./src/lib/user.js","webpack://Polecat/./ui/style/colors.js","webpack://Polecat/./src/dashboard/themes/dark.js","webpack://Polecat/./src/dashboard/themes/light.js","webpack://Polecat/./src/dashboard/themes/dashiesDark.js","webpack://Polecat/./src/dashboard/themes/dashiesLight.js","webpack://Polecat/./src/dashboard/themes/index.js","webpack://Polecat/./src/dashboard/themes/navy.js","webpack://Polecat/./src/dashboard/themes/purple.js","webpack://Polecat/./src/instrument-menu/instrument-menu-constants.js","webpack://Polecat/./src/dashboard/box-layout/helpers.js","webpack://Polecat/./src/dataset-config/components/table-form/table-form-constants.js","webpack://Polecat/./src/whats-new/whats-new-actions/whats-new-actions.js","webpack://Polecat/./src/dataset-config/components/line-chart-form/helpers.js","webpack://Polecat/./src/dataset-config/components/number-form/helpers.js","webpack://Polecat/./src/dataset-config/components/leaderboard-form/helpers.js","webpack://Polecat/./src/dataset-config/components/geckometer-form/helpers.js","webpack://Polecat/./src/dataset-config/components/column-chart-form/helpers.js","webpack://Polecat/./src/dataset-config/components/bar-chart-form/helpers.js","webpack://Polecat/./src/dataset-config/components/get-visualisation-helpers.js","webpack://Polecat/./src/components/grouped-dropdown/grouped-dropdown-styles.scss","webpack://Polecat/./src/services/auth-service.js","webpack://Polecat/./src/universal-config/actions/universal-socket-actions.js","webpack://Polecat/./ui/src/button-group/button-group.scss","webpack://Polecat/./src/components/modal/modal-style.scss","webpack://Polecat/./src/people/actions/people-actions.js","webpack://Polecat/./src/tv-page/components/tv-page-style.scss","webpack://Polecat/./src/visualisation/monitoring/monitoring-style.scss","webpack://Polecat/./src/dashboard/themes/utilities/get-background-color/index.js","webpack://Polecat/./src/dashboard/themes/utilities/get-background-color/get-background-color.js","webpack://Polecat/./src/dashboard/themes/utilities/get-widget-color/index.js","webpack://Polecat/./src/dashboard/themes/utilities/get-widget-color/get-widget-color.js","webpack://Polecat/./src/dashboard/themes/utilities/get-user-theme-variables/get-user-theme-variables.js","webpack://Polecat/./src/dashboard/themes/utilities/get-user-theme-variables/index.js","webpack://Polecat/./src/dashboard/themes/utilities/generate-auto-widget-color/generate-auto-widget-color.js","webpack://Polecat/./src/dashboard/themes/utilities/generate-auto-widget-color/index.js","webpack://Polecat/./src/dashboard/themes/utilities/is-light/index.js","webpack://Polecat/./src/dashboard/themes/utilities/is-light/is-light.js","webpack://Polecat/./src/dashboard/themes/utilities/index.js","webpack://Polecat/./src/data-sources/actions/data-sources-actions.js","webpack://Polecat/./src/universal/index.js","webpack://Polecat/./src/lib/wait-for-state/wait-for-state.js","webpack://Polecat/./src/lib/wait-for-state/index.js","webpack://Polecat/./src/universal-config/reducer/ensure-config-helpers.js","webpack://Polecat/./src/universal-config/reducer/config-helpers.js","webpack://Polecat/./src/components/button-group-visual/button-group-visual-component.js","webpack://Polecat/./src/components/button-group-visual/index.js","webpack://Polecat/./src/visualisation/text/text-style.scss","webpack://Polecat/./ui/src/progress-bar/progress-bar.js","webpack://Polecat/./ui/src/progress-bar/index.js","webpack://Polecat/./src/components/menu/menu-label/menu-label-component.js","webpack://Polecat/./src/components/menu/menu-label/index.js","webpack://Polecat/./src/dashboard/container-layout/container-layout-constants.js","webpack://Polecat/delegated ./node_modules/redux/es/redux.js from dll-reference vendor","webpack://Polecat/./src/components/form/toggle-input/toggle-input-component.js","webpack://Polecat/./src/components/form/toggle-input/index.js","webpack://Polecat/delegated ./node_modules/react-intl/lib/index.es.js from dll-reference vendor","webpack://Polecat/./src/universal/serializers/services/spreadsheets.js","webpack://Polecat/./src/universal/serializers/services/salesforce.js","webpack://Polecat/./src/universal/serializers/services/datasets.js","webpack://Polecat/./src/universal/serializers/services/database.js","webpack://Polecat/./src/universal/serializers/services/universal.js","webpack://Polecat/./src/universal/serializers/services/index.js","webpack://Polecat/./src/components/promo-card/promo-card-component.js","webpack://Polecat/./src/dataset-config/actions/dataset-action-helpers.js","webpack://Polecat/./src/visualisation/funnel/funnel-style.scss","webpack://Polecat/./ui/src/playground/rule-based-visualisation-picker/rule-based-visualisation-picker.scss","webpack://Polecat/./src/salesforce-config/helpers.js","webpack://Polecat/./src/lib/auth-strategy.js","webpack://Polecat/./src/lib/debounce-promise.js","webpack://Polecat/delegated ./node_modules/js-cookie/src/js.cookie.js from dll-reference vendor","webpack://Polecat/./src/universal-config/reducer/ui-options-reducer/ui-options-reducer.js","webpack://Polecat/./src/universal-config/reducer/ui-options-reducer/index.js","webpack://Polecat/./src/services/concierge-service/error-types.js","webpack://Polecat/./src/services/app-service.js","webpack://Polecat/./src/components/form/select/select-component.js","webpack://Polecat/./src/components/form/select/index.js","webpack://Polecat/./src/admin/helpers.js","webpack://Polecat/./src/lib/type-scale/scale.js","webpack://Polecat/./src/lib/type-scale/type-scale.js","webpack://Polecat/./src/lib/type-scale/index.js","webpack://Polecat/./src/components/promo-card/index.js","webpack://Polecat/./src/database-config/components/query-editor-modal/query-editor-modal-style.scss","webpack://Polecat/./src/data-source-connector/components/services/database-connector/database-connector-form/database-connector-form-style.scss","webpack://Polecat/./src/components/form/unit-control/unit-control-component.js","webpack://Polecat/./src/components/form/unit-control/index.js","webpack://Polecat/./src/components/form/advanced-settings/advanced-settings-component.js","webpack://Polecat/./src/components/form/advanced-settings/index.js","webpack://Polecat/./src/lib/delay/delay.js","webpack://Polecat/./src/lib/delay/index.js","webpack://Polecat/./src/components/warning/warning-component.js","webpack://Polecat/./src/components/warning/index.js","webpack://Polecat/./src/tv-page/actions/tv-page-actions.js","webpack://Polecat/./src/tv-page/constants/tv-page-constants.js","webpack://Polecat/./src/lib/strip-newlines.js","webpack://Polecat/./src/components/form/editable-input/editable-input-component.js","webpack://Polecat/./src/components/form/editable-input/editable-component.js","webpack://Polecat/./src/universal-config/components/status-indicators-form/status-indicators-form-component.js","webpack://Polecat/./src/universal-config/components/status-indicators-form/index.js","webpack://Polecat/./src/components/error/error-component.js","webpack://Polecat/./src/components/error/index.js","webpack://Polecat/./src/dashboard/container-layout/actions/container-layout-actions.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/column-chart-form/helpers.js","webpack://Polecat/./src/universal-config/reducer/other-universal-config-reducer-methods.js","webpack://Polecat/./src/data-source-connector/actions/fetch-files-action.js","webpack://Polecat/./src/spreadsheet-config-beta/actions/dynamic-config-actions.js","webpack://Polecat/./src/account/actions/account-actions.js","webpack://Polecat/./src/visualisation/feed/feed-row-styles.scss","webpack://Polecat/./src/dashboard/mobile-layout/mobile-layout-style.scss","webpack://Polecat/./src/components/form/auto-input/auto-input-style.scss","webpack://Polecat/./src/components/form/inline-settings/inline-settings-component.js","webpack://Polecat/./src/components/form/inline-settings/index.js","webpack://Polecat/./src/universal/transformers/spreadsheet/series-helpers.js","webpack://Polecat/./src/universal/transformers/shared/number-format.js","webpack://Polecat/./src/universal/transformers/compose-transformers.js","webpack://Polecat/./src/universal/transformers/spreadsheet/bar.js","webpack://Polecat/./src/universal/transformers/spreadsheet/line.js","webpack://Polecat/./src/universal/transformers/per-visualisation/number/comparison.js","webpack://Polecat/./src/universal/transformers/spreadsheet/status-indicators.js","webpack://Polecat/./src/universal/transformers/spreadsheet/number.js","webpack://Polecat/./src/universal/transformers/spreadsheet/leaderboard.js","webpack://Polecat/./src/universal/transformers/spreadsheet/geckometer.js","webpack://Polecat/./src/universal/transformers/spreadsheet/text.js","webpack://Polecat/./src/universal/transformers/per-visualisation/text/text.js","webpack://Polecat/./src/universal/transformers/per-visualisation/table/table.js","webpack://Polecat/./src/universal/transformers/spreadsheet/table.js","webpack://Polecat/./src/universal/transformers/shared/goal.js","webpack://Polecat/./src/universal/transformers/per-visualisation/line/line.js","webpack://Polecat/./src/universal/transformers/per-visualisation/line/yaxisminmax.js","webpack://Polecat/./src/universal/transformers/pegasus/line.js","webpack://Polecat/./src/universal/transformers/per-visualisation/bar/bar.js","webpack://Polecat/./src/universal/transformers/pegasus/bar.js","webpack://Polecat/./src/universal/transformers/pegasus/column.js","webpack://Polecat/./src/universal/transformers/shared/progress-indicator.js","webpack://Polecat/./src/universal/transformers/shared/status-indicators.js","webpack://Polecat/./src/universal/transformers/per-visualisation/number/number.js","webpack://Polecat/./src/universal/transformers/pegasus/number.js","webpack://Polecat/./src/universal/transformers/per-visualisation/leaderboard/leaderboard.js","webpack://Polecat/./src/universal/transformers/pegasus/leaderboard.js","webpack://Polecat/./src/universal/transformers/per-visualisation/geckometer/geckometer.js","webpack://Polecat/./src/universal/transformers/per-visualisation/geckometer/minmax.js","webpack://Polecat/./src/universal/transformers/pegasus/geckometer.js","webpack://Polecat/./src/universal/transformers/pegasus/table.js","webpack://Polecat/./src/universal/transformers/database/helpers.js","webpack://Polecat/./src/universal/transformers/shared/clean-transformed-data.js","webpack://Polecat/./src/universal/transformers/database/line.js","webpack://Polecat/./src/universal/transformers/database/bar.js","webpack://Polecat/./src/universal/transformers/database/column.js","webpack://Polecat/./src/universal/transformers/database/number.js","webpack://Polecat/./src/universal/transformers/database/leaderboard.js","webpack://Polecat/./src/universal/transformers/database/geckometer.js","webpack://Polecat/./src/universal/transformers/database/table.js","webpack://Polecat/./src/universal/transformers/datasets/helpers.js","webpack://Polecat/./src/universal/transformers/datasets/line.js","webpack://Polecat/./src/universal/transformers/datasets/number.js","webpack://Polecat/./src/universal/transformers/datasets/bar.js","webpack://Polecat/./src/universal/transformers/datasets/leaderboard.js","webpack://Polecat/./src/universal/transformers/datasets/geckometer.js","webpack://Polecat/./src/universal/transformers/datasets/table.js","webpack://Polecat/./src/universal/transformers/universal/line.js","webpack://Polecat/./src/universal/transformers/universal/number.js","webpack://Polecat/./src/universal/transformers/universal/bar.js","webpack://Polecat/./src/universal/transformers/universal/geckometer.js","webpack://Polecat/./src/universal/transformers/universal/leaderboard.js","webpack://Polecat/./src/universal/transformers/universal/table.js","webpack://Polecat/./src/universal/transformers/per-visualisation/feed/feed.js","webpack://Polecat/./src/universal/transformers/universal/feed.js","webpack://Polecat/./src/universal/transformers/index.js","webpack://Polecat/./src/lib/popup-window.js","webpack://Polecat/./src/services/loop-service.js","webpack://Polecat/./src/admin/actions/admin-actions.js","webpack://Polecat/./src/customize/helpers.js","webpack://Polecat/./src/lib/mobile/mobile.js","webpack://Polecat/./src/lib/mobile/index.js","webpack://Polecat/./src/widget-header/widget-header-style.scss","webpack://Polecat/./src/admin/components/titlebar/titlebar.scss","webpack://Polecat/./src/tracking/segment-tracker/segment-tracker.js","webpack://Polecat/./src/tracking/segment-tracker/index.js","webpack://Polecat/./node_modules/he/he.js","webpack://Polecat/./src/universal-config/components/universal-compact-config/index.js","webpack://Polecat/./src/compact-config/services/database/import-config.js","webpack://Polecat/./src/compact-config/services/database/index.js","webpack://Polecat/./src/compact-config/compact-config-component.js","webpack://Polecat/./src/universal/lib/csrf.js","webpack://Polecat/./src/universal/serializers/helpers.js","webpack://Polecat/./src/universal/lib/queries-universal.js","webpack://Polecat/./src/universal-config/persist-config-helpers.js","webpack://Polecat/./src/lib/auth-url.js","webpack://Polecat/./src/lib/oauth.js","webpack://Polecat/./src/lib/defer.js","webpack://Polecat/./src/intercom/intercom-provider.js","webpack://Polecat/./src/intercom/intercom-consumer.js","webpack://Polecat/./src/intercom/index.js","webpack://Polecat/./src/components/status-label/status-label-component.js","webpack://Polecat/./src/components/status-label/index.js","webpack://Polecat/./ui/src/icon/icon.scss","webpack://Polecat/./src/components/form/input/input-style.scss","webpack://Polecat/./src/components/modal/modal-component.js","webpack://Polecat/./src/hoc/on-mount.js","webpack://Polecat/./src/visualisation/list/list-style.scss","webpack://Polecat/./src/components/select-dropdown/select-dropdown-component.js","webpack://Polecat/./src/components/select-dropdown/index.js","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-style-injector.js","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-item.js","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-component.js","webpack://Polecat/./src/visualisation/leaderboard/index.js","webpack://Polecat/./src/account/lib/plan-helpers.js","webpack://Polecat/./src/components/link/link-component.js","webpack://Polecat/./src/components/link/index.js","webpack://Polecat/./src/visualisation/number/number-goal-style.scss","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/progress-indicator/progress-indicator-styles.scss","webpack://Polecat/./src/visualisation/pie-chart/pie-chart-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/instrument-fragment.graphql","webpack://Polecat/./src/admin/reducer/users-dashboards-reducer.js","webpack://Polecat/./src/lib/body-renderer/index.js","webpack://Polecat/./src/lib/body-renderer/body-renderer.js","webpack://Polecat/./src/imports/actions/imports-actions.js","webpack://Polecat/./src/services/concierge-service/graphql/dashboard-with-containers-query.graphql","webpack://Polecat/./src/visualisation/map/map-component.js","webpack://Polecat/./src/visualisation/map/topo-json-map-component.js","webpack://Polecat/./src/visualisation/map/map-loader-component.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/actions/delete-data-source-confirm-modal-actions.js","webpack://Polecat/./src/visualisation/visualisation-constants.js","webpack://Polecat/./src/visualisation/visualisation-wrapper-component.js","webpack://Polecat/./src/visualisation/index.js","webpack://Polecat/./src/dataset-config/components/table-form/helpers.js","webpack://Polecat/./src/salesforce-config/report-types.js","webpack://Polecat/./src/spreadsheet-config-beta/actions/selection-actions.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/column-chart-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/bar-chart-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/line-chart-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/number-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/get-visualisation-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/leaderboard-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/geckometer-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/text-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations/table-helpers.js","webpack://Polecat/./src/admin/reducer/admin-reducer.js","webpack://Polecat/./src/admin/reducer/index.js","webpack://Polecat/./ui/src/loading-spinner/loading-spinner.scss","webpack://Polecat/./src/widget-menu/widget-menu-modal/widget-menu-modal-style.scss","webpack://Polecat/./src/components/form/duration-input/duration-input-styles.scss","webpack://Polecat/./src/components/form/select/select-style.scss","webpack://Polecat/./src/widget-menu/copy-widget-modal/copy-widget-modal-style.scss","webpack://Polecat/./src/components/tooltip/tooltip-style.scss","webpack://Polecat/./src/visualisation/shared/comparison-value/comparison-value-style.scss","webpack://Polecat/./src/visualisation/responsive-number/layouts/horizontal/horizontal-number-styles.scss","webpack://Polecat/./src/visualisation/table/sortable-cell/sortable-cell-style.scss","webpack://Polecat/./src/components/slider/slider-style.scss","webpack://Polecat/./src/visualisation/ragcolumn/ragcolumn-style.scss","webpack://Polecat/./src/toast/components/toast/toast-style.scss","webpack://Polecat/./src/in-app-help/in-app-help-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/dashboards-query.graphql","webpack://Polecat/./src/services/concierge-service/graphql-helpers.js","webpack://Polecat/./src/customize/filter-by-allowances/filter-by-allowances.js","webpack://Polecat/./src/customize/filter-by-allowances/index.js","webpack://Polecat/./src/lib/loop.js","webpack://Polecat/./src/components/absolute-positioned/absolute-positioned-component.js","webpack://Polecat/./src/components/absolute-positioned/index.js","webpack://Polecat/./src/universal-config/mirage/activated-mirage-integrations.js","webpack://Polecat/./src/components/presets/preset-icon/preset-icon-component.js","webpack://Polecat/./src/components/presets/preset-icon/index.js","webpack://Polecat/./src/components/presets/preset-list-item/preset-list-item-component.js","webpack://Polecat/./src/components/presets/preset-list-item/index.js","webpack://Polecat/./src/dashboard/components/dashboard-footer/dashboard-footer-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/dashboard-query.graphql","webpack://Polecat/./src/visualisation/line-chart/line-chart-component.js","webpack://Polecat/./src/widget-title/widget-title-component.js","webpack://Polecat/./src/services/concierge-service/graphql/dashboard-tracking-props-query.graphql","webpack://Polecat/./src/visualisation/geckometer/geckometer-component.js","webpack://Polecat/./src/components/form/label/label-component.js","webpack://Polecat/./src/components/form/label/index.js","webpack://Polecat/./src/imports/reducer/imports-reducer.js","webpack://Polecat/./node_modules/fscreen/lib/index.js","webpack://Polecat/./src/components/framed-formatted-number/framed-formatted-number-style.scss","webpack://Polecat/./src/visualisation/responsive-number/layouts/vertical/vertical-number-styles.scss","webpack://Polecat/./src/visualisation/responsive-number/layouts/mobile/mobile-number-styles.scss","webpack://Polecat/./src/components/swatch/index.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/default-data-source-connector-style.scss","webpack://Polecat/./src/components/list-item/list-item-style.scss","webpack://Polecat/./src/components/info-bubble/info-bubble-style.scss","webpack://Polecat/delegated ./node_modules/rxjs/Observable.js from dll-reference vendor","webpack://Polecat/./src/service-list/restricted-service-list/restricted-service-list-style.scss","webpack://Polecat/./src/components/instrument/instrument.scss","webpack://Polecat/./src/imports/importing-data-modal/importing-data-modal-style.scss","webpack://Polecat/./src/dashboard/container-layout/container-layout-helpers.js","webpack://Polecat/./src/universal/lib/extendable-builtin-gen.js","webpack://Polecat/./src/salesforce-config/actions/salesforce-config-actions.js","webpack://Polecat/./src/hoc/wait-for.js","webpack://Polecat/./src/compact-config/dashies-compact-config-component.js","webpack://Polecat/./src/components/conditional-loading-indicator/conditional-loading-indicator-component.js","webpack://Polecat/./src/components/conditional-loading-indicator/index.js","webpack://Polecat/./src/services/concierge-service/graphql/numberFormat-fragment.graphql","webpack://Polecat/./src/services/concierge-service/graphql/statusIndicator-fragment.graphql","webpack://Polecat/./ui/src/playground/border/border.js","webpack://Polecat/./ui/src/playground/border/index.js","webpack://Polecat/./src/universal/query-helpers.js","webpack://Polecat/./src/universal/lib/round-to-power-of-ten.js","webpack://Polecat/./src/universal-config/components/universal-compact-config/import-universal-compact-config.js","webpack://Polecat/./src/compact-config/compact-config-style.scss","webpack://Polecat/./src/services/mirage-service/mirage-cache.js","webpack://Polecat/./src/services/mirage-service/service-data/index.js","webpack://Polecat/./src/services/mirage-service/service-data/ga2.js","webpack://Polecat/./src/services/mirage-service/mirage-service.js","webpack://Polecat/./src/services/mirage-service/index.js","webpack://Polecat/./src/widget-menu/widget-menu-modal/widget-menu-modal-component.js","webpack://Polecat/./src/widget-menu/widget-menu-modal/index.js","webpack://Polecat/./src/salesforce-config/reducer/salesforce-reducer.js","webpack://Polecat/./src/salesforce-config/reducer/index.js","webpack://Polecat/./src/compact-config/components/panel-container/panel-container-component.js","webpack://Polecat/./src/compact-config/components/panel-container/index.js","webpack://Polecat/./ui/src/icon-badge/icon-badge.js","webpack://Polecat/./ui/src/icon-badge/index.js","webpack://Polecat/delegated ./node_modules/apollo-boost/lib/bundle.esm.js from dll-reference vendor","webpack://Polecat/./node_modules/object-hash/dist/object_hash.js","webpack://Polecat/./src/components/form/advanced-settings/advanced-settings-style.scss","webpack://Polecat/./ui/src/playground/border/border.scss","webpack://Polecat/./src/widget-menu/widget-status-indicator-form/widget-status-indicator-form-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/dashboard-customization-queries.graphql","webpack://Polecat/./src/database-config/database-connections-query.graphql","webpack://Polecat/./src/admin/components/modals/admin-modal.scss","webpack://Polecat/./src/sharing-menu/slack-menu/slack-menu-component-style.scss","webpack://Polecat/./src/service-list/components/integrations-page-footer/integrations-page-footer-style.scss","webpack://Polecat/./src/spreadsheet-config/actions/selection-actions.js","webpack://Polecat/./src/visualisation/series-presenter/series-presenter.js","webpack://Polecat/./src/visualisation/series-presenter/index.js","webpack://Polecat/delegated ./node_modules/history/esm/history.js from dll-reference vendor","webpack://Polecat/./src/dashboard/graphql-actions/graphql-dashboard-actions.js","webpack://Polecat/./src/lib/placeholder.js","webpack://Polecat/./src/visualisation/shared/spark-line/spark-line-component.js","webpack://Polecat/./src/visualisation/shared/spark-line/index.js","webpack://Polecat/./src/visualisation/number/number-goal-component.js","webpack://Polecat/./src/visualisation/number/number-label-component.js","webpack://Polecat/./src/visualisation/number/number-component.js","webpack://Polecat/./src/visualisation/number/oriented-number-component.js","webpack://Polecat/./src/components/swatch/base-swatch/base-swatch-component.js","webpack://Polecat/./src/components/swatch/base-swatch/index.js","webpack://Polecat/./src/components/swatch/swatch-component.js","webpack://Polecat/./src/toast/toast-storage.js","webpack://Polecat/./src/sharing-menu/actions/sharing-menu-actions.js","webpack://Polecat/./ui/src/alert/alert.scss","webpack://Polecat/./src/admin/components/empty-states/empty-state-style.scss","webpack://Polecat/./ui/src/progress-bar/progress-bar.scss","webpack://Polecat/./src/components/form/toggle-input/toggle-input-style.scss","webpack://Polecat/./src/widget-title/widget-title-style.scss","webpack://Polecat/./src/account/components/plans-modal/plan-style.scss","webpack://Polecat/./src/components/draggable-context/draggable-context-component.js","webpack://Polecat/./src/components/draggable-context/index.js","webpack://Polecat/./node_modules/little-loader/lib/little-loader.js","webpack://Polecat/delegated ./node_modules/react-dnd-html5-backend/dist/esm/index.js from dll-reference vendor","webpack://Polecat/./src/visualisation/line-chart/index.js","webpack://Polecat/./src/visualisation/line-chart/helpers.js","webpack://Polecat/./src/lib/sharing.js","webpack://Polecat/./src/lib/fuzzy-search/index.js","webpack://Polecat/./src/lib/fuzzy-search/fuzzy-search.js","webpack://Polecat/./src/components/menu/header/header-component.js","webpack://Polecat/./src/components/menu/header/index.js","webpack://Polecat/./src/components/menu/separator/index.js","webpack://Polecat/./src/components/menu/separator/separator-component.js","webpack://Polecat/./src/components/grouped-dropdown/grouped-dropdown-list-component.js","webpack://Polecat/./src/components/grouped-dropdown/grouped-dropdown-component.js","webpack://Polecat/./src/components/grouped-dropdown/index.js","webpack://Polecat/./src/lib/dispatch-event.js","webpack://Polecat/./src/hoc/tooltip.js","webpack://Polecat/./src/components/menu/drop-menu-select-label/drop-menu-select-label-component.js","webpack://Polecat/./src/components/menu/drop-menu-select-label/index.js","webpack://Polecat/./src/components/confirm-modal/confirm-modal-component.js","webpack://Polecat/./src/hoc/connect-to-history.js","webpack://Polecat/./src/visualisation/pie-chart/pie-chart-component.js","webpack://Polecat/delegated ./node_modules/react-helmet/lib/Helmet.js from dll-reference vendor","webpack://Polecat/./src/components/pricing-gate/pricing-gate-component.js","webpack://Polecat/./src/components/pricing-gate/pricing-gate-provider.js","webpack://Polecat/./src/components/pricing-gate/index.js","webpack://Polecat/./src/components/marketing-button/marketing-button-style.scss","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-component-style.scss","webpack://Polecat/./src/compact-config/components/label/label-component.js","webpack://Polecat/./src/compact-config/components/label/index.js","webpack://Polecat/./src/lib/i18n/format-message.js","webpack://Polecat/./src/components/config-filters/timespan-helper.js","webpack://Polecat/delegated ./node_modules/isomorphic-fetch/fetch-npm-browserify.js from dll-reference vendor","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/index.js","webpack://Polecat/delegated ./node_modules/react-tabs/esm/index.js from dll-reference vendor","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/line-chart-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/bar-chart-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/number-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/leaderboard-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/geckometer-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/text-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/get-visualisation-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/actions/spreadsheet-actions.js","webpack://Polecat/./src/compact-config/components/input/input-component.js","webpack://Polecat/./src/compact-config/components/input/index.js","webpack://Polecat/./src/visualisation/table/sortable-cell/sortable-cell-component.js","webpack://Polecat/./src/visualisation/table/sortable-cell/index.js","webpack://Polecat/./src/visualisation/table/table-component.js","webpack://Polecat/./src/visualisation/column-chart/column-chart-component.js","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-style.scss","webpack://Polecat/./src/visualisation/map/map-style.scss","webpack://Polecat/./src/visualisation/feed/feed-style.scss","webpack://Polecat/delegated ./node_modules/intl-messageformat/lib/index.js from dll-reference vendor","webpack://Polecat/./src/lib/history-provider.js","webpack://Polecat/./src/salesforce-config/constants/salesforce-refresh-intervals.js","webpack://Polecat/./src/components/instrument/actions/instrument-data-actions.js","webpack://Polecat/./src/account/reducer/account-reducer.js","webpack://Polecat/./src/account/reducer/index.js","webpack://Polecat/./src/lib/hex-code/hex-code.js","webpack://Polecat/./src/customize/reducer/customize-reducer.js","webpack://Polecat/./src/customize/reducer/index.js","webpack://Polecat/./src/dashboard/reducer/dashboard-reducer.js","webpack://Polecat/./src/dashboard/reducer/index.js","webpack://Polecat/./src/admin/reducer/all-dashboards-reducer.js","webpack://Polecat/./src/admin/reducer/all-loops-reducer.js","webpack://Polecat/./src/admin/reducer/all-data-sources-reducer.js","webpack://Polecat/./src/lib/update-by-id/index.js","webpack://Polecat/./src/lib/update-by-id/update-by-id.js","webpack://Polecat/./src/admin/reducer/all-users-reducer.js","webpack://Polecat/./src/dashboard/container-layout/reducer/container-layout-reducer.js","webpack://Polecat/./src/dashboard/container-layout/reducer/index.js","webpack://Polecat/./src/dataset-config/reducer/index.js","webpack://Polecat/./src/data-source-connector/reducer/data-source-connector-reducer.js","webpack://Polecat/./src/data-source-connector/reducer/index.js","webpack://Polecat/./src/data-sources/reducer/data-sources-reducer.js","webpack://Polecat/./src/data-sources/reducer/index.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/reducer/default-data-source-connector-reducer.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/reducer/index.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/reducer/delete-data-source-confirm-modal-reducer.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/reducer/index.js","webpack://Polecat/./src/widget/edit-widget/reducer/edit-widget-reducer.js","webpack://Polecat/./src/widget/edit-widget/reducer/index.js","webpack://Polecat/./src/file-picker/reducer/file-picker-reducer.js","webpack://Polecat/./src/file-picker/reducer/index.js","webpack://Polecat/./src/dashboard/graphql-reducer/graphql-dashboard-reducer.js","webpack://Polecat/./src/dashboard/graphql-reducer/index.js","webpack://Polecat/./src/manage-screens/reducer/manage-screens-reducer.js","webpack://Polecat/./src/manage-screens/reducer/index.js","webpack://Polecat/./src/notification-bar/reducer/notification-reducer.js","webpack://Polecat/./src/notification-bar/reducer/index.js","webpack://Polecat/./src/people/reducer/people-reducer.js","webpack://Polecat/./src/people/reducer/index.js","webpack://Polecat/./src/components/presets/presets-reducer.js","webpack://Polecat/./src/reducers/service-accounts-reducer/service-accounts-reducer.js","webpack://Polecat/./src/reducers/service-accounts-reducer/index.js","webpack://Polecat/./src/spreadsheet-config/reducer/spreadsheet-config-reducer-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/sanitize-config.js","webpack://Polecat/./src/spreadsheet-config/reducer/spreadsheet-config-reducer.js","webpack://Polecat/./src/spreadsheet-config/reducer/index.js","webpack://Polecat/./src/toast/reducer/toast-reducer.js","webpack://Polecat/./src/toast/reducer/index.js","webpack://Polecat/./src/tv-page/reducer/tv-page-reducer.js","webpack://Polecat/./src/tv-page/reducer/index.js","webpack://Polecat/./src/universal-config/reducer/ui-query-reducer/ui-query-reducer.js","webpack://Polecat/./src/universal-config/reducer/universal-config-reducer.js","webpack://Polecat/./src/universal-config/reducer/index.js","webpack://Polecat/./src/user/reducer/user-reducer.js","webpack://Polecat/./src/user/reducer/index.js","webpack://Polecat/./src/whats-new/whats-new-reducer/whats-new-reducer.js","webpack://Polecat/./src/whats-new/whats-new-reducer/index.js","webpack://Polecat/./src/widget/reducer/widgets-reducer.js","webpack://Polecat/./src/widget/reducer/index.js","webpack://Polecat/./src/widget-data/reducer/widget-data-reducer.js","webpack://Polecat/./src/widget-data/reducer/index.js","webpack://Polecat/./src/widget-menu/reducer/widget-menu-reducer.js","webpack://Polecat/./src/widget-menu/reducer/index.js","webpack://Polecat/./src/instrument-menu/reducer/instrument-menu-reducer.js","webpack://Polecat/./src/instrument-menu/reducer/index.js","webpack://Polecat/./src/components/instrument/reducer/instrument-data-reducer.js","webpack://Polecat/./src/components/instrument/reducer/index.js","webpack://Polecat/./src/init/root-reducer.js","webpack://Polecat/./src/lib/action-error-handler.js","webpack://Polecat/./src/lib/redux/middleware/handle-error-middleware.js","webpack://Polecat/./src/lib/redux/enhancer.js","webpack://Polecat/./src/init/get-redux-store.js","webpack://Polecat/./src/init/init-app.js","webpack://Polecat/./src/init/idempotent-init-app.js","webpack://Polecat/./src/init/index.js","webpack://Polecat/./src/salesforce-config/components/line-chart-form/helpers.js","webpack://Polecat/./src/salesforce-config/components/number-form/helpers.js","webpack://Polecat/./src/salesforce-config/get-visualisation-helpers.js","webpack://Polecat/./src/salesforce-config/components/column-chart-form/helpers.js","webpack://Polecat/./src/salesforce-config/components/bar-chart-form/helpers.js","webpack://Polecat/./src/salesforce-config/components/leaderboard-form/helpers.js","webpack://Polecat/./src/salesforce-config/components/geckometer-form/helpers.js","webpack://Polecat/./src/salesforce-config/components/table-form/helpers.js","webpack://Polecat/./src/components/slider/slider-component.js","webpack://Polecat/./src/components/slider/index.js","webpack://Polecat/./src/visualisation/shared/variable-font-size/variable-font-size-component.js","webpack://Polecat/./src/visualisation/shared/variable-font-size/index.js","webpack://Polecat/./src/visualisation/text/text-component.js","webpack://Polecat/./src/components/external-link/external-link-component.js","webpack://Polecat/./src/components/external-link/external-link-connector.js","webpack://Polecat/./src/components/external-link/index.js","webpack://Polecat/./node_modules/localforage/dist/localforage.js","webpack://Polecat/./src/components/form/inline-settings/inline-settings-style.scss","webpack://Polecat/./src/components/menu/drop-menu-select-label/drop-menu-select-label-style.scss","webpack://Polecat/./src/components/select-dropdown/select-dropdown-style.scss","webpack://Polecat/./src/hoc/hide-body-scrollbars-style.scss","webpack://Polecat/./src/components/form/editable-input/editable-style.scss","webpack://Polecat/./src/visualisation/table/table-data-limiter-style.scss","webpack://Polecat/./src/components/swatch/labelled-swatch/labelled-swatch-component.js","webpack://Polecat/./src/components/presets/preset-list-item/preset-list-item-styles.scss","webpack://Polecat/./src/components/promo-card/promo-card-style.scss","webpack://Polecat/./src/components/sortable-list-item/sortable-list-item-style.scss","webpack://Polecat/./src/components/swatch/base-swatch/base-swatch-style.scss","webpack://Polecat/./src/components/color-picker/color-picker-input/color-picker-input-style.scss","webpack://Polecat/./src/components/presets/preset-panel/preset-panel-styles.scss","webpack://Polecat/./src/mobile-menu/mobile-menu-style.scss","webpack://Polecat/delegated ./node_modules/webpack/buildin/global.js from dll-reference vendor","webpack://Polecat/./src/lib/pusher-adapter.js","webpack://Polecat/./src/lib/push-manager.js","webpack://Polecat/./src/imports/helpers.js","webpack://Polecat/./src/lib/component-picker.js","webpack://Polecat/./src/hoc/menu.js","webpack://Polecat/./src/visualisation/highchart/defaults.js","webpack://Polecat/./src/visualisation/highchart/highchart-component.js","webpack://Polecat/./src/visualisation/highchart/highchart-iframe-component.js","webpack://Polecat/./src/visualisation/highchart/highchart-loader-component.js","webpack://Polecat/./src/visualisation/highchart/index.js","webpack://Polecat/./src/widget-menu/widget-number-format/widget-number-format-component.js","webpack://Polecat/./src/visualisation/text/legacy-text-transformer-component.js","webpack://Polecat/./src/visualisation/text/index.js","webpack://Polecat/./src/universal-config/components/universal-dropdown/universal-dropdown-component.js","webpack://Polecat/./src/universal-config/components/universal-dropdown/index.js","webpack://Polecat/./src/spreadsheet-config-beta/can-use-beta.js","webpack://Polecat/./src/hoc/layout.js","webpack://Polecat/./src/components/presets/presets-actions.js","webpack://Polecat/./node_modules/redux-thunk/es/index.js","webpack://Polecat/./src/lib/copy-to-clipboard.js","webpack://Polecat/./src/visualisation/funnel/funnel-component.js","webpack://Polecat/./src/visualisation/funnel/funnel-data-limiter.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-item-style.scss","webpack://Polecat/./src/masthead/base-masthead/base-masthead-style.scss","webpack://Polecat/./src/account/components/plans-modal/plans-modal-style.scss","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/spreadsheets-connector.scss","webpack://Polecat/./src/masthead/account-menu/account-menu-style.scss","webpack://Polecat/./src/hoc/dimensions/dimensions-component.js","webpack://Polecat/./src/hoc/dimensions/index.js","webpack://Polecat/./src/components/sortable/sortable-component.js","webpack://Polecat/./src/components/sortable/sortable-preview-component.js","webpack://Polecat/./src/components/sortable/index.js","webpack://Polecat/./node_modules/core-js/stable/index.js","webpack://Polecat/delegated ./node_modules/core-js/es/index.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/core-js/web/index.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/core-js/internals/path.js from dll-reference vendor","webpack://Polecat/./node_modules/regenerator-runtime/runtime.js","webpack://Polecat/./src/components/sortable/sortable-style.scss","webpack://Polecat/./src/components/relative-time/relative-time-component.js","webpack://Polecat/./src/components/relative-time/index.js","webpack://Polecat/./src/visualisation/shared/comparison-value/comparison-value-component.js","webpack://Polecat/./src/visualisation/shared/comparison-value/index.js","webpack://Polecat/./src/visualisation/table/table-data-limiter-component.js","webpack://Polecat/./src/widget/table-wrapper.js","webpack://Polecat/./src/visualisation/table/index.js","webpack://Polecat/./src/hoc/tv-mode/tv-mode-component.js","webpack://Polecat/./src/hoc/tv-mode/tv-mode-connector.js","webpack://Polecat/./src/hoc/tv-mode/index.js","webpack://Polecat/./src/visualisation/layouts/bar-chart-layout.js","webpack://Polecat/./src/visualisation/bar-chart/bar-chart-component.js","webpack://Polecat/./src/visualisation/table/table-alignment-injector-component.js","webpack://Polecat/./src/compact-config/components/input-dropdown-group/input-dropdown-group-style.scss","webpack://Polecat/./src/visualisation/bar-chart/bar-chart-style.scss","webpack://Polecat/./src/visualisation/number/number-label-style.scss","webpack://Polecat/./src/visualisation/responsive-number/components/label/label-styles.scss","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/comparison/comparison-styles.scss","webpack://Polecat/delegated ./node_modules/react-dropzone/dist/index.js from dll-reference vendor","webpack://Polecat/./src/lib/web-worker/promise-worker/promise-worker.js","webpack://Polecat/./src/dashboard/customization-applicator/css-worker-component.js","webpack://Polecat/./src/dashboard/customization-applicator/customization-applicator-component.js","webpack://Polecat/./src/widget/controlled-widget/helpers.js","webpack://Polecat/./src/widget/controlled-widget/controlled-widget-component.js","webpack://Polecat/./src/components/menu/drop-item-with-description/drop-item-with-description-component.js","webpack://Polecat/./src/components/menu/drop-item-with-description/index.js","webpack://Polecat/./src/components/presets/preset-list/preset-list-component.js","webpack://Polecat/./src/toast/components/toast/toast-root-style.scss","webpack://Polecat/./src/manage-screens/components/device-list-item-style.scss","webpack://Polecat/./src/components/bubble/bubble-style.scss","webpack://Polecat/./src/components/table/table-style.scss","webpack://Polecat/./src/widget-footer/widget-footer-style.scss","webpack://Polecat/./src/dashboard/box-layout/css-scale/css-scale-style.scss","webpack://Polecat/./src/components/button-group-visual/button-group-visual-style.scss","webpack://Polecat/./src/masthead/widget-masthead/widget-masthead-style.scss","webpack://Polecat/./src/file-picker/file-row/file-row-style.scss","webpack://Polecat/./src/manage-screens/components/add-screen-view-style.scss","webpack://Polecat/./src/masthead/add-widget-button/add-widget-button-style.scss","webpack://Polecat/./src/admin/components/modals/dashboard-permissions-modal/dashboard-permissions-modal-style.scss","webpack://Polecat/./src/components/instrument/instrument-header/instrument-header-style.scss","webpack://Polecat/./src/widget/celebration-widget/celebration-widget-styles.scss","webpack://Polecat/./src/compact-config/dashies-compact-config-query.js","webpack://Polecat/./src/compact-config/dashies-compact-config-connector.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/constants/words.js","webpack://Polecat/./src/components/form/advanced-settings-table/advanced-settings-table-component.js","webpack://Polecat/./src/components/form/advanced-settings-table/index.js","webpack://Polecat/./src/dataset-config/actions/dataset-save-actions.js","webpack://Polecat/./src/config-wrapper/action-picker.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/line-chart-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/column-chart-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/bar-chart-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/number-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/leaderboard-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/geckometer-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/text-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/get-visualisation-helpers.js","webpack://Polecat/delegated ./node_modules/fuse.js/dist/fuse.js from dll-reference vendor","webpack://Polecat/./src/widget-menu/widget-status-indicator-form/widget-status-indicator-form-component.js","webpack://Polecat/./src/universal-config/components/universal-compact-config/universal-compact-config-style.scss","webpack://Polecat/./src/widget-menu/widget-menu-positioner/widget-menu-positioner-component.js","webpack://Polecat/./src/dataset-config/reducer/dataset-reducer.js","webpack://Polecat/./src/dataset-config/lib/filters.js","webpack://Polecat/./src/services/data-source-service.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component/config-forms/table-form/helpers.js","webpack://Polecat/./src/spreadsheet-config/spreadsheet-config-component-v2/config-forms/table-form/helpers.js","webpack://Polecat/./src/notification-bar/actions/notification-actions.js","webpack://Polecat/./src/components/clamp-lines/clamp-lines-component.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/visualisations-validator.js","webpack://Polecat/./src/spreadsheet-config-beta/providers/validation-provider/validation-helpers.js","webpack://Polecat/./src/spreadsheet-config-beta/providers/validation-provider/validation-provider.js","webpack://Polecat/./src/spreadsheet-config-beta/providers/validation-provider/validation-provider-connector.js","webpack://Polecat/./src/spreadsheet-config-beta/providers/validation-provider/index.js","webpack://Polecat/./src/components/form/duration-input/duration-input-component.js","webpack://Polecat/./src/components/form/duration-input/index.js","webpack://Polecat/./node_modules/ua-parser-js/src/ua-parser.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/index.js","webpack://Polecat/./src/components/form/unit-control/unit-control-style.scss","webpack://Polecat/./src/components/menu/header/header-style.scss","webpack://Polecat/./src/components/menu/separator/separator-style.scss","webpack://Polecat/./src/components/form/advanced-settings-table/advanced-settings-table-styles.scss","webpack://Polecat/./ui/src/icon-badge/icon-badge.scss","webpack://Polecat/./src/components/confirm-modal/confirm-modal-style.scss","webpack://Polecat/./src/components/warning/warning-style.scss","webpack://Polecat/./src/compact-config/components/panel-container/panel-container-style.scss","webpack://Polecat/./src/widget-menu/widget-menu-positioner/widget-menu-positioner-style.scss","webpack://Polecat/delegated ./vendors/pusher.js from dll-reference vendor","webpack://Polecat/./src/components/popover/popover-component.js","webpack://Polecat/./src/database-config/database-client/index.js","webpack://Polecat/./src/database-config/database-client/database-client.js","webpack://Polecat/./src/database-config/components/query-editor/import-query-editor.js","webpack://Polecat/./src/database-config/visualisations-validator.js","webpack://Polecat/./src/database-config/components/query-editor-modal/query-editor-modal-component-content.js","webpack://Polecat/./src/database-config/components/query-editor-modal/query-editor-modal-component.js","webpack://Polecat/./src/components/color-picker/color-picker-input/color-picker-input-component.js","webpack://Polecat/./src/components/color-picker/color-picker-input/index.js","webpack://Polecat/./src/components/swatch/color-picker-swatch/color-picker-swatch-component.js","webpack://Polecat/./src/components/swatch/color-picker-swatch/index.js","webpack://Polecat/./src/components/menu-legacy/drop-link/drop-link-component.js","webpack://Polecat/./src/components/menu-legacy/drop-link/index.js","webpack://Polecat/./src/components/menu-legacy/drop-item/drop-item-component.js","webpack://Polecat/./src/components/menu-legacy/drop-item/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/trial/database-trial-style.scss","webpack://Polecat/./src/hoc/render-every.js","webpack://Polecat/./src/dashboard/components/footer-clock/footer-clock-component.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/loop-modal-style.scss","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/user-permissions-modal-style.scss","webpack://Polecat/./src/imports/imports-indicator-style.scss","webpack://Polecat/./src/visualisation/column-chart/index.js","webpack://Polecat/./src/visualisation/bar-chart/index.js","webpack://Polecat/./src/visualisation/funnel/index.js","webpack://Polecat/./src/visualisation/geckometer/index.js","webpack://Polecat/./src/visualisation/map/index.js","webpack://Polecat/./src/visualisation/rag/index.js","webpack://Polecat/./src/visualisation/rag/rag-component.js","webpack://Polecat/./src/visualisation/pie-chart/index.js","webpack://Polecat/./src/visualisation/list/index.js","webpack://Polecat/./src/visualisation/clock/index.js","webpack://Polecat/./src/visualisation/clock/clock-component.js","webpack://Polecat/./src/visualisation/bullet/index.js","webpack://Polecat/./src/visualisation/bullet/bullet-component.js","webpack://Polecat/./src/visualisation/number/legacy-number-transformer-component.js","webpack://Polecat/./src/visualisation/responsive-number/dimensions-injector.js","webpack://Polecat/./src/visualisation/responsive-number/index.js","webpack://Polecat/./src/visualisation/number/index.js","webpack://Polecat/./src/components/clamp-lines/index.js","webpack://Polecat/./src/visualisation/feed/feed-row-component.js","webpack://Polecat/./src/visualisation/feed/feed-component.js","webpack://Polecat/./src/visualisation/list/list-item-component.js","webpack://Polecat/./src/visualisation/list/list-items-component.js","webpack://Polecat/./src/visualisation/list/list-component.js","webpack://Polecat/./src/visualisation/feed/feed-connector.js","webpack://Polecat/./src/visualisation/feed/index.js","webpack://Polecat/./src/visualisation/ragcolumn/ragcolumn-component.js","webpack://Polecat/./src/visualisation/ragcolumn/index.js","webpack://Polecat/./src/visualisation/highchart-or-line-chart/highchart-or-line-chart-component.js","webpack://Polecat/./src/visualisation/highchart-or-line-chart/index.js","webpack://Polecat/./src/visualisation/monitoring/monitoring-component.js","webpack://Polecat/./src/visualisation/monitoring/index.js","webpack://Polecat/./src/visualisation/image/image-component.js","webpack://Polecat/./src/visualisation/image/index.js","webpack://Polecat/./ui/src/image/image.scss","webpack://Polecat/./src/components/form/editable-input/editable-input-style.scss","webpack://Polecat/./src/components/popover/index.js","webpack://Polecat/./src/spreadsheet-config-beta/helpers/path.js","webpack://Polecat/./src/visualisation/line-chart/line-chart-style.scss","webpack://Polecat/./src/visualisation/column-chart/column-chart-style.scss","webpack://Polecat/./src/components/filter-loader/index.js","webpack://Polecat/./src/components/filter-loader/filter-loader-component.js","webpack://Polecat/./src/components/form/auto-input/auto-input-component.js","webpack://Polecat/./src/components/form/auto-input/auto-input-text-collection.js","webpack://Polecat/./src/components/form/auto-input/index.js","webpack://Polecat/./src/database-config/database-connection-create.graphql","webpack://Polecat/./src/components/presets/preset-list/preset-list-styles.scss","webpack://Polecat/./src/components/presets/preset-icon/preset-icon-style.scss","webpack://Polecat/./src/widget/widget-wrapper/resizable-widget-style.scss","webpack://Polecat/./src/components/data-source-list-item/data-source-list-item-style.scss","webpack://Polecat/./src/components/swatch/labelled-swatch/labelled-swatch-style.scss","webpack://Polecat/delegated ./node_modules/react-color/lib/components/common/index.js from dll-reference vendor","webpack://Polecat/./src/customize/components/theme-picker/custom-css-upload/custom-css-upload-style.scss","webpack://Polecat/./src/components/confetti/confetti-component.js","webpack://Polecat/./src/components/confetti/index.js","webpack://Polecat/./src/components/marketing-button/marketing-button-component.js","webpack://Polecat/./src/components/marketing-button/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/intro-panel/intro-panel-styles.scss","webpack://Polecat/./src/empty-dashboard/empty-dashboard-style.scss","webpack://Polecat/./src/first-run/first-run-style.scss","webpack://Polecat/./src/dataset-config/components/preview-modal/preview-modal-style.scss","webpack://Polecat/./src/widget-loader/bar-loading-animation-styles.scss","webpack://Polecat/./src/preview/components/empty-visualisation/empty-visualisation-style.scss","webpack://Polecat/./src/widget/widget-connector.js","webpack://Polecat/./src/widget/visualisation/visualisation-component.js","webpack://Polecat/./src/widget/visualisation/visualisation-connector.js","webpack://Polecat/./src/widget/visualisation/index.js","webpack://Polecat/./src/compact-config/visualisation-preview/visualisation-preview-connector.js","webpack://Polecat/./src/universal-config/components/visualisation-preview/import-visualisation-preview.js","webpack://Polecat/./src/universal-config/components/visualisation-preview/index.js","webpack://Polecat/./src/compact-config/visualisation-preview/index.js","webpack://Polecat/./src/widget/visualised-widget-component.js","webpack://Polecat/./src/widget/visualised-widget-connector.js","webpack://Polecat/./src/components/menu-legacy/drop-menu/drop-menu-component.js","webpack://Polecat/./src/components/menu-legacy/drop-menu/index.js","webpack://Polecat/./src/hoc/mobile-detector/mobile-detector-component.js","webpack://Polecat/./src/hoc/mobile-detector/index.js","webpack://Polecat/./ui/src/playground/blob/blob.js","webpack://Polecat/./ui/src/playground/blob/index.js","webpack://Polecat/./src/file-picker/file-picker/file-picker-style.scss","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list-panel/connection-list-panel-style.scss","webpack://Polecat/./src/data-source-connector/data-source-popover/data-source-popover-style.scss","webpack://Polecat/./src/whats-new/whats-new-style.scss","webpack://Polecat/./src/toast/components/toast-launcher/toast-launcher.scss","webpack://Polecat/./src/components/add-dashboard-modal/add-dashboard-modal-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/scheduled-posts-query.graphql","webpack://Polecat/./src/service-list/components/service-pill/service-pill-style.scss","webpack://Polecat/./src/preview/components/preview/preview-style.scss","webpack://Polecat/./src/components/drag-interaction/drag-interaction-component.js","webpack://Polecat/./src/components/drag-interaction/index.js","webpack://Polecat/delegated ./node_modules/webpack/buildin/module.js from dll-reference vendor","webpack://Polecat/./src/visualisation/responsive-number/responsive-number-constants.js","webpack://Polecat/./src/visualisation/responsive-number/prop-types.js","webpack://Polecat/./src/visualisation/responsive-number/responsive-number-helpers.js","webpack://Polecat/./src/visualisation/responsive-number/components/label/label-component.js","webpack://Polecat/./src/visualisation/responsive-number/components/label/index.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/comparison/comparison-component.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/comparison/index.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/progress-indicator/progress-indicator-component.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/progress-indicator/progress-indicator-helpers.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/progress-indicator/index.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/sparkline/sparkline-component.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/sparkline/index.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/secondary-visualisation-component.js","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/index.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/vertical/vertical-number-component.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/vertical/index.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/horizontal/horizontal-number-component.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/horizontal/index.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/mobile/mobile-number-component.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/mobile/mobile-number-helpers.js","webpack://Polecat/./src/visualisation/responsive-number/layouts/mobile/index.js","webpack://Polecat/./src/visualisation/responsive-number/transform-payload/transform-payload-helpers.js","webpack://Polecat/./src/visualisation/responsive-number/responsive-number-component.js","webpack://Polecat/./src/public-path.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/lib/LoremIpsum.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/constants/formats.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/constants/lineEndings.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/lib/generator.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/capitalize.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/isNode.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/isReactNative.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/isWindows.js","webpack://Polecat/delegated ./node_modules/process/browser.js from dll-reference vendor","webpack://Polecat/./node_modules/lorem-ipsum/dist/constants/platforms.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/makeArrayOfLength.js","webpack://Polecat/./node_modules/lorem-ipsum/dist/util/makeArrayOfStrings.js","webpack://Polecat/delegated ./node_modules/invariant/browser.js from dll-reference vendor","webpack://Polecat/./src/components/service-icon/service-icon-style.scss","webpack://Polecat/./node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js","webpack://Polecat/./src/dashboard/helpers/dashboard-helpers.js","webpack://Polecat/./src/compact-config/components/input-dropdown-group/input-dropdown-group-component.js","webpack://Polecat/./src/universal-config/components/universal-dropdown/universal-dropdown-style.scss","webpack://Polecat/./src/compact-config/components/input/input-style.scss","webpack://Polecat/./src/compact-config/components/label/label-style.scss","webpack://Polecat/./src/visualisation/shared/spark-line/spark-line-style.scss","webpack://Polecat/./src/visualisation/number/number-style.scss","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/sparkline/sparkline-styles.scss","webpack://Polecat/./src/visualisation/responsive-number/secondary-visualisation/secondary-visualisation-styles.scss","webpack://Polecat/./src/visualisation/responsive-number/responsive-number-style.scss","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-tv-style.scss","webpack://Polecat/./src/visualisation/leaderboard/leaderboard-desktop-style.scss","webpack://Polecat/./node_modules/hsl-to-hex/index.js","webpack://Polecat/./src/visualisation/image/image-style.scss","webpack://Polecat/delegated ./node_modules/intl/index.js from dll-reference vendor","webpack://Polecat/./src/tv-page/components/tv-page-component.js","webpack://Polecat/./src/tv-page/components/tv-page-pin-component.js","webpack://Polecat/./src/tv-page/components/tv-page-pin-connector.js","webpack://Polecat/./src/tv-page/components/tv-page-empty-component.js","webpack://Polecat/./src/tv-page/index.js","webpack://Polecat/./src/components/instrument/widget-helpers/widget-helpers.js","webpack://Polecat/./ui/src/playground/rule-based-visualisation-picker/rule-based-visualisation-picker.js","webpack://Polecat/./ui/src/playground/rule-based-visualisation-picker/helpers.js","webpack://Polecat/./ui/src/playground/rule-based-visualisation-picker/constants.js","webpack://Polecat/./ui/src/playground/rule-based-visualisation-picker/index.js","webpack://Polecat/./src/dashboard/dashboard-loading-spinner/dashboard-loading-spinner-component.js","webpack://Polecat/./src/dashboard/dashboard-loading-spinner/index.js","webpack://Polecat/./src/lib/toString.js","webpack://Polecat/./src/components/link/link-style.scss","webpack://Polecat/./src/data-source-connector/components/data-source-header-styles.scss","webpack://Polecat/./src/components/status-label/status-label-style.scss","webpack://Polecat/./src/components/error/error-style.scss","webpack://Polecat/./src/components/list/list-style.scss","webpack://Polecat/./src/database-config/database-query.graphql","webpack://Polecat/./src/components/form/text-area/text-area-style.scss","webpack://Polecat/./src/components/form/label/label-style.scss","webpack://Polecat/./src/components/menu/menu-label/menu-label-style.scss","webpack://Polecat/./src/manage-screens/components/manage-screens-view-style.scss","webpack://Polecat/./src/in-app-help/in-app-help-component.js","webpack://Polecat/delegated ./node_modules/react-autowhatever/dist/index.js from dll-reference vendor","webpack://Polecat/./src/components/filter-loader/filter-loader-style.scss","webpack://Polecat/delegated ./node_modules/color/index.js from dll-reference vendor","webpack://Polecat/./src/components/icon-upgrade/icon-upgrade-style.scss","webpack://Polecat/./src/customize/components/theme-picker/premade-theme-picker/premade-theme-picker.scss","webpack://Polecat/delegated ./node_modules/react-color/lib/index.js from dll-reference vendor","webpack://Polecat/./src/customize/components/theme-picker/custom-theme-editor/custom-theme-editor-style.scss","webpack://Polecat/./src/customize/components/promo-cards/promo-cards-component.js","webpack://Polecat/./src/hoc/allowed.js","webpack://Polecat/./src/components/swatch/labelled-swatch/index.js","webpack://Polecat/./src/components/icon-upgrade/index.js","webpack://Polecat/./src/components/icon-upgrade/icon-upgrade-component.js","webpack://Polecat/./src/customize/components/theme-picker/premade-theme-picker/premade-theme-picker-component.js","webpack://Polecat/./src/customize/components/theme-picker/premade-theme-picker/index.js","webpack://Polecat/./src/customize/components/widget-style-picker/widget-style-picker-component.js","webpack://Polecat/./src/customize/components/widget-style-picker/index.js","webpack://Polecat/./src/customize/components/widget-style-picker/widget-style-picker-connector.js","webpack://Polecat/./src/customize/components/theme-picker/custom-theme-editor/custom-theme-editor-component.js","webpack://Polecat/./src/customize/components/theme-picker/custom-theme-editor/index.js","webpack://Polecat/./src/customize/components/theme-picker/custom-css-upload/custom-css-upload-component.js","webpack://Polecat/./src/customize/components/theme-picker/custom-css-upload/index.js","webpack://Polecat/./src/customize/components/theme-picker/theme-picker-component.js","webpack://Polecat/./src/customize/components/theme-picker/index.js","webpack://Polecat/./src/customize/components/theme-picker/theme-picker-connector.js","webpack://Polecat/./src/customize/components/widget-title-size-card/widget-title-size-card-component.js","webpack://Polecat/./src/customize/components/widget-title-size-card/index.js","webpack://Polecat/./src/customize/components/dashboard-footer-control/dashboard-footer-control-component.js","webpack://Polecat/./src/customize/components/dashboard-footer-control/index.js","webpack://Polecat/./src/customize/components/dashboard-footer-control/dashboard-footer-control-connector.js","webpack://Polecat/./src/customize/components/font-size-control/font-size-control-component.js","webpack://Polecat/./src/customize/components/font-size-control/index.js","webpack://Polecat/./src/customize/components/grid-size-control/grid-size-control-component.js","webpack://Polecat/./src/customize/components/grid-size-control/index.js","webpack://Polecat/./src/customize/components/grid-size-control/grid-size-control-connector.js","webpack://Polecat/./src/customize/components/customize/customize-component.js","webpack://Polecat/./src/widget-footer/widget-footer.js","webpack://Polecat/./src/widget-footer/index.js","webpack://Polecat/./src/widget-title/widget-title-connector.js","webpack://Polecat/./src/widget-title/widget-title-universal-connector.js","webpack://Polecat/./src/widget-title/index.js","webpack://Polecat/./src/widget-menu/widget-menu-connector.js","webpack://Polecat/./src/widget-menu/index.js","webpack://Polecat/./src/widget-menu/widget-menu-overlay/widget-menu-overlay.js","webpack://Polecat/./src/widget-menu/widget-menu-overlay/index.js","webpack://Polecat/./src/widget-header/widget-header-component.js","webpack://Polecat/./src/widget-header/widget-header-connector.js","webpack://Polecat/./src/widget-header/index.js","webpack://Polecat/./src/widget/widget-wrapper/resizable-widget-component.js","webpack://Polecat/./src/widget/widget-wrapper/resizable-widget-connector.js","webpack://Polecat/./src/widget/widget-wrapper/widget-wrapper-component.js","webpack://Polecat/./src/widget/widget-wrapper/widget-wrapper-connector.js","webpack://Polecat/./src/widget/widget-wrapper/index.js","webpack://Polecat/./src/dashboard/box-layout/css-scale/css-scale-component.js","webpack://Polecat/./src/dashboard/box-layout/css-scale/index.js","webpack://Polecat/./src/components/scroll-to/scroll-to-component.js","webpack://Polecat/./src/components/scroll-to/index.js","webpack://Polecat/./src/widget/widget-component.js","webpack://Polecat/./src/admin/pages/data-sources-group-page/components/data-source-drop-menu/data-source-drop-menu-component.js","webpack://Polecat/./src/admin/pages/data-sources-group-page/components/data-source-drop-menu/index.js","webpack://Polecat/./src/components/data-source-list-item/data-source-list-item-component.js","webpack://Polecat/./src/components/form/text-area/text-area-component.js","webpack://Polecat/./src/components/form/text-area/index.js","webpack://Polecat/./src/manage-screens/components/device-list-item-component.js","webpack://Polecat/./src/manage-screens/components/manage-screens-view-component.js","webpack://Polecat/./src/components/sortable-list/sortable-list-component.js","webpack://Polecat/./src/components/sortable-list/index.js","webpack://Polecat/./src/components/sortable-list-item/sortable-list-item-component.js","webpack://Polecat/./src/components/sortable-list-item/index.js","webpack://Polecat/./src/account/components/plans-modal/basic-plan-confirm-modal/basic-plan-confirm-modal-style.scss","webpack://Polecat/./src/file-picker/breadcrumb/breadcrumb-style.scss","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-style.scss","webpack://Polecat/./src/data-source-connector/components/services/dataset-connector/dataset-connector.scss","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list/connection-list-style.scss","webpack://Polecat/./src/masthead/dashboard-picker/dashboard-picker-style.scss","webpack://Polecat/./src/components/menu/drop-item-with-description/drop-item-with-description-style.scss","webpack://Polecat/./src/dashboard/container-layout/set-container-layout-button/set-container-layout-button-styles.scss","webpack://Polecat/./src/service-list/components/inactive-list/inactive-list-style.scss","webpack://Polecat/./src/admin/pages/people-page/people-page-style.scss","webpack://Polecat/./src/widget/mobile-widget/mobile-widget-styles.scss","webpack://Polecat/./src/dashboard/dashboard-tracking-props/dashboard-tracking-props-component.js","webpack://Polecat/./src/dashboard/dashboard-tracking-props/index.js","webpack://Polecat/./src/data-source-connector/components/data-source-header-component.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/account-connector-form/account-connector-form-component.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/account-connector-form/index.js","webpack://Polecat/./src/data-source-connector/components/data-source-educational-footer/index.js","webpack://Polecat/./src/data-source-connector/components/data-source-educational-footer/data-source-educational-footer-component.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/default-data-source-connector-component.js","webpack://Polecat/./src/components/trial-modal/trial-modal-component.js","webpack://Polecat/./src/components/trial-modal/index.js","webpack://Polecat/./src/components/form-field/form-field-component.js","webpack://Polecat/./src/components/form-field/index.js","webpack://Polecat/./src/components/form-field/form-field-style.scss","webpack://Polecat/./src/data-source-connector/components/data-source-educational-footer/data-source-educational-footer-styles.scss","webpack://Polecat/./src/edit-container-dashboard-page/dashboard-settings-modal/timezone-settings/timezones.js","webpack://Polecat/./src/database-config/database-connection-delete.graphql","webpack://Polecat/./src/lib/is-polecat-service.js","webpack://Polecat/./src/admin/components/admin-style.scss","webpack://Polecat/./src/widget-loader/bar-loading-animation.js","webpack://Polecat/./src/widget-loader/widget-loader-component.js","webpack://Polecat/./src/widget-loader/index.js","webpack://Polecat/./src/widget/widget-errors/service-account-not-found-error/service-account-not-found-error-component.js","webpack://Polecat/./src/widget/widget-errors/service-account-not-found-error/service-account-not-found-error-connector.js","webpack://Polecat/./src/widget/widget-errors/service-account-not-found-error/index.js","webpack://Polecat/./src/widget/widget-errors/oauth-token-expired-or-invalid-error/oauth-token-expired-or-invalid-error-component.js","webpack://Polecat/./src/widget/widget-errors/oauth-token-expired-or-invalid-error/oauth-token-expired-or-invalid-error-connector.js","webpack://Polecat/./src/widget/widget-errors/oauth-token-expired-or-invalid-error/index.js","webpack://Polecat/./src/widget/widget-importing/widget-importing-component.js","webpack://Polecat/./src/widget/widget-importing/index.js","webpack://Polecat/./src/widget/widget-errors/no-data-pushed-error/no-data-pushed-error-component.js","webpack://Polecat/./src/widget/widget-errors/no-data-pushed-error/index.js","webpack://Polecat/./src/widget/widget-errors/widget-data-error/widget-data-error-component.js","webpack://Polecat/./src/widget/widget-errors/widget-data-error/index.js","webpack://Polecat/./src/hoc/offline-detector/offline-detector-component.js","webpack://Polecat/./src/hoc/offline-detector/index.js","webpack://Polecat/./src/components/offline-banner/offline-banner-component.js","webpack://Polecat/./src/components/offline-banner/index.js","webpack://Polecat/./src/account-selector/account-selector-style.scss","webpack://Polecat/./src/file-picker/list/list-style.scss","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-popover/salesforce-popover-style.scss","webpack://Polecat/./src/data-source-connector/components/services/spreadsheet-file-import/spreadsheet-file-import-style.scss","webpack://Polecat/./src/components/nav-logo-button/nav-logo-button-style.scss","webpack://Polecat/./src/components/trial-modal/trial-modal-component-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/scheduled-posts-mutations.graphql","webpack://Polecat/./src/masthead/dashboard-options/dashboard-options-style.scss","webpack://Polecat/./src/masthead/dashboard-masthead/dashboard-masthead-style.scss","webpack://Polecat/./src/masthead/breadcrumb-dropdown/breadcrumb-dropdown-style.scss","webpack://Polecat/./src/service-list/service-list-style.scss","webpack://Polecat/./src/widget-loader/widget-loader-styles.scss","webpack://Polecat/./node_modules/hsl-to-rgb-for-reals/converter.js","webpack://Polecat/./style/index.scss","webpack://Polecat/delegated ./node_modules/rxjs/add/observable/fromEvent.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/mergeMap.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/map.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/filter.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/takeUntil.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/take.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/mergeMapTo.js from dll-reference vendor","webpack://Polecat/delegated ./node_modules/rxjs/add/operator/merge.js from dll-reference vendor","webpack://Polecat/./src/data-source-connector/default-data-source-connector/default-data-source-connector-connector.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/index.js","webpack://Polecat/./src/account-selector/account-selector-component.js","webpack://Polecat/./src/account-selector/index.js","webpack://Polecat/./src/account-selector/account-selector-connector.js","webpack://Polecat/./src/file-picker/file-row/file-row-component.js","webpack://Polecat/./src/file-picker/file-row/index.js","webpack://Polecat/./src/file-picker/folder-row/folder-row-component.js","webpack://Polecat/./src/file-picker/folder-row/index.js","webpack://Polecat/./src/file-picker/folder-row/folder-row-connector.js","webpack://Polecat/./src/file-picker/list/list-component.js","webpack://Polecat/./src/file-picker/list/index.js","webpack://Polecat/./src/file-picker/breadcrumb/breadcrumb-component.js","webpack://Polecat/./src/file-picker/breadcrumb/index.js","webpack://Polecat/./src/file-picker/file-picker/file-picker-component.js","webpack://Polecat/./src/file-picker/file-picker/file-picker-connector.js","webpack://Polecat/./src/file-picker/index.js","webpack://Polecat/./src/lib/comparer-generator.js","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-popover/salesforce-popover-component.js","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-popover/index.js","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-connector-connector.js","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/index.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-item-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheet-file-import/spreadsheet-file-import-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheet-file-import/index.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheet-file-import/spreadsheet-file-import-connector.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-link-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/content/content-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/spreadsheets-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/spreadsheets-connector-connector.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/index.js","webpack://Polecat/./src/data-source-connector/components/services/dataset-connector/dataset-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/dataset-connector/dataset-connector-connector.js","webpack://Polecat/./src/data-source-connector/components/services/dataset-connector/index.js","webpack://Polecat/./src/components/presets/preset-list/index.js","webpack://Polecat/./src/components/presets/preset-panel/preset-panel-component.js","webpack://Polecat/./src/components/presets/preset-panel/index.js","webpack://Polecat/./src/components/presets/preset-panel/preset-panel-connector.js","webpack://Polecat/./src/data-source-connector/components/services/universal-connector/universal-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/universal-connector/universal-connector-connector.js","webpack://Polecat/./src/data-source-connector/components/services/universal-connector/index.js","webpack://Polecat/./src/data-source-connector/components/services/heirloom-connector/heirloom-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/heirloom-connector/index.js","webpack://Polecat/./src/components/align/align-component.js","webpack://Polecat/./src/components/align/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/database-connections-query.js","webpack://Polecat/./src/database-config/components/query-editor-modal/index.js","webpack://Polecat/./src/database-config/constants.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/database-connector-form/database-connector-form-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/database-connector-form/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/intro-panel/intro-panel-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/intro-panel/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list/connection-list-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list/connection-list-connector.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list-panel/connection-list-panel-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/connection-list-panel/index.js","webpack://Polecat/./src/database-config/database-tracking-provider/database-tracking-provider.js","webpack://Polecat/./src/database-config/database-tracking-provider/index.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/trial/database-trial-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/database-connector-component.js","webpack://Polecat/./src/data-source-connector/components/services/database-connector/index.js","webpack://Polecat/./src/data-source-connector/connector-picker.js","webpack://Polecat/./src/data-source-connector/data-source-popover/data-source-popover-component.js","webpack://Polecat/./src/data-source-connector/data-source-popover/index.js","webpack://Polecat/./src/data-source-connector/data-source-connector-component.js","webpack://Polecat/./src/data-source-connector/data-source-connector-connector.js","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/sidebar/sidebar-link-style.scss","webpack://Polecat/./src/data-source-connector/components/services/spreadsheets-connector/components/content/content-component.scss","webpack://Polecat/./src/components/align/align-style.scss","webpack://Polecat/./src/components/wistia-embed/wistia-embed-style.scss","webpack://Polecat/./src/masthead/masthead-upgrade-link/masthead-upgrade-link-component-style.scss","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-timezone/scheduled-posts-timezone-component-style.scss","webpack://Polecat/./src/components/conditional-disabled-overlay/conditional-disabled-overlay-style.scss","webpack://Polecat/./src/widget/widget-errors/no-data-pushed-error/no-data-pushed-error-style.scss","webpack://Polecat/./src/components/user-initials/user-initials-style.scss","webpack://Polecat/./src/admin/pages/people-page/components/person-permissions-select/person-permission-select-style.scss","webpack://Polecat/./src/admin/pages/people-page/components/person/person-style.scss","webpack://Polecat/./src/admin/components/list-heading/list-heading-style.scss","webpack://Polecat/./src/admin/pages/data-sources-group-page/data-sources-page-style.scss","webpack://Polecat/./src/mobile-menu/offline-menu-message/offline-menu-message-style.scss","webpack://Polecat/./src/dashboard/dashboard-layout/dashboard-layout-style.scss","webpack://Polecat/./src/preview/components/empty-visualisation/empty-visualisation-component.js","webpack://Polecat/./src/preview/components/empty-visualisation/index.js","webpack://Polecat/./src/preview/components/preview/preview-component.js","webpack://Polecat/./src/preview/components/preview/index.js","webpack://Polecat/./src/compact-config/components/input-dropdown-group/index.js","webpack://Polecat/./src/dashboard/components/dashboard-footer/dashboard-footer-connector.js","webpack://Polecat/./src/data-source-connector/default-data-source-connector/account-connector-form/account-connector-form-styles.scss","webpack://Polecat/./src/empty-dashboard/empty-dashboard-component.js","webpack://Polecat/./src/hoc/fullscreen-change-listener.js","webpack://Polecat/./src/components/instrument/instrument-header/instrument-header-component.js","webpack://Polecat/./src/components/instrument/instrument-header/index.js","webpack://Polecat/./src/components/instrument/instrument-error/instrument-error-component.js","webpack://Polecat/./src/components/instrument/instrument-error/index.js","webpack://Polecat/./src/components/instrument/instrument-component.js","webpack://Polecat/./src/error-boundary/error-boundary-component.js","webpack://Polecat/./src/error-boundary/index.js","webpack://Polecat/./src/components/conditional-disabled-overlay/conditional-disabled-overlay-component.js","webpack://Polecat/./src/components/conditional-disabled-overlay/index.js","webpack://Polecat/./src/components/instrument/query/instrument-query-component.js","webpack://Polecat/./src/components/instrument/query/index.js","webpack://Polecat/./src/dashboard/components/dashboard-footer/dashboard-footer-component.js","webpack://Polecat/./src/dashboard/components/footer-clock/index.js","webpack://Polecat/./src/hoc/conditional-render.js","webpack://Polecat/./src/components/add-dashboard-modal/add-dashboard-modal-component.js","webpack://Polecat/./src/in-app-help/index.js","webpack://Polecat/./src/services/concierge-service/graphql/instrument-query.graphql","webpack://Polecat/./src/database-config/components/query-editor-modal/edit-widget-query-editor-modal.js","webpack://Polecat/./src/lib/slack-oauth.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-constants.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-timezone/scheduled-posts-timezone-query.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-timezone/scheduled-posts-timezone-component.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-timezone/index.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-component.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-query.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/scheduled-posts-dashboard-id-query.js","webpack://Polecat/./src/sharing-menu/slack-menu/scheduled-posts/index.js","webpack://Polecat/./src/sharing-menu/slack-menu/slack-menu-component.js","webpack://Polecat/./src/sharing-menu/slack-menu/slack-menu-channels-query.js","webpack://Polecat/./src/sharing-menu/slack-menu/slack-menu-connections-query.js","webpack://Polecat/./src/sharing-menu/slack-menu/index.js","webpack://Polecat/./src/widget/celebration-widget/celebration-widget-component.js","webpack://Polecat/./src/widget/celebration-widget/index.js","webpack://Polecat/./src/widget/celebration-widget/celebration-widget-connector.js","webpack://Polecat/./src/dashboard/session-telemetry/session-telemetry-component.js","webpack://Polecat/./src/dashboard/session-telemetry/index.js","webpack://Polecat/./src/dashboard/session-telemetry/session-telemetry-connector.js","webpack://Polecat/./src/customize/components/customize/customize-connector.js","webpack://Polecat/./src/customize/components/customize/index.js","webpack://Polecat/./src/customize/components/customize-panel/customize-panel-component.js","webpack://Polecat/./src/customize/components/customize-panel/index.js","webpack://Polecat/./src/dashboard/dashboard-layout/dashboard-layout-component.js","webpack://Polecat/./src/imports/importing-data-modal/importing-data-modal-component.js","webpack://Polecat/./src/imports/importing-data-modal/importing-data-modal-mutation.js","webpack://Polecat/./src/imports/importing-data-modal/index.js","webpack://Polecat/./src/imports/importing-data-modal/importing-data-modal-connector.js","webpack://Polecat/./src/imports/import-toast/import-toast-component.js","webpack://Polecat/./src/imports/import-toast/index.js","webpack://Polecat/./src/imports/import-toast/import-toast-connector.js","webpack://Polecat/./src/imports/imports-indicator-component.js","webpack://Polecat/./src/imports/imports-indicator-connector.js","webpack://Polecat/./src/imports/index.js","webpack://Polecat/./src/whats-new/whats-new-component.js","webpack://Polecat/./src/hoc/prop-watcher.js","webpack://Polecat/./src/whats-new/whats-new-watcher.js","webpack://Polecat/./src/whats-new/whats-new-connector.js","webpack://Polecat/./src/whats-new/index.js","webpack://Polecat/./src/manage-screens/components/add-screen-view-component.js","webpack://Polecat/./src/components/wistia-embed/wistia-embed-component.js","webpack://Polecat/./src/components/wistia-embed/index.js","webpack://Polecat/./src/manage-screens/components/upgrade-view-component.js","webpack://Polecat/./src/manage-screens/components/manage-screens-component.js","webpack://Polecat/./src/toast/components/toast-launcher/toast-launcher-component.js","webpack://Polecat/./src/toast/components/toast-launcher/toast-launcher-connector.js","webpack://Polecat/./src/toast/components/toast-launcher/index.js","webpack://Polecat/./src/first-run/first-run-component.js","webpack://Polecat/./src/first-run/first-run-connector.js","webpack://Polecat/./src/first-run/index.js","webpack://Polecat/./src/components/nav-logo-button/nav-logo-button-component.js","webpack://Polecat/./src/components/nav-logo-button/index.js","webpack://Polecat/./src/components/dashboard-limit-modal/dashboard-limit-modal-component.js","webpack://Polecat/./src/components/dashboard-limit-modal/index.js","webpack://Polecat/./src/masthead/masthead-upgrade-link/masthead-upgrade-link-component.js","webpack://Polecat/./src/masthead/masthead-upgrade-link/index.js","webpack://Polecat/./src/file-picker/folder-row/folder-row-style.scss","webpack://Polecat/./src/data-source-connector/components/services/salesforce-connector/salesforce-connector-style.scss","webpack://Polecat/./src/components/external-link/external-link-style.scss","webpack://Polecat/./src/integration-request/components/integration-request-modal/integration-request-modal-style.scss","webpack://Polecat/./src/integration-request/components/widget-type-page/widget-type-page-style.scss","webpack://Polecat/./src/components/menu-legacy/drop-item/drop-item-style.scss","webpack://Polecat/./node_modules/copy-to-clipboard/index.js","webpack://Polecat/./src/manage-screens/components/upgrade-view-style.scss","webpack://Polecat/./src/manage-screens/components/manage-screens-style.scss","webpack://Polecat/./src/components/warning-pill/warning-pill-style.scss","webpack://Polecat/./src/masthead/dashboard-settings-menu/dashboard-settings-menu-component-style.scss","webpack://Polecat/./ui/src/playground/blob/blob.scss","webpack://Polecat/./src/services/concierge-service/graphql/slack-channels-query.graphql","webpack://Polecat/./src/services/concierge-service/graphql/slack-connections-query.graphql","webpack://Polecat/./src/masthead/dashboard-masthead-title/dashboard-masthead-title-style.scss","webpack://Polecat/./src/masthead/breadcrumb-nav/breadcrumb-nav-style.scss","webpack://Polecat/./src/masthead/breadcrumb-link/breadcrumb-link-style.scss","webpack://Polecat/./src/masthead/masthead-breadcrumb/masthead-breadcrumb-style.scss","webpack://Polecat/./src/service-list/components/service-search/service-search-style.scss","webpack://Polecat/./src/service-list/components/service-list-header/service-list-header-style.scss","webpack://Polecat/./src/service-list/components/service-list-subheader/service-list-subheader-style.scss","webpack://Polecat/./src/widget/widget-importing/widget-importing-style.scss","webpack://Polecat/./node_modules/@bugsnag/plugin-react/dist/bugsnag-react.js","webpack://Polecat/./src/admin/components/admin-content-container/admin-content-container-style.scss","webpack://Polecat/./src/admin/components/ghost-list/ghost-list-style.scss","webpack://Polecat/./src/components/menu/drop-item-link/drop-item-link-style.scss","webpack://Polecat/./src/components/checkbox-with-label/checkbox-with-label-styles.scss","webpack://Polecat/./src/admin/components/empty-states/data-sources-empty-state/data-sources-empty-state-style.scss","webpack://Polecat/./src/admin/pages/loops-group-page/loops-group-page-style.scss","webpack://Polecat/./src/components/scrollable-list/scrollable-list-style.scss","webpack://Polecat/./src/components/offline-banner/offline-banner-styles.scss","webpack://Polecat/./src/dashboard/dashboard-loading-spinner/dashboard-loading-spinner-style.scss","webpack://Polecat/./src/dashboard/preview-scaling/preview-scaling-style.scss","webpack://Polecat/./src/components/instrument/instrument-error/instrument-error-style.scss","webpack://Polecat/./src/services/concierge-service/graphql/imports-query.graphql","webpack://Polecat/./src/services/concierge-service/graphql/acknowledge-import-mutation.graphql","webpack://Polecat/./src/customize/components/customize-panel/customize-panel-style.scss","webpack://Polecat/./src/widget/mobile-widget/mobile-widget-component.js","webpack://Polecat/./src/widget/mobile-widget/index.js","webpack://Polecat/./src/widget/mobile-widget/mobile-widget-connector.js","webpack://Polecat/./src/dashboard/mobile-layout/empty-dashboard-component.js","webpack://Polecat/./src/dashboard/mobile-layout/offline-dashboard-component.js","webpack://Polecat/./src/dashboard/mobile-layout/reconnect-dashboard-component.js","webpack://Polecat/./src/dashboard/mobile-layout/mobile-layout-component.js","webpack://Polecat/./src/dashboard/mobile-layout/mobile-layout-connector.js","webpack://Polecat/./src/dashboard/mobile-layout/index.js","webpack://Polecat/./src/services/concierge-service/graphql/import-fragment.graphql","webpack://Polecat/./node_modules/toggle-selection/index.js","webpack://Polecat/./node_modules/intl/locale-data/jsonp/en.js","webpack://Polecat/./src/account/components/plans-modal/basic-plan-confirm-modal/basic-plan-confirm-modal-component.js","webpack://Polecat/./src/account/components/plans-modal/basic-plan-confirm-modal/index.js","webpack://Polecat/./src/account/components/plans-modal/plan-component.js","webpack://Polecat/./src/account/components/plans-modal/plans-modal-component.js","webpack://Polecat/./src/account/components/plans-modal/index.js","webpack://Polecat/./src/account/plans-modal-connector.js","webpack://Polecat/./src/account/index.js","webpack://Polecat/./src/dashboard/components/dashboard-footer/index.js","webpack://Polecat/./src/config-wrapper/config-wrapper.js","webpack://Polecat/./src/config-wrapper/index.js","webpack://Polecat/./src/data-source-connector/index.js","webpack://Polecat/./src/empty-dashboard/index.js","webpack://Polecat/./src/integration-request/components/integration-request-modal/integration-request-modal-component.js","webpack://Polecat/./src/integration-request/components/integration-request-modal/index.js","webpack://Polecat/./src/integration-request/integration-request-component.js","webpack://Polecat/./src/integration-request/integration-request-connector.js","webpack://Polecat/./src/integration-request/components/widget-type-page/index.js","webpack://Polecat/./src/integration-request/components/widget-type-page/widget-type-page-component.js","webpack://Polecat/./src/integration-request/index.js","webpack://Polecat/./src/masthead/dashboard-picker/dashboard-picker-component.js","webpack://Polecat/./src/masthead/dashboard-picker/index.js","webpack://Polecat/./src/hoc/account-owner-or-group-admin.js","webpack://Polecat/./src/masthead/account-menu/account-menu-component.js","webpack://Polecat/./src/masthead/account-menu/index.js","webpack://Polecat/./src/masthead/account-menu/account-menu-connector.js","webpack://Polecat/./src/masthead/screens-button/screens-button.js","webpack://Polecat/./src/masthead/screens-button/index.js","webpack://Polecat/./src/manage-screens/components/manage-screens-connector.js","webpack://Polecat/./src/manage-screens/components/index.js","webpack://Polecat/./src/app/app-component.js","webpack://Polecat/./src/lib/is-unsupported-browser/is-unsupported-browser.js","webpack://Polecat/./src/app/index.js","webpack://Polecat/./src/lib/is-unsupported-browser/index.js","webpack://Polecat/./src/components/warning-pill/warning-pill-component.js","webpack://Polecat/./src/components/warning-pill/index.js","webpack://Polecat/./src/unsupported/unsupported-browser-modal/unsupported-browser-modal-component.js","webpack://Polecat/./src/unsupported/unsupported-browser-modal/index.js","webpack://Polecat/./src/unsupported/index.js","webpack://Polecat/./src/unsupported/unsupported-component.js","webpack://Polecat/./src/admin/components/modals/invite-members-modal/invite-members-form-component.js","webpack://Polecat/./src/admin/components/modals/invite-members-modal/invite-members-modal-component.js","webpack://Polecat/./src/admin/components/modals/invite-members-modal/invite-members-modal-connector.js","webpack://Polecat/./src/admin/components/modals/invite-members-modal/index.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-dashboard-list/loop-dashboard-list-component.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-dashboard-list/index.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/loop-modal-component.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/add-loop-modal/add-loop-modal-connector.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/add-loop-modal/index.js","webpack://Polecat/./src/components/add-dashboard-modal/add-dashboard-modal-connector.js","webpack://Polecat/./src/components/add-dashboard-modal/index.js","webpack://Polecat/./src/masthead/base-masthead/base-masthead-component.js","webpack://Polecat/./src/masthead/base-masthead/base-masthead-connector.js","webpack://Polecat/./src/masthead/base-masthead/index.js","webpack://Polecat/./src/components/menu-legacy/drop-button/drop-button-component.js","webpack://Polecat/./src/components/menu-legacy/drop-button/index.js","webpack://Polecat/./src/masthead/dashboard-settings-menu/dashboard-settings-menu-component.js","webpack://Polecat/./src/masthead/dashboard-settings-menu/index.js","webpack://Polecat/./src/masthead/add-widget-button/add-widget-button-component.js","webpack://Polecat/./src/masthead/add-widget-button/add-widget-button-connector.js","webpack://Polecat/./src/masthead/add-widget-button/index.js","webpack://Polecat/./src/sharing-menu/sharing-menu-component.js","webpack://Polecat/./src/sharing-menu/sharing-menu-connector.js","webpack://Polecat/./src/sharing-menu/index.js","webpack://Polecat/./src/masthead/dashboard-options/dashboard-options-component.js","webpack://Polecat/./src/masthead/dashboard-options/index.js","webpack://Polecat/./src/masthead/dashboard-masthead-title/dashboard-masthead-title-component.js","webpack://Polecat/./src/masthead/dashboard-masthead-title/dashboard-masthead-title-connector.js","webpack://Polecat/./src/masthead/dashboard-masthead-title/index.js","webpack://Polecat/./src/masthead/breadcrumb-nav/breadcrumb-nav-component.js","webpack://Polecat/./src/masthead/breadcrumb-nav/index.js","webpack://Polecat/./src/masthead/breadcrumb-link/breadcrumb-link-component.js","webpack://Polecat/./src/masthead/breadcrumb-link/index.js","webpack://Polecat/./src/hoc/with-graphql-id/with-graphql-id.js","webpack://Polecat/./src/hoc/with-graphql-id/index.js","webpack://Polecat/./src/dashboard/container-layout/set-container-layout-button/set-container-layout-button-component.js","webpack://Polecat/./src/dashboard/container-layout/set-container-layout-button/index.js","webpack://Polecat/./src/masthead/dashboard-masthead/dashboard-masthead-component.js","webpack://Polecat/./src/masthead/dashboard-masthead/dashboard-masthead-connector.js","webpack://Polecat/./src/masthead/dashboard-masthead/index.js","webpack://Polecat/./src/masthead/masthead-breadcrumb/masthead-breadcrumb-component.js","webpack://Polecat/./src/masthead/masthead-breadcrumb/index.js","webpack://Polecat/./src/dataset-config/components/preview-modal/preview-modal-component.js","webpack://Polecat/./src/dataset-config/components/preview-modal/preview-modal-connector.js","webpack://Polecat/./src/dataset-config/components/preview-modal/index.js","webpack://Polecat/./src/masthead/breadcrumb-dropdown/breadcrumb-dropdown-component.js","webpack://Polecat/./src/masthead/breadcrumb-dropdown/breadcrumb-dropdown-connector.js","webpack://Polecat/./src/masthead/breadcrumb-dropdown/index.js","webpack://Polecat/./src/masthead/widget-masthead/spreadsheets-beta-breadcrumbs.js","webpack://Polecat/./src/masthead/widget-masthead/widget-masthead-component.js","webpack://Polecat/./src/masthead/widget-masthead/widget-masthead-connector.js","webpack://Polecat/./src/masthead/widget-masthead/index.js","webpack://Polecat/./src/masthead/index.js","webpack://Polecat/./src/service-list/components/service-search/service-search-component.js","webpack://Polecat/./src/service-list/components/service-search/index.js","webpack://Polecat/./src/service-list/components/service-pill/service-pill-component.js","webpack://Polecat/./src/service-list/components/service-pill/index.js","webpack://Polecat/./src/service-list/service-list-constants.js","webpack://Polecat/./src/service-list/components/list/list-component.js","webpack://Polecat/./src/service-list/components/list/index.js","webpack://Polecat/./src/service-list/components/integrations-page-footer/integrations-page-footer.js","webpack://Polecat/./src/service-list/components/integrations-page-footer/index.js","webpack://Polecat/./src/service-list/components/integrations-page-footer/integrations-page-footer-connector.js","webpack://Polecat/./src/service-list/components/service-list-header/service-list-header-component.js","webpack://Polecat/./src/service-list/components/service-list-header/index.js","webpack://Polecat/./src/service-list/components/service-list-subheader/service-list-subheader-component.js","webpack://Polecat/./src/service-list/components/service-list-subheader/index.js","webpack://Polecat/./src/service-list/service-list-component.js","webpack://Polecat/./src/service-list/service-list-mounter/service-list-mounter-component.js","webpack://Polecat/./src/service-list/service-list-mounter/service-list-mounter-connector.js","webpack://Polecat/./src/service-list/service-list-mounter/index.js","webpack://Polecat/./src/service-list/service-list-helpers.js","webpack://Polecat/./src/service-list/service-list-connector.js","webpack://Polecat/./src/service-list/components/inactive-list/inactive-list-component.js","webpack://Polecat/./src/service-list/components/inactive-list/index.js","webpack://Polecat/./src/service-list/restricted-service-list/restricted-service-list-component.js","webpack://Polecat/./src/service-list/restricted-service-list/restricted-service-list-data-provider.js","webpack://Polecat/./src/service-list/restricted-service-list/index.js","webpack://Polecat/./src/service-list/service-list-entry.js","webpack://Polecat/./src/service-list/index.js","webpack://Polecat/./src/widget/index.js","webpack://Polecat/./src/widget/controlled-widget/index.js","webpack://Polecat/./src/lib/handle-geckojs-message.js","webpack://Polecat/./src/admin/components/admin-content-container/admin-content-container-component.js","webpack://Polecat/./src/admin/components/admin-content-container/index.js","webpack://Polecat/./src/admin/components/admin-permission-denied/index.js","webpack://Polecat/./src/admin/components/admin-permission-denied/admin-permission-denied-component.js","webpack://Polecat/./src/admin/components/group-admin-titlebar/group-admin-titlebar-component.js","webpack://Polecat/./src/admin/components/group-admin-titlebar/index.js","webpack://Polecat/./src/admin/components/ghost-list/ghost-list-component.js","webpack://Polecat/./src/admin/components/ghost-list/index.js","webpack://Polecat/./src/admin/components/empty-states/organization-members-empty-state/organization-members-empty-state-component.js","webpack://Polecat/./src/admin/components/empty-states/organization-members-empty-state/index.js","webpack://Polecat/./src/admin/components/empty-states/organization-viewers-empty-state/index.js","webpack://Polecat/./src/admin/components/empty-states/organization-viewers-empty-state/organization-viewers-empty-state-component.js","webpack://Polecat/./src/components/user-initials/user-initials-component.js","webpack://Polecat/./src/components/user-initials/index.js","webpack://Polecat/./src/admin/pages/people-page/components/person-permissions-select/person-permissions-select-component.js","webpack://Polecat/./src/admin/pages/people-page/components/person-permissions-select/index.js","webpack://Polecat/./src/components/menu/drop-item-link/drop-item-link-component.js","webpack://Polecat/./src/components/menu/drop-item-link/index.js","webpack://Polecat/./src/hoc/account-owner-only.js","webpack://Polecat/./src/admin/components/modals/revoke-owner-confirm-modal/revoke-owner-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/revoke-owner-confirm-modal/index.js","webpack://Polecat/./src/admin/components/modals/make-owner-confirm-modal/make-owner-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/make-owner-confirm-modal/index.js","webpack://Polecat/./src/admin/components/modals/promote-to-member-confirm-modal/promote-to-member-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/promote-to-member-confirm-modal/index.js","webpack://Polecat/./src/admin/components/modals/delete-user-confirm-modal/delete-user-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/delete-user-confirm-modal/index.js","webpack://Polecat/./src/admin/pages/people-page/components/person/person-component.js","webpack://Polecat/./src/admin/pages/people-page/components/person/index.js","webpack://Polecat/./src/admin/pages/people-page/components/person/person-connector.js","webpack://Polecat/./src/admin/components/list-heading/list-heading-component.js","webpack://Polecat/./src/admin/components/list-heading/index.js","webpack://Polecat/./src/admin/pages/people-page/people-page-component.js","webpack://Polecat/./src/admin/pages/people-page/index.js","webpack://Polecat/./src/admin/pages/people-page/people-page-connector.js","webpack://Polecat/./src/admin/components/modals/regenerate-sharing-link-confirm-modal/regenerate-sharing-link-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/regenerate-sharing-link-confirm-modal/index.js","webpack://Polecat/./src/admin/pages/dashboards-group-page/dashboards-group-page-component.js","webpack://Polecat/./src/admin/pages/dashboards-group-page/dashboards-group-page-connector.js","webpack://Polecat/./src/admin/pages/dashboards-group-page/index.js","webpack://Polecat/./src/components/data-source-list-item/index.js","webpack://Polecat/./src/components/checkbox-with-label/checkbox-with-label-component.js","webpack://Polecat/./src/components/checkbox-with-label/index.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/component/affected-widgets-list/affected-widgets-list-component.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/component/affected-widgets-list/index.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/component/delete-data-source-confirm-modal-component.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/index.js","webpack://Polecat/./src/admin/components/modals/delete-data-source-confirm-modal/component/delete-data-source-confirm-modal-connector.js","webpack://Polecat/./src/admin/components/empty-states/data-sources-empty-state/index.js","webpack://Polecat/./src/admin/components/empty-states/data-sources-empty-state/data-sources-empty-state-component.js","webpack://Polecat/./src/admin/components/database-connection-list/database-connection-list-component.js","webpack://Polecat/./src/admin/components/database-connection-list/database-connection-list-connector.js","webpack://Polecat/./src/admin/components/database-connection-list/index.js","webpack://Polecat/./src/admin/pages/data-sources-group-page/data-sources-group-page-component.js","webpack://Polecat/./src/admin/pages/data-sources-group-page/index.js","webpack://Polecat/./src/admin/pages/data-sources-group-page/data-sources-group-page-connector.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-list-item/loop-list-item-component.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-list-item/index.js","webpack://Polecat/./src/admin/components/empty-states/loops-empty-state/loops-empty-state-component.js","webpack://Polecat/./src/admin/components/empty-states/loops-empty-state/index.js","webpack://Polecat/./src/admin/pages/loops-group-page/loops-group-page-component.js","webpack://Polecat/./src/admin/pages/loops-group-page/index.js","webpack://Polecat/./src/admin/pages/loops-group-page/loops-group-page-connector.js","webpack://Polecat/./src/components/scrollable-list/scrollable-list-component.js","webpack://Polecat/./src/components/scrollable-list/index.js","webpack://Polecat/./src/components/dashboard-permission-list-item/dashboard-permission-list-item-component.js","webpack://Polecat/./src/components/dashboard-permission-list-item/index.js","webpack://Polecat/./src/admin/components/modals/dashboard-permissions-modal/dashboard-permissions-modal-component.js","webpack://Polecat/./src/admin/components/modals/dashboard-permissions-modal/actions/dashboard-permissions-modal-actions.js","webpack://Polecat/./src/admin/components/modals/dashboard-permissions-modal/dashboard-permissions-modal-connector.js","webpack://Polecat/./src/admin/components/modals/dashboard-permissions-modal/index.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/components/user-permission-list-item/user-permission-list-item-component.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/components/user-permission-list-item/index.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/user-permissions-modal-component.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/index.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/user-permissions-modal-connector.js","webpack://Polecat/./src/admin/components/modals/user-permissions-modal/actions/user-permissions-modal-actions.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/edit-loop-modal/index.js","webpack://Polecat/./src/admin/pages/loops-group-page/loop-modal/edit-loop-modal/edit-loop-modal-connector.js","webpack://Polecat/./src/admin/index.js","webpack://Polecat/./src/admin/components/admin-component.js","webpack://Polecat/./src/mobile-menu/offline-menu-message/offline-menu-message-component.js","webpack://Polecat/./src/mobile-menu/offline-menu-message/index.js","webpack://Polecat/./src/mobile-menu/mobile-menu-component.js","webpack://Polecat/./src/mobile-menu/mobile-menu-query.js","webpack://Polecat/./src/mobile-menu/index.js","webpack://Polecat/./src/routes/components/routes/routes-component.js","webpack://Polecat/./src/routes/components/routes/index.js","webpack://Polecat/./src/routes/index.js","webpack://Polecat/./src/dashboard/customization-applicator/customization-applicator-graphql-helper.js","webpack://Polecat/./src/dashboard/customization-applicator/customization-applicator-query.js","webpack://Polecat/./src/dashboard/customization-applicator/customization-applicator-connector.js","webpack://Polecat/./src/dashboard/customization-applicator/index.js","webpack://Polecat/./src/dashboard/preview-scaling/scale-for-preview.js","webpack://Polecat/./src/dashboard/preview-scaling/preview-scaling-component.js","webpack://Polecat/./src/dashboard/preview-scaling/index.js","webpack://Polecat/./src/dashboard/preview-scaling/preview-scaling-connector.js","webpack://Polecat/./src/dashboard/custom-css-preview/custom-css-preview-component.js","webpack://Polecat/./src/dashboard/custom-css-preview/index.js","webpack://Polecat/./src/dashboard/custom-css-preview/custom-css-preview-connector.js","webpack://Polecat/./src/dashboard/dashboard-layout/dashboard-layout-connector.js","webpack://Polecat/./src/dashboard/dashboard-layout/index.js","webpack://Polecat/./src/dashboard/dashboard-layout-redirect/dashboard-layout-redirect-component.js","webpack://Polecat/./src/dashboard/dashboard-layout-redirect/index.js","webpack://Polecat/./src/dashboard/index.js","webpack://Polecat/./src/graphql-share-page/data-provider/screen-data-provider/graphql-screen-data-provider.js","webpack://Polecat/./src/graphql-share-page/data-provider/screen-data-provider/index.js","webpack://Polecat/./src/graphql-share-page/data-provider/sharing-url-data-provider/graphql-share-page-data-provider.js","webpack://Polecat/./src/graphql-share-page/data-provider/sharing-url-data-provider/index.js","webpack://Polecat/./src/graphql-page-container/graphql-page-container-component.js","webpack://Polecat/./src/graphql-page-container/index.js","webpack://Polecat/./src/main.js","webpack://Polecat/./src/index.js"],"names":["root","factory","exports","module","define","amd","window","webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","10","__webpack_require__","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","oldJsonpFunction","slice","s","createAction","action","payload","translationKeyWrapper","DecoratedComponent","WrappedComponent","props","data-t","id","propTypes","PropTypes","string","isRequired","ConfiguredI18NProviderComponent","children","locale","messages","translations","node","FormattedMessage","IntlFormattedMessage","FormattedHTMLMessage","IntlFormattedHTMLMessage","displayName","Base","Tag","layoutClasses","className","rest","classes","classNames","defaultProps","Layout","layout","Row","flex","flexWrap","Column","flexColumn","PROJECTIONS","MERCATOR","MILLER","ALBERS_USA","MAP_TYPES","WORLD","CONTINENT","COUNTRY","REGION","CONTINENTS","SOUTH_AMERICA","NORTH_AMERICA","OCEANIA","AFRICA","EUROPE","ASIA","debugEvent","log","schema","groupCollapsed","forEach","groupEnd","JSON","stringify","track","opts","Tracker","trackSnowplow","version","isDev","snowplow","trackSwitchVisualisation","serviceName","from","to","extra","properties","from_viz","to_viz","service_name","userPermissionConstants","OWNER","GROUP_ADMIN","GROUP_VIEWER","DASHBOARD_VIEWER","getUserPermissionString","user","isAccountOwner","isGroupAdmin","isGroupViewer","isDashboardViewOnly","generateUniqueId","Math","random","toString","substring","Date","getTime","redirect","delay","location","getWindow","getNavigator","navigator","getDocumentElement","documentElement","getViewportDimensions","width","innerWidth","clientWidth","height","innerHeight","clientHeight","intercom","Intercom","globalClearTimeout","getNodeEnv","process","config","STATIC_ASSET_URL","getConfigFromMeta","memoize","getElementById","metaNode","parse","content","defaultConfig","SpreadsheetsBaseURL","SPREADSHEETS_HOST","PegasusBaseURL","PEGASUS_HOST","InquisitorBaseURL","INQUISITOR_HOST","AssetBaseURL","ASSET_HOST","WidgetDataBaseURL","DATA_API_HOST","ManagementBaseURL","API_HOST","AuthBaseURL","AUTH_API_HOST","RootURL","protocol","domain","StatsURL","STATS_HOST","IrisBaseURL","IRIS_HOST","CustomCSSURL","CapterraBaseURL","StaticAssetBaseURL","ChannelAuthHost","CHANNEL_AUTH_HOST","BulletinBaseURL","BULLETIN_HOST","set","newConfig","POLLING_OPTS","defaultPollInterval","maxNumberOfPolls","csrfFetch","url","others","fetch","applyCSRF","FetchError","status","other","assign","MultipleFetchError","errors","fetchErrors","map","allMessages","join","handleError","res","json","catch","statusText","fetchAll","fetchAllJSON","fetchJSON","fetchJSONWithoutCSRF","options","fetchAllJSONWithCredentials","method","credentials","headers","Accept","fetchAllWithCredentials","fetchJSONWithCredentials","pollJSON","pollingOpts","counter","pollInterval","parseInt","newCounter","newPollingOpts","SIZES","EXTRA_SMALL","SMALL","MEDIUM","LARGE","INTENT","PRIMARY","SECONDARY","NEGATIVE","LINK","TYPES","BUTTON","SUBMIT","RESET","mapSizeToLoadingSpinnerSizes","mapIntentToLoadingSpinnerTheme","LoadingSpinner","THEMES","DARK","LIGHT","getDataAttributes","keys","filter","startsWith","reduce","obj","Button","icon","intent","disabled","loading","onClick","onFocus","onBlur","size","stretched","title","hasIcon","style","spinnerContainer","spinnerTransition","spinner","theme","iconNoChildren","bool","oneOf","func","__defineType","definition","required","number","SchemaTypes","values","enum","oneOfType","allTypes","store","apolloClient","printEvent","resolveContext","resolvers","resolver","reduxState","getState","trackEvent","async","errorMessage","bugsnag","send","eventWithContext","contextResolvers","BACKTRACK_HOST","body","metaData","setReduxStore","reduxStore","setApolloClient","client","platformInfo","once","uaParser","userAgent","browser","device","os","$browser","$browser_version","$device","vendor","model","negate","isEmpty","$os","$os_version","clientPlatformContext","$current_url","$screen_height","screen","$screen_width","timestampToISO","timestamp","toISOString","organizationContext","Billing","Plan","subscriptionDate","initalReferrer","utmCampaign","utmContent","utmMedium","utmName","utmTerm","organization","account","billing","usages","dashboards","day_in_lifetime","plan","signup_form","trial_days_remaining","annual_subscription","is_subscription_manual","date","trial","subscription_date","initial_referrer","utm_campaign","utm_content","utm_medium","utm_name","utm_term","omitBy","isNil","permissionMap","power_user","getEmailDomain","email","last","split","formatUserPayload","jobRole","job_role","newsletter","permission","trackingId","tracking_id","signupDate","signup_date","distinct_id","Permission","SHARED_CONTEXTS","__getSchemaRequiredFields","schemaTypes","acc","__getSchemaProperties","__combineContextSchemas","contexts","context","createJSONSchema","defineEvent","allContexts","allSchemaTypes","sharedIntegrationSchemaProperties","integrationSelected","Location","LOCATIONS","DashboardAddWidgetDropdown","IntegrationsMainList","IntegrationsRecentList","integrationClickedConnect","integrationSelectedDataSource","integrationSelectedWidget","integrationSelectedFile","spreadsheetsSubmittedUrl","integrationQueryStarted","integrationQueryFinished","spreadsheetsUrlSucceeded","spreadsheetsUrlFailed","sharedConnectionSchemaProperties","connectionCreated","connectionDeleted","connectionFailed","connectionSelected","externalConnectionCreated","externalConnectionFailed","dashboardCreated","TRACKING_LAYOUT_TYPES","DashboardContext","dashboardChangedLayout","dashboardCopied","dashboardCopiedSharingLink","DashboardShareMenu","AdminDashboards","dashboardCreatedSharingLink","dashboardDeleted","DashboardDeleteModal","dashboardDeletedSharingLink","dashboardRegeneratedSharingLink","dashboardSavedCustomization","Theme","VALID_THEMES","VALID_WIDGET_STYLES","dashboardTriggeredRemoteRefresh","sharedScreenSchemaProperties","screenChangedContent","screenConnected","screenDeleted","screenRefreshed","screenRenamed","integrationListSearched","buttonClicked","externalLinkClicked","welcomeSurveyDismissed","welcomeSurveySubmitted","groupCreated","groupDeleted","groupWidgetsReordered","groupWidgetsResized","PERMISSION_SCHEMA","PERMISSIONS","invitationResent","invitationSent","AdminInviteModal","HeaderPeopleModal","userDeleted","permissionsChanged","sharedWidgetSchemaProperties","Visualisation","widgetMovedOffCanvas","widgetMovedToCanvas","widgetCreated","widgetCopied","widgetDeleted","widgetConfigEdited","widgetIndicatorsAdded","widgetIndicatorsEdited","widgetIndicatorsDeleted","widgetNumberFormattingEdited","widgetGoalAdded","widgetGoalEdited","widgetGoalRemoved","sharedDashboardLoopSchemaProperties","dashboardLoopCreated","dashboardLoopDeleted","dashboardLoopRegeneratedSharingLink","dashboardLoopCopiedSharingLink","AdminLoops","Toast","scheduledPostSchemaProperties","scheduledPostCreated","scheduledPostUpdated","scheduledPostDeleted","createErrorAction","INDEX_BASED","toBackendIndex","partial","add","toFrontendIndex","getSelectedCells","cells","selection","indices","startCol","startRow","endCol","Infinity","endRow","isValidSelection","cell","column","row","_","flatten","every","greedilyParseFloat","parseFloat","replace","isEntireColumnSelection","isEntireRowSelection","swapSelection","getSelectionHeaderIndices","selections","allSelectedCells","headerDirection","filteredSelections","chain","min","getFullRowOrColumnHeaderIndex","headerCol","headerRow","mapValues","stableItemSort","items","reverse","item","isUndefined","sortedItems","concat","sort","a","getServices","query","base","URL","getServiceAccounts","groupId","serviceNames","getWidgetsForService","serviceId","getService","getServiceWidgetTypes","getRecentlyConnectedServices","deleteServiceAccount","deleteAssociatedWidgets","params","createServiceAccount","accountData","password","service","omit","basic_auth","getAllDashboards","getDashboard","dashboardId","getAllSharingLoops","getUser","patchUser","getPlans","orgId","getOrganization","setCheckpoint","checkpoint","getPairingCode","getPairingStatus","exchangeDeviceToken","token","connectDevice","getDevices","deleteDevice","setDeviceName","setDeviceDashboard","submitIntegrationRequest","getLogoUploadLink","filename","createDashboard","dashboard","getGroupDashboards","getPeople","getGroupLoops","createLoop","loop","updateLoop","loopId","deleteLoop","deleteWidget","widgetKey","enableToggle","toggle","disableToggle","saveSegmentationAnswers","setDetailsColumns","addDetailsColumn","addMetric","fetchFilterSuggestionsStart","removeDetailsColumn","removeFilter","removeMetric","setFilter","setFilterForm","setGlobalFilter","setGroupByBucket","setGroupByCategory","setMetricAggregate","setMetricField","setSplitBy","setOrderBy","setOrderByExtra","setTimeField","setTimeOperands","setTimespanComparisonOff","setTimespanComparisonOn","setTimespanComparisonOperator","setTimespanComparisonType","setVIPFilter","setVisualisationError","setVisualisationType","toggleDataSourcePanel","validate","updateNumberFormat","setPrerequisites","clearPrerequisites","switchVisualisationType","dispatch","universal","vizType","submit","updateMetric","field","index","features","featureFlags","updateGroupBy","TIME_OPTION","bucket","uiQuery","fetchAndUpdateSubquery","updateAggregation","aggregate","addNewMetric","removeMetricAtIndex","updateFilter","rawValue","since_start_of","quantity","unit","operator","operands","op","setGlobalFilterValue","_value","combinedFilters","globalFilters","getCombinedFiltersValues","is_global","bootstrapGraph","universalSetError","setVIPFilterValue","runSubmit","is_vip","editFilter","filterForm","_filterModal","currentIndex","currentField","currentOperator","subQueryResults","fieldValues","getValues","operatorRequiresValues","some","includes","supports_null_values","supports_contains_operators","restrict_single_value","GROUPED_TIMESPAN_OPTIONS","hasValues","newValues","closeFilterConfig","removeFilterFromQuery","updateTimespanOperands","updateSplitBy","updateOrderBy","updateOrderByExtra","saveState","paths","getStateToSave","setConfig","restoreState","defaults","getStateToRestore","restoreStateGoal","queryResults","metrics","goal","defaultGoal","getDefaultGoal","setServiceAccountId","source","setSource","service_account_id","switchServiceAccount","updateServiceAccounts","serviceAccounts","setServiceAccounts","updateTimespanComparison","active","setDetailsColumnNodes","nodes","addNewDetailsColumn","col","removeDetailsColumnAtIndex","updatePrerequisites","prerequisiteNodes","prerequisites","newPrerequisiteNodes","clearQueryResults","fetchVizDataStart","fetchVizDataSuccess","setCancelledQueries","setPreset","setQueryIds","recomputeQueries","updateSubQueryResults","updateColumnNumberFormat","disableQueries","cancelQueries","reason","clearQueryIds","_queryIds","pusherChannel","qIds","queryIds","queriesFetchDone","forceCancel","queryId","universalService","cancelQuery","cancelErr","currentSubQueryResults","resourceName","getResourceName","getSubQueryResult","subQueryResult","cleanResult","decode","receivedQueryIds","queuedData","ids","forEachRight","pull","clearQueuedData","runQuery","timezone","queriesEnabled","isMirage","mirageActions","LIMITED_VISUALISATION_TYPES","queryLimit","delivery","provider","destination","queries","queryFetchCursor","queryOptions","beQuery","limit","ENABLED_CACHE","payloads","query_id","previewError","handleErrors","NoServiceAccountError","setNoServiceAccountsAndOpenPanel","PusherError","_triggerFirstQueries","isPusherReady","initConfig","presetId","startPusher","resetInitial","startPusherChannel","bootstrapUniversalService","integration","fetchPreset","preset","fetchMetadata","metadata","initialQueries","setRawQueries","bootstrapServiceAccounts","defaultsFor","getPreferences","preferences","applyPreferences","getWidgetConfig","widgetId","getConfig","service_account","accountId","deserialize","storedQueries","q","mirageConfig","SilentlyChangedServiceAccountError","resetGraph","setAPISettings","setConfigReady","setExistingDashboardContext","setGraph","setInitialQueries","setGlobalFiltersFromQueries","setPrerequisitesFromQueries","setQueryOptions","setService","setUiOptions","setNoServiceAccounts","setPrerequisiteOptions","widgetMenu","view","instrumentMenu","instrumentMenuView","WidgetMenu","VIEWS","EDIT","INSTRUMENT_MENU_VIEWS","showDataSourcePanel","addingNewConnection","extendableBuiltinGen","NoValuesForGlobalFilterError","_getQueryOptions","universalState","runQueryInContext","qr","queryOpts","zipObject","_withoutCombined","filters","is_combined","_loadGlobalFilters","globalsToFetch","gf","_setGlobalFilters","f","firstOption","formatMessage","_loadVIPFilters","setDefaults","vipFilters","vf","currentDashboard","dataSources","services","setDashboard","find","currentAccountId","editWidget","allServiceAccounts","getServiceAccountId","loadPrerequisites","graph","prerequisitesMetadata","saFilters","service_account_filters","exclude_from_query","getNodeFromSubquery","sa","saFilterValues","allSaFiltersValues","saFiltersKeyValues","v","allValues","tree","build_prerequisite_options","setDefaultPrerequisiteValues","prerequisiteOptions","uiOptions","serviceAccountPrerequisites","option","firstValueAt","level","initialise","api","buildGraph","setUpPrerequisites","newPrerequisites","getPrerequisitesFromQueries","prerequisite","setUpAdditionalFields","injectCustomFieldsInGraph","addVirtualFields","metricCategories","fetchSubqueryData","_globalFilters","groupBy","splitBy","arraysToFetch","loadFilters","_resetGraph","resetGlobalFilters","validateEmailAddresses","addresses","isValidEmail","getDashboardsStart","getDashboardsSuccess","getDashboardsFailed","getPeopleStart","getPeopleSuccess","getPeopleFailed","getDataSourcesStart","getDataSourcesSuccess","getDataSourcesFailed","setPermissionsStart","setPermissionsSuccess","setPermissionsFailed","revokeAccountOwnerStart","revokeAccountOwnerSuccess","revokeAccountOwnerFailed","makeAccountOwnerStart","makeAccountOwnerSuccess","makeAccountOwnerFailed","demoteToDashboardViewOnlyStart","demoteToDashboardViewOnlySuccessful","demoteToDashboardViewOnlyFailed","promoteToMemberStart","promoteToMemberSuccess","promoteToMemberFailed","inviteMembersStart","inviteMembersSuccess","inviteMembersFailed","inviteMembersEmailInvalid","inviteMembersClearError","openReconnectModal","closeReconnectModal","reconnectDataSourceStart","reconnectDataSourceSuccess","reconnectDataSourceCancelled","reconnectDataSourceFailed","deleteDataSourceStart","deleteDataSourceSuccess","deleteDataSourceFailed","openDashboardPermissionsModalStart","openDashboardPermissionsModalSuccess","openDashboardPermissionsModalFailed","openUserPermissionsModalStart","openUserPermissionsModalSuccess","openUserPermissionsModalFailed","trackPermissionsChange","prevRole","nextRole","target_user_previous_permission","target_user_new_permission","getDashboards","getGroupDashboardsService","getPeopleService","people","getDataSources","getGroupDataSourcesService","getNameForUserWithId","userId","allUsers","userById","getUserDisplayName","getEmailForUserWithId","getRoleForUser","members","getTrackingStringFromRole","role","setPermissions","previousRole","permissionService","toastActions","revokeAccountOwner","revokeeName","makeAccountOwner","demoteToDashboardViewOnly","toastConstants","promoteToMember","userName","getInviteErrorPayload","firstError","getEmailAddressValues","faultyAddresses","count","addressesStr","remaining","inviteMembers","organization_id","emails","trim","newUsers","trackingPermission","target_user_permission","user_id","org_id","router","removeQueryParam","deleteDataSource","dataSourceId","deleteDataSourceService","reconnectDataSource","dataSource","popup","openPopup","reconnectOAuth","openDashboardPermissionsModal","groupDashboardsPromise","openUserPermissionsModal","waitForState","state","allDashboards","resendInvite","owners","viewers","FONTS","FONT_AWESOME","GECKO_FONT","FONT_WEIGHTS","FA_REGULAR","FA_SOLID","FA_LIGHT","Icon","muted","light","font","fontWeight","default","aria-hidden","addDashboard","deleteDashboard","changeDashboard","setDashboards","setAddress","inviteUpdating","inviteSuccessful","inviteFailed","setDashboardScaleFactor","setClassicboardScaleFactor","dashboardError","updateSharingError","inviteError","toggleSharingStart","toggleSharingInviteTabStart","addReadOnlyUsersStart","setDashboardTitleStart","setDashboardTitleSuccess","setDashboardTitleFailed","setCurrentDashboardSharingLink","setIsMobile","setImportingService","toggleImportingModal","setSharingMode","setEditMode","initDashboard","importingServiceRaw","sessionStorage","getItem","STORAGE_IMPORTING_SERVICE","importingService","removeItem","toggleSharing","sharing","group_id","dashboard_id","dashboard_name","updateDashboard","newDashboard","toggleSharingInviteTab","INVITED_TAB_INDEX","users","default_group_id","fetchUsers","addReadOnlyUsers","address","currentUsers","baseReadOnly","currentUser","entity_id","inviteReadOnlyUsers","setDashboardTitle","dispatchToGeckoJS","addWidget","openMenu","closeMenu","openCopyModal","updateStatusIndicatorValue","doOpenNumberFormatter","doOpenWidgetStatusIndicator","saveNewNumberFormat","saveNewIndicator","openDeleteModal","openEditWidget","toggleQueryEditor","openNumberFormatter","widgets","numberFormat","openWidgetStatusIndicator","indicators","doCloseMenu","open","handleIndicatorTracking","widget","newIndicators","originalIndicators","getStates","indicatorsList","isNumber","newStates","difference","thresholds","hasRemovedIndicators","hasAddedIndicators","hasEditedIndicators","isEqual","trackingProps","visualisation","widgetType","getIntegrationTrackingDetails","saveIndicatorConfig","serviceTitle","slug","patchConfig","showGenericErrorToast","deleteStatusIndicatorConfig","handleNumberFormattingTracking","oldFormat","saveNumberFormat","dispatchEvent","closeAndSave","isUniversal","universalConfigSaveActions","editWidgetActions","postLogo","enctype","response","uploadLogo","file","upload","fields","formData","FormData","append","postResponse","decodeURIComponent","postCustomCSS","uploadCustomCSS","css","initialiseValues","cancel","setTheme","setThemeBackground","setThemeWidgetStyle","setShowGridPreview","setScaleToFit","setTvMode","setGridSize","setLargeTitles","setShowFooter","setShowClock","setShowLogo","setLogoSuccessful","setLogoFailed","setLogoValidationFailed","saveStart","saveSuccessful","saveFailed","uploadLogoStart","uploadLogoSuccessful","uploadLogoFailed","setCustomCSSValidationFailed","uploadCustomCSSStart","uploadCustomCSSSuccessful","uploadCustomCSSFailed","setCustomCSSLoaded","setColumns","mount","areWidgetsLoaded","waitForLogoUpload","customize","uploadLogoState","UPLOAD_LOGO_STATE_STARTED","UPLOAD_LOGO_STATE_FAILED","waitForCustomCSSUpload","uploadCustomCSSState","UPLOAD_CUSTOM_CSS_STATE_STARTED","UPLOAD_CUSTOM_CSS_STATE_FAILED","save","currentTvMode","tv_mode","toggles","allowances","filterByAllowances","themeBackgroundColor","themeWidgetStyle","scaleToFit","tvMode","showFooter","showClock","showLogo","logoSrc","largeTitles","newToggles","without","isGridLayout","columns","FRAME_WIDTH","gridSize","scale_when_fullscreen","customization","updatedDashboard","isWidgetOutOfFrame","moveOffCanvas","USER_THEME","navigate","showToast","FOOTER_SWITCHED_ON","refreshDashboard","setLogo","createObjectURL","serviceUploadLogo","setCustomCSS","serviceUploadCustomCSS","circle","dark","this","renderCircle","inlineStyle","animation","WebkitAnimation","MozAnimation","OAnimation","wrapper","range","Component","DARK_THEME","LIGHT_THEME","NAVY_THEME","PURPLE_THEME","CUSTOM_THEME","VALID_THEMES_INCLUDING_DASHIES","DARK_WIDGET_STYLE","LIGHT_WIDGET_STYLE","AUTO_WIDGET_STYLE","GROUPING_RE","FALLBACK_CURRENCIES","USD","GBP","EUR","ABBREVIATIONS","T","abbreviation","divider","B","M","K","none","MAX_PRECISION","DURATION_UNIT","years","days","hours","minutes","seconds","milliseconds","LOCALE_SUPPORT","toLocaleString","getAbbreviation","getPrecision","getSuffix","format","prefix","suffix","currencySuffix","formatter","autoPrecision","precision","currency","negative","absoluteValue","abs","minimumFractionDigits","maximumFractionDigits","computedPrefix","numberValue","currencyPrefix","roundedValue","pow","round","toFixed","intDigits","fractionDigits","integerDigits","getFormattedNumberSegments","val","referenceValue","fixedAbbreviation","reference","SUPPORTED_UNITS","UNIT_MEASURES","UNIT_THRESHOLDS","toMs","inputUnit","fromMs","outputUnit","getDurationSegments","largest","maxUnit","ms","SUPPORTED_UNITS_FOR_INPUT_UNIT","dropRightWhile","indexOf","segments","unitName","unitCount","unitMS","floor","thru","largestUnit","findIndex","indexToTriggerRound","needRoundUp","segmentsToBubbleOn","roundedSegments","tmpVal","dropWhile","take","parseDurationInput","input","total","getInputFromDuration","smallestSegmentUnit","valueInMs","allUnits","takeRight","largestSegmentUnit","allUnitsArray","u","humanizeDuration","humaniseNumber","separator","BASE_NODE_PROPS","Node","query_template_for_values","query_custom_values","template","primary_resource","useFK","path","virtual_join","foreign_key","target_key","custom","category","CUSTOM_FIELD","resource","values_from","primary_key","collection","grouped","groupValues","groupedOptions","forIn","formatKey","formatValue","getValueExtras","extras","combined_filters","cf","select","tk","isArray","possibleIds","equivalents","DATETIME","getDetailsNode","entryNode","output","subquery","tryFK","requestedPath","getCustom","getPath","buildBaseSubquery","entry","inputNode","roots","allCustomNodes","customQueries","custom_fields_queries","queriesResults","results","selectQuery","fieldTemplates","field_templates","customNodes","result","fieldTemplate","templateValues","prop","newNodes","rootsWithRel","relations","extraNodes","relation","targetedResource","equivalent_fields","cloneDeep","forOwn","rules","ruleName","rule","siblings","isEqualTo","resources","allEquivalentFields","nodesWithBase","foreignNodes","nodesWithColumns","countable","human_readable_name","allFields","details","default_columns","baseNode","pick","defaultColumns","traverse","visited","removeBaseFields","baseFields","getMetricFields","types","nodesFromRoot","compact","exclude_from_metrics","getFieldsByType","entries","predicateFn","uniqEntries","uniq","allCandidateNodes","supported_visualisations","hidden","intersectionWith","b","sortBy","getChildrenFromEntry","entryResource","getCompatibleMetrics","metricType","sv","pm","TYPE_TO_GROUP","SHOW_SCROLLBAR_DELAY","padContent","scrollbarWidth","paddingRight","masthead","right","getBodyClassList","classList","hideBodyScrollbar","bodyClasses","getScrollbarWidth","modalOpen","hasBodyScrollbar","showBodyScrollbar","remove","hideBodyScrollbars","DecoratedHiddenBodyScrollbars","nextProps","visible","hasScrollbars","PureComponent","bodyRenderer","ModalComponent","ALPHABET","cellRegex","getColumnLetter","columnString","columnNumber","currentLetterNumber","getNumberFromLetter","retVal","toUpperCase","colPiece","getSelectionSize","start","end","hasInfiniteRows","hasInfiniteCols","updateSelection","newSelection","newStartCol","newStartRow","newEndCol","max","newEndRow","colDiff","rowDiff","restrictToSingleDimension","maxCols","maxRows","inputToSelection","match","alpha","selectionToString","flatSelection","getWindowSize","formatCellValue","human","floatVal","isFinite","hasDisabledSelection","xAxis","series","stripInteger","intValue","unzipPathSelections","parentPath","memo","sampleIndex","childPaths","childSelections","flatSelections","isEntireColumnOrRowSelection","getFullHeaderFromCfg","headerPaths","getHeaderCells","headerIndices","first","zip","headerIndex","isMatch","getHeaderCellsFromCfg","zipObjectPath","getCanvasCells","viewport","scrolls","j","scrollCol","scrollRow","maxRow","rows","maxCol","ret","cellValue","toRenderableState","_minDefault","_maxDefault","selectedCells","numericCells","getNumericCells","getSelectionFormat","updatedConfig","getMixedInputValue","setMinMaxFromDefaults","showSuccessToast","showErrorToast","hideToast","showScheduledToast","toast","toastStorage","UNIVERSAL_VISUALISATIONS","isDurationInput","conformsTo","isString","isEmptyDurationInput","TIMESPAN_TYPES","GROUP_BY_CATEGORY_TYPES","GROUP_BY_TIME_TYPES","FILTER_FIELD_TYPES","DETAILS_TYPES","ORDER_BY_TYPES","AGGREGATE_OPTIONS","fullName","TIMESPAN_OPERATORS","TIMESPAN","PREV_TIMESPAN","PREV_SAME_TIMESPAN","PREV_PARTIAL_TIMESPAN","ALL_OPTION","TIMESPAN_CUSTOM_OPTION","label","getGroupedTimespanOptionsWithHint","g","opt","getTimespanLabel","hint","getTimespanHint","MAX_NUMBER_OF_METRICS","line","bar","leaderboard","geckometer","table","duration","datetime","int","float","percent","TIMESPAN_TRANSFORM","week","toUnit","multiplier","month","quarter","TYPE_ORDER","groupMetrics","categoryOrder","typeOrderStartIndex","catIndex","areMetricsTypesCompatible","uniqBy","_getInputFromDuration","getMsFromTimespan","durationToDays","getMaxQuantityForUnit","transform","timespanSupportsPrevSameComparison","canTimespanCompare","maxTimePeriod","totalTime","getTSComparisonOperatorForViz","getVisualisationsForMetric","metric","viz","intersection","canFormatNumberForType","truncate","tVal","day","startOf","getTimespan","tz","offset","moment","clone","subtract","SPLIT_TYPES","DEFAULT_LABEL","getMainColumnField","queryMetas","getIncompleteFromNow","ensureTimespan","qty","buckets","isBefore","nevValue","isSame","getBuckets","unionWith","getEnumHumanValue","stringKey","getSeriesName","capitalize","sortSeries","getMultilineScatterSeries","selectMeta","isTimespanComparisonOn","point","x","y","getMultilineSeriesAndLabels","labels","numXPoints","labelX","fill","Array","unzip","dimensions","goalValue","getFormat","mainColumn","useRelativeTime","parseNumberValue","wrappedValue","isNull","fillInValues","seriesType","splitQueryString","list","joinQueryParams","history","createBrowserHistory","goBack","getHistory","getQueryParams","search","getQueryParam","param","setQueryParam","pathname","queryParams","fullOpenMenu","setWidgets","widgetAdded","widgetChanged","widgetConfigChanged","widgetRemoved","widgetDragStart","widgetDragEnd","widgetLocationChanged","locationChangeStart","locationChangeAccomplished","locationChangeEnd","launchCelebration","finishCelebration","setAwaitingInitialServerSideRefresh","transformedWidget","convertWidgetLayoutToGrid","reset","widgetsPayload","widgetTypes","mirageInterations","activatedMirageIntegrations","getFromWidgets","adjustedWidgets","localForage","STORAGE_KEY_LAST_ADDED_WIDGET","lastWidgetKey","widgetData","can_edit","formattedWidgets","importUniversalCompactConfig","layoutChanged","originalLayout","originalLocation","transformedLayout","convertWidgetLayoutFromGrid","DASHBOARD_WIDGET_LOCATION","widgetService","usesCompactConfig","editPath","getEditWidgetPath","managementService","mirageHelpers","widget_id","widget_type_id","widget_type","widgetUpdateConfig","attributes","originalConfig","copyWidget","originalWidget","organizationId","configuration","widgetTitle","dashboardTitle","dashboardPath","widgetHasMovedOffCanvas","OFF_CANVAS_WIDGET_LOCATION","moved_by_user","inception","_getNextWidgetOrder","order","widgetList","w","maxOrder","_getNextStableWidgetOrder","stableWidgets","stableOrder","resizeWidget","left","top","pixel_width","pixel_height","moveWidget","position","DEFAULT_SIZE","defaultWidth","defaultHeight","convertedLayout","userAction","widgetTypeId","widgetTypeTitle","visualisationType","isUserAction","LOCATION_CHANGE_CLICK","LOCATION_CHANGE_DRAG","trackMove","pixelWidth","pixelHeight","locationChangeMove","processDataReceived","currentValue","newValue","threshold","newData","currentData","canCelebrate","has","comparison","isPercentageThresholdType","thresholdType","hasValue","isNumberViz","hasGoal","service_id","dataReceived","DECIMAL","PERCENT","isDatetime","inputValue","parseFormat","parseNumberBasedOnFormat","isPercentage","isCurrency","isSameCurrency","numericValue","getGeckometerValue","formatPatchedConfig","getInitialContainerArea","storedArea","CONTAINER_AREA_KEY","parsedArea","row_start","rowStart","column_start","columnStart","row_span","rowSpan","column_span","columnSpan","getDefaultSize","WIDGET_POSITION_KEY","initial_container_area","update","formattedConfig","copyToDashboard","locationToParse","updateLocation","broker","COMPONENTS","trigger","GeckoComponent","View","domNode","findDOMNode","__view__","getBroker","insertBefore","getDOMNode","firstChild","render","useView","viewName","registerView","WrappedGeckoComponent","propName","isFunction","SERVICE_CUTOFF_TIMESTAMPS","salesforce","ga2","showLegacyService","organizationCreated","SERVICE_LABELS","beta","legacy","new","UNIVERSAL_SERVICES","SPREADSHEET_SERVICE_NAMES","HIDDEN_SERVICE_NAMES","HAS_PRESETS","removeHiddenService","hiddenServices","handleAliasedService","keywords","isAliased","handleLegacyService","newSalesforceService","polymorphic","isLegacy","newGaService","transformPolymorphic","transformUniversal","transformPresets","hasPresets","sortByTitle","toLowerCase","buildServiceList","amendedServices","transformedServices","aliasedServices","formattedService","transformServices","serviceKey","getServiceLabel","initFlow","serviceType","initDataSource","setState","isPanelVisible","togglesOAuthWindow","createConnectionSuccessful","createConnectionFailed","connectionCancelled","fetchServiceSuccessful","fetchServiceFailed","switchServiceStart","switchServiceSuccessful","switchAccountStart","switchAccountSuccessful","accountAddSuccessful","accountAddFailed","initFailed","getFreshServiceAccountId","serviceAccount","serviceAccountId","addConnection","extraParams","onAddConnectionSuccess","is_universal","createConnection","auth_type","cancelConnection","initConnector","switchService","servicePicker","fetchList","files","fileFetchFailed","addAccount","auth","errorProps","switchAccount","serviceAccountIdString","initPanelOldIntegration","init","DATA_FETCH_ERROR","DATA_FETCH_START","DATA_FETCH_SUCCESSFUL","INIT_CONFIG_ERROR","INIT_CONFIG_LOADING","INIT_CONFIG_SUCCESSFUL","SET_STATE_PROPS","SWITCH_VISUALISATION_TYPE","UPDATE_CONFIG","WIDGET_CONFIG_FETCH_FAILED","WIDGET_CREATION_START","WIDGET_CREATION_FAILED","WIDGET_UPDATE_START","TOGGLE_TABLE_HEADERS","SET_PROGRESS_GOAL","getAttributeValue","dataAttribute","dataset","getActiveElement","activeElement","checkValidity","scrollElement","scrollLeft","scrollTop","getScrollHeight","scrollHeight","collectOffsets","currentNode","offsetLeft","offsetTop","offsetParent","getEventDistanceFromElement","rect","getBoundingClientRect","pageX","pageY","bottom","getClientSize","getScaledClientSize","getOffsetSize","offsetWidth","offsetHeight","getScrollOffsets","scrollDiv","overflow","convertSelectionToObjectFormat","firstCell","convertSelectionToArrayFormat","isRowSelection","isColumnSelection","_convertRangeToColumns","firstColumn","firstRow","lastColumn","lastRow","_convertRangeToRows","convertSelectionRangesToColumns","ranges","convertSelectionRangesToRows","compressSelections","compressed","previous","areSelectionsAdjascent","initial","getComparisonValue","valueOption","getMinimumHeight","getHumanReadableName","clock","funnel","feed","text","rag","ragcolumn","pie","highcharts","monitoring","bullet","image","isHalfHeight","isSmallDimension","dimension","isMediumDimension","isLargeDimension","DropItemComponent","layoutClassName","innerClassName","innerIconClassName","getIcon","isSmall","selected","dividerTop","dividerBottom","noPadding","hasLeftIcon","dropItem","pointer","innerWrapperClasses","innerWrapper","small","unpadded","selectedClasses","iconLeftWrapper","tabIndex","ItemWithRightHint","flexAuto","doSetActiveField","doSetValue","doSetValues","widgetCreationStart","widgetCreationSuccessful","widgetCreationFailed","widgetUpdateStart","widgetUpdateSuccessful","widgetUpdateFailed","widgetConfigFetchStart","widgetConfigFetchSuccessful","widgetConfigFetchFailed","initSpreadsheetConfigStart","initSpreadsheetConfigSuccessful","initSpreadsheetConfigFailed","doSwitchVisualisationType","toggleFilePicker","deleteTableColumn","reorderTableColumn","DEFAULT_TYPE","createWidget","spreadsheets","hasHeader","forSerialization","serialize","data_source","widget_type_name","visualisation_type","isColumnFilled","column_count","has_header","pathHelpers","updateWidget","initialConfig","worksheetId","fileId","widgetPreUpdate","indicatorTrack","goalTrack","handleGoalTracking","formattingTrack","configTrack","graphqlDashboard","grapqhlDashboardHelpers","instrumentId","widgetStorage","spreadsheet","worksheet","spreadsheetErrorType","getSpreadsheet","getWorksheet","showFilePicker","worksheets","getVisualisationHelpers","getDefaultConfig","setActiveField","setValue","activeFieldPath","setValues","currentConfig","previousConfigs","lastConfigForType","visualisationHelpers","getVisualisationHelpersV2","translate","configMappingRules","getActiveDashboardId","Cookies","setView","openUpgradeModal","openModal","closeModal","setDevices","fetchDevicesStart","fetchDevicesSuccess","fetchDevicesFailed","openModalAndFetchDevices","devices","loops","groupsActions","loopActions","connectDeviceStart","connectDeviceSuccess","connectDeviceFailed","currentDashboardId","activeDashboardId","defaultTo","connectDeviceService","device_id","ADDED_SCREEN","refreshDeviceStart","refreshDeviceSuccess","refreshDeviceFailed","refreshDevice","manageScreens","allLoops","sharingLoop","refreshSharingLoop","deleteDeviceStart","deleteDeviceSuccess","deleteDeviceFailed","deleteDeviceService","setDeviceNameStart","setDeviceNameSuccess","setDeviceNameFailed","setDeviceNameService","setDeviceConnectionStart","setDeviceConnectionSuccess","setDeviceConnectionFailed","setDeviceConnection","toggleLiteStart","toggleLiteSuccess","toggleLiteFailed","toggleLite","enabled","SUCCESS","ERROR","DEMOTED_TO_DASHBOARD_VIEW_ONLY","SHARING_LINK_COPIED","REGENERATED_SHARING_LINK","REGENERATED_LOOP_SHARING_LINK","CREATED_LOOP","ADD_A_GOAL","DASHBOARD_TEMPLATE_CREATE_ERROR","WIDGET_COPIED","getYAxisFormat","labelType","getSeries","pegSeries","getXLabels","pegLabels","getLabelType","numberToDisplay","destructureSalesforceConfigWrap","transformer","limitSeriesTransformWrap","initialSeries","fn","queryManager","closeFilePicker","fetchFilesStart","fetchFilesFailed","fetchFilesSuccess","folderSelected","obtainUUIDError","trackSpreadsheetsFileSuccess","trackSpreadsheetsFileFailed","debouncedFetchList","args","DebouncePromise","searchFiles","encodeURIComponent","isServiceAccountExpired","filterSearch","attribute","openFile","fileOptions","getRedirectPath","obtainUUID","uuid","file_url","spreadsheetUrl","changeFile","polecatService","actionPicker","setSelectedFolder","folder","capitalizeFirstLetter","charAt","setOptGroupName","optGroupName","currency_code","mergeFields","groups","isOptGrouped","groupFields","debouncedQueryAutocompleteValue","tap","groupable","numeric","setProgressGoal","datasetSet","datasetSetError","resetConfig","setTableType","resetQueryHistory","reorderColumn","_initialise","dataSetId","widgetQuery","datasetService","fetchDataSet","includesData","dataSet","fieldGroups","datasets","ensureQuery","queryDataSet","queryResult","isLoading","debouncedQueryDataSet","debouncify","_updateQueryAndConfig","cleanQuery","syncFiltersQuery","_autocomplete","formState","currentFieldType","currentFormState","shouldPerformSearch","queryAutocompleteValue","filterModal","highlightedItemIndex","suggestions","datasetId","extendedConfig","setTypedExtremum","switchTableType","_previousSummaryQuery","_previousRawQuery","tableType","FORM_TYPES","SUMMARIZED","RAW","newQuery","tableHelpers","getDefaultQueryForRaw","getDefaultQueryForSummary","currentQuery","updateQuery","refreshFile","_previousQueries","currentType","restConfig","VisualisationHelpers","baseQuery","mapQuery","getFieldTypes","changeTableColumnField","changeColumnAggregate","orderBy","order_by","newColumns","newColumn","_aggregate","newOrderByQuery","newFormat","isTimespan","extendedFormState","sortTable","columnIndex","isContentLoading","updateSortTableQuery","removeTableColumn","newColumnsQuery","MULTISERIES_COLOURS","d3","hsl","ColourBrewer","currentNeutralColourHex","getComputedStyle","getPropertyValue","colour","rgb","colours","next","getNextColour","NUMERIC_FORMATS","WidgetNumberFormat","connect","formattableColumns","heading","getFormattableColumns","onNumberFormatUpdate","change","widgetMenuActions","onSave","onClose","WidgetNumberFormatComponent","WidgetStatusIndicatorFormConnector","comparisonType","durationMetricUnit","onChange","onDelete","onEditWidget","widgetActions","WidgetStatusIndicatorFormComponent","CopyWidgetModalComponent","selectedDashboardId","bindAll","onConfirm","getOtherDashboards","isCurrentDashboardSelected","handleConfirm","confirmButtonLabel","getWidgetTitle","radioLabel","checked","handleSelectCurrentDashboard","radioInput","handleSelectDifferentDashboard","isFullWidth","defaultPropTypes","array","CopyWidgetModalConnector","COPY","stateProps","dispatchProps","CopyWidgetModal","dashboardTimezone","CompactConfig","CompactConfigConnector","WidgetMenuPositionerConnector","scaleFactor","widgetWidth","WidgetMenuPositioner","CLOSED","DELETE","MENU","NUMBER_FORMAT","STATUS_INDICATORS","DeleteWidgetModal","isNegative","WidgetMenuComponent","setPosition","prevProps","messageId","disabledMessage","menuItemClasses","menuItem","menuItemDisabled","menuItemLoading","menuItemWrapper","spinnerWrapper","menuTooltipWrapper","tooltip","canFormatNumber","canSetIndicators","isExpired","isImporting","isGridDashboard","isStatusIndicatorsSet","isDuplicateDisabled","onCopy","onDuplicate","onEdit","onFormatNumber","onMoveWidgetOffCanvas","onOpenDeleteModal","onOpenWidgetStatusIndicator","realTimeUpdates","refreshDelay","ref","el","menu","renderMenuItem","menuItemEdit","menuItemFormatNumber","menuItemWarning","menuItemCopy","menuItemDuplicate","menuItemMoveOffCanvas","menuItemDelete","presentRefreshDelay","isEditing","renderMenu","onCloseDeleteModal","onDeleteWidget","container","renderContent","inside","outside","useCompactConfig","getServicePath","isNewIntegration","hasAccounts","getWidgetTypePath","serviceLib","canUseSpreadsheetsBeta","getDashboardPath","getDashboardFromStorage","layoutType","__typename","widgetHash","isNaN","ListItemMeta","styles","meta","ListItemOuter","ListItem","hasHoverState","isHighlighted","itemTypeSmall","hasHover","align","Image","loaded","handleLoad","classnames","onLoad","apply","Rules","cfg","lastCfg","translators","sourceKey","translator","targetKey","identity","sourcePath","targetPath","pair","RuleSet","applyAndMerge","private","custom_conversions","insights","adsets","ads","campaigns","time_fields","aggregated","exclude_from_filters","exclude_from_groupby","ad_accounts","adAccounts","account_id","max_time_period","reverse_comparison","default_aggregation","additional_info","satisfaction_ratings","tickets","group","responder","VALUES_QUERY_TEMPLATE","accountSummaries","goals","customMetrics","customDimensions","propertyName","propertyId","views","show_expanded","allow_free_form","reports","accounts","summ","accountName","viewId","filter_exclusion_groups","leads","companies","activities","deals","optimisation_order","audit","orders","enable_for_performance","filter_associated_fields","is_first_class","exclude_from_details","iconSuffix","assignee","real_time_chats","real_time_agents","chats","description","group_by","bucket_by","multi_index","heirloom","bound_to_metric","detailsMetricResource","DEFAULT_DELIVERY","DISABLED_CACHE","InquisitorError","metadataIntegrations","fetchPresets","presets","presetIntegrations","uid","cache","requestHeaders","refresh","saId","mergeQueryResults","queryMeta","customQuery","mapSubQueryResult","transformedValues","DEFAULT","GRAY","ButtonGroup","spaced","notSpaced","Children","toArray","child","saveDashboardsToStorage","graphQLDashboards","mappedDashboards","legacyId","setItem","GRAPHQL_DASHBOARDS_WITH_LAYOUT_KEY","legacyDashboardId","dashboardsFromStore","dashboardList","isContainerLayout","INSTRUMENT_QUERY","gql","getInstrumentIdFromWidgetKey","graphQLDashboardId","variables","containers","instruments","frames","frame","instrument","flattenDeep","doNotUseLegacyWidgetKey","LAYOUT_TYPES","ClassicLayout","FixedLayout","ContainerLayout","GRAPHQL_LAYOUT_TYPES_TRACKING","getExtra","DEFAULT_TIMESPAN_OPERANDS","getBucket","getQueryMetas","metricMeta","isDetailsMetricSelected","detailsColumns","columnNode","hasReverseComparison","groupByMeta","splitByMeta","resolveNodesCrossResource","mainGraph","keepExisting","uiSubQuery","getFilterQueryFromUiQuery","mainEntry","LARGER_UNIT","year","groupEntries","applyComparison","Map","newState","prerequisiteKeys","filterQ","filtersToStrip","lodashFilter","prerequisitesToStrip","boundFilterQs","splitByQ","splitBySelectQ","boundToMetricFilters","timespans","hasKey","tmp","keyToCompare","xor","timespan","getQueriesFromUiQuery","_state","_entries","timespanComparison","orderByQ","buildQueryForDetailsTable","timespanOperator","timespanOperands","pop","timeshift","addTimespanComparison","hasMultiQueries","qIndices","mainIndex","currentMetricsQ","groupByQ","xaxisQ","timespanQ","constructQueries","serviceAccountFilters","prerequisitesSubQ","filterSubQ","getFilterNodesFromQueries","globalFiltersSubQ","filterSets","boundToMetricFiltersSubQ","filtersSubQ","filterSetSubQ","getNodesFromQueries","_queries","sharedState","queriesState","multiQueryState","_filter","groupBySubQ","splitBySubQ","orderBySubQ","vipFiltersSubQ","isPrerequisite","selectSubQ","metricsSubQ","metricSubQ","timespanSubQ","nbOfMetrics","mainMetricNode","baseTimespans","times","groupByBase","orderByBase","allMetrics","metricsOrder","getMetricsOrder","queryState","sorted","getGlobalFilters","filterTypes","getDistinctId","cookieName","env","GB_ENV","idFromCookie","Cookie","newId","SessionTracker","sessionType","trackingProperties","sessionId","COOKIE_PREFIX","TRACKING_ENABLED","startSnowplowTracking","startLegacyTracking","snowplowFn","SNOWPLOW_INTERVAL","setInterval","forceStart","getCookieName","TRACKING_HOST","cookie_enabled","cookieEnabled","session_type","session_id","startUpdateTimer","updateSession","LEGACY_INTERVAL","setUserGroups","setUserOrganization","getCurrentUserSuccess","getCurrentUserFailed","getUserOrganizationSuccess","setCheckpointStart","setCheckpointSuccess","setCheckpointFailed","updateUsersDashboardsPermissionsSuccessful","trackMarketingCampaignCapterra","isInitialSignup","hasCheckpoint","checkpoints","handleInitialSignup","SegmentTracker","getInstance","initialiseNonGraphQLPage","initialiseSharedGraphQLDashboard","sharingHash","currentOrganization","dashboardType","gb_user_id","master_account_name","trial_end","initialiseScreenGraphQLDashboard","screenId","pusher_channel","AuthStrategy","strategy","tvPageActions","initialiseGraphQLEditPage","signedUpUser","updateCheckpoint","updateUsersDashboardsPermissions","usersDashboardsPermissions","Serializer","mapIndices","max_column","max_row","min_column","min_row","LineChartSerializer","configValues","constructor","configKeys","configDefaults","payloadValues","x_axis","ColumnChartSerializer","BarChartSerializer","NumberSerializer","progressIndicator","statusIndicator","LeaderboardSerializer","reverseSort","GeckometerSerializer","reverseGoalDirection","TextSerializer","isLoop","TableSerializer","getSerializer","serviceSerializer","getServiceSerializer","visualisationSerializer","getVisualisationSerializer","merge","InputComponent","hasError","placeholder","isUppercase","maxLength","autoFocus","uppercase","handleChange","handleBlur","textInput","focus","len","setSelectionRange","Input","CDN_BASE_URL","loadMap","AmChart","load","importMap","importTopoJson","formatMapObject","ammapsId","projection","getMapData","mapType","mapData","world","continents","countries","regions","sanitizeAndScalePoints","points","_map","normalizedColor","latitude","longitude","color","diameter","sqrt","InMemoryCache","fragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","dataIdFromObject","cacheRedirects","Query","getCacheKey","ApolloClient","operation","getCSRFToken","setContext","uri","GRAPHQL_ENDPOINT","authQueryString","SpreadsheetError","refreshSpreadsheet","maxAge","spreadsheetId","mapKeys","snakeCase","worksheet_id","file_id","refreshInterval","refresh_interval","inviteUsersToGroup","getUsersByGroup","removeUserFromGroup","deleteUser","setRole","demoteToGroupId","MAX_TITLE_LENGTH","shape","pixels","FramedFormattedNumberComponent","TagName","fontSize","mainFontSize","dx","isSvg","secondaryFontSize","SPACING","parts","durationParts","segUnit","stringValue","renderNumberValue","renderDurationUnit","renderDuration","renderNegative","renderPrefix","renderAbbreviation","renderSuffix","layoutStyle","renderNumber","FramedFormattedNumber","_toSavedPath","updates","UPLOAD_LOGO_STATE_SUCCEEDED","UPLOAD_CUSTOM_CSS_STATE_SUCCEEDED","RagVisualisationComponent","ragType","Rag","RagColumn","RagVisualisation","noHeading","NUMBER_COMPARISON_TYPES","SparklineComparison","PercentageComparison","NumberComparison","VISUALISATIONS","Bar","BarComponent","Bullet","BulletComponent","Clock","ClockComponent","ColumnChartComponent","Feed","FeedComponent","Funnel","FunnelComponent","Geckometer","GeckometerComponent","Highcharts","HighchartOrLineChart","ImageComponent","Label","NoHeadingTextComponent","Leaderboard","LeaderboardComponent","LegacyLine","LineComponent","Line","List","ListComponent","MapComponent","Monitoring","MonitoringComponent","Number","NumberComponent","PieChart","PieComponent","RagComponent","Table","fixedPadding","Text","LEGACY_DASHBOARD_TYPES_VISUALISATIONS","TextComponent","TableComponent","VIEWING_CONTEXT_TYPES","SHARE","CUSTOMIZE","getVisualisationComponent","dashboardLayoutType","warn","getVisualisationPadding","useLargeFont","padding","paddingTop","paddingBottom","paddingLeft","getTitleHeight","hasTitle","getVisualisationSize","titleHeight","h","isSpreadsheetCellReference","configValue","getConfigValue","statusIndicatorToLegacyFormat","lowerThreshold","upperThreshold","positiveIsUp","positiveDirection","_currentUpperState","lowerValue","upperValue","lowerState","upperState","transformFormStateToThresholds","graphQLToLegacyNumberFormat","decimalPlacesPrecision","decimalPlacesStyle","unitPlacement","unitValue","mappedNumberFormat","getStatusIndicatorValues","configStatusIndicator","dataStatusIndicator","mapStatusIndicator","canUseResponsiveNumberViz","statusIndicatorToGoal","statusIndicatorValues","statusIndicatorToValues","transformConfig","graphQLConfig","integrationSlug","graphQlConfig","sharedConfig","numberFormats","nf","getLayout","transformSharedConfig","timezone_offset","fullhour","reload","reloadIntervalSeconds","LABEL_TYPES","TEXT","ALERT","INFO","minYAxis","maxYAxis","mapFocus","startingValue","targetValue","progressIndicatorToComparison","mappedComparison","reversed","transformNumberComparison","labelAndTitleToNumberVizLabel","transformData","mergeConfigAndData","getVisualisationData","dataUrl","authQueryParam","paramString","addQueryParam","INSTRUMENT_STATES","backgroundLoading","foregroundLoading","importing","outdated","ready","stale","warning","ERROR_INSTRUMENT_STATES","ErrNoData","ErrNoDataPushed","ErrOAuthTokenExpiredOrInvalid","ErrServiceAccountNotFound","ErrTimeout","ErrImportPending","getInstrumentDisplayState","isDataFromCache","isPartial","dataUpdatedAt","hasData","formatLastUpdatedText","updatedAt","getNumberInstrumentValue","shouldTriggerCelebration","previousData","previousValue","transformLegacyConfigToGraphQL","legacyConfig","DEFAULT_GRAPHQL_NUMBER_FORMAT","legacyToGraphQLNumberFormat","legacyNumberFormat","auto","legacyToGraphQLNumberFormatShape","legacyToGraphQLStatusIndicatorsFormat","legacyStatusIndicatorsFormat","lowerThresholdIndex","upperThresholdIndex","matches","String","usesOAuth","dataAccId","data-acc-id","HOURS_24","now","clear","owner","is_admin","group_memberships","DASHBOARD_ROUTES","dashboardContext","currentPath","matchPath","getDashboardId","isLegacyId","TrackingPropsQuery","TrackingPropsLegacyIdQuery","readQuery","columnCount","grid","_window","typeof","bugsnagClient","notify","getLoopsStart","getLoopsSuccess","getLoopsFailure","createLoopStart","createLoopSuccess","createLoopFailure","updateLoopStart","updateLoopSuccess","updateLoopFailure","deleteLoopStart","deleteLoopSuccess","deleteLoopFailure","getLoops","numberOfBoards","dashboard_ids","createLoopService","newLoop","loop_id","nb_of_boards","link","getLoopURL","updateLoopService","deleteLoopService","HeaderCell","renderDescription","NUMERIC_TYPES","DATE_TYPES","Cell","getDatetimeFormat","getFormatOptions","renderValue","UPDATEABLE_PROPS","bodyWithCoercedSharing","patchDashboard","country","updateDashboardTitle","regenerateSharingLink","getUserDashboards","getViewOnlyUsers","copyDashboard","dashboardName","CardComponent","header","isDisabled","isSlim","isSuperSlim","bodyOnly","slim","superSlim","card","canClick","CardGroup","TogglableCardComponent","headerContent","toggleButton","handleToggle","getGeckometerDefaultMinMax","maxDefault","roundToPowerOfTen","getPlaceholder","setExtremum","_default","_typed","extremum","openUniversalConfig","closeDeleteModal","openInstrumentStatusIndicator","setStatusIndicators","openInstrumentNumberFormatting","setNumberFormat","GET_CURRENT_USER_SCOPE_QUERY","useCanUserEdit","useQuery","scope","useDashboardQueryProps","dashboardFragment","fragments","mainFragmentName","useParams","CustomizationDashboardFragment","ContainerLayoutDashboardFragment","instrumentFragment","numberFormatFragment","statusIndicatorFormatFragment","NonContainerLayoutDashboardFragment","useCurrentDashboardCustomization","useCurrentDashboard","fragment","useDragHelper","spec","useDrag","useDragLayerHelper","useDragLayer","useDropHelper","useDrop","useFeatureFlags","flags","useSelector","useAllowances","DashboardTitleFragment","useDashboardTitle","DashboardLayoutFragment","useDashboardLayoutType","useClickOutsideListener","callback","useRef","clickHandler","current","contains","useEffect","addEventListener","removeEventListener","isMobileSize","isMobileViewport","useMobileDetect","useState","isMobile","resizeHandler","useEnterAndEscape","onEnter","noop","onEscape","keyCode","isEscape","isEnter","useIsFreePlan","is_free","DropMenuComponent","autoClose","origin","dropMenuButton","menuBoundingRect","buttonTop","buttonHeight","shouldMenuRenderUpwards","buttonClasses","button","noHover","onToggle","extendedProps","cloneElement","isAnchored","listClassName","animate","renderSearchInput","wrapperClasses","dropMenu","listClasses","anchored","topRight","bottomLeft","topLeft","listPosition","getListPosition","renderButton","data-menu","handleAction","renderChildren","viewportHeight","containerPosition","fitsAbove","fromTop","fromBottom","setConfigAndData","changeRefreshInterval","configUpdated","originalGoal","originalComparision","comparision","newGoal","newComparision","hasGoalValuesChanged","hasOriginalGoalValues","hasNewGoalValues","trackingDetails","transformedData","setProxyIntegration","setActivatedIntegrations","setMirageProxyService","initMirageServiceAccount","mirageServiceAccounts","universalBootstrapActions","initMirageConfig","proxyIntegration","bootstrapMirageFromConfig","mirageProxyServiceId","runMirageQuery","universalConfigActions","mirageService","done","ServiceIconComponent","rounded","iconBase","ServiceIcon","BubbleComponent","isLight","isWide","bubble","InfoBubbleComponent","toggleTooltip","isVisible","isDark","isBubbleLight","targetPosition","isBubbleWide","zIndex","openingDirection","help","info","tTop","tLeft","isFixed","GRID_WIDTH","GRID_HEIGHT","FRAME_HEIGHT","STABLE_TOP","STABLE_TOP_PAD","isSaving","prepareWidgetData","rawSource","integrationMeta","cleanConfig","removeKeysWithUnderscore","arrangeConfig","amendedMetas","amendedSelect","beQueries","TEMPLATES","saveUserPreferences","setPreferences","createAndTrack","fromCompact","from_compact","widgetDataReady","newWidgetData","originalWidgetData","newWidgetContext","addStraightToDashboard","proxyService","dataSourceConnector","connectedServiceName","requiresImport","data_id","dataError","clearData","WARNING","mapTypeToIcon","Alert","alert","alertIcon","alertContent","alertTitle","ConfirmModal","AsyncComponentLoaderComponent","component","__isMounted","loadComponent","importComponent","renderComponent","onError","AsyncComponentLoaderConnector","passthrough","createReactRenderer","propsTransform","domHost","ctx","app","idempotentInitApp","ReactDOM","getStore","unmountComponentAtNode","INPUT_DEFAULT_SELECTION","MULTIPLE_INPUT_DEFAULT_SELECTION","TooltipComponent","classTooltip","tooltipWrapper","renderTooltip","hoverTarget","onMouseEnter","onMouseLeave","Tooltip","combinedFilter","max_age","findCustomFilter","initialLoad","newUiQuery","coreQuery","newGlobalFilters","currentFilters","getQueryForValue","subQueryPayload","savedFilter","initDataSourceStart","initDataSourceSuccessful","initDataSourceFailed","fileFetchStart","getDefaultService","filteredServices","_groupId","fetchFiles","SalesforceError","getMeta","parameters","refreshReport","fetchData","yAxis","report_id","dataSetID","demo","created_at","SERVICES","gsheets","componentPicker","ToastRootComponent","preview","React","ToastComponent","autoHide","startTimer","stopTimer","messageType","delayed","autoWidth","delayedAnimation","success","_timer","ToastIcon","large","toastIcon","toastIconLarge","ToastRoot","worksheetFetched","worksheetFetchFailed","setScrolls","fetchWorksheet","fetchFile","ARG","BOL","BRA","CHL","COL","ECU","FLK","GUY","PYR","PER","SUR","URY","VEN","AUS","NCL","NZL","PNG","SLB","VUT","DZA","AGO","BEN","BWA","BFA","BDI","CMR","CPV","CAF","TCD","COM","COG","COD","CIV","DJI","EGY","GNQ","ERI","ETH","GAB","GMB","GHA","GIN","GNB","KEN","LSO","LBR","LBY","MDG","MWI","MLI","MRT","MAR","MOZ","NAM","NER","NGA","RWA","STP","SEN","SLE","SOM","ZAF","SDN","SWZ","TZA","TGO","TUN","UGA","ZMB","ZWE","ALB","AND","AUT","BLR","BEL","BIH","BGR","HRV","CZE","DNK","EST","FRO","FIN","FRA","DEU","GRC","VAT","HUN","ISL","IRL","IMN","ITA","JEY","LVA","LIE","LTU","LUX","MKD","MLT","MDA","MCO","MNE","NLD","NOR","POL","PRT","ROU","SMR","SRB","SVK","SVN","ESP","SWE","CHE","UKR","GBR","ATG","ABW","BHS","BRB","BLZ","BMU","CAN","CYM","CRI","CUB","CUW","DMA","DOM","SLV","GRD","GTM","HTI","HND","JAM","MEX","MSR","NIC","PAN","PRI","KNA","LCA","MAF","SPM","VCT","SXM","TTO","TCA","USA","VGB","VIR","AFG","ARM","AZE","BHR","BGD","BTN","BRN","KHM","CHN","CYP","GEO","HKG","IND","IDN","IRN","IRQ","ISR","JPN","JOR","KAZ","PRK","KOR","KWT","KGZ","LAO","LBN","MAC","MYS","MNG","MMR","NPL","OMN","PAK","PHL","QAT","RUS","SAU","SGP","LKA","SYR","TWN","TJK","THA","TLS","TUR","TKM","ARE","UZB","VNM","YEM","invariant","splice","getAllKeys","getOwnPropertySymbols","copy","Set","getPrototypeOf","newContext","commands","defaultCommands","extend","directive","isEquals","$apply","nextObject","objectWasNextObject","nextValueForKey","nextObjectValue","$push","invariantPushAndUnshift","$unshift","$splice","originalObject","invariantSplice","invariantSplices","$set","invariantSet","$toggle","targets","invariantSpecArray","nextObjectCopy","$unset","$add","invariantMapOrSet","$remove","delete","$merge","specValue","original","contextForExport","command","typeOfTarget","tzRegex","normalise","getParseFormat","time","test","hasTZ","UTC","pickFormat","ticks","getUTCMilliseconds","getUTCSeconds","getUTCMinutes","getUTCHours","getUTCDate","getUTCMonth","pickTooltipFormat","prettyDateFormat","dateStrings","dates","str","utc","prettyDateFormatForDuration","today","thisYear","tick","hour","isMirageService","isMirageWidget","findMirageService","prepareMirageWidget","createMirageServiceAccount","expires_at","expired","about_to_expire","shouldCreateMirageWidget","connections","SUPPORTED_MIRAGE_SERVICES","canServiceUseMirage","getInitials","codePointAt","fromCodePoint","EMAIL_RE","themes","navy","purple","dashiesDark","dashiesLight","NUMBER_FORMATTING","applyRatioToWidgetLayout","ratio","applyRatioToFrameLayout","convertFrameLayoutToGrid","convertFramePositionFromGrid","WHATS_NEW_ENDPOINT","toggleModalAction","toggleNotification","markAsReadAction","fetchDataStart","fetchDataSuccess","fetchDataFailed","toggleModal","whatsNew","markAsRead","etag","whats_new_etag","checkForNewUpdate","userEtag","firstRun","DATETIME_BUCKETING_ONLY","COLUMN_MAPPINGS","NUMBER_AND_GECKOMETER_MAPPINGS","QUERY_MAPPING_RULES","ensureConfig","getDefaultQuery","firstDatetimeField","firstNumericField","numberOfMetrics","bucketBy","xAxisField","split_by","fromType","MAP_METRICS","newComparison","stored","_order_by","MULTI_METRICS_MAPPINGS","transformers","_minTyped","_maxTyped","firstXAxis","xAxisType","newXAxisType","switchFromStringType","ColumnChartHelpers","DATA_METHODS","LineChartHelpers","NumberHelpers","LeaderboardHelpers","GeckometerHelpers","BarChartHelpers","TableHelpers","getPusherChannel","setPusherChannel","setPusherReady","queueFetchedData","isCurrentQuery","isCancelledQuery","cancelledQueries","handlePushEvent","eventName","isConfigReady","importingWidgetKey","isPreviewOpen","getEditedWidgetKey","widgetDataActions","_connectToPusher","channel","PushManager","subscribe","authService","usersFetchStart","usersFetchSuccessful","usersFetchFailed","deleteUserStart","deleteUserSuccessful","deleteUserFailed","currentUserId","deleteUserService","target_user_id","getBackgroundColor","themeName","getWidgetColor","getGeckoboxBackdropColor","backgroundColor","hsluv","hexToHsluv","hsluvToHex","getUserThemeVariables","widgetStyle","baseTheme","dashboardTextColor","draggerColor","geckoboxGridColor","positiveColor","customTheme","widgetColor","generateAutoWidgetColor","getActiveWidgetColor","hue","saturation","lightness","widgetSaturation","widgetLightness","setFiltered","setRecentlyConnected","fetchSources","includeRecentlyConnected","fetchRecentlyConnected","predicate","EMPTY_DURATION_INPUT","SUPPORTED_DURATION_INPUTS","_config","updatedMin","updatedMax","arrangeMinMax","arrangeDurations","transformCtx","ensureNumberFormat","isDurationInputField","parsedValue","ensureDurations","getRoot","ensureDetailsMetric","minDuration","ensureMinMax","ButtonGroupVisual","flexEqualWidth","ButtonVisual","helpText","isActive","STATUSES","IDLE","LOADING","ProgressBar","progress","containerClasses","progressBar","indeterminate","determinate","MenuLabel","iconContainer","GRID_ROWS","GRID_COLUMNS","MIN_CONTAINER_ROW_SPAN","MIN_CONTAINER_COLUMN_SPAN","CONTAINER_GRID_CELLS","DASHBOARD_GRID_GAP","DRAG_TYPES","CONTAINER","FRAME","SINGLE_FRAME_CONTAINER","ToggleInputComponent","hasText","toggleClasses","toggleInput","labelClasses","classesKnob","knob","handleFocus","ToggleInput","SpreadsheetsSerializer","comparisonLabel","SalesforceSerializer","salesforceConfig","orientation","setOrientation","reportId","updateOldNumberWidget","DatasetsSerializer","DatabaseSerializer","UniversalSerializer","PromoCard","promoCard","PromoCardHeader","promoCardHeader","PromoCardFooter","promoCardFooter","PromoCardLink","prevField","prevAggregate","prevDirection","direction","getOrderByColumn","pickBy","DATETIME_FORMATS","toOptions","disabledName","toDateOrTimeGroups","getCurrentFormat","aggregations","getAlternativeSeries","savedSeries","ensureValidMeta","availableGroups","toValidAxisConfig","toValidSeriesConfig","validConfig","toValidLatestRecord","dateGroups","toValidMinMax","toValidConfig","TABULAR_REPORT","metaColumns","toValidTabularConfig","toValidFunctions","intermediateConfig","isValidInterval","intervals","interval","METRIC_TYPES","initialState","groupFieldsByCategory","CATEGORIES_ORDER","canNodeGroupBy","getMetricOptions","getGroupByOptions","entryResources","getSplitByOptions","getFilterOptions","getDetailsOptions","getOrderByOptions","getAvailableMetrics","currentMetric","getAvailableFilters","groupedFilters","uiQueryFilters","currentFilter","exclusionGroups","appendSelectedNodes","uiOptionsReducer","bootstrapActions","queryActions","filterAssociatedFields","metricTimeFields","ERROR_TYPES","UNKNOWN","QUERY_FAILED","CONNECTION_FAILED","TIMEOUT","CANCELED","INVALID_QUERY","DANGEROUS_USER_PERMISSIONS","VALUE_OUT_OF_RANGE","NOT_FOUND","PERMISSION_DENIED","QUERY_RESPONSE_TOO_LARGE","getApolloErrorType","apolloError","graphQLErrors","SelectComponent","defaultValue","selectWrapper","first_name","last_name","getDashboardTrackingProps","Dashboards","typeScale","scaleIndex","scale","px","rem","increase","decrease","UnitControlComponent","prefixValue","suffixValue","hasPrefix","hasSuffix","invalidProps","hasPrefixOrSuffix","focusTextInput","inputWrapper","handleInputChange","AdvancedSettingsComponent","handleNumberFormatUpdate","abbreviationButtons","ABBREVIATION_BUTTONS","handleAbbreviationChange","isPrecisionDefined","precisionStyle","precisionNumber","inactive","isDecreaseDisabled","MIN_PRECISION","isIncreaseDisabled","displayedPrecision","INIT_PRECISION","handlePrecisionChange","precisionGroup","labelMargin","renderAbbreviationButtons","renderPrecisionButtons","AdvancedSettings","millis","WarningComponent","Warning","_pollFetch","doFetch","_handleStatusError","_pollForPairingStatus","setCode","setDevice","setError","codeCount","pattern","stripNewlines","EditableInputComponent","refs","inputText","setAutoHeight","handler","blur","isMultiLine","inputClassName","editableInput","handleClick","onKeyDown","handleKeyDown","overflowY","EditableComponent","onSubmit","showPlaceholderOnHover","isDashboardTitle","strippedText","isPlaceholder","displayedText","editable","multiLines","handleEnterEditMode","STATE_LABELS","positive","REVERSE_STATES","transformThresholdsToFormState","currentUpperState","upper","lower","renderDefaultInput","smallestInputUnit","isFiniteValue","isCellSelection","displayValue","durationInput","controlInputs","durationInputClear","iconButton","StatusIndicatorsFormComponent","newThresholds","_newCurrentUpperState","newLowerValue","newUpperValue","getNewValue","parsedLowerValue","parsedUpperValue","renderInput","onChangeThresholds","marginBottom","justify","marginRight","newUpperState","stateLabel","ErrorComponent","errorLink","errorLinkText","onErrorLinkClick","renderErrorLink","DASHBOARD_AREA","resizeContainerStart","resizeContainerEnd","setEmptySpaces","removeEmptySpaces","setSelectedContainer","deselectContainer","deselectAll","instrumentMenuActions","getEmptySpaces","emptySpaces","accumulatedSpaces","space","isIntersecting","area","sections","getSections","uniqWith","emptySpace","comparisonSpace","comparisonIndex","isContainedBy","spaceToKeep","selectContainer","containerId","selectedContainer","containerLayout","moveContainerStart","moveFrameStart","lastValue","MAX_SERIES","isValid","requiredSelections","headerColours","brewery","universalTransformer","fileFetchSuccessful","pickerActions","hydrate","focusInput","selectPlan","selectAddon","setPaymentInterval","initialisePlansStart","initialisePlansSuccess","initialisePlansFailed","initialisePlans","usage","currentPlan","fetchDevices","plans","selectedAddons","collectPurchasedAddons","getDefaultAddons","InlineSettingsComponent","inlineSettings","isNotNull","isFirstCellHeader","indexHeader","hasFirstCellHeader","fromCharCode","getDefaultLegendName","targetCells","getSeriesValues","getLabels","labelCells","composeTransformers","initialContext","composeApplyConfigTransformers","legends","headerXAxisIndices","headerSeriesIndices","seriesCells","xAxisCells","seriesOfSelection","seriesValues","seriesObj","element","y_axis","numberFormatTransform","getStartOfSelection","indexXAxis","indexSeries","padXAxis","alignSeries","indexedXAxis","indexedSeries","scatterPoints","zipWith","paddedXAxisCells","sCells","alignedSeries","xAxisLabels","originalThresholds","getValue","formatPercent","mappedStatusIndicator","getNumberSeriesValues","allCells","getNumberValue","numberTransformV1","parsedValues","progressStartingValue","injectComparisonValues","comparisonTransform","statusIndicatorsTransform","toItem","skipHeader","selectedWithoutHeader","partialRight","minValue","maxValue","MAX_LENGTH_OF_COLUMN","getCellFormat","getBestSelectionFormat","mapCell","cellType","mapHeading","hasCellHeader","columnsCells","columnCells","headingCells","dataCells","headerOffset","fillEmptyCells","colCells","fillToEndCount","constant","missingCount","columnConfig","genericTableTransform","goalTransform","pegasusPayload","axisMetadata","axis_metadata","xLabels","x_labels","x_type","y_type","y_unit","genericLineTransform","genericBarTransform","lineTransform","getValueBasedOnFormat","__","statusIndicators","getYFormat","firstSeries","genericNumberTransform","xLabelToItem","xLabel","genericLeaderboardTransform","dataFormat","genericGeckometerTransform","injectFormats","columnTypes","injectHeadings","headings","visualisationData","column_types","getCellValue","boolean","integer","getValuesFromRow","processSeries","noOfValues","processedSeries","filteredData","dataPoint","cleanTransformedData","formatSeries","databaseQuery","seriesData","seriesFormatter","createMultiSeriesFormatter","applyConfig","cleanedData","dataType","getFirstCol","transformSeries","secondaryIndex","metric_type","metricUnit","metric_unit","generateYAxis","visualisationConfig","pickXAxisType","x_axis_type","injectSortOrder","queryColumns","sortedColIndex","columnOffset","lineColumn","unitTs","incomplete_from","numberColumn","parsedComparisonValue","isMultiSeries","selectXAxis","fullData","barColumn","formattedLabels","formattedLabel","meterColumn","formatLabel","leaderboardColumn","isDetailsTable","groupByType","legnth","genericTableTranform","UNIVERSAL_ASSETS_FOLDER","integrationName","fmtFunctions","placeholderPath","universalConfig","genericFeedTransform","openWindow","windowName","regenerateLoopLink","regenerateDashboardSharingLinkSuccess","regenerateLoopSharingLinkSuccess","deleteDashboardSuccess","regenerateDashboardSharingLink","dashboardService","sharing_hash","dashboardActions","getSharingURL","regenerateLoopSharingLink","loopService","defaultValues","getCustomizeValues","cssFile","switchToDesktopView","localStorage","switchToMobileView","getShowDesktopView","setPageToFitScreen","getElementsByName","isUserIdentified","contextProperties","doTrack","analytics","doLog","superProperties","first_contact","utm_source","landing_page","mailer","identify","allProperties","freeExports","freeGlobal","global","regexAstralSymbols","regexAsciiWhitelist","regexBmpWhitelist","regexEncodeNonAscii","encodeMap","'","regexEscape","escapeMap","regexInvalidEntity","regexInvalidRawCodePoint","regexDecode","decodeMap","decodeMapLegacy","decodeMapNumeric","invalidReferenceCodePoints","stringFromCharCode","codePointToSymbol","codePoint","strict","parseError","hexEscape","decEscape","encode","encodeEverything","useNamedReferences","allowUnsafeSymbols","escapeCodePoint","decimal","escapeBmpSymbol","symbol","charCodeAt","$0","high","low","html","$1","$2","$3","$4","$5","$6","$7","$8","semicolon","decDigits","hexDigits","isAttributeValue","he","UniversalConfigLoader","importUniversalConfig","loadingPositioner","UniversalCompactConfig","importConfig","AsyncDatabaseCompactConfig","DatabaseCompactConfig","CompactConfigComponent","compactConfig","CompactConfigWithContext","SAFE_METHODS","querySelector","CSRFToken","supportsMultiSeries","compactedQueryResults","resSize","mergedResults","qrRow","k","CACHE_KEY","getOldLastUsedAccountId","_getPreferences","removeOldAccountId","pref","getLastUsedAccountId","oldId","cachedAccountExists","authUrl","authType","redirect_url","extra_params","queryString","poll","deferred","closed","isPending","OAuthCallbacks","close","resultHandler","resolution","OAuth","isResolved","isRejected","callbacks","succeed","fail","fakeIntercom","argString","support","IntercomContext","createContext","available","intercomContextTypes","IntercomProvider","debounce","unlisten","listen","Provider","withRouter","withIntercomContext","wrappedDisplayName","withConsumer","Consumer","intercomContext","StatusLabelComponent","handleKeydown","hasCloseButton","closeButton","flexContainer","div","renderCloseButton","scroller","popover","renderPopover","ModalSection","section","ModalHeading","ModalText","OnMount","do","SelectDropdownComponent","renderOptions","arrayOf","LeaderboardStyleInjector","tvStyle","desktopStyle","LeaderboardItemComponent","delta","rank","previous_rank","displayArrow","formattedValue","listItem","arrow","data-delta","LeaderboardVisualisationComponent","itemHeight","containerHeight","afterRender","displayArrows","isPreviewMode","leaderboardStyles","previewLayout","truncatedItems","renderItems","canRender","normalisedPurchasedKeys","addonId","addon_id","ADDONS_DEFAULT_QUANTITY","max_dashboard_user_bundle","maxDashboards","maxQuantity","maxUsage","max_dashboards","DASHBOARD_SUBJECTS","extraDashboards","selectedAddon","addon","subject","toExtraDashboardsAndUsers","addonWithQuantity","applyLimits","maxUsers","max_users","addons","availableAddons","getAddonsWithQuantities","limits","getTotalAddonsPrice","isAnnual","totalAddons","purchased","price","addonAnnualPrice","annual","addonMonthlyPrice","monthly","applyPricing","displayedPrice","annualBase","monthlyBase","getCurrentPrice","displayedCurrentPrice","applySelectedAddons","flagIsCurrent","currentIsAnnual","normalisedPurchased","validSelectedAddons","isCurrent","max_quantity","removeEmptyAddons","LinkComponent","Link","doc","loc","names","unique","defs","def","kind","definitions","getKey","getUserDashboardIds","usersDashboards","dashboardIds","getDashboardUserIds","userIds","usersDashboardsReducer","joins","userActions","createPortal","setImports","hideImport","queueServiceAccountId","importsReceived","imports","storedImport","acknowledged","activeImports","definitionRefs","findOperation","oneQuery","operationName","newDoc","opRefs","allRefs","newRefs","refName","prevRefs","childRef","collectFragmentReferences","selectionSet","variableDefinitions","mapSettings","dataProvider","addClassNames","areasSettings","adjustOutlineThickness","mouseEnabled","panEventsEnabled","dragMap","zoomOnDoubleClick","zoomControl","zoomControlEnabled","homeButtonEnabled","imagesSettings","MapVisualisation","images","makeChart","domMap","updateMap","validateData","mapVisualisation","city","city_name","country_code","region_code","host","ip","TopoJsonMapComponent","_projection","geo","albersUsa","drawMap","drawPoints","topoJson","_svg","selectAll","topoSvg","svg","feature","objects","states","bounds","attr","projectedPoints","coords","enter","MapLoader","setConnectionWidgetsData","openModalWithConnection","connectionId","dashboardCount","dashboards_count","widgetCount","widgets_count","WIDGET_PADDING","WIDGET_PADDING_TV_MODE","NumberVisualisation","GeckometerVisualisation","LineChart","ColumnChart","BarChart","LeaderboardVisualisation","VISUALISATION_TYPES","getVisualisationStatus","VisualisationComponent","pickComponent","mapNumberFormat","newNumberFormat","defaultPrecision","defaultAbbreviation","defaultPrefix","defaultSuffix","VisualisationWrapperComponent","setDimensions","VisualisationWrapper","TableSummaryModeNotSupportedError","columnFields","takeLength","firstGroupBy","groupByField","orderByField","numberOfColumns","isGroupingByTime","updateQueryForSummary","MAX_COLUMNS","clearAll","updateSelections","lockSelections","deleteSelection","setInitialConfig","getSelectionsFromConfig","columnChartVisualisationHelpers","GOAL_TO_COMPARISON","lastComparison","getSelectionTargets","MIN_COLUMNS","loadingDataSources","loadingInvite","loadingDashboards","loadingLoops","isReconnectModalOpen","reconnectingDataSourceId","isDeleting","isDashboardPermissionsModalLoading","isUserPermissionsModalLoading","adminReducer","groupActions","loadingPeople","getDashboardQueryProps","fetchContainers","DashboardByIdWithContainers","DashboardById","ScreenContentWithContainers","DashboardBySharingHashWithContainers","DashboardBySharingHash","isContainerLayoutEditMode","isGraphQLDashboard","starterThemes","customizeValues","advancedDashboardCustomization","advanced_dashboard_customization","canDisableBranding","can_disable_branding","customCSS","custom_css","newCustomizeValues","SHARING_HOST","AbsolutePositioned","BodyRenderedAbsolutelyPositioned","AbsolutePositionedComponent","integrations","proxy","_get","VALID_TYPES","PresetIconComponent","isIcon","PresetIcon","PresetListItemComponent","flexFill","subtitle","PresetListItem","visualisationSettings","regular","idealXAxisTickSeparation","defaultMaxLabelWidth","chartRightNudge","chartBottomMargin","yAxisNudge","nudgeFactor","minYAxisTicks","maxYAxisTicks","xAxisTypes","standard","LineChartComponent","createChart","createDefs","createGrid","createAxis","createTooltip","chart","tooltipLabel","seriesList","class","handleIncompletePaths","dots","dotPoints","nilIndices","getDotPoints","dot","dPathHelper","stroke","cx","cy","exit","drawThreshold","axis","overlay","labelWrapper","defined","margin","applyTransformation","linear","longestYAxisLabel","nudgeThreshold","nudge","maxChartWidthSpan","IDEAL_X_AXIS_TICK_SEPARATION","MIN_NUM_Y_AXIS_TICKS","MAX_NUM_Y_AXIS_TICKS","numberOfYTicks","maxTicks","numTicks","nice","numberOfDataPoints","domainsDataX","formats","nbTicks","getNumberOfTicks","numberOfNiceYTicks","getNumberOfNiceYTicks","firstValue","makeXAxis","tickFormat","orient","tickValues","makeYAxis","tickSize","DEFAULT_MAX_WIDTH","yLabels","longestLabel","each","textLength","getComputedTextLength","setXScale","defineXDomain","axisLabels","numLabels","maxLabelWidth","maxWidth","gridAttributes","thresholdAttributes","thresholdY","legendWrap","visibility","legendCircles","legendTexts","legendCircleRadius","legendCircleOffset","dy","scalingFactor","getScalingFactor","sum","textNode","currentWidth","transformations","lastX","legendTransX","isSecondary","indexIncompleteFrom","incompletePoints","d3series","pathsHl","brighter","inputSeries","incomplete","colourBrewer","isScattered","originalSeries","xCoords","dashboardTz","seriesHaveData","domainX","dateFormat","allBars","_this","opacity","transition","classed","on","mouseenter","mouseleave","mousemove","closestTick","mouseX","marginLeft","scaleX","x0","invert","bisect","findClosestTick","mouse","pts","xs","tickValue","dt","getPointsOnTick","pointsSVG","scales","xi","yi","toSvgContext","xCoordTooltipLine","pointsSVGWithYValue","y2","ii","computedTop","domainsData","getNudgedYDomain","domainsDataY","yDomain","yDomainMax","yDomainMin","seriesWithLegend","drawLegend","labelsAreStrings","maxDataPoints","seriesDatum","sanitiseInput","thresholdNum","chartSettings","getChartSettings","setClipPathIds","setSvgDimensions","setYScale","preprocessSeries","computeDomains","computeBoundaries","defineYDomain","drawGrid","handleLegend","draw","applyTooltip","WidgetTitleComponent","canEdit","onUpdate","newTitle","ARC","shapeRendering","GeckometerVisualisationComponent","_id","uniqueId","componentDidUpdate","domNeedles","querySelectorAll","gaugeNeedle","isIE","msTransform","isFirefox","MozTransform","domNeedle","removeAttribute","transformOrigin","currentNeedleRotation","smallestDimension","startAngle","endAngle","reached","valueAngle","allThresholds","thresholdName","isReached","markerAngle","mask","minMaxNumberFormat","itemValue","computeBounds","calculateAngle","clampAngle","translatedThresholds","startValue","endValue","needleOutOfBounds","warningSizeFactor","warningFontSize","getTypeScale","outOfBoundsWarning","preserveAspectRatio","viewBox","strokeWidth","strokeLinecap","renderThresholdMask","gaugeArc","renderThresholdMarker","gaugeNeedleOval","gaugeNeedleLine","textAnchor","rotation","LabelComponent","htmlFor","polling","queuedServiceAccountId","hasFailed","hasCompleted","hasRemainingTries","remainingRetries","shouldPoll","getCurrentImports","getCompletedImports","getImportBySA","importsReducer","importsActions","oldStateActiveImports","completedImports","activeSaImport","fullscreenEnabled","fullscreenElement","requestFullscreen","exitFullscreen","fullscreenchange","fullscreenerror","webkit","moz","requestFullscreenFunction","Boolean","SwatchComponent","hasSingleFrame","isContainerFull","getCellSize","dashboardWidth","dashboardHeight","gridGap","getContainerCellSize","isColumnLayout","numberOfCells","cellWidth","cellHeight","rowEndA","columnEndA","rowEndB","columnEndB","getXAndYOverlap","aColumnEnd","bColumnEnd","aRowEnd","bRowEnd","xOverlap","yOverlap","newRowSpan","getTopSection","areaColumnEnd","newColumnSpan","getRightSection","areaRowEnd","getBottomSection","getLeftSection","getPointerArea","dashboardOffset","clamp","getSnappedArea","originalArea","getBestSpace","spaces","pointerArea","newArea","suitableSpaces","getFittedArea","spaceRowEnd","spaceColumnEnd","getFrameAreaOnDashboard","frameIndex","containerArea","containerCells","getSpanOnDashboard","containerSpan","frameSpan","prevFrameSpans","span","cellsTop","frameRowSpan","SMALLEST_SPANS","isFrameTooSmall","areaOnDashboard","smallestSpans","findBestAreaForNewWidget","currentBiggestArea","currentBiggestSpaces","overlappedArea","topmostAreas","findLeftMostArea","cls","ExtendableBuiltin","setPrototypeOf","debouncedFetchDataRequest","DEFAULT_TABULAR_TYPE","WIDGET_CREATION_ERROR","WIDGET_FETCH_ERROR","NO_GROUPS_OR_AGGREGATIONS_ERROR","NO_GROUPS_OR_AGGREGATIONS_LINK","NO_GROUPS_OR_AGGREGATIONS_LINK_TEXT","ErrorWithLink","linkText","SalesforceConfigConstants","setStateProps","initConfigLoading","initConfigSuccessful","initConfigError","dataFetchStart","dataFetchSuccessful","dataFetchError","toggleTableHeaders","_fetchPreviewData","configOptions","reportType","validRefreshInterval","REFRESH_INTERVALS","ONE_HOUR","updateConfig","enableMultiSeries","disableMultiSeries","renderableState","salesforce_version","getLastConfigForType","addTableColumn","nextField","sourceIndex","targetIndex","currentFormat","immutableUpdate","WaitFor","wait","renderWaiting","waiting","DashiesCompactConfig","setEditWidget","ConditionalLoadingIndicatorComponent","ConditionalLoadingIndicator","Border","shadow","selectPaths","ceil","LN10","mirageCache","queryHash","hash","lorem","LoremIpsum","wordsPerSentence","generateFakeSyncResponse","specificResponse","serviceSpecificResponses","hardcodedResponses","getHardcodedResponse","getRandomWords","trimEnd","generateSentences","initialize","MirageService","WidgetMenuModalComponent","modal","background","IconBadge","BACKGROUNDS","GREY","isMetaLoading","isInitLoading","salesforceReducer","ensureValidConfig","isFetchingData","progressGoal","salesforceReducerInner","PanelContainerComponent","panelContainer","PanelContainer","GREEN","require","1","algorithm","createHash","write","digest","encoding","read","sha1","excludeValues","MD5","keysMD5","getHashes","ignoreUnknown","respectType","respectFunctionNames","respectFunctionProperties","unorderedArrays","unorderedSets","unorderedObjects","replacer","excludeKeys","exec","Function","_object","isBuffer","_array","_date","toJSON","_symbol","_error","_boolean","_string","_function","_number","_xml","_null","_undefined","_regexp","_uint8array","_uint8clampedarray","_int8array","_uint16array","_int16array","_uint32array","_int32array","_float32array","_float64array","_arraybuffer","Uint8Array","_url","_set","_blob","_domwindow","_process","_pipe","_tcp","_udp","_tty","_statwatcher","_securecontext","_connection","_zlib","_context","_nodescript","_httpparser","_dataview","_signal","_fsevent","_tlswrap","buf","writeToStream","self","Buffer","arguments","buffer","crypto","lYpoI2","2","toByteArray","fromByteArray","base64js","3","D","O","U","byteLength","_useTypedArrays","_augment","_isBuffer","readUInt8","_charsWritten","F","N","E","I","Y","A","SlowBuffer","INSPECT_MAX_BYTES","poolSize","ArrayBuffer","foo","subarray","isEncoding","C","substr","S","_arr","L","writeUInt8","readUInt16LE","readUInt16BE","readUInt32LE","readUInt32BE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","inspect","toArrayBuffer","ieee754","4","5","sha256","md5","createHmac","randomBytes","6","7","getRandomValues","8","9","nextTick","setImmediate","postMessage","stopPropagation","argv","addListener","off","removeListener","removeAllListeners","emit","binding","cwd","chdir","11","NaN","LN2","notNil","pluckDatumValue","datum","seriesPresenter","SeriesPresenter","removeNils","filteredSeries","filteredXAxis","filterNils","identifyNils","ComponentName","launchInstrumentCelebration","finishInstrumentCelebration","SparkLineComponent","createElementNS","sparkline","yPadding","SparkLine","NumberGoalComponent","hideNumber","isGoalReached","goalNumberFormat","thresholdClassNames","goalThreshold","goalThresholdReached","goalComplete","trackWidth","offsetValue","offsetThreshold","trackClasses","goalProgressBarTrack","progressClasses","goalProgressBar","goalProgress","backgroundSize","renderProgress","hasValidDefault","defaultLabel","shouldRenderRestoreButton","getActiveLabel","NumberLabelComponent","isEditable","buttonClassName","restoreButton","any","NumberVisualisationComponent","stepsToFit","handleLabelChange","handleComparisonLabelChange","fitText","onConfigChange","useTracking","slimline","medium","isHorizontal","isTiny","decreaseBy","comparisonLabelInput","comparisonNumberFormat","absolute","comparisonValue","fontScale","renderComparisonLabel","sparklineValues","lastSparklineValue","sparklineValue","isHalfHeightWidget","goalContainer","shouldHideNumber","hasValidComparison","trendline","renderSparkLine","renderGoal","renderComparisonValue","legacyStringValue","hasLegacyStringValue","numberContainer","primaryStat","primaryNumber","labelInput","numberWidgetClasses","hasComparison","hasGoalComparison","hasHorizontalLabelSupport","hasAnyText","horizontal","vertical","getSizeClass","primaryContainer","primaryAlignment","renderPrimaryNumber","renderLegacyStringValue","renderLabel","renderComparison","scrollWidth","activeLabel","activeComparisonLabel","pickThresholdState","visualisationValue","neutralIndex","meetsLowerThreshold","meetsUpperThreshold","OrientedNumberVisualisationComponent","colorStops","colorFrom","colorTo","BaseSwatchComponent","borderColor","hoverIcon","iconType","swatch","hoverBorder","aria-checked","BaseSwatch","getBorderColor","loadToastFromStorage","scheduleToast","storeToast","regenerateSharingLinkStart","regenerateSharingLinkSuccess","regenerateSharingLinkFailure","dndContext","createDndContext","HTML5Backend","DraggableContextComponent","manager","dragDropManager","pendingScripts","scriptCounter","_addScript","firstScript","setup","_cleanup","_finish","readyState","isReady","complete","inserted","onreadystatechange","firstState","SeriesLines","DecoratedLineComponent","v1Props","axisx","newProps","finalProps","settings","FuzzySearch","overrideStringify","searchTerm","originalStringify","Fuse","HeaderComponent","Header","Separator","GroupedDropdownListComponent","expandedGroups","canCollapse","canRenderHeader","getLabel","searchValue","useObjectFormat","renderNoResults","visibleOptions","renderCollapsed","innerIcon","showMore","NoResultsComponent","noResultsMessage","GroupedDropdownComponent","filteredOptions","fuzzySearches","handleSearch","createFuzzySearch","canSearch","searchKeys","searchDropdown","renderDropMenuContent","optionsToShow","onSearch","dropdownType","canRenderUpwards","getMenuLabel","fuzzySearchConfig","renderDropMenuLabel","menuLabel","maxPatternLength","optionGroup","fuzz","fuzzySearch","alignSelected","shouldSort","distance","minMatchCharLength","GroupedDropdown","detail","createEvent","initCustomEvent","collectScrollingParents","domLeaf","collectParents","_scrollingParents","cleanUp","evt","preventDefault","currentTarget","handleClose","DropMenuSelectLabelComponent","DropMenuSelectLabel","ConfirmModalComponent","confirmModal","marginTop","connectToHistory","mapHistoryToProps","handleHistoryChanged","PieSlice","innerRadius","outerRadius","arc","sin","PI","x2","cos","x1","y1","PieChartComponent","originalWidth","legendWidth","mean","colorScale","radius","sortedData","sliceData","pieData","legend","legendList","pill","PricingGateProvider","dismissed","shouldRender","trialist","allowancePath","allowance","usagePath","allowed","onDismiss","allowancesFromState","usagesFromState","screens","forceUnlimitedScreens","forceDatabaseIntegrationAllowed","max_screens","database_integration","Content","MessageFormat","QUARTER_HINTS","getTimespanComparisonLabel","currentDate","currentMonth","getMonth","_capitalize","_isNode","_isReactNative","_isWindows","_makeArrayOfLength","_makeArrayOfStrings","_interopRequireDefault","mapSeriesToValue","TextHelpers","hydrateConfigureView","reorderTableColumns","validSelections","isDirectionSwapped","selectionsArray","autoComplete","SortableCellComponent","isHeader","isRightAligned","onSort","alignmentStyles","containerClassName","isSortable","iconClassName","unsorted","SortableCell","FORMATTABLE_NUMBER_TYPES","MixedColumnCellContent","alignment","cellClass","rightAligned","mixedCell","spacer","ColumnCellContent","extendLoading","timer","wrapperStyle","tableWrapper","hasHeadings","columnValues","columnMeta","columnNumberFormat","isObject","tr","onSortHeading","headingClass","th","rowIndex","onSortFirstRow","cellClasses","td","hiddenContent","loadingCell","valueType","barChartOptions","isSmallWidget","barsToMakeSpaceFor","numberOfSeries","barWidth","chartWidth","calculatedChartWidth","allSeries","tooltipNudge","pointIndices","firstBar","barSpacing","barGroupSpacing","maxBarWidth","minBarWidth","maxAvailableBarsWidth","potentialAvailableBarsWidth","availableBarsWidth","availableBarWidth","buildBars","aSeries","seriesIndex","bars","baseVal","prevSibling","previousSibling","prevX","barsOverlapping","getBarOptions","HistoryProvider","childContextTypes","numRequests","accountReducer","accountActions","planId","updatedAddons","updatedSelectedAddons","HEX_CODE_REGEX","toHexCode","isHexCode","hexCode","originalColumnsValue","logoError","customCSSError","themeBackgroundColorInput","showGridPreview","customizeReducer","customizeActions","newBackground","customCSSLoadedInPage","newThemeBackgroundColor","newWidgets","DASHBOARD_MODES","ERRORS","sharingError","regenerateLinkError","addressInput","working","draggingWidget","dashboardReducer","classicboardScaleFactor","sharingMenuActions","isImportingModalOpen","openModalService","allDashboardsReducer","entities","adminActions","allLoopsReducer","updatedLoop","allDataSourcesReducer","updateById","tidyUsers","viewer","tidied","dashboards_shared","makeUserAccountOwner","newAccountOwner","makeUserMemberViewer","promotedUser","newMember","allUsersReducer","dashboardViewOnlyUser","peopleActions","updateUsers","isBeingDeleted","resizingContainer","hoveredArea","containerLayoutReducer","containerLayoutActions","isSelectedContainer","datasetReducer","dataSourceConnectorReducer","initDataSourceActions","isSwitchingService","dataSourceConnectorActions","isSwitchingAccount","isOauthWindowOpen","isInfoVisible","formatServices","serviceList","dataSourcesReducer","dataSourcesActions","formattedServices","recentlyConnectedIds","recently_connected","recentlyConnected","filterQuery","USERNAME_FIELD","PASSWORD_FIELD","determineConnectionFields","defaultDataSourceConnectorReducer","isModalOpen","deleteDataSourceConfirmModalReducer","deleteDataSourceConfirmModalActions","getTimeStamp","defaultApplyConfig","getApplyConfig","getTransformer","editWidgetReducer","_cachedFiles","filterFiles","filterWithinFolder","filePickerReducer","isFetching","importErrorMessage","celebrationInstrument","graphQLDashboardReducer","graphQLDashboardActions","isConnecting","currentView","isFetchingDevices","manageScreensReducer","manageScreensActions","notificationReducer","notificationActions","spreadsheetConfigActions","spreadsheetActions","manageViewTab","transformInviteesToUsers","peopleReducer","invitees","unionBy","presetsReducer","presetsActions","groupServiceAccounts","serviceAccountsReducer","extractMeta","sheet","isFileMissing","sanitizers","sanitized","sanitizeConfig","sanitizer","lockedSelections","dynamicEditor","isBeta","setThresholds","thresholdState","betaInjectStatusIndicatorThresholds","handleSetValue","fullPath","selectionIndex","currentSelections","clonedSelections","withoutIndex","spreadsheetConfigReducer","newSelections","selectionValues","newOptions","selectionActionsBeta","updatedSelections","updatedSelection","colStart","rowEnd","colEnd","selectionActions","validationRules","convert","betaSelectionHelpers","betaGetVisualisationHelpers","visType","spreadsheetActionsBeta","helpers","compressedSelections","selectionObjects","dynamicConfigActions","focusedInput","spreadsheetConfigReducerInner","toastReducer","reducer","tvPagActions","curry","applyForVizType","matchingViz","currentViz","applyForRule","matchingRule","applyWhenSet","statePath","applyWhenNotSet","applyFrom","applyOn","applyAgainstUiOptions","isMetrics","currentExtra","dropFiltersAgainstUiOptions","prepareNew","elements","_setMetric","_node","_extra","defaultAggregation","_setGroupBy","_setOrderBy","_setSplitBy","_setTimespan","_setLimit","_setBucket","_setFilter","prevFilters","isCustomFilter","_setGlobalFilter","_setVIPFilter","_setDetailsColumn","_updateBoundToMetricFilters","currentBoundFilters","newBoundFilters","boundToMetricFilterKeys","filtersWithoutClashes","stateBoundToMetricFilters","applyAllAgainstUIOptions","_index","setGroupByGeneric","getUiQueryBasedOnOptions","setMetric","nodeType","extraForOrder","metricExtra","setDetailsColumn","setTimespan","setGroupBy","setLimit","setBucket","extraForOptOrder","setTimespanOperands","extraTs","timespanNode","truncateMaxMetrics","maxMetrics","cleanStateSetMetric","cleanStateSetVisType","mainTransformer","tmpState","uiQueryReducer","cleaned","cleanedState","nodesFromQuery","allVIPNodes","savedVIPFilters","hasNoServiceAccounts","setConfigComparison","getTSComparisonForVisualisation","getComparisonForNewTimespan","getConfigForVisualisation","getUpdatedConfig","hasCompatibleMetricTypes","uiMetrics","allNodes","updateVizType","universalConfigReducer","allFetchDone","configWithDefaults","newQueryResults","newQueriesFetchDone","configActions","socketActions","mirageProxyService","visualisationError","visualisationNotificationType","initialQuery","needChange","newSubQueryResults","isLoadingSuggestions","isVisualisationDataComplete","saveActions","metricField","baseState","availableVisualisations","newType","compatibleMetrics","uiQueryMetrics","availableMetrics","lastMetric","cursor","nextMetric","timeLimit","formatIndex","userReducer","whatsNewActions","trialEnd","userProps","trialDaysRemaining","diff","union","showNotification","addWidgetType","getVisualisationDetails","bodyClassName","getVisualisationClassName","service_title","isDataRequired","no_data","widgetsReducer","widgetWithProps","anticipateHide","anticipateShow","isCelebrating","isAwaitingInitialServerSideRefresh","newWidgetAttributes","getDataPerService","getWidgetService","widgetDataReducer","cleanError","isEditingQuery","legacyWidgetKey","currentNumberFormat","instrumentDataReducer","instrumentDataActions","rootReducer","combineReducers","admin","allDataSources","defaultDataSourceConnector","deleteDataSourceConfirmModal","filePicker","graphQLDashboard","notification","spreadsheetReducer","toastLauncher","toastLauncherReducer","tvPage","tvPageReducer","universalReducer","usersDashboardsreducer","whatsNewReducer","widgetMenuReducer","instrumentMenuReducer","instrumentData","actionErrorHandler","isDevelopment","isTest","attempt","__DEV__","enhancer","composeEnhancers","compose","applyMiddleware","thunk","createStore","initApp","getReduxStore","Tracking","GOAL_DIRECTION_TO_THRESHOLD_TYPE","isReversed","SliderComponent","currentSlide","startLoopSlides","nextState","isValueEqual","isStateEqual","stopLoopSlides","loopSlides","nextSlide","speed","slideIndex","paginationClassName","dotClassName","dotClasses","activeDot","dotItem","handleChangeSlide","paginationClasses","pagination","paginationInnerClasses","textClasses","textPagination","renderDots","renderTextPagination","slideClassName","sliderClassName","icons","slideClasses","sliderClasses","currentIcon","iconClasses","renderPagination","Slider","VariableFontSizeComponent","handleResize","finalSize","sizes","heights","pickFontSize","VariableFontSize","smallHeading","largeHeading","allIcons","maxSlides","allowHTML","lastMaxSlidesValues","dangerouslySetInnerHTML","__html","variableFontSize","slider","slidePreview","paginationPreview","dotPreview","slideDashboard","paginationDashboard","textWrapper","getHeadingClass","renderSlider","ExternalLinkComponent","externalLink","ExternalTrackableLink","ExternalLinkConnector","_dereq_","scheduleDrain","draining","Mutation","MutationObserver","WebKitMutationObserver","called","observer","createTextNode","observe","characterData","MessageChannel","scriptEl","port1","onmessage","port2","queue","oldQueue","task","immediate","INTERNAL","handlers","REJECTED","FULFILLED","PENDING","TypeError","outcome","safelyResolveThenable","QueueItem","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","returnValue","getThen","thenable","onSuccess","tryCatch","out","iterable","resolved","allResolver","outValue","race","_typeof","iterator","idb","indexedDB","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","getIDB","createBlob","Blob","builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","getBlob","Promise$1","executeCallback","executeTwoCallbacks","errorCallback","normalizeKey","getCallback","DETECT_BLOB_SUPPORT_STORE","supportsBlobs","dbContexts","READ_ONLY","READ_WRITE","_checkBlobSupport","txn","transaction","blob","objectStore","put","onabort","oncomplete","matchedChrome","matchedEdge","_checkBlobSupportWithoutCaching","_deferReadiness","dbInfo","dbContext","deferredOperation","deferredOperations","dbReady","_advanceReadiness","_rejectReadiness","_getConnection","upgradeNeeded","forages","db","dbArgs","openreq","onupgradeneeded","createObjectStore","storeName","oldVersion","ex","newVersion","onsuccess","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","objectStoreNames","isDowngrade","isUpgrade","incVersion","_decodeBlob","encodedBlob","bin","arr","_binStringToArrayBuffer","atob","_isEncodedBlob","__local_forage_encoded_blob","_fullyReady","_initReady","_dbInfo","createTransaction","retries","tx","forage","_tryReconnect","asyncStorage","_driver","_initStorage","initPromises","ignoreErrors","_defaultConfig","_support","isSafari","openDatabase","platform","hasFetch","IDBKeyRange","isIndexedDBValid","iterate","req","openCursor","iterationNumber","blobSupport","reader","FileReader","onloadend","base64","btoa","readAsBinaryString","advanced","advance","dropInstance","dbPromise","deleteObjectStore","_forage2","deleteDatabase","onblocked","BASE_CHARS","BLOB_TYPE_PREFIX","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER","SERIALIZED_MARKER_LENGTH","TYPE_ARRAYBUFFER","TYPE_BLOB","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT16ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","TYPE_SERIALIZED_MARKER_LENGTH","toString$1","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","bytes","bufferToString","base64String","localforageSerializer","marker","fileReader","readAsArrayBuffer","blobType","matcher","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","createDbTable","executeSql","tryExecuteSql","sqlStatement","SYNTAX_ERR","_setItem","retriesLeft","originalValue","serializer","sqlError","QUOTA_ERR","webSQLStorage","dbInfoPromise","storeNames","getAllStoreNames","operationInfo","dropTable","operations","_getKeyPrefix","keyPrefix","_isLocalStorageUsable","checkIfLocalStorageThrows","localStorageWrapper","isLocalStorageValid","keyPrefixLength","itemKey","searchElement","arg","DefinedDrivers","DriverSupport","DefaultDrivers","INDEXEDDB","WEBSQL","LOCALSTORAGE","DefaultDriverOrder","OptionalDriverMethods","LibraryMethods","DefaultConfig","driver","callWhenReady","localForageInstance","libraryMethod","_args","_key","localforage_js","LocalForage","driverTypeKey","instance","Constructor","_classCallCheck","driverName","defineDriver","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","driverObject","complianceError","driverMethods","driverMethodName","methodNotImplementedFactory","methodName","_i","_len","optionalDriverMethod","configureMissingMethods","setDriverSupport","getDriver","getDriverPromise","serializerPromise","drivers","supportedDrivers","_getSupportedDrivers","setDriverToConfig","extendSelfWithDriver","_extend","oldDriverSetDone","currentDriverIndex","driverPromiseLoop","initDriver","supports","libraryMethodsAndProperties","createInstance","LabelledSwatchComponent","swatchProps","pusherAdapter","Pusher","useTurnstile","pusher","applicationKey","authEndpoint","wsHost","wssPort","csrfToken","socket","subscriptions","connection","unbind","channelName","onPush","bind_all","unsubscribe","PusherAdapter","SERVICES_WITH_IMPORTS","EmptyComponent","components","DefaultComponent","MenuPropTypes","Menu","_nextProps","clickedOutsideMenu","isModalClosed","DEFAULTS","plotOptions","dataLabels","groupPadding","lineWidth","credits","colors","lineColor","tickColor","gridLineColor","plotBandColor","getDefaults","evil","js","HighchartVisualisationComponent","renderHighchart","destroy","isCustomWidget","highchart","optInToGeckoboardDefaults","renderTo","Chart","HighchartIframeComponent","domIframe","contentWindow","BARRIER_HOST","highchartResult","loadHighcharts","HighchartLoader","HighchartRenderer","Highchart","isPublic","lightButtons","renderRegularNumberFormat","renderColumnNumberFormat","ICON_TYPES","LegacyTextTransformerComponent","iconTypes","allText","TextPicker","transformedProps","UniversalDropdownComponent","getSearchPlaceholderText","searchInput","UniversalDropdown","LAUNCH_DATE","unix","canUserBeta","org","toSuffix","inlineFlex","flexNone","flexShrink","sm","md","lg","gutter","marginX","marginY","paddingX","paddingY","directionColumn","spaceScale","getPresetsStart","getPresetsSuccess","getPresetsFailed","__getHeirloomLink","__getWidgetTypes","uniqueServiceNames","uniqueServiceIds","serviceIds","widgetTypesPerService","__injectLinksIntoHeirloomPresets","getPresets","createThunkMiddleware","extraArgument","_ref","withExtraArgument","BAR_COLOURS","percentage","showPercentage","getMaxValue","getBarColor","step","tablePositioner","getBarWidth","funnelCell","labelContainer","getPercentage","FunnelDataLimiter","maxItems","DimensionsComponent","animationFrameID","resizeObserver","ResizeObserver","unobserve","cancelAnimationFrame","contentRect","notifyWidth","notifyHeight","requestAnimationFrame","Dimensions","SortableComponent","isDragging","drag","drop","sortableRef","wrapperClassName","getEmptyImage","onMove","instanceOf","HTMLDivElement","onBeginDrag","onDrop","DragAndDroppableSortableComponent","begin","collect","monitor","isBeingDragged","accept","hover","dragIndex","hoverIndex","hoverBoundingRect","hoverMiddleY","hoverClientY","getClientOffset","SortableHandle","handle","SortablePreviewComponent","currentOffset","activeItem","idType","SortablePreviewLayer","getSourceClientOffset","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","_invoke","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","previousPromise","callInvokeWithMethodAndArg","invoke","__await","unwrapped","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iteratorMethod","isGeneratorFunction","genFun","ctor","mark","__proto__","awrap","iter","skipTempReset","prev","stop","rootRecord","rval","exception","caught","hasCatch","hasFinally","finallyEntry","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","RelativeTime","fromNow","updateTime","clearInterval","ComparisonValueComponent","showBlankComparison","blankComparison","increased","decreased","unchanged","isZero","getClassNames","absChange","getPercentageChange","indicator","ComparisonValue","noOfColumns","TableDataLimiter","hideHints","maxColumns","getMaxColumns","getColumnCount","hasHiddenColumns","showMoreHint","availableHeight","rowHeight","getMaxRows","sharingMode","hiddenColumnsFade","renderShowMoreHint","TableWrapper","TableVisualisation","alignedColumns","WrappedTableVisualisation","TvModeComponent","TvModeConnector","TvMode","ZERO_TICK_WIDTH","clipZeroTick","canvas","zeroX","clipId","clipPath","zeroClip","clipEnter","insert","barChartLayout","extent","valueScale","labelScale","newBars","zeroClipId","MAX_ITEMS","BAR_HEIGHT","BAR_Y_OFFSET_FACTOR","SEPARATOR_Y_POS","_d","barY","thresholdX","newLabels","applyLabels","BarChartComponent","formatLabels","_orientation","RIGHT_ALIGNED","TableAlignmentInjector","hasCellObjects","metaWithDefaults","dataColumns","columnsAlignment","alignCount","countBy","columnAlignment","addAlignmentToTableMeta","PromiseWorker","messageIds","promiseCallbacks","createWorker","worker","newWorker","messageReceived","Worker","messageToSend","CSSWorkerComponent","CSS_WEB_WORKER","initStyles","updateCSS","styleNode","cssRequest","cssText","receivedCSS","innerHTML","CSSVariables","updateCSSVariables","setProperty","CustomCSSComponent","addLoadListener","getThemingComponent","CSS","CSSWorker","CustomizationApplicatorComponent","themingComponent","onCustomCSSLoad","ThemingComponent","contextReducers","min_y_axis","max_y_axis","region","ControlledWidget","visualisationProps","getSpecificContext","widgetBodyClasses","widgetInner","DropItemWithDescriptionComponent","hasBottomDivider","isLink","linkClass","linkHref","metaInfo","DropItemWithDescription","PresetListComponent","transformWidget","DashiesCompactConfigConnector","WORDS","AdvancedSettingsTableComponent","handleColumnClick","selectedColumn","defaultColumn","listSmall","AdvancedSettingsTable","dataset_id","datasetActions","table_type","ACTIONS","datasetsSave","datasetSaveActions","spreadsheetsSave","salesforceConfigActions","salesforceSave","hasCellSelections","notice","MENU_POSITIONS","getPixelPosition","menuRef","isFinalPosition","setIsFinalPosition","domElement","updateState","oldState","actualConfig","actualQueryResult","currentTableType","nextTableType","previousQuery","qrSourceIndex","qrTargetIndex","columnType","getFilteredSuggestions","MAIN_QUERY_FIELD_PATH","supportTimespan","getMainField","isTypeDatetime","applyTimespan","_updated_at","getFiltersFields","hasTimespanFilter","mainFieldKey","isMainFieldDatetime","filtersWithTimespan","newFormState","hideFieldSelector","mainField","partition","tsFilter","otherFilters","cleanFilters","newFilters","mapSeriesToColumns","prevValue","mapNumberToColumns","clearNotification","LAST_WHITESPACE","ClampLinesComponent","maxHeight","lines","lineHeight","previousProps","innerText","fitIn","cuttingPoint","truncatedText","lastWhiteSpace","truncatedAfterLastWord","newText","parentWidth","_isNumericColumn","_isDateColumn","_isStringColumn","getColumnType","filteredRows","prepareSelectedCells","getRows","_ruleset","validator","visualisationsValidator","passing","getValidSelections","indexToCompare","prevSize","currSize","areSelectionsTheSameLength","oppositeIndex","startPrevious","startAtSameIndex","isOverlapping","areSelectionsAligned","swapSelectionsDirection","allCellsWithinSelections","selectionIsUnbound","lenCols","getColumnsLength","lenRows","getRowsLength","newCells","getRow","foundCell","ValidationProvider","validation","handleChangeSelections","handleDirectionSwap","debouncedHandleChangeSelections","prevState","onChangeSelection","onDirectionSwap","validationProviderConnector","DurationInput","units","getUnits","durationValues","getDurationValues","newDuration","usePlaceholder","durationInputContainer","renderInputs","MODEL","NAME","TYPE","VENDOR","VERSION","MOBILE","TABLET","util","regexes","extensions","mergedRegexes","str1","str2","lowerize","major","mapper","rgx","ua","arrays","regex","maps","oldsafari","amazon","sprint","windows","cpu","engine","UAParser","uastring","getResult","rgxmap","getBrowser","getCPU","architecture","getDevice","getEngine","getOS","getUA","setUA","BROWSER","MAJOR","CPU","ARCHITECTURE","DEVICE","CONSOLE","SMARTTV","WEARABLE","EMBEDDED","ENGINE","OS","$","jQuery","Zepto","parser","_LoremIpsum","loremIpsum","_words","_ref$count","_ref$format","_ref$paragraphLowerBo","paragraphLowerBound","_ref$paragraphUpperBo","paragraphUpperBound","_ref$sentenceLowerBou","sentenceLowerBound","_ref$sentenceUpperBou","sentenceUpperBound","_ref$units","_ref$words","words","_ref$suffix","sentencesPerParagraph","generateParagraphs","generateWords","Popover","popoverWidth","updateEventHandlers","updatePosition","removeEventHandlers","popoverRef","which","above","positionLeft","addEventHandlers","Element","DatabaseClient","mutate","mutation","DatabaseConnectionCreate","configInput","databaseID","DatabaseQuery","importQueryEditor","getErrorDetails","upperFirst","AsyncQueryEditor","QueryEditor","QueryEditorModalComponentContent","initialValue","handleRunQuery","handleQueryInput","handleSelectVisualisation","databaseId","onRunQuery","onQuerySuccess","onQueryError","editorContainer","footer","buttons","editorMessage","successSubtitle","visualisations","onSelect","getProgressStatus","QueryEditorModalComponent","isOpen","contentProps","ColorPicker","customPicker","colorPicker","ColorPickerInput","handleColorChange","emitColorChange","hex","swatchRef","renderColorPicker","ColorPickerSwatch","DropLinkComponent","DropLink","DropItem","renderEvery","registerTimeout","FooterClock","UpdatingFooterClock","DataLimitedFunnel","mapDurationThresholdsToUnit","GeckometerPresenter","configIndicators","dataIndicators","pickIndicators","STATUS_CLASSES","REVERSED_STATUS_CLASSES","allItems","isLarge","itemClassName","statusClasses","unescapedPrefix","symbolAppendField","transformedColor","customColor","getCurrentTime","use24HourClock","getUse24HourClock","timeOffset","localOffset","getTimezoneOffset","newTime","timeSize","dateSize","timeClasses","dateClasses","pickColor","scaleSize","getCurrentAgainstProjectedState","currentStart","currentEnd","projectedStart","projectedEnd","minBy","maxBy","getCurrentState","getProjectedState","renderMeasure","rawMeasure","availableSize","firstAxisPoint","measure","projected","getMeasure","originalOffset","barSize","renderRange","rangeItems","ragRanges","rangeTotalSize","lastRag","getRangeItems","renderBullet","chartSize","comparative","rawComparative","renderComparative","BulletVisualisationComponent","userOrientation","getOrientation","maxChartCount","getMaxChartCount","graphClassName","getChartSize","showLabels","getShowLabels","getLabelOffset","sublabel","renderLabels","STRING_OR_NUMBER_PROP_TYPE","RANGE_PROP_TYPE","RANGE_OBJECT_PROP_TYPE","amber","green","red","ITEM_PROP_TYPE","hasTrendLine","getVisualisationContext","composeComparisonContext","composeNumberFormatContext","composeLegacyStringContext","composeDurationContext","LegacyNumberTransformerComponent","ResponsiveNumber","NumberVisualisationPicker","restProps","ResponsiveNumberComponent","OrientedNumberComponent","ClampLines","FeedRow","iconWrapper","mainImage","mainStyleLineHeight","mainStyle","secondaryScale","secondaryStyle","spaceWidth","dividerStyle","iconSecondary","main","secondary","renderIcons","getSize","BASE_TYPE_SCALE","feedWrapper","typeScaleProp","ListItemComponent","ListItemsComponent","currentPage","groupIndex","ListVisualisationComponent","groupedItems","loopTimer","newPage","offScreenItems","offScreen","idx","currentPageHeight","currentItemCount","listItemDOMNodes","dataItems","FeedVisualisationConnector","FeedVisualisation","RagColumnComponent","isReverse","totalValues","isLargeTemplate","columnClasses","tableClasses","processedItems","prepareItems","displayClass","newItem","getDisplayClass","HighchartOrLineChartComponent","downTime","responseTime","isUp","isDown","isUnreported","hasStatus","contentClasses","arrowUp","arrowDown","unreported","monitoringVisualisation","serverTimes","serverTime","secondaryStat","getImageUrl","refreshParam","alt","CREATE_BASE","EDIT_BASE","PATHS","edit","selectData","selectVisualization","configure","STEPS","_stepsInverted","makePath","_getPathsFromStep","getStep","FilterLoader","loader","AutoInputComponent","isSelecting","freeForm","availableSuggestions","onApply","newHighlightedItemIndex","handlePressEnter","itemIndex","tagText","removeTag","handleRemoveTag","noResults","typedValue","rawItem","prefixIndex","userTypedValue","tail","highlighted","placeholderValue","inputProps","itemProps","onMouseDown","handleMouseDown","handleMouseEnter","renderTags","renderItem","renderItemData","toKeyVal","AutoInputTextCollection","textSuggestionsAsCollection","updatedFormState","SHAPES","rand","ConfettiComponent","particles","lastTime","particle","velocity","vx","vy","atan2","minSpeed","maxSpeed","WIDTH","HEIGHT","sample","gravity","windResistance","fade","makeParticle","MarketingButton","WidgetConnector","getPolymorphicWidgetType","polymorphicTemplate","isMenuOpen","importVisualisationPreview","AsyncVisualisationPreview","VisualisationPreview","visualisationPreviewConnector","Preview","VisualisationPreviewSwitch","VisualisedWidgetComponent","handleConfigChange","shouldUpdate","friendlyDataUpdatedAt","isResizable","showPreview","canScrollTo","canBeRefreshed","canRenderVisualisation","templateType","widgetError","getWidgetError","widgetStatus","typeStatusMap","getWidgetStatus","hasNoMessage","showLoader","withErrorBoundary","importsState","hasRelevantActiveImports","activeImport","VisualisedWidgetConnector","dataThresholds","isWidgetStatusIndicatorFormOpen","focusedWidgetKey","isInEditMode","configThresholds","configThresholdsFormatted","dataThresholdsFormatted","suppressThreshold","toggleClassName","DropMenu","MobileDetectorComponent","showDesktopView","MobileDetector","BLOB_VERSIONS","FIRST","SECOND","THIRD","backgroundImage","VERSIONS","mapTouch","touches","DragInteractionComponent","Observable","fromEvent","_domTarget","move","dragMove","flatMap","downEvent","startX","startY","moveEvent","takeUntil","dragEnd","mergeMapTo","_dragStart","onDragStart","_dragMove","onDragMove","scrollWindow","_dragEnd","onDragEnd","domTarget","currentPageTop","pageYOffset","currentPageLeft","pageXOffset","windowHeight","windowWidth","scrollTo","ConditionalDragInteraction","SECONDARY_VIZ_TYPES","Sparkline","ProgressIndicator","numberFormatType","formatType","sparklineType","compareValue","progressIndicatorType","statusIndicatorType","secondaryVisualisationType","numberPropTypes","primaryValue","secondaryVisualisation","onChangeLabel","onChangeComparisonLabel","getLabelFontSize","primaryFontSize","hasSecondaryViz","getSecondaryVisualisationStyle","secondaryVizType","numberAndLabelWidth","getValueForStatusIndicator","unitWithDefault","getStatusIndicatorState","metIndicators","editableClasses","Comparison","labelClassName","isHoveringVisualisation","hasLabel","comparisonContainer","progressBarHeight","getProgressBarHeight","progressBarContainer","borderRadius","progressBarBackground","progressBarProgress","getProgressionPercentage","progressIndicatorContainer","targetReached","renderProgressBar","percentageText","targetText","pad","STROKE_WIDTH","SecondaryVisualisation","labelFontSize","secondaryVisualisationMargins","getSecondaryVisualisationMargins","canFitSecondaryViz","secondaryVizHeight","renderSecondaryVisualisation","VerticalNumberComponent","widthScaleFactor","handleWidthConstraint","primaryNumberWidth","primaryNumberRef","instrumentWidth","instrumentHeight","primaryFontMaxFontSize","numerator","denominator","getVerticalPrimaryFontSize","totalPrimaryLabelHeight","containerTop","getContainerTop","statusIndicatorState","containerStyle","verticalNumberContainer","primaryNumberLayout","labelLayout","VerticalNumber","HorizontalNumber","displaySecondaryViz","isHovering","labelWidth","labelRef","getHorizontalPrimaryFontSize","isSparklineSecondaryViz","horizontalNumberContainer","secondaryVisualisationLayout","MobileNumberComponent","hasSecondary","LABEL_FONT_SIZE","mobileNumberContainer","MobileNumber","transformPayload","hasSparkline","hasTrendline","hasNumberComparison","hasPercentageComparison","getSecondaryVisualisation","isHorizontalLayout","transformedFormat","transformedUnit","__webpack_public_path__","PUBLIC_BASE_URL","_formats","_lineEndings","_generator","_util","_defineProperties","descriptor","configurable","writable","_defineProperty","FORMAT_PLAIN","FORMATS","protoProps","staticProps","isReactNative","isNode","isWindows","LINE_ENDINGS","WIN32","POSIX","FORMAT_HTML","strings","formatString","num","generateRandomWords","generateRandomParagraph","makeString","formatStrings","makeArrayOfStrings","getLineEnding","_ref$sentencesPerPara","_ref$wordsPerSentence","seed","_this$wordsPerSentenc","generateRandomInteger","makeArrayOfLength","accumulator","pluckRandomWord","_this2","_this$sentencesPerPar","generateRandomSentence","trimmed","product","_platforms","SUPPORTED_PLATFORMS","DARWIN","LINUX","MapShim","getIndex","class_1","__entries__","_a","isBrowser","global$1","requestAnimationFrame$1","trailingTimeout","REFRESH_DELAY","transitionKeys","mutationObserverSupported","ResizeObserverController","connected_","mutationEventsAdded_","mutationsObserver_","observers_","onTransitionEnd_","leadingCall","trailingCall","lastCallTime","resolvePending","timeoutCallback","timeStamp","throttle","addObserver","connect_","removeObserver","observers","disconnect_","updateObservers_","activeObservers","gatherActive","hasActive","broadcastActive","childList","subtree","disconnect","_b","instance_","defineConfigurable","getWindowOf","ownerDocument","defaultView","emptyRect","createRectInit","toFloat","getBordersSize","positions","getHTMLElementContentRect","paddings","positions_1","getPaddings","horizPad","vertPad","boxSizing","isDocumentElement","vertScrollbar","horizScrollbar","isSVGGraphicsElement","SVGGraphicsElement","SVGElement","getBBox","getContentRect","bbox","getSVGContentRect","ResizeObservation","broadcastWidth","broadcastHeight","contentRect_","broadcastRect","ResizeObserverEntry","rectInit","Constr","DOMRectReadOnly","ResizeObserverSPI","controller","callbackCtx","activeObservations_","observations_","callback_","controller_","callbackCtx_","observations","clearActive","observation","WeakMap","hasReachedDashboardLimit","optimiseForTV","defaultDashboardName","addedDashboardType","serviceCreateDashboard","InputDropdownGroupComponent","mainKey","universalDropProps","dropdownList","withCaret","readOnly","toRgb","luminosity","cycle","TvPageComponent","assetHost","page","logoContainer","logo","TvPagePinComponent","descriptionTitle","pinCode","placeholderPin","TvPagePinConnector","TvPageEmptyComponent","descriptionText","TvPagePin","TvPageEmpty","deleteInstrument","amendedContainers","newNumberOfFrames","newFrameSpan","amendedContainer","writeQuery","duplicateInstrument","refetchInstruments","updateTitle","oldTitle","writeData","updateLabelAndTitle","labelAndTitle","oldLabelAndTitle","updateComparisonLabel","oldComparison","Rule","indicatorClassName","ruleIndicator","tooltipPointer","RuleBasedVisualisationPicker","tooltipDescriptionFormatter","ruleBasedVisualisationPicker","vizName","tooltipDescription","tooltipContainer","visualisationIcon","NUMBER","GECKOMETER","LINE","COLUMN","BAR","LEADERBOARD","TABLE","DashboardLoadingSpinner","pluralize","importHelpCentreSearch","InAppHelpComponent","isIntercomAvailable","customizeLearnMoreUrl","TrialPromoCard","UpgradePromoCard","onUpgradeClick","rawAllowed","allowancesTest","FallbackComponent","PrimaryComponent","Allowed","remainingProps","connectAllowed","RawAllowed","fallback","IconUpgrade","wedge","UpgradeIcon","PremadeThemePickerComponent","PremadeThemePicker","DARK_THEME_WIDGET_COLOR","LIGHT_THEME_WIDGET_COLOR","WidgetStylePickerComponent","autoWidgetColor","createClickHandler","WidgetStylePicker","CustomThemeEditor","onBackgroundColorChange","CustomCSSUpload","multiple","dropzone","isDragActive","dropHere","CustomCssUpload","themeToTab","ThemePickerComponent","isCustomCSSEnabled","onCustomCSSChange","onSelectTheme","tab","selectedIndex","ThemePicker","WidgetTitleSizeCard","onLargeTitlesChange","UploadLogo","onLogoChange","logoDropzone","disableClick","logoUpload","logoDragActive","logoPreview","logoRemove","logoUploadInstructions","logoDropNote","logoUploadNote","FooterLabelComponent","footerCardTitle","LogoLabel","CustomizeFooter","onShowLogoChange","onShowClockChange","DashboardFooterControlComponent","onShowFooterChange","DashboardFooterControl","FontSizeControlComponent","baseUrl","activeControlImage","controlImage","FontSizeControl","VALUES","GridSizeControlComponent","GridSizeControl","CustomizeComponent","columnOptions","showTrialPromo","showUpgradePromo","isBoxLayout","onColumnsChange","onScaleToFitChange","onTvModeChange","onCancel","onMount","onPreviewGrid","customizePanelContent","inner","can_toggle_widget_title_size","buttonPanel","WidgetFooter","serviceTitleClass","fileName","widgetFooter","serviceIcon","WidgetTitleConnector","isFixieboard","WidgetTitle","WidgetTitleUniversalConnector","getRefreshDelay","WidgetMenuConnector","isFocused","real_time_updates","showCopyModal","createOnCopyHandler","shouldShowCopyModal","ownProps","filteredStateProps","WidgetMenuOverlayPortal","domHostId","WidgetMenuOverlay","headerId","_listenForEsc","in","WidgetHeaderComponent","onCloseMenu","onOpenMenu","isEditingFromDashboard","isTitleEnabled","isWidgetFocused","draggable","staleData","settingsNode","settingsButton","handleMenuToggle","WidgetHeaderConnector","editedKey","WidgetHeader","snapValue","scaledGridSize","scaledGridGapSize","snappedValue","remainder","cellSpan","snap","snapHeight","hasSlimSupport","gridIncrements","minHeight","SLIM_HEIGHT","ResizableWidgetComponent","onResizeStart","newWidth","newHeight","onResizeChange","raw","onResizeEnd","handleWrapper","getMaxSize","dashboardMax","widgetOffset","widgetSize","ResizableWidgetConnector","ResizableWidget","WidgetWrapperComponent","onResize","isMovable","isPreviewLoading","widgetHeight","hasTransparentBackground","widgetClassName","resizing","transparent","focused","sizeStyle","resizeHandleStyle","resizeHandle","data-id","handleResizeChange","handleResizeEnd","ghostPreview","reverseScale","isFixedLayout","createOnResizeHandler","remainingDispatchProps","WidgetWrapperConnector","CssScaleComponent","fullSize","scaled","CssScale","ScrollTo","setDomRef","domRef","NUMBER_FORMAT_VISUALISATIONS","canConfigAndDataAllowNumberFormat","isDurationData","canFormatTable","WidgetComponent","isSlimHeight","hasSlimHeight","getInnerClassName","setDomref","DataSourceDropMenu","onOpenDeleteConfirmModal","DataSourceListItem","onReconnect","TextAreaComponent","textarea","DeviceListItem","sharingLoops","onRename","onRefresh","onSetContent","typeIsDashboard","editableContainer","sortedDashboards","dashboardOptions","unshift","sortedSharingLoops","loopOptions","sharingLoopId","handleSelectChange","renderDashboardSelect","ManageScreensView","onShowAddView","onDeleteDevice","onRefreshDevice","onSetDeviceName","onSetDeviceConnection","onCreateLoop","isLiteEnabled","onToggleLite","dashboardLayout","noSharingLoops","hasPromo","devicesList","renderDevicesList","renderError","renderAddButton","liteToggle","QueriedManageScreensView","dashboardLayoutQuery","SortableListComponent","SortableListItemComponent","itemClass","sortableWrapperClass","sortable","innerItem","previewItem","DashboardTrackingProps","DataSourceHeaderComponent","AccountConnectorFormComponent","onConnect","updateValidity","renderField","connectScreen","formTitle","memorableFields","connectFields","handleSubmit","noValidate","form","renderMemorableFields","renderConnectFields","DataSourceEducationalFooter","DefaultDataSourceConnectorComponent","hasEducationalFooter","protection","protectionMessage","protectionIcon","eye","lock","TRIAL_MODAL_ROUTES","TV","PEOPLE","DASHBOARDS","TRIAL_MODAL_CONTENTS","TrialModal","useHistory","useRouteMatch","exact","modalContent","startTrialButton","upgradeButton","FormFieldComponent","valid","showHelp","sanitize","RegExp","handleToggleHelp","suffixLabel","suffix_label","invalid","inputClasses","inputWithSuffix","requiredIndicator","validationMessage","getDefaultErrorMessage","renderHelp","domEl","timezones","AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BV","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CW","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW","countryCodeByTimezone","POLECAT_SERVICES","isPolecatService","BarLoadingAnimation","loadAnimationContainer","loaderBar","WidgetLoader","showSlowLoadingMsg","startSlowLoadingTimer","widgetLoader","renderLoadingMessage","ServiceAccountNotFoundComponent","ServiceAccountNotFoundErrorConnector","ServiceAccountNotFoundErrorComponent","ServiceAccountNotFound","OAuthTokenExpiredOrInvalidErrorComponent","dataSourcesLink","OauthTokenExpiredOrInvalidErrorConnector","OauthTokenExpiredOrInvalidErrorComponent","OAuthTokenExpiredOrInvalidError","WidgetImporting","widgetImporting","NoDataPushedComponent","copied","linkClassNames","copieable","NoDataPushedError","WidgetDataError","showModal","isOffline","onLine","onOnlineStatusChange","OfflineDetector","OfflineBanner","bannerClass","offlineBanner","blue","chroma","huePrime","secondComponent","lightnessAdjustment","DefaultDataSourceInit","onInit","DefaultDataSourceConnectorConnector","onConnectionSuccess","AccountSelectorComponent","selectedId","selectAction","addAction","selectAccount","FileRowComponent","isSelected","onFileSelected","lastModified","formatted","dateTime","wrongTypeMsg","modifiedAt","modified_at","isDemo","isTabular","renderFolder","renderDate","renderBetaLabel","FolderRowComponent","onSelectFolder","FolderRowConnector","last_modified","currentFolder","isFiltered","hasFolder","supportedTypes","betaTypes","tabularTypes","folderName","groupByFolder","renderFolderRow","renderFileRow","noResult","BreadcrumbComponent","rootClass","clickablePath","breadcrumb","goToRoot","onFolderSelected","FilePickerComponent","isLoadingList","filterAttribute","picker","lLoadingList","renderSearch","renderBreadcrumb","renderList","FilePicker","comparer","comparerGenerator","valA","valB","COMPARER","SUPPORTED_REPORT_TYPES","TABULAR_REPORT_TYPES","SalesforcePopoverComponent","onSwitchAccount","salesforceConnector","renderHeader","SalesforceConnectorComponent","lFetchingInitialList","SalesforceConnectorConnector","fileDetails","folderTitle","createOnConnectHandler","LOGO_SOURCE","onedrivebusiness","dropbox","STORAGE_TITLE","SidebarItemComponent","spreadsheetsService","isConnected","backtrackProps","handleSwitchService","isInitialState","connectBtn","extendedItem","notConnected","imgWrapper","renderDetails","SPREADSHEETS_HELP_LINKS","SpreadsheetFileImportComponent","onFileImport","helpLinkContainer","helpLinkIcon","helpLink","renderHelpLinks","SpreadsheetFileImportConnector","onImport","SidebarLinkComponent","fiWrapper","baseStyle","SidebarComponent","serviceErrorMessage","availableServices","hostedExcelService","lItem","lItemInitial","renderService","sidebar","ContentComponent","extendedService","isHostedExcel","filePickerWrapper","handleSelectAccount","renderFileList","SpreadsheetsConnectorComponent","titles","lSwitchingService","extendedServices","sidebarClasses","lSidebar","spreadsheetsConnector","SpreadsheetsConnectorConnector","spreadsheetsServiceName","pathCreator","newServiceAccountId","remainingStateProps","DatasetsConnectorComponent","datasetsConnector","defaultMessage","DatasetConnectorConnector","createOnFileSelected","DatasetConnectorComponent","PresetList","servicePropTypes","PresetFetcher","PresetPanelComponent","hideFooter","panelClasses","presetPanel","scrollHidden","loadingOverlay","presetPanelHeader","presetPanelContentOuter","presetPanelContentInner","presetPanelButton","presetPanelFooter","PresetPanelComposition","PresetPanel","_presets","UniversalConnectorComponent","showPresetPanel","addingAnotherAccount","hasMirageWidget","isCreatingWidget","handlePresetSelection","onAccountsAvailable","trackPresetSelection","selectedService","preset_id","preset_name","UniversalConnectorConnector","accountServiceName","currentUniversalService","areFormattedServicesLoading","HeirloomConnectorComponent","redirecting","hasValidServiceAccount","getPresetData","redirectToConfigPage","heirloomPresetConfigPageUrl","requiresAccount","requires_account","getValidServiceAccount","orderedWidgetTypes","widgetTypesWithIcon","Align","as","DatabaseConnectionsQuery","DatabaseConnections","QueryEditorModal","ENGINES","MYSQL","port","POSTGRESQL","REDSHIFT","databaseOptions","getErrorMessage","handleRequestClick","DatabaseConnectorFormComponent","databaseType","connectionName","databaseName","username","createMutation","getMutationVariables","databaseConnectionCreate","databaseConnections","database","headerContainer","requirements","supplementary","halfFields","supplementaryIcon","actions","isFormFilled","DatabaseConnectorForm","IntroPanel","onContinue","supportMessage","engines","engineLogo","ConnectionList","toBeDeleted","deleteConnection","connectionIcon","deleteButton","DatabaseConnectionDelete","ConnectionListPanel","onAddConnection","onSelectConnection","connectionList","DatabaseTrackingProvider","sharedProperties","selectConnection","connection_id","connection_name","selectEngine","submitConnectionForm","createConnectionError","queryError","outcome_info","querySuccess","DatabaseTrial","redirection","featureGate","featureGateInner","featureGateTitle","featureGateContent","trialistContentId","contentId","featureGateAction","trialistButtonId","buttonId","DatabaseConnectorComponent","INTRO","selectedEngine","confirmWidget","closeEditor","hasConnections","tracker","FORM","DatabaseConnectorComponentWrapped","gateProps","DatabaseConnector","SpreadsheetsConnector","SalesforceConnector","DatasetConnector","UniversalConnector","HeirloomConnector","DefaultDataSourceConnector","getComponent","DataSourcePopoverComponent","isOverlayVisible","lLoading","sidePanel","renderPanel","DataSourcePopover","DataSourceConnectorComponent","ConnectorComponent","connectorPicker","renderConnector","getServiceNames","DataSourceConnector","ERROR_OVERRIDES","EmptyVisualisationComponent","errorKey","renderMessage","infoText","emptyState","illustration","renderTitle","renderInfo","EmptyVisualisation","PreviewComponent","previewWrapper","renderEmpty","renderLoading","visualisationStatus","previewClasses","previewMode","visualisationNotComplete","isStatusIndicatorsEnabled","InputDropdownGroup","DashboardFooterConnector","isPreview","showTrialCountdown","show_trial_countdown","DashboardFooterComponent","DashboardFooterHistoryConnector","EmptyDashboardComponent","addWidgetPath","footerLink","angleRight","fullscreenChangeListener","FullscreenChangeListener","isFullscreen","handleFullscreenChange","fscreen","onFullscreenChange","InstrumentHeaderComponent","didUserReload","onReloadClick","handleReload","lastUpdatedText","canReload","addBackground","renderLastUpdate","titleFontSize","viewingContext","headerClassNames","instrumentHeader","hasBackground","bringToBack","reloadButtonClassNames","reloadButton","rotateButton","widgetHelpers","lastUpdated","InstrumentHeader","InstrumentErrorComponent","instrumentError","InstrumentError","Instrument","scalingStyle","statusIndicatorClass","isFromCache","hideTitleWhenShort","refreshMode","shouldPad","visualisationScale","useContentHeight","dataURL","canUserEdit","isClientSideRefresh","displayState","shouldRenderError","shouldRenderVisualisation","isShort","useWidgetSidePadding","visualisationPadding","configWithThresholds","hasBackgroundColor","instrumentClasses","fixedLayoutBackground","errorState","warningState","loadingState","visualisationClasses","noHeader","vizPositionerClasses","visualisationPositioner","largeTitle","smallTitle","newComparisonLabel","newLabel","intervalSeconds","errorBoundaryPropTypes","beforeSend","ErrorBoundaryComponent","ErrorBoundaryChoiceComponent","reactPlugin","getPlugin","ErrorBoundary","use","bugsnagReact","forwardRef","Fallback","ConditionalDisabledOverlayComponent","ConditionalDisabledOverlay","InstrumentQueryComponent","InstrumentQuery","refetch","BrandingText","brandingText","brandingTextDarken","Logo","imageUrl","isGeckoLogo","showBrandingText","brandLogo","Title","TrialText","trialDaysCountdown","DashboardFooter","supportPortrait","isFreePlan","dashboardFooter","portraitSupport","footerClock","conditionalRender","submitting","AddDashboardModal","firstGroup","selectedGroupId","submitData","groupSection","onGroupChange","isLoadingGroups","optimiseForTVChecked","addDashboardModal","toggleSection","renderGroupsOption","InAppHelp","getNumberFormat","EditWidgetQueryEditorModal","createOnConfirm","handleEvent","cleanupListeners","slackOAuth","refetchConnections","receiveMessage","TIMES_IN_HOURS","display","ScheduledPostsTimezoneQuery","DashboardTimezone","ScheduledPostTimezoneComponent","countryCode","scheduledPostTimezone","changeTimezoneButton","withScheduledPostsTimezoneQuery","ScheduledPostsTimezoneComponent","ScheduledPostsComponent","scheduledPosts","slackChannels","createScheduledPost","updateScheduledPost","removeScheduledPost","scheduledPost","hasExistingScheduledPost","firstSlackChannel","firstPostTime","initialSlackChannel","slackChannelId","slackChannel","setSlackChannel","initialPostTime","timeHour","postTime","setPostTime","hasFormValuesChanged","buttonTextId","renderSlackChannelOptions","renderPostTimeOptions","inputTitle","dropdown","slackChannelValue","postTimeSection","postTimeDropdown","hourValue","postTimeTimezone","submitButton","removeButton","ScheduledPostsQueryComponent","slackConnectionId","ScheduledPostsQuery","useMutation","CreateScheduledPost","createError","UpdateScheduledPost","updateError","RemoveScheduledPost","removeError","scheduledPostInput","mutationResponse","cachedScheduledPosts","newScheduledPosts","createScheduledPostCacheUpdater","postId","deleteScheduledPost","removeScheduledPostCacheUpdater","ScheduledPostsDashboardIdQuery","DashboardIdByLegacyId","SlackMenuComponent","slackConnections","isSharing","onDisplaySharingLinkTab","renderConnectButton","renderSlackIntegrationInfo","connectInfo","slackWrapper","sharingInfo","sharingInfoText","sharingLink","errorAlert","slackConnection","teamName","connectionDetails","connectedIcon","disconnectLink","SlackMenuChannelsQuery","SlackChannelsQuery","SlackMenuConnectionsQuery","SlackConnectionsQuery","getScaleRatio","maxAllowedWidgetHeight","CelebrationWidget","instrumentSize","scaledSize","containerSize","onFinish","celebrationWidgetWrapper","confetti","contentWrapper","swirl","actualSize","getTransformedInstrumentSize","instrumentConfig","renderWidget","CelebrationWidgetComponent","SessionTelemetryComponent","windowSession","performance","memory","usedJSHeapSize","window_session","window_session_duration_s","getSessionLength","memory_used","getMemorySnapshot","SessionTelemetry","COLUMN_OPTIONS","defaultUser","Customize","filteredValues","doesCustomizationMatchAllowances","createOnSaveHandler","createOnUpgradeClickHandler","CustomizePanelComponent","customizePanel","_importClassicLayoutComponent","AsyncClassicLayout","_importClassicLayoutGraphQLComponent","AsyncClassicLayoutGraphQL","_importBoxLayoutComponent","AsyncBoxLayout","BoxLayout","_importBoxLayoutGraphQLComponent","AsyncBoxLayoutGraphQL","_importMobileLayoutComponent","AsyncMobileLayout","MobileLayout","DashboardLayoutComponent","isPointerActive","handleMouseMove","onFinishCelebration","celebrationWidget","onFinishInstrumentCelebration","celebrationInstrumentId","celebrationTimer","parent","isEditMode","isDashboardLoaded","isEditingDatabaseWidget","useGraphQLDashboard","onMouseMove","pointerActive","previewClassName","renderDesktopLayout","GeckoRouter","ImportingDataModal","handleSupport","progressStatus","importId","onAcknowledgeImport","importType","progressText","descriptionMessageId","renderImportModalDescription","sectionError","showDescription","okButton","renderFinished","renderInProgress","isImportFinished","ImportingDataModalMutation","AcknowledgeImport","acknowledgeImport","getProgressPercentage","dataImport","ImportToast","toastWrapper","toastProgress","toastInner","toastText","ImportToastLauncher","completed","timeouts","getNewlyCompleted","scheduleHideToast","toasts","onOpenModal","onCloseModal","openModalDataImport","imp","visibleToasts","getVisibleToasts","renderToasts","renderImportingDataModal","TIME_TO_HIDE","getImportsFromResponse","ImportsIndicator","startPolling","schedule","ImportsQuery","fetchPolicy","pubDate","article","formatting","WhatsNewComponent","onOpen","notificationPill","WhatsNewWatcher","propWatcher","WhatsNewConnector","AddScreenViewComponent","errorText","onShowManageView","intl","instructions","handleConnect","renderManageScreensButton","renderAddScreenModal","renderFeatureGate","showFeatureGate","injectIntl","WistiaEmbed","video","allowTransparency","frameBorder","scrolling","allowFullScreen","MozAllowFullScreen","WebkitAllowFullScreen","OAllowFullScreen","msAllowFullScreen","UpgradeView","onUpgradeLinkClick","instructionContainer","ManageScreensComponent","ToastPropTypes","successMessage","successMessageWithButton","buttonText","successMessageWithButtonAndIcon","successMessageWithIcon","ToastLauncherComponent","canUseSharingUrls","onManageScreens","onManageDashboardAccess","onCopySharingLink","ToastNode","onFollowLink","onInviteMore","ToastLauncherConnector","sharing_urls","servicePath","manageDashboardAccessPath","ToastLauncher","formatOptions","roleOptions","jtbdOptions","EMPTY_VALUE","FirstRunComponent","inputs","jtbd","scrollable","banner","getStartedButton","ConditionalFirstRun","FirstRunConnector","createHandlers","answers","segmentation_question","segmentation_answer","NavLogoButtonComponent","showBackButton","DashboardLimitModalComponent","DashboardLimitModal","MastheadUpgradeLink","showUpgradeLink","isFreePlanUser","renderTrialDaysRemainingText","dayText","mastheadButton","trialDaysRemainingText","planText","mastheadUpgradeText","deselectCurrent","debug","reselectPrevious","createRange","getSelection","textContent","clip","whiteSpace","webkitUserSelect","MozUserSelect","msUserSelect","userSelect","clipboardData","setData","selectNodeContents","addRange","execCommand","copyKey","prompt","removeRange","removeAllRanges","_$src_1","_React$Component","subClass","superClass","_proto","componentDidCatch","BugsnagReport","report","getStacktrace","severity","unhandled","severityReason","componentStack","formatComponentStack","updateMetaData","MobileWidget","smallHeight","useSmallHeight","getWidgetType","smallWidth","useSmallWidth","largeHeight","isPolymorphic","rowCount","smallHeightRowWidget","EmptyDashboard","emptyDashboard","emptyContent","fillRule","rx","OfflineDashboard","xmlns","ReconnectDashboard","reconnectButton","returnedOnline","onAppInstalled","onSetIsMobile","trackResponsiveSession","onSwitchToDesktopView","clipPathUnits","switchToDesktop","switchToDesktopButton","footerWrapper","footerInner","sortByPosition","widgetA","widgetB","MobileLayoutConnector","onCanvasWidgets","createOnOpenMenuHandler","rangeCount","getRangeAt","tagName","IntlPolyfill","__addLocaleData","ca","hourNo0","hour12","short","full","long","availableFormats","Ed","Ehm","EHm","Ehms","EHms","Gy","GyMMM","GyMMMd","GyMMMEd","hm","Hm","hms","Hms","hmsv","Hmsv","hmv","Hmv","Md","MEd","MMM","MMMd","MMMEd","MMMMd","yM","yMd","yMEd","yMMM","yMMMd","yMMMEd","yMMMM","yQQQ","yQQQQ","dateFormats","yMMMMEEEEd","yMMMMd","timeFormats","hmmsszzzz","hmsz","calendars","buddhist","months","narrow","eras","dayPeriods","am","chinese","coptic","dangi","ethiopic","ethioaa","generic","gregory","hebrew","indian","islamic","islamicc","japanese","persian","roc","nu","patterns","positivePattern","negativePattern","symbols","latn","nan","plusSign","minusSign","percentSign","infinity","currencies","AUD","BRL","CAD","CNY","HKD","ILS","INR","JPY","KRW","MXN","NZD","TWD","VND","XAF","XCD","XOF","XPF","BasicPlanConfirmModalComponent","featureList","featureIcon","featureContent","featureTitle","BasicPlanConfirmModal","ALL_PLAN_DETAILS","basic0819","titleId","allAllowancesId","team0819","teamplus0819","company0819","freemium0520","PlanComponent","showWarning","openWarningModal","closeWarningModal","period","subPrice","databaseConnectionCount","messageParts","isBasicPlan","commaList","handleSelection","selectButton","lowerCase","containerClass","planWrapper","basic","renderPrice","renderSelectButton","dashboardLimit","renderDashboardLimit","basicPlanTick","renderDisabledMessage","DISCONTINUED_HEADER","ADDONS_TEXT","PlansModalComponent","renderPlans","currentPrice","isTrial","discontinuedMessage","obsolete","getAddonsDetails","handleSwitchPaymentInterval","paymentInterval","annualHint","handleSelectPlan","handleSelectAddon","defaultGroupId","plansModal","plansModalInner","intervalAndUsage","renderSwitchPaymentInterval","plansWrapper","PlansModalConnector","completePlans","createSelectPlanHandler","numExtraDashboards","selected_plan","extra_dashboards","handleCancel","newDispatchProps","PlansModal","PlansModalQueryConnector","_importComponent","Loader","ConfigComponent","configWrapperPicker","ConfigWrapper","renderProps","ConfigWrapperComponent","IntegrationRequestModalComponent","clearState","IntegrationRequestComponent","handleSubmitModal","handleOpenModal","handleCloseModal","showRequestModal","onSubmitIntegrationRequest","IntegrationRequestConnector","serviceRequest","WidgetTypePageComponent","integrationRequest","IntegrationRequest","WidgetTypePageIntegrationRequest","makeLegacyDashboard","shouldReload","DashboardPickerComponent","dashboardListContainer","domList","domContainer","renderGroupItem","data-action","dashboardLinkWrapper","renderDashboardItem","addDashboardButton","onAddDashboard","present","renderExampleHint","DashboardPicker","AccountOwnerOrGroupAdmin","AccountOwnerOrGroupAdminConnector","AccountMenuComponent","adminLink","currentUserIsOwner","firstName","lastName","canUpgrade","userInitials","accountMenu","accountLinkDescriptionId","userInitialsCircle","showAdmin","AccountMenuConnector","ScreensButton","useDispatch","useLocation","ScreensButtonConnector","ManageScreens","App","unsupportedRegex","isUnsupportedBrowser","WarningPill","warningPill","UnsupportedBrowserModal","Unsupported","handleOpen","InviteMembersFormComponent","handlePermissionChange","onInvite","menuLabelId","inputContainer","manageLink","manageLinkIcon","InviteMembersModalComponent","handleInvite","onShow","isAdminPage","groupName","adminModal","renderHeading","adminModalImage","featureGateModal","featureGateCopy","renderInviteModal","InviteMembersModalConnector","company","InviteMembersModal","invite","inviteAdmin","LoopDashboardListComponent","LoopDashboardList","LEGACY_INTERVAL_OPTIONS","20","LoopModalComponent","applyDefaults","handleUpdate","handleCreate","handleSelectDashboard","getAvailableDashboards","onCreate","loopName","firstDashboard","availableDashboardsList","imageSrc","emptyLoops","emptyLoopsImage","handleMove","canSave","intervalOptions","showManageLink","modalHeading","isContentScrollable","renderIntervalSelect","renderLoopDashboardList","renderAddForm","renderSubmitButton","AddLoopModalConnector","LoopModal","AddDashboardModalConnector","createOnSubmitHandler","BaseMastheadComponent","isHelpOpen","domSource","gatherEventProps","canEditOrganization","isViewingDashboard","showSwitchToMobile","onSwitchToMobileView","stringifiedDashboardId","backToDashboardPath","helpButtonClasses","closeHelp","mastheadTopWrapper","renderPicker","onLoopsClick","onInviteClick","helpPopoverRef","supportUrl","BaseMastheadComponentWithApolloProvider","BaseMastheadConnector","hasFreemiumFeatureFlag","hasClassicboards","isDashboardLimitReached","dashboardHelpers","createOnAddDashboardHandler","createOnUpgradeLinkClick","filteredDispatchProps","BaseMasthead","DropButtonComponent","DropButton","CustomizeDropItem","DashboardSettingsMenuComponent","settingsCog","DashboardSettingsMenu","AddWidgetButtonComponent","widget_types","has_accounts","getServiceLink","handleClickService","data-service","connectedServices","utilityServices","dropMenuHeading","onAddWidget","renderSplitButton","isUtility","AddWidgetButtonConnector","updated_at","renderShareFeatureGate","shareIllustration","renderPublicContent","sharingURL","tabPanel","shareLinkText","iconContainerLink","onCopyLink","onRegenerateLink","onDeleteLink","renderPrivateContent","onEnableSharing","renderInviteContent","userSuggestions","onChangeAddress","onSubmitInvite","renderPanelContent","setTab","onSelectTab","temporarilyAllowSharing","renderLinkContent","wrapperTabs","layoutTabList","tabTitle","panel","SharingMenuComponent","SharingMenu","SharingMenuConnector","alreadySelected","matchingUsers","autoCompleteEmailList","createOnSubmitInviteHandler","createOnDeleteLinkHandler","SharingMenuDashboardConnector","DashboardOptionsComponent","sharingMenu","settingsMenu","addWidgetButton","onEnterFullscreen","fullscreen","DashboardOptions","DashboardMastheadTitle","DashboardMastheadTitleConnector","BreadcrumbNav","breadcrumbNav","BreadcrumbLink","breadcrumbLink","DASHBOARDS_QUERY","withGraphQLId","SWITCH_TO_CONTAINER_LAYOUT","SetContainerLayoutButton","setIsLoading","switchToContainerLayout","DashboardMastheadComponent","canConvertToContainerLayout","canEditDashboard","showDashboardOptions","crumb","setContainerLayoutButton","showGroupName","MastheadWithApolloProvider","ConnectedHistoryDashboardMasthead","DashboardMastheadConnector","DashboardMasthead","isMobileViewportSize","MastheadBreadcrumb","PreviewModalComponent","fieldMap","getHeaderCellDescription","recordCount","total_count","Fragment","showPreviewModal","innerModal","renderHeaderCells","renderRow","PreviewModalConnector","createOnChangeHandler","BreadcrumbDropdownComponent","openInNewTabText","openInNewTabUrl","onToggleFilePicker","changeFileText","onRefreshFile","refreshFileText","crumbClass","fileTitle","dropList","renderPreviewModalLink","renderOpenInNewTabLink","SERVICE_SPECIFIC","fileActions","universalQueryActions","BreadcrumbDropdown","SpreadsheetsBetaBreadcrumbs","configureWidgetURL","selectVizURL","basicCrumb","breadcrumbOverrides","Spreadsheets","getBreadcrumbServiceLabel","override","WidgetMastheadComponent","onTextClick","isSpreadsheetsBeta","editMode","spreadsheetServiceId","getBreadcrumbsProps","connectServiceId","propsForSpreadsheets","propsForSalesforce","propsForDatasets","getServiceProps","serviceProps","WidgetMasthead","getServiceName","Dashboard","Widget","Account","ServiceSearchComponent","PillLink","dataName","data-service-name","ServicePill","pillContainer","featuredDescription","SERVICE_LIST_COLUMNS","ServiceComponent","onClickService","FOOTER_SERVICES","IntegrationSuggestions","suggestionsText","blobContainer","integrationText","integrationTitle","subheading","IntegrationRequestSection","isRequestModalOpen","setIsRequestModalOpen","footerBox","leftHandSide","textContainer","buttonContainer","IntegrationsPageFooter","isSearchResultEmpty","ServiceListHeader","Subheader","subheader","ServiceListSubheader","ServiceListComponent","filtered","toolServices","afterSearch","recentServices","onClickManageAllConnections","ServiceList","data-page-content","renderRecents","renderSources","renderTools","featuredServices","ServiceListMounter","dataSourceActions","EXTRA_TRACKING","freshdesk","gaUniversal","hubspot2","hubspot3","intercom2","intercom3","pipedrive","pipedrive2","salesforceNew","zendeskUniversal","zendeskchat","trackServiceSelection","extraTracking","TOOL_SERVICES","FEATURED_SERVICES","HIDDEN_SERVICES","sortLegacy","trackSearchDebounced","search_term","results_count","ServiceListConnector","allServices","partitionedServices","getFeaturesServices","isRecentlyConnected","orderRecentlyConnected","InactiveList","RestrictedServiceList","allowedServices","restrictedServices","manageConnectionsPath","freeToConnectHeader","cards","trialCard","cardHeading","cardDescription","cardButton","upgradeCard","restrictedServiceList","ALLOWED_SERVICES","RestrictedServiceListDataProvider","organizationCreatedDate","ServiceListEntry","isServiceListRestricted","ControlledWidgetRenderer","handleWidgetCreateAndUpdate","template_type","handleGeckoJSMessage","identifier","AdminContentContainerComponent","AdminContentContainer","AdminPermissionDenied","adminStyle","defaultTitle","titleTemplate","titleBarStyle","contentRow","GroupAdminTitleBar","tabs","tabsInner","tabLink","activeClassName","renderTabs","GhostListComponent","GhostList","OrganizationMembersEmptyStateComponent","OrganizationMembersEmptyState","OrganizationViewersEmptyState","UserInitialsComponent","initials","pending","PersonPermissionsSelectComponent","labelId","permissionDropMenuList","PersonPermissionSelect","DropItemLinkComponent","dropItemStyles","DropItemLink","AccountOwnerOnly","AccountOwnerOnlyConnector","RevokeOwnerConfirmModal","MakeOwnerConfirmModalComponent","PromoteToMemberConfirmModalComponent","DeleteUserConfirmModalComponent","DeleteUserConfirmModal","PersonComponent","isRevokeOwnerModalVisible","isMakeOwnerModalVisible","isPromoteToMemberModalVisible","isDeleteUserModalVisible","toggleRevokeOwnerModal","onRevokeAccountOwner","toggleMakeOwnerModal","onMakeAccountOwner","togglePromoteToMemberModal","onPromoteToMember","toggleDeleteUserModal","onDeleteUser","member","isCurrentUser","currentUserIsAccountOwner","onDemoteToDashboardViewOnly","onResendInvite","onPermissionsChange","memberId","invitePending","invite_pending","canDeleteUser","showMenu","usersListItemName","dashboardsShared","getPermissionSection","handleRevokeOwner","handleMakeOwner","handlePromoteToMember","handleDeleteUser","Person","ListHeading","helpMessage","listHeading","PeoplePageComponent","peopleForGroup","person","filterPeopleBeingDeleted","TitleBarButton","buttonIconProvider","renderAccountOwners","renderMembers","renderDashboardViewOnlyUsers","PeoplePageConnector","RegenerateSharingLinkConfirmModalComponent","DashboardsGroupPageComponent","isRegenerateSharingLinkModalVisible","isDeleteDashboardModalVisible","toggleRegenerateSharingLinkModal","onRegenerateSharingLink","deleteDashboardTitle","onCopySharingLinkClick","onRegenerateSharingLinkClick","onDeleteDashboardClick","sharedUsers","usersSharedWith","renderDashboards","toggleDeleteDashboardModal","handleRegenerateSharingLink","onDeleteDashboard","deleteDashboardId","DashboardsGroupPageConnector","getDashboardsArray","DashboardsGroupPage","CheckboxWithLabelComponent","Checkbox","AffectedWidgetsList","renderListItems","DeleteDataSourceConfirmModal","onCheckboxChange","connectionTitle","summary","adminModalStyles","DataSourcesEmptyState","emptyStateStyles","DatabaseConnectionList","plural","onDeleteConnection","DataSourcesGroupPageComponent","dataSourcesForGroup","onReconnectDataSource","onOpenReconnectModal","onCloseReconnectModal","reconnectingDataSource","onOpenDeleteDataSourceConfirmModal","reconnectingServiceName","renderDataSources","DataSourcesGroupPageConnector","deleteDatasourceConfirmModalAction","LoopListItemComponent","isDeleteModalVisible","onDeleteLoop","renderConfirmDeletionModal","LoopsEmptyStateComponent","onAddLoopClick","LoopsEmptyState","LoopsGroupPageComponent","renderLoopsList","LoopsGroupPageConnector","ScrollableListComponent","ScrollableList","DashboardPermissionListItemComponent","hasAccess","onToggleAccess","DashboardPermissionListItem","DashboardPermissionsModal","handleToggleAccess","hasChanged","hasChangesPending","localdashboardIds","changes","infoMessage","renderInfoMessage","getDashboardPermissionChanges","permissions","added","perm","removed","haveCachedData","usersCurrentDashboardIds","dashboard_permissions_added","dashboard_permissions_removed","modalActions","UserPermissionListItem","UserPermissionsModal","dashboardViewOnlyUsers","localuserIds","renderUserList","EditLoopModalConnector","AdminComponent","PeoplePage","DataSourcesGroupPage","LoopsGroupPage","EditLoopModal","OfflineMenuMessage","lastDashboardUrl","getLastDashboard","caches","offlineText","MobileMenu","mobileMenuPage","scrollWrapper","renderOffline","dashboardUrl","menuItemActive","logoutLink","closeButtonWrapper","WrappedMenu","redirects","RoutesComponent","ThemedDashboard","PreviewDashboard","isScreen","Admin","Routes","mapBuiltInThemeToProp","NAVY","PURPLE","mapFrameStyleToWidgetStyle","SHADED","getTheme","themeType","CustomizationApplicatorQuery","frameStyle","graphqlToCustomizationProps","CustomizationApplicatorGraphQlWrapper","useGraphQL","initScreenPage","deviceToken","CustomizationApplicatorConnector","getDashboardScaleForPreview","dashboardDimensions","containerDimensions","targetWidth","sourceHeight","sourceWidth","targetHeight","fitToBox","mutationObserverFactory","WebkitMutationObserver","clearScaling","domDashboardFooter","dashboardStyle","scalePreview","domDashboard","containerWidth","getFooterScaleForPreview","footerScale","footerHeight","PreviewScalingComponent","handlePreviewScaling","setMode","unbindEventHandlers","enterPreviewMode","leavePreviewMode","PreviewScalingConnector","isClassicboard","CustomCSSPreviewComponent","cssBackgroundProps","applyCustomCSS","isCSSPreview","bodyStyles","styleProperty","CustomCSSPreviewConnector","DashboardLayoutConnector","shouldRenderClassicboardsInGeckoJS","DashboardLayoutWithDashboardsQuery","onCompleted","DashboardLayout","LEGACY_DASHBOARD_QUERY","DASHBOARD_QUERY","RoadieImportError","textAlign","DashboardLayoutRedirectComponent","timeoutRef","pollingTimedOut","setPollingTimedOut","isOnLegacyId","stopPolling","DashboardLayoutRedirect","applyTheming","ensureCorrectLayout","EnsuredDashboard","shouldRenderQuery","GET_DASHBOARD_QUERY","GraphqlScreenDataProvider","GraphqlSharePageDataProvider","_importGraphQLEditPageComponent","AsyncGraphQLEditPage","GraphQLEditPage","_importGraphQLSharePageComponent","AsyncGraphQLSharePage","GraphQLSharePage","_importGraphQLMobilePageComponent","AsyncGraphQLMobilePage","GraphQLMobilePage","GraphQLPageContainer","graphQLHelpers","renderer","RoutesRenderer","GraphQLDashboardPage","applyPreview","noConflict","tracking","events","TrackingEvents","scheduleToastDelegate"],"mappings":"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AAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,IAAS,SAAS,IAAS,SAAS,KAAe,MAAM,KAAe,OAAO,IAAS,MAAM,KAAe,OAAO,IAAS,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,IAAS,OAAO,KAAe,OAAO,KAAe,MAAM,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAO,SAAS,IAAO,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,MAAM,IAAS,MAAM,KAAe,OAAO,KAAe,MAAM,IAAS,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAO,OAAO,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAO,QAAQ,IAAO,QAAQ,IAAO,OAAO,IAAO,OAAO,IAAS,SAAS,IAAS,SAAS,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,IAAS,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,IAAS,OAAO,IAAS,SAAS,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,IAAS,OAAO,IAAS,KAAK,IAAS,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,KAAK,IAAS,SAAS,IAAS,SAAS,IAAS,QAAQ,IAAS,QAAQ,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAO,QAAQ,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,QAAQ,IAAS,SAAS,IAAS,SAAS,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAO,SAAS,IAAS,SAAS,IAAS,SAAS,IAAO,QAAQ,IAAO,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAO,OAAO,IAAO,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,IAAS,QAAQ,IAAS,QAAQ,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,KAAe,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAO,SAAS,IAAO,SAAS,IAAS,QAAQ,IAAS,QAAQ,IAAO,OAAO,IAAS,OAAO,KAAe,OAAO,KAAe,MAAM,KAAe,OAAO,IAAS,MAAM,IAAS,OAAO,KAAe,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,OAAO,IAAS,OAAO,IAAS,QAAQ,IAAO,QAAQ,IAAO,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,OAAO,IAAS,OAAO,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,QAAQ,IAAS,OAAO,IAAS,QAAQ,IAAS,UAAU,IAAS,SAAS,IAAS,SAAS,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,QAAQ,IAAS,SAAS,IAAS,QAAQ,IAAS,OAAO,IAAS,OAAO,IAAS,QAAQ,IAAS,SAAS,IAAS,QAAQ,IAAS,SAAS,IAAS,SAAS,IAAS,KAAK,IAAO,QAAQ,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,UAAU,IAAS,UAAU,IAAS,KAAK,IAAS,MAAM,IAAS,KAAK,IAAS,MAAM,IAAS,OAAO,IAAS,MAAM,IAAS,QAAQ,IAAS,QAAQ,IAAS,SAAS,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,UAAU,IAAS,OAAO,IAAS,MAAM,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,QAAQ,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,QAAQ,IAAS,QAAQ,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,QAAQ,IAAS,QAAQ,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,SAAS,IAAS,SAAS,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,MAAM,IAAS,QAAQ,IAAS,QAAQ,IAAS,MAAM,IAAS,MAAM,IAAS,QAAQ,IAAS,QAAQ,IAAS,MAAM,IAAS,MAAM,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,OAAO,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,SAAS,IAAS,MAAM,IAAS,MAAM,IAAS,SAAS,IAAS,SAAS,IAAS,MAAM,I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","file":"polecat.10137a7429d8a9d864b8.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Polecat\"] = factory();\n\telse\n\t\troot[\"Polecat\"] = factory();\n})(window, function() {\nreturn "," \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t10: 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t10: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"7\":\"ammap\",\"12\":\"topojson\"}[chunkId]||chunkId) + \".\" + {\"0\":\"b2895319df1e573acd61\",\"1\":\"cf4b4d75d3243bc0e916\",\"2\":\"0228ac8d5df6c9ab4ffd\",\"3\":\"eb7ecd2d8068d07e393e\",\"4\":\"7403985997391c80ca48\",\"5\":\"097167e40a220f3714c9\",\"6\":\"dbbcb59e88e3f5dd598d\",\"7\":\"45312a74a4c4cc1d9fae\",\"12\":\"0ec1b58bf0829de154e7\",\"14\":\"e49c5ad33eda2e196a13\",\"15\":\"33d715931da1128d9a05\",\"16\":\"7762d7924b60ad5ea2dd\",\"17\":\"d1bda4e9ece143b87e58\",\"18\":\"e1d3bb4fbcce700a9b6e\",\"19\":\"acb11fccf3fbb90401aa\",\"20\":\"255ecdd6cbf2602a7415\",\"21\":\"2c324351df6cdc410f37\",\"22\":\"1fe39aa4785fc1900b99\",\"23\":\"8c97908c52a1c1d4cab3\",\"24\":\"1a2f550320789ce4a77c\",\"25\":\"72665a915487acd5600e\",\"26\":\"012acc8551c9c0ba97c0\",\"27\":\"35981e5a659d2d7bac88\",\"28\":\"5ffac0773c680a75b327\",\"29\":\"5788aaa5580c24627f58\",\"30\":\"85e79db144aacb016c9c\",\"31\":\"3d9d4e2cdbfc63d24180\"}[chunkId] + \".bundle.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"0\":1,\"2\":1,\"3\":1,\"4\":1,\"5\":1,\"6\":1,\"15\":1,\"16\":1,\"17\":1,\"18\":1,\"20\":1,\"21\":1,\"22\":1,\"23\":1,\"24\":1,\"25\":1,\"26\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"\" + ({\"7\":\"ammap\",\"12\":\"topojson\"}[chunkId]||chunkId) + \".\" + {\"0\":\"9e6555a474aae4bbff07\",\"1\":\"31d6cfe0d16ae931b73c\",\"2\":\"10b9f98966434c3fb280\",\"3\":\"2aa24a788df618454252\",\"4\":\"c11269d5c31ba3caef63\",\"5\":\"ca5ccff2b3f4ad54488f\",\"6\":\"83f2f126cc72fc056867\",\"7\":\"31d6cfe0d16ae931b73c\",\"12\":\"31d6cfe0d16ae931b73c\",\"14\":\"31d6cfe0d16ae931b73c\",\"15\":\"55a22c1e7f1f75baeaf1\",\"16\":\"b10d77625c2eec43d61c\",\"17\":\"9037179897d21b2885ea\",\"18\":\"937a5581bad5c88446b1\",\"19\":\"31d6cfe0d16ae931b73c\",\"20\":\"3259c3a2ccf2f47da4ad\",\"21\":\"7b7df69415c42c8f6ebe\",\"22\":\"7b7df69415c42c8f6ebe\",\"23\":\"3bef5488cf9fd377891e\",\"24\":\"304bfbf4682825f5e832\",\"25\":\"cb78036a6559685d7ed5\",\"26\":\"5306b355047e5753169f\",\"27\":\"31d6cfe0d16ae931b73c\",\"28\":\"31d6cfe0d16ae931b73c\",\"29\":\"31d6cfe0d16ae931b73c\",\"30\":\"31d6cfe0d16ae931b73c\",\"31\":\"31d6cfe0d16ae931b73c\"}[chunkId] + \".bundle.css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonpPolecat\"] = window[\"webpackJsonpPolecat\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 907);\n","module.exports = (__webpack_require__(28))(0);","module.exports = (__webpack_require__(28))(1);","module.exports = (__webpack_require__(28))(1116);","const createAction = type => {\n  const action = payload => ({ type, payload });\n  action.type = type;\n\n  return action;\n};\n\nexport default createAction;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\n/*\n * Components can be wrapped with a translationKeyWrapper which\n * adds a span that shows the translation id in a data-t attribute.\n * That way people can easily look up translations in the content files.\n */\nfunction translationKeyWrapper(DecoratedComponent) {\n  const WrappedComponent = props => (\n    <span data-t={props.id}>\n      <DecoratedComponent {...props} />\n    </span>\n  );\n\n  WrappedComponent.propTypes = {\n    ...DecoratedComponent.propTypes,\n    id: PropTypes.string.isRequired,\n  };\n\n  return WrappedComponent;\n}\n\nexport default translationKeyWrapper;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { IntlProvider } from 'react-intl';\nimport translations from '../../../content/default.json';\n\n// Gives the child tree access to the translation dictionary\nconst ConfiguredI18NProviderComponent = ({ children }) => (\n  <IntlProvider locale=\"en\" messages={translations}>\n    {children}\n  </IntlProvider>\n);\n\nConfiguredI18NProviderComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default ConfiguredI18NProviderComponent;\n","import translationKeyWrapper from './translation-key-wrapper';\nimport {\n  FormattedMessage as IntlFormattedMessage,\n  FormattedHTMLMessage as IntlFormattedHTMLMessage,\n} from 'react-intl';\nimport { formatMessage } from './format-message';\nimport ConfiguredI18NProvider from './configured-i18n-provider-component';\n\nconst FormattedMessage = translationKeyWrapper(IntlFormattedMessage);\nconst FormattedHTMLMessage = translationKeyWrapper(IntlFormattedHTMLMessage);\n\nFormattedMessage.displayName = 'FormattedMessage';\nFormattedHTMLMessage.displayName = 'FormattedHTMLMessage';\n\n// formatMessage is exposed to gecko-js\nexport {\n  FormattedMessage as default,\n  FormattedHTMLMessage,\n  formatMessage,\n  ConfiguredI18NProvider,\n};\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport layout from '../../hoc/layout';\n\nconst Base = props => {\n  const { tag: Tag, layoutClasses, className, children, ...rest } = props;\n  const classes = classNames(layoutClasses, className);\n\n  return (\n    <Tag {...rest} className={classes}>\n      {children}\n    </Tag>\n  );\n};\n\nBase.defaultProps = {\n  tag: 'div',\n};\nBase.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  layoutClasses: PropTypes.string,\n  tag: PropTypes.string,\n};\n\nconst Layout = layout(Base);\n\nconst Row = ({ children, ...rest }) => (\n  <Layout flex flexWrap {...rest}>\n    {children}\n  </Layout>\n);\nRow.propTypes = {\n  children: PropTypes.node,\n};\n\nconst Column = ({ children, ...rest }) => (\n  <Layout flex flexColumn {...rest}>\n    {children}\n  </Layout>\n);\nColumn.propTypes = {\n  children: PropTypes.node,\n};\n\nexport { Layout as default, Row, Column };\n","import Layout, { Row, Column } from './layout-component';\nexport { Layout as default, Row, Column };\n","module.exports = (__webpack_require__(28))(32);","/*\n * Projections\n */\nconst MERCATOR = 'mercator';\nconst MILLER = 'miller';\nconst ALBERS_USA = 'albersUsa';\n\nexport const PROJECTIONS = {\n  MERCATOR,\n  MILLER,\n  ALBERS_USA,\n};\n\n/*\n * Map Types\n */\nconst WORLD = 'world';\nconst CONTINENT = 'continent';\nconst COUNTRY = 'country';\nconst REGION = 'region';\n\nexport const MAP_TYPES = {\n  WORLD,\n  CONTINENT,\n  COUNTRY,\n  REGION,\n};\n\n/*\n * Continents\n */\nconst SOUTH_AMERICA = 'south_america';\nconst NORTH_AMERICA = 'north_america';\nconst OCEANIA = 'oceania';\nconst AFRICA = 'africa';\nconst EUROPE = 'europe';\nconst ASIA = 'asia';\n\nexport const CONTINENTS = {\n  SOUTH_AMERICA,\n  NORTH_AMERICA,\n  OCEANIA,\n  AFRICA,\n  EUROPE,\n  ASIA,\n};\n","import { forEach } from 'lodash';\nimport {\n  isAccountOwner,\n  isGroupAdmin,\n  isGroupViewer,\n  isDashboardViewOnly,\n} from './user-permissions';\n\nconst debugEvent = (name, payload) => {\n  /* eslint-disable no-console */\n  if (!console.log) {\n    return;\n  }\n\n  console.log(\n    `%c[Snowplow]%c - event: %c${name}%c (schema: ${payload.schema})`,\n    'background-color: #0FD354;',\n    '',\n    'font-weight: bold;',\n    '',\n  );\n  if (!payload.data) {\n    return;\n  }\n\n  if (console.groupCollapsed) {\n    console.groupCollapsed('Event payload');\n    forEach(payload.data, (value, key) => {\n      console.log(`${key}: `, value);\n    });\n    console.groupEnd();\n  } else {\n    console.log(JSON.stringify(payload.data));\n  }\n  /* eslint-enable no-console */\n};\n\n/* global, Tracker */\nconst track = (name, opts) => {\n  window.Tracker.track(name, opts);\n};\n\nconst hasBeenInit = () => {\n  return window.Tracker.hasBeenInit();\n};\n\nconst init = (user, identify, convertToBackboneModel) => {\n  window.Tracker.init(user, identify, undefined, convertToBackboneModel);\n};\n\nconst isTrackingEnabled = () => {\n  return window.Tracker.isTrackingEnabled();\n};\n\nconst trackSnowplow = (name, version, data, isDev = __DEV__) => {\n  const payload = {\n    schema: `iglu:com.geckoboard/${name}/jsonschema/${version}`,\n    data,\n  };\n\n  // Snowplow is disabled on dev. We'll use the console instead\n  if (isDev) {\n    debugEvent(name, payload);\n  } else if (window.snowplow) {\n    window.snowplow('trackSelfDescribingEvent', payload);\n  }\n};\n\nconst trackSwitchVisualisation = (serviceName, from, to, extra = {}) => {\n  track('Config - Switch visualisation', {\n    properties: {\n      from_viz: from,\n      to_viz: to,\n      service_name: serviceName,\n      ...extra,\n    },\n  });\n};\n\nconst userPermissionConstants = {\n  OWNER: 'owner',\n  GROUP_ADMIN: 'group_admin',\n  GROUP_VIEWER: 'group_read_only',\n  DASHBOARD_VIEWER: 'dashboard_view_only',\n};\n\nconst getUserPermissionString = user => {\n  if (isAccountOwner(user)) {\n    return userPermissionConstants.OWNER;\n  }\n\n  if (isGroupAdmin(user)) {\n    return userPermissionConstants.GROUP_ADMIN;\n  }\n\n  if (isGroupViewer(user)) {\n    return userPermissionConstants.GROUP_VIEWER;\n  }\n\n  if (isDashboardViewOnly(user)) {\n    return userPermissionConstants.DASHBOARD_VIEWER;\n  }\n\n  return undefined;\n};\n\n/*\n * Create a unique ID string\n * Found on: https://stackoverflow.com/a/44078785/2409858\n */\nconst generateUniqueId = () =>\n  Math.random()\n    .toString(36)\n    .substring(2) + new Date().getTime().toString(36);\n\nexport {\n  track,\n  trackSnowplow,\n  trackSwitchVisualisation,\n  hasBeenInit,\n  init,\n  isTrackingEnabled,\n  userPermissionConstants,\n  getUserPermissionString,\n  generateUniqueId,\n};\n","// delay is optional\nconst redirect = (target, delay) => {\n  if (delay) {\n    setTimeout(() => {\n      window.location.href = target;\n    }, delay);\n  } else {\n    window.location.href = target;\n  }\n};\n\nconst hash = () => {\n  return window.location.hash;\n};\n\nconst getWindow = () => window;\n\nconst getNavigator = () => navigator;\n\nconst getDocumentElement = () => window.document.documentElement;\n\nconst getViewportDimensions = () => ({\n  width: window.innerWidth || document.documentElement.clientWidth,\n  height: window.innerHeight || document.documentElement.clientHeight,\n});\n\nconst intercom = (...args) => {\n  try {\n    window.Intercom(...args); // eslint-disable-line new-cap\n  } catch (e) {\n    // swallow error here as Intercom can fail to load but should not block our\n    // application to load completely\n  }\n};\n\nconst globalClearTimeout = (...args) => {\n  return window.clearTimeout(...args);\n};\n\nconst getNodeEnv = () => process.env.NODE_ENV;\n\nexport {\n  getNodeEnv,\n  getWindow,\n  getNavigator,\n  getDocumentElement,\n  getViewportDimensions,\n  globalClearTimeout,\n  hash,\n  intercom,\n  redirect,\n};\n","import { memoize } from 'lodash';\n\nconst STATIC_ASSET_URL = '//d2s28ygc2k7998.cloudfront.net';\n\nconst getConfigFromMeta = memoize(() => {\n  if (!window.document || !window.document.getElementById('polecat_config')) {\n    return {};\n  }\n\n  const metaNode = window.document.getElementById('polecat_config');\n  return JSON.parse(metaNode.content);\n});\n\nlet config;\n\nfunction defaultConfig() {\n  return {\n    ...getConfigFromMeta(),\n    SpreadsheetsBaseURL: window.SPREADSHEETS_HOST,\n    PegasusBaseURL: window.PEGASUS_HOST,\n    InquisitorBaseURL: window.INQUISITOR_HOST,\n    AssetBaseURL: window.ASSET_HOST,\n    WidgetDataBaseURL: window.DATA_API_HOST,\n    ManagementBaseURL: window.API_HOST,\n    AuthBaseURL: window.AUTH_API_HOST,\n    RootURL: `${location.protocol}//${document.domain}/`,\n    StatsURL: window.STATS_HOST,\n    IrisBaseURL: window.IRIS_HOST,\n    CustomCSSURL: 'https://s3.amazonaws.com/gecko.css/',\n    CapterraBaseURL: '//ct.capterra.com',\n    StaticAssetBaseURL: STATIC_ASSET_URL,\n    ChannelAuthHost: window.CHANNEL_AUTH_HOST,\n    BulletinBaseURL: window.BULLETIN_HOST,\n  };\n}\n\nfunction get() {\n  return config || defaultConfig();\n}\n\nfunction set(newConfig) {\n  config = newConfig;\n}\n\nexport default { get, set, STATIC_ASSET_URL };\n","import 'isomorphic-fetch';\nimport { applyCSRF } from './lib/csrf';\n\n// Fallback default but each service should customise these parameter\nconst POLLING_OPTS = {\n  defaultPollInterval: 1000,\n  maxNumberOfPolls: 60,\n};\n\nfunction csrfFetch(url, opts, ...others) {\n  return fetch(url, applyCSRF(opts), ...others);\n}\n\nclass FetchError extends Error {\n  constructor(message, status, type, other) {\n    super(message);\n\n    Object.assign(this, other);\n    this.name = 'FetchError';\n    this.message = message;\n    this.type = type || 'uncategorized';\n    this.status = status;\n  }\n}\n\nclass MultipleFetchError extends FetchError {\n  constructor(errors, status, other) {\n    const fetchErrors = errors.map(({ message, type, ...rest }) => {\n      return new FetchError(message, status, type, rest);\n    });\n    const allMessages = fetchErrors.join(' ');\n\n    super(allMessages, status, 'multiple', other);\n    this.name = 'MultipleFetchError';\n\n    this.errors = fetchErrors;\n  }\n}\n\nfunction handleError(res) {\n  // Display the HTTP status error when we\n  // cant get a friendly error from the response\n  return res\n    .json()\n    .then(({ error, errors }) => {\n      if (error) {\n        const { message, type, ...other } = error;\n        return new FetchError(message, res.status, type, other);\n      }\n\n      if (errors) {\n        return new MultipleFetchError(errors, res.status);\n      }\n\n      throw new Error();\n    })\n    .catch(() => new FetchError(res.statusText, res.status))\n    .then(err => {\n      throw err;\n    });\n}\n\nfunction fetchAll(...args) {\n  return csrfFetch(...args).then(res => {\n    if (res.status >= 200 && res.status < 300) {\n      return res;\n    }\n    return handleError(res);\n  });\n}\n\nfunction fetchAllJSON(...args) {\n  return fetchAll(...args).then(res => res.json());\n}\n\nfunction fetchJSON(...args) {\n  return fetchAllJSON(...args).then(json => json.data || json);\n}\n\nfunction fetchJSONWithoutCSRF(url, options) {\n  return fetch(url, options)\n    .then(res => {\n      if (res.status >= 200 && res.status < 300) {\n        return res;\n      }\n      return handleError(res);\n    })\n    .then(res => res.json());\n}\n\n// We made the assumption in `fetchJSON` that the presense of `data` in the response\n// meant that we could discard everything else. This was wrong.\nfunction fetchAllJSONWithCredentials(url, opts) {\n  const finalOpts = {\n    method: 'GET',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n    },\n    ...opts,\n  };\n\n  return fetchAllJSON(url, finalOpts);\n}\n\nfunction fetchAllWithCredentials(url, opts) {\n  const finalOpts = {\n    method: 'GET',\n    credentials: 'include',\n    ...opts,\n  };\n\n  return fetchAll(url, finalOpts);\n}\n\nfunction fetchJSONWithCredentials(...args) {\n  return fetchAllJSONWithCredentials(...args).then(json => json.data || json);\n}\n\nfunction pollJSON(url, opts = {}, pollingOpts = POLLING_OPTS, counter = 0) {\n  // default to 0 that will be overidden to default or X-Retry-After-Ms header\n  let { pollInterval = 0 } = pollingOpts;\n  const { defaultPollInterval, maxNumberOfPolls } = pollingOpts;\n  const headers = { ...opts.headers, Accept: 'application/json' };\n\n  return csrfFetch(url, {\n    method: 'GET',\n    credentials: 'include',\n    ...opts,\n    headers,\n  }).then(res => {\n    if (res.status === 204) {\n      if (counter >= maxNumberOfPolls) {\n        throw new FetchError('Fetch limit exceeded.', res.status);\n      }\n\n      // Get next poll interval hint from the response header\n      pollInterval = parseInt(\n        res.headers.get('X-Retry-After-Ms') || pollInterval,\n        10,\n      );\n      pollInterval = pollInterval === 0 ? defaultPollInterval : pollInterval;\n\n      const newCounter = counter + 1;\n      const newPollingOpts = { ...pollingOpts, pollInterval };\n\n      return new Promise(resolve => {\n        setTimeout(() => {\n          resolve(pollJSON(url, opts, newPollingOpts, newCounter));\n        }, pollInterval);\n      });\n    }\n\n    if (res.status >= 200 && res.status < 300) {\n      return res.json();\n    }\n    return handleError(res);\n  });\n}\n\nexport {\n  fetchJSON as default,\n  csrfFetch,\n  fetchJSONWithCredentials,\n  pollJSON,\n  fetchAll,\n  fetchAllWithCredentials,\n  fetchJSONWithoutCSRF,\n  handleError,\n  FetchError,\n  MultipleFetchError,\n  POLLING_OPTS,\n  fetchAllJSONWithCredentials,\n  fetchAllJSON,\n};\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport Icon from '../icon';\nimport LoadingSpinner from '../loading-spinner';\n\nimport style from './button.scss';\n\nconst SIZES = {\n  EXTRA_SMALL: 'extra-small',\n  SMALL: 'small',\n  MEDIUM: 'medium',\n  LARGE: 'large',\n};\n\nconst INTENT = {\n  PRIMARY: 'primary',\n  SECONDARY: 'secondary',\n  NEGATIVE: 'negative',\n  LINK: 'link',\n};\n\nconst TYPES = {\n  BUTTON: 'button',\n  SUBMIT: 'submit',\n  RESET: 'reset',\n};\n\nconst mapSizeToLoadingSpinnerSizes = {\n  [SIZES.EXTRA_SMALL]: 12,\n  [SIZES.SMALL]: 14,\n  [SIZES.MEDIUM]: 16,\n  [SIZES.LARGE]: 20,\n};\n\nconst mapIntentToLoadingSpinnerTheme = {\n  [INTENT.PRIMARY]: LoadingSpinner.THEMES.DARK,\n  [INTENT.SECONDARY]: LoadingSpinner.THEMES.DARK,\n  [INTENT.NEGATIVE]: LoadingSpinner.THEMES.LIGHT,\n  [INTENT.LINK]: LoadingSpinner.THEMES.DARK,\n};\n\nconst getDataAttributes = props =>\n  Object.keys(props)\n    .filter(key => key.startsWith('data-'))\n    .reduce((obj, key) => ({ ...obj, [key]: props[key] }), {});\n\nconst Button = props => {\n  const {\n    href,\n    icon,\n    intent,\n    disabled,\n    loading,\n    children,\n    onClick,\n    onFocus,\n    onBlur,\n    size,\n    stretched,\n    target,\n    title,\n    type,\n  } = props;\n\n  const Tag = href ? 'a' : 'button';\n  const hasIcon = !!icon && !loading;\n\n  const classes = classNames(\n    style.Button,\n    style[`size-${size}`],\n    style[`intent-${intent}`],\n    {\n      [style.stretched]: stretched,\n      [style.loading]: loading,\n      [style.hasIcon]: hasIcon,\n    },\n  );\n\n  return (\n    <Tag\n      className={classes}\n      disabled={disabled || loading}\n      href={href}\n      onClick={onClick}\n      onFocus={onFocus}\n      onBlur={onBlur}\n      target={target}\n      title={title}\n      type={type}\n      {...getDataAttributes(props)}\n    >\n      <TransitionGroup className={style.spinnerContainer}>\n        {loading && (\n          <CSSTransition classNames={style.spinnerTransition} timeout={200}>\n            <div className={style.spinner}>\n              <LoadingSpinner\n                size={mapSizeToLoadingSpinnerSizes[size]}\n                theme={mapIntentToLoadingSpinnerTheme[intent]}\n              />\n            </div>\n          </CSSTransition>\n        )}\n      </TransitionGroup>\n      {hasIcon && (\n        <span\n          className={classNames(style.icon, {\n            [style.iconNoChildren]: !children,\n          })}\n        >\n          <Icon name={icon} />\n        </span>\n      )}\n      {children}\n    </Tag>\n  );\n};\n\nButton.SIZES = SIZES;\nButton.INTENT = INTENT;\nButton.TYPES = TYPES;\n\nButton.defaultProps = {\n  intent: INTENT.PRIMARY,\n  size: SIZES.MEDIUM,\n  type: TYPES.BUTTON,\n};\n\nButton.propTypes = {\n  children: PropTypes.node,\n  disabled: PropTypes.bool,\n  href: PropTypes.string,\n  icon: PropTypes.string,\n  intent: PropTypes.oneOf([\n    INTENT.PRIMARY,\n    INTENT.SECONDARY,\n    INTENT.NEGATIVE,\n    INTENT.LINK,\n  ]),\n  loading: PropTypes.bool,\n  size: PropTypes.oneOf([\n    SIZES.EXTRA_SMALL,\n    SIZES.SMALL,\n    SIZES.MEDIUM,\n    SIZES.LARGE,\n  ]),\n  stretched: PropTypes.bool,\n  target: PropTypes.string,\n  title: PropTypes.string,\n  type: PropTypes.oneOf([TYPES.BUTTON, TYPES.SUBMIT, TYPES.RESET]),\n  onBlur: PropTypes.func,\n  onClick: PropTypes.func,\n  onFocus: PropTypes.func,\n};\n\nexport default Button;\n","import Button from './button';\nexport default Button;\n","const __defineType = definition => {\n  const type = () => ({ definition, required: false });\n  type.isRequired = () => ({ definition, required: true });\n\n  return type;\n};\n\nconst number = __defineType({ type: 'number' });\n\nconst bool = __defineType({ type: 'boolean' });\n\nconst string = __defineType({ type: 'string' });\n\nfunction oneOf(values = []) {\n  return __defineType({ enum: values });\n}\n\nfunction oneOfType(types = []) {\n  const allTypes = types.map(type => type().definition.type);\n\n  return __defineType({\n    type: allTypes,\n  });\n}\n\nconst SchemaTypes = {\n  bool,\n  number,\n  oneOf,\n  oneOfType,\n  string,\n};\n\nexport default SchemaTypes;\n","import SchemaTypes from './schema-types';\n\nexport default SchemaTypes;\n","import { csrfFetch } from '../universal/fetch';\nimport bugsnag from '../lib/bugsnag';\n\nconst printEvent = event => {\n  /* eslint-disable no-console */\n  console.groupCollapsed(`Event: ${event.schema.title}`);\n  console.log('event: ', event.event);\n  console.log('schema: ', event.schema);\n  console.groupEnd();\n  /* eslint-enable no-console */\n};\n\n// This is where we'll save the redux store and\n// apollo client once `Tracking.setReduxStore`\n// and `Tracking.setApolloClient` have been called.\nlet store;\nlet apolloClient;\n\nconst resolveContext = (resolvers = []) =>\n  resolvers.reduce(\n    (properties, resolver) => ({\n      ...properties,\n      ...resolver({\n        reduxState: store.getState(),\n        apolloClient,\n      }),\n    }),\n    {},\n  );\n\nexport default async function trackEvent(event, isDev = __DEV__) {\n  // If we don't yet have a Redux store we won't dispatch the event\n  if (!store) {\n    const errorMessage = `Tracking event: \"${event.schema.title}\" was dispatched before the Redux store was initialised`;\n    bugsnag.send(errorMessage);\n    return;\n  }\n\n  // If we don't yet have the Apollo client we won't dispatch the event\n  if (!apolloClient) {\n    const errorMessage = `Tracking event: \"${event.schema.title}\" was dispatched before the Apollo client was initialised`;\n    bugsnag.send(errorMessage);\n    return;\n  }\n\n  const eventWithContext = {\n    event: {\n      ...resolveContext(event.contextResolvers),\n      ...event.event,\n    },\n    schema: event.schema,\n  };\n\n  if (isDev) {\n    printEvent(eventWithContext);\n  }\n\n  // We never want to throw an error from trackEvent()\n  // because tracking should never stop the user from\n  // doing what they are trying to do. If tracking fails\n  // we will notify Bugsnag but still return a resolved\n  // Promise.\n  try {\n    await csrfFetch(`${window.BACKTRACK_HOST}/event`, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      credentials: 'include',\n      body: JSON.stringify(eventWithContext),\n    });\n  } catch (e) {\n    bugsnag.send(e, {\n      metaData: {\n        trackEvent: {\n          title: event.schema.title,\n          properties: eventWithContext.event,\n        },\n      },\n    });\n  }\n}\n\nexport function setReduxStore(reduxStore) {\n  store = reduxStore;\n}\n\nexport function setApolloClient(client) {\n  apolloClient = client;\n}\n\n// Useful for testing to reset the redux store and apollo client\nexport function reset() {\n  store = undefined;\n  apolloClient = undefined;\n}\n","import trackEvent, { setApolloClient, setReduxStore } from './track-event';\nexport { trackEvent, setApolloClient, setReduxStore };\n","import { isEmpty, negate, once } from 'lodash';\nimport uaParser from 'ua-parser-js';\nimport SchemaTypes from '../../schema-types';\nimport { getWindow } from '../../../lib/global';\n\nconst deviceString = ({ type, vendor, model }) =>\n  [type, vendor, model].filter(negate(isEmpty)).join(', ');\n\nconst platformInfo = once(() => {\n  const { browser, device, os } = uaParser(getWindow().navigator.userAgent);\n\n  return {\n    $browser: browser.name,\n    $browser_version: browser.version,\n    $device: deviceString(device),\n    $os: os.name,\n    $os_version: os.version,\n  };\n});\n\nconst resolve = () => ({\n  $current_url: getWindow().location.href,\n  $screen_height: getWindow().screen.height,\n  $screen_width: getWindow().screen.width,\n  ...platformInfo(),\n});\n\nconst schema = {\n  $browser: SchemaTypes.string.isRequired,\n  $browser_version: SchemaTypes.string.isRequired,\n  $current_url: SchemaTypes.string.isRequired,\n  $device: SchemaTypes.string.isRequired,\n  $os: SchemaTypes.string.isRequired,\n  $os_version: SchemaTypes.string,\n  $screen_height: SchemaTypes.number.isRequired,\n  $screen_width: SchemaTypes.number.isRequired,\n};\n\nexport default {\n  resolve,\n  schema,\n};\n","import clientPlatformContext from './client-platform-context';\n\nexport default clientPlatformContext;\n","import { isNil, omitBy } from 'lodash';\nimport SchemaTypes from '../../schema-types';\n\nconst timestampToISO = timestamp => {\n  return new Date(timestamp * 1000).toISOString();\n};\n\nconst filterNilValues = ({\n  subscription_date: subscriptionDate,\n  initial_referrer: initalReferrer,\n  utm_campaign: utmCampaign,\n  utm_content: utmContent,\n  utm_medium: utmMedium,\n  utm_name: utmName,\n  utm_term: utmTerm,\n}) => {\n  return omitBy(\n    {\n      'First subscription date': subscriptionDate,\n      'Initial referrer': initalReferrer,\n      'UTM campaign': utmCampaign,\n      'UTM content': utmContent,\n      'UTM medium': utmMedium,\n      'UTM name': utmName,\n      'UTM term': utmTerm,\n    },\n    isNil,\n  );\n};\n\nconst organizationContext = {\n  schema: {\n    'Account name': SchemaTypes.string.isRequired,\n    Billing: SchemaTypes.bool.isRequired,\n    'Dashboard count': SchemaTypes.number.isRequired,\n    'Day in lifetime': SchemaTypes.number.isRequired,\n    'Organization ID': SchemaTypes.string.isRequired,\n    Plan: SchemaTypes.string.isRequired,\n    'Signup form': SchemaTypes.string.isRequired,\n    'Trial days remaining': SchemaTypes.number.isRequired,\n    'Billing frequency': SchemaTypes.oneOf(['Monthly', 'Annual']).isRequired,\n    'Billing type': SchemaTypes.oneOf(['Manual', 'Automatic']),\n    'Organization created date': SchemaTypes.string.isRequired,\n    'Trial end date': SchemaTypes.string.isRequired,\n    'First subscription date': SchemaTypes.string,\n    'Initial referrer': SchemaTypes.string,\n    'UTM campaign': SchemaTypes.string,\n    'UTM content': SchemaTypes.string,\n    'UTM medium': SchemaTypes.string,\n    'UTM name': SchemaTypes.string,\n    'UTM term': SchemaTypes.string,\n  },\n  resolve: ({ reduxState }) => {\n    const {\n      user: { user },\n      user: { organization },\n    } = reduxState;\n    return {\n      'Account name': organization.account,\n      Billing: organization.billing === 'y',\n      'Dashboard count': organization.usages.dashboards,\n      'Day in lifetime': organization.day_in_lifetime,\n      'Organization ID': `${organization.id}`,\n      Plan: organization.plan,\n      'Signup form': !!user.signup_form ? user.signup_form : '',\n      'Trial days remaining': organization.trial_days_remaining,\n      'Billing frequency': organization.annual_subscription\n        ? 'Annual'\n        : 'Monthly',\n      'Billing type': organization.is_subscription_manual\n        ? 'Manual'\n        : 'Automatic',\n      'Organization created date': timestampToISO(organization.date),\n      'Trial end date': timestampToISO(organization.trial),\n      ...filterNilValues(user),\n    };\n  },\n};\n\nexport default organizationContext;\n","import { isNil, omitBy, last } from 'lodash';\nimport SchemaTypes from '../../schema-types';\n\nconst permissionMap = {\n  power_user: 'admin',\n};\n\nconst getEmailDomain = email => last(email.split('@'));\n\nexport const formatUserPayload = ({\n  job_role: jobRole,\n  newsletter,\n  permission,\n  tracking_id: trackingId,\n  id,\n  email,\n  signup_date: signupDate,\n}) => {\n  return {\n    distinct_id: trackingId,\n    'Newsletter subscriber': newsletter,\n    Permission: permissionMap[permission] || permission,\n    'User ID': `${id}`,\n    'User signup date': signupDate,\n    'User email domain': getEmailDomain(email),\n    ...omitBy(\n      {\n        'Job role': jobRole,\n      },\n      isNil,\n    ),\n  };\n};\n\nconst schema = {\n  distinct_id: SchemaTypes.string.isRequired,\n  'Job role': SchemaTypes.string,\n  'Newsletter subscriber': SchemaTypes.bool.isRequired,\n  Permission: SchemaTypes.oneOf(['read', 'admin', 'none']).isRequired,\n  'User ID': SchemaTypes.string.isRequired,\n  'User signup date': SchemaTypes.string.isRequired,\n  'User email domain': SchemaTypes.string.isRequired,\n};\n\nconst resolve = ({ reduxState = {} } = {}) => {\n  const { user: { user = {} } = {} } = reduxState;\n  return formatUserPayload(user);\n};\n\nexport default {\n  schema,\n  resolve,\n};\n","import clientPlatformContext from '@Tracking/contexts/client-platform';\nimport organizationContext from '@Tracking/contexts/organization';\nimport userContext from '@Tracking/contexts/user';\n\n/**\n * Shared contexts will be used for every event\n */\nconst SHARED_CONTEXTS = [\n  clientPlatformContext,\n  organizationContext,\n  userContext,\n];\n\nconst __getSchemaRequiredFields = schemaTypes =>\n  Object.keys(schemaTypes).reduce(\n    (acc, property) =>\n      schemaTypes[property]().required ? [...acc, property] : acc,\n    [],\n  );\n\nconst __getSchemaProperties = schemaTypes =>\n  Object.keys(schemaTypes).reduce(\n    (acc, property) => ({\n      ...acc,\n      [property]: schemaTypes[property]().definition,\n    }),\n    {},\n  );\n\nconst __combineContextSchemas = contexts =>\n  contexts.reduce((schema, context) => ({ ...schema, ...context.schema }), {});\n\nexport function createJSONSchema(name, schemaTypes) {\n  const required = __getSchemaRequiredFields(schemaTypes);\n  const properties = __getSchemaProperties(schemaTypes);\n\n  return {\n    title: name,\n    type: 'object',\n    properties,\n    required,\n  };\n}\n\nfunction defineEvent(name, schemaTypes = {}, ...contexts) {\n  if (!name) {\n    throw new Error('ERROR: No event name.');\n  }\n\n  const allContexts = [...SHARED_CONTEXTS, ...contexts];\n\n  const allSchemaTypes = {\n    ...__combineContextSchemas(allContexts),\n    ...schemaTypes,\n  };\n\n  return event => ({\n    event,\n    schema: createJSONSchema(name, allSchemaTypes),\n    contextResolvers: allContexts.map(c => c.resolve),\n  });\n}\n\nexport default defineEvent;\n","import defineEvent from './define-event';\n\nexport default defineEvent;\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\nimport { LOCATIONS } from '@Tracking/constants';\n\nconst sharedIntegrationSchemaProperties = {\n  'Auth type': SchemaTypes.oneOf(['oauth', 'oauth2', 'basic', 'null'])\n    .isRequired,\n  'Integration name': SchemaTypes.string.isRequired,\n  'Integration slug': SchemaTypes.string.isRequired,\n  'Data source': SchemaTypes.string,\n};\n\nexport const integrationSelected = defineEvent('Integration - Selected', {\n  ...sharedIntegrationSchemaProperties,\n  Location: SchemaTypes.oneOf([\n    LOCATIONS.DashboardAddWidgetDropdown,\n    LOCATIONS.IntegrationsMainList,\n    LOCATIONS.IntegrationsRecentList,\n  ]).isRequired,\n});\n\nexport const integrationClickedConnect = defineEvent(\n  'Integration - Clicked connect',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const integrationSelectedDataSource = defineEvent(\n  'Integration - Selected data source',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const integrationSelectedWidget = defineEvent(\n  'Integration - Selected widget',\n  {\n    ...sharedIntegrationSchemaProperties,\n    'Widget name': SchemaTypes.string.isRequired,\n  },\n);\n\nexport const integrationSelectedFile = defineEvent(\n  'Integration - Selected file',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const spreadsheetsSubmittedUrl = defineEvent(\n  'Spreadsheets - Submitted URL',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const integrationQueryStarted = defineEvent(\n  'Integration - Query started',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const integrationQueryFinished = defineEvent(\n  'Integration - Query finished',\n  {\n    ...sharedIntegrationSchemaProperties,\n    'Query success': SchemaTypes.bool,\n  },\n);\nexport const spreadsheetsUrlSucceeded = defineEvent(\n  'Spreadsheets - URL succeeded',\n  sharedIntegrationSchemaProperties,\n);\n\nexport const spreadsheetsUrlFailed = defineEvent('Spreadsheets - URL failed', {\n  ...sharedIntegrationSchemaProperties,\n  'URL failure reason': SchemaTypes.string.isRequired,\n});\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\n\nconst sharedConnectionSchemaProperties = {\n  'Auth type': SchemaTypes.oneOf(['oauth', 'oauth2', 'basic', 'null'])\n    .isRequired,\n  'Integration name': SchemaTypes.string.isRequired,\n  'Integration slug': SchemaTypes.string.isRequired,\n  'Data source': SchemaTypes.string,\n};\n\nexport const connectionCreated = defineEvent(\n  'Connection - Created',\n  sharedConnectionSchemaProperties,\n);\n\nexport const connectionDeleted = defineEvent(\n  'Connection - Deleted',\n  sharedConnectionSchemaProperties,\n);\n\nexport const connectionFailed = defineEvent('Connection - Failed', {\n  ...sharedConnectionSchemaProperties,\n  'Connection failure reason': SchemaTypes.string,\n});\n\nexport const connectionSelected = defineEvent(\n  'Connection - Selected',\n  sharedConnectionSchemaProperties,\n);\n\nexport const externalConnectionCreated = defineEvent(\n  'External connection - Created',\n);\n\nexport const externalConnectionFailed = defineEvent(\n  'External connection - Failed',\n);\n","import { values } from 'lodash';\nimport defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\nimport { DashboardContext } from '@Tracking/contexts';\nimport { TRACKING_LAYOUT_TYPES } from '@Tracking/contexts/dashboard';\nimport { LOCATIONS } from '@Tracking/constants';\nimport {\n  VALID_THEMES,\n  VALID_WIDGET_STYLES,\n} from '../../dashboard/themes/theme-constants';\n\nexport const dashboardCreated = defineEvent(\n  'Dashboard - Created',\n  {\n    'Created dashboard type': SchemaTypes.oneOf(values(TRACKING_LAYOUT_TYPES))\n      .isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardChangedLayout = defineEvent(\n  'Dashboard - Changed layout type',\n  {\n    'From layout': SchemaTypes.oneOf(values(TRACKING_LAYOUT_TYPES)).isRequired,\n    'To layout': SchemaTypes.oneOf(values(TRACKING_LAYOUT_TYPES)).isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardCopied = defineEvent(\n  'Dashboard - Copied',\n  {},\n  DashboardContext,\n);\n\nexport const dashboardCopiedSharingLink = defineEvent(\n  'Dashboard - Copied sharing link',\n  {\n    Location: SchemaTypes.oneOf([\n      LOCATIONS.DashboardShareMenu,\n      LOCATIONS.AdminDashboards,\n    ]).isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardCreatedSharingLink = defineEvent(\n  'Dashboard - Created sharing link',\n  {},\n  DashboardContext,\n);\n\nexport const dashboardDeleted = defineEvent(\n  'Dashboard - Deleted',\n  {\n    Location: SchemaTypes.oneOf([\n      LOCATIONS.DashboardDeleteModal,\n      LOCATIONS.AdminDashboards,\n    ]).isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardDeletedSharingLink = defineEvent(\n  'Dashboard - Deleted sharing link',\n  {},\n  DashboardContext,\n);\n\nexport const dashboardRegeneratedSharingLink = defineEvent(\n  'Dashboard - Regenerated sharing link',\n  {\n    Location: SchemaTypes.oneOf([\n      LOCATIONS.DashboardShareMenu,\n      LOCATIONS.AdminDashboards,\n    ]).isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardSavedCustomization = defineEvent(\n  'Dashboard - Saved customization',\n  {\n    Theme: SchemaTypes.oneOf(VALID_THEMES).isRequired,\n    'Custom Theme Background Color': SchemaTypes.string,\n    'Custom Theme Widget Style': SchemaTypes.oneOf(VALID_WIDGET_STYLES),\n    'Scale to fit': SchemaTypes.bool.isRequired,\n    'TV font': SchemaTypes.bool.isRequired,\n    'Show footer': SchemaTypes.bool.isRequired,\n    'Show clock': SchemaTypes.bool.isRequired,\n    'Show logo': SchemaTypes.bool.isRequired,\n    'Number of columns': SchemaTypes.number.isRequired,\n  },\n  DashboardContext,\n);\n\nexport const dashboardTriggeredRemoteRefresh = defineEvent(\n  'Dashboard - Triggered remote refresh',\n  {},\n  DashboardContext,\n);\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\n\nconst sharedScreenSchemaProperties = {\n  'Screen ID': SchemaTypes.string.isRequired,\n  'Screen content type': SchemaTypes.oneOf(['dashboard', 'sharing_loop']),\n};\n\nexport const screenChangedContent = defineEvent(\n  'Screen - Changed content',\n  sharedScreenSchemaProperties,\n);\n\nexport const screenConnected = defineEvent(\n  'Screen - Connected',\n  sharedScreenSchemaProperties,\n);\n\nexport const screenDeleted = defineEvent(\n  'Screen - Deleted',\n  sharedScreenSchemaProperties,\n);\n\nexport const screenRefreshed = defineEvent(\n  'Screen - Refreshed',\n  sharedScreenSchemaProperties,\n);\n\nexport const screenRenamed = defineEvent(\n  'Screen - Renamed',\n  sharedScreenSchemaProperties,\n);\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\n\nexport const integrationListSearched = defineEvent(\n  'Integration list - Searched',\n  {\n    'Search term': SchemaTypes.string,\n    'Search results count': SchemaTypes.number,\n  },\n);\n\nexport const buttonClicked = defineEvent('Button - Clicked', {\n  'Button identifier': SchemaTypes.string,\n});\n\nexport const externalLinkClicked = defineEvent('External link - Clicked', {\n  'Link identifier': SchemaTypes.string,\n});\n\nexport const welcomeSurveyDismissed = defineEvent('Welcome survey - Dismissed');\n\nexport const welcomeSurveySubmitted = defineEvent('Welcome survey - Submitted');\n","import defineEvent from '@Tracking/define-event';\nimport { DashboardContext } from '@Tracking/contexts';\n\nexport const groupCreated = defineEvent(\n  'Group - Created',\n  {},\n  DashboardContext,\n);\n\nexport const groupDeleted = defineEvent(\n  'Group - Deleted',\n  {},\n  DashboardContext,\n);\n\nexport const groupWidgetsReordered = defineEvent(\n  'Group - Widgets re-ordered',\n  {},\n  DashboardContext,\n);\n\nexport const groupWidgetsResized = defineEvent(\n  'Group - Widgets re-sized',\n  {},\n  DashboardContext,\n);\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\nimport { LOCATIONS, PERMISSIONS } from '@Tracking/constants';\n\nexport const PERMISSION_SCHEMA = SchemaTypes.oneOf(Object.values(PERMISSIONS))\n  .isRequired;\n\nexport const invitationResent = defineEvent('User - Invitation resent');\n\nexport const invitationSent = defineEvent('User - Invitation sent', {\n  Location: SchemaTypes.oneOf([\n    LOCATIONS.AdminInviteModal,\n    LOCATIONS.DashboardShareMenu,\n    LOCATIONS.HeaderPeopleModal,\n  ]).isRequired,\n});\n\nexport const userDeleted = defineEvent('User - Deleted');\n\nexport const permissionsChanged = defineEvent('User - Permission changed', {\n  'From permission': PERMISSION_SCHEMA,\n  'To permission': PERMISSION_SCHEMA,\n});\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\nimport { DashboardContext } from '@Tracking/contexts';\n\nconst VISUALISATION_TYPES = [\n  'bar',\n  'bullet',\n  'clock',\n  'column',\n  'funnel',\n  'geckometer',\n  'highcharts',\n  'image',\n  'leaderboard',\n  'line',\n  'list',\n  'map',\n  'monitoring',\n  'number',\n  'pie',\n  'rag',\n  'ragcolumn',\n  'table',\n  'text',\n];\n\nconst sharedWidgetSchemaProperties = {\n  'Instrument ID': SchemaTypes.string,\n  'Legacy widget ID': SchemaTypes.string.isRequired,\n  Visualisation: SchemaTypes.oneOf(VISUALISATION_TYPES).isRequired,\n  'Widget type ID': SchemaTypes.string,\n  'Widget type name': SchemaTypes.string,\n  'Integration name': SchemaTypes.string.isRequired,\n  'Integration slug': SchemaTypes.string.isRequired,\n};\n\nexport const widgetMovedOffCanvas = defineEvent(\n  'Widget - Moved off canvas',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetMovedToCanvas = defineEvent(\n  'Widget - Moved to canvas',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetCreated = defineEvent(\n  'Widget - Created',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetCopied = defineEvent(\n  'Widget - Copied',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetDeleted = defineEvent(\n  'Widget - Deleted',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetConfigEdited = defineEvent(\n  'Widget - Config edited',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetIndicatorsAdded = defineEvent(\n  'Widget - Indicators added',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetIndicatorsEdited = defineEvent(\n  'Widget - Indicators edited',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetIndicatorsDeleted = defineEvent(\n  'Widget - Indicators deleted',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetNumberFormattingEdited = defineEvent(\n  'Widget - Number formatting edited',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetGoalAdded = defineEvent(\n  'Widget - Goal added',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetGoalEdited = defineEvent(\n  'Widget - Goal edited',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n\nexport const widgetGoalRemoved = defineEvent(\n  'Widget - Goal removed',\n  sharedWidgetSchemaProperties,\n  DashboardContext,\n);\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\nimport { LOCATIONS } from '@Tracking/constants';\n\nconst sharedDashboardLoopSchemaProperties = {\n  'Dashboard loop ID': SchemaTypes.string.isRequired,\n};\n\nexport const dashboardLoopCreated = defineEvent(\n  'Dashboard loop - Created',\n  sharedDashboardLoopSchemaProperties,\n);\n\nexport const dashboardLoopDeleted = defineEvent(\n  'Dashboard loop - Deleted',\n  sharedDashboardLoopSchemaProperties,\n);\n\nexport const dashboardLoopRegeneratedSharingLink = defineEvent(\n  'Dashboard loop - Regenerated sharing link',\n  sharedDashboardLoopSchemaProperties,\n);\n\nexport const dashboardLoopCopiedSharingLink = defineEvent(\n  'Dashboard loop - Copied sharing link',\n  {\n    ...sharedDashboardLoopSchemaProperties,\n    Location: SchemaTypes.oneOf([LOCATIONS.AdminLoops, LOCATIONS.Toast])\n      .isRequired,\n  },\n);\n","import defineEvent from '@Tracking/define-event';\nimport SchemaTypes from '@Tracking/schema-types';\n\nconst scheduledPostSchemaProperties = {\n  'Scheduled post ID': SchemaTypes.string.isRequired,\n  'Scheduled post destination': SchemaTypes.string.isRequired,\n};\n\nexport const scheduledPostCreated = defineEvent(\n  'Scheduled Post - Created',\n  scheduledPostSchemaProperties,\n);\n\nexport const scheduledPostUpdated = defineEvent(\n  'Scheduled Post - Updated',\n  scheduledPostSchemaProperties,\n);\n\nexport const scheduledPostDeleted = defineEvent(\n  'Scheduled Post - Deleted',\n  scheduledPostSchemaProperties,\n);\n","export * from './integration-events';\nexport * from './connection-events';\nexport * from './dashboard-events';\nexport * from './screen-events';\nexport * from './generic-events';\nexport * from './group-events';\nexport * from './user-events';\nexport * from './widget-events';\nexport * from './loop-events';\nexport * from './scheduled-post-events';\n","module.exports = (__webpack_require__(28))(1351);","const createErrorAction = type => {\n  const action = (error, payload) => ({ type, error, payload });\n  action.type = type;\n\n  return action;\n};\n\nexport default createErrorAction;\n","import _, {\n  partial,\n  add,\n  chain,\n  head,\n  mapValues,\n  every,\n  isUndefined,\n} from 'lodash';\n\nconst INDEX_BASED = 1;\nconst toBackendIndex = partial(add, INDEX_BASED);\nconst toFrontendIndex = partial(add, -INDEX_BASED);\n\n// Return 0 based index of the excel column string\n// From http://stackoverflow.com/a/1237333/2259520\n\nfunction getSelectedCells(cells, selection) {\n  return selection.map((indices = [[], []]) => {\n    let [\n      [startCol = 0, startRow = 0],\n      [endCol = Infinity, endRow = Infinity],\n    ] = indices;\n\n    // Ignore selections if they're for the entire sheet\n    if (!isValidSelection(indices)) { // eslint-disable-line\n      return [];\n    }\n\n    if (startCol === -1) {\n      startCol = 0;\n    }\n    if (startRow === -1) {\n      startRow = 0;\n    }\n    if (endCol === -1) {\n      endCol = Infinity;\n    }\n    if (endRow === -1) {\n      endRow = Infinity;\n    }\n\n    // Normalize for backend match\n    [startCol, endCol, startRow, endRow] = [\n      startCol,\n      endCol,\n      startRow,\n      endRow,\n    ].map(toBackendIndex);\n    return cells.filter(cell => {\n      const { column, row } = cell;\n      return (\n        column >= startCol &&\n        column <= endCol &&\n        row >= startRow &&\n        row <= endRow\n      );\n    });\n  });\n}\n\n// Validate that a single selection has been set by the user\n// e.g. selection is not [[-1, -1], [-1, -1]]\nfunction isValidSelection(selection) {\n  return !_(selection)\n    .flatten()\n    .every(i => i === -1);\n}\n\n// This is necessary as Google Sheets exports computed currency values\n// as strings. For example, suppose A1:A10 are values formatted as currency\n// and A11 is SUM(A1:A10) formatted as a currency. Google sheets will export\n// it as a TEXT value \"$1,234.00\"\n//\n// See this thread for some back story: https://geckoboard.slack.com/archives/devs/p1445966225002683\nfunction greedilyParseFloat(value) {\n  return parseFloat(value.replace(/[^0-9-.E]/gi, ''));\n}\n\nfunction swapSelection(selection) {\n  if (!selection) return null;\n  const [[startCol, startRow], [endCol, endRow]] = selection;\n  return [\n    [startRow, startCol],\n    [endRow, endCol],\n  ];\n}\n\nfunction isEntireColumnSelection(selection) {\n  const [[, startRow], [endCol]] = selection;\n  // Full column and valid selection\n  return startRow === -1 && endCol !== -1;\n}\n\nfunction isEntireRowSelection(selection) {\n  return isEntireColumnSelection(swapSelection(selection));\n}\n\nfunction getFullRowOrColumnHeaderIndex(selections, allSelectedCells) {\n  const filteredSelections = selections.filter(isValidSelection);\n\n  if (!filteredSelections.length) {\n    return null;\n  }\n  if (filteredSelections.every(isEntireColumnSelection)) {\n    let row = chain(allSelectedCells)\n      .flatten()\n      .map('row')\n      .min()\n      .value();\n    row = toFrontendIndex(row);\n    return { row };\n  }\n  if (filteredSelections.every(isEntireRowSelection)) {\n    let column = chain(allSelectedCells)\n      .flatten()\n      .map('column')\n      .min()\n      .value();\n    column = toFrontendIndex(column);\n    return { column };\n  }\n  return null;\n}\n\nfunction getSelectionHeaderIndices(selections, allSelectedCells) {\n  const headerDirection = getFullRowOrColumnHeaderIndex(\n    selections,\n    allSelectedCells,\n  );\n\n  return selections.map(selection => {\n    if (!selection) {\n      return null;\n    }\n\n    if (!isValidSelection(selection)) {\n      return null;\n    }\n\n    let [column, row] = head(selection);\n\n    if (headerDirection) {\n      const { column: headerCol, row: headerRow } = headerDirection;\n      // Default to indice from selection for the missing index\n      // e.g headerDirection = { row: 1 } then we'll return { row:1, column: X }\n      // X coming from the selection itself\n      [column = column, row = row] = [headerCol, headerRow];\n    } else {\n      // Return first cell's coordinates for each selection\n      if (column === -1) column++; // whole row selection pick first cell\n      if (row === -1) row++; // whole column selection pick first cell\n    }\n\n    return mapValues({ row, column }, toBackendIndex);\n  });\n}\n\nfunction stableItemSort(items, reverse) {\n  if (every(items, item => isUndefined(item.value))) {\n    return items;\n  }\n\n  const sortedItems = items\n    .concat()\n    .sort(({ value: a }, { value: b }) => (b || 0) - (a || 0));\n\n  if (reverse) {\n    return sortedItems.reverse();\n  }\n\n  return sortedItems;\n}\n\nexport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n  greedilyParseFloat,\n  toBackendIndex,\n  toFrontendIndex,\n  INDEX_BASED,\n  isValidSelection,\n  stableItemSort,\n};\n","import {\n  fetchJSONWithCredentials,\n  fetchAllJSON,\n  fetchAll,\n  fetchAllWithCredentials,\n} from '../universal/fetch';\nimport config from '../universal/config';\nimport { omit } from 'lodash';\n\nfunction getServices(query) {\n  const base = `${config.get().ManagementBaseURL}/services`;\n  const URL = query ? `${base}?${query}` : base;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction getServiceAccounts(groupId, serviceNames) {\n  let url = `${config.get().ManagementBaseURL}/groups/${groupId}/accounts`;\n\n  if (serviceNames) {\n    const query = serviceNames.map(s => `service[]=${s}`).join('&');\n    url += `?${query}`;\n  }\n\n  return fetchJSONWithCredentials(url);\n}\n\nfunction getWidgetsForService(serviceId) {\n  const url = `${config.get().ManagementBaseURL}/accounts/${serviceId}/widgets`;\n\n  return fetchJSONWithCredentials(url);\n}\n\nfunction getService(serviceId) {\n  const URL = `${config.get().ManagementBaseURL}/services/${serviceId}`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction getServiceWidgetTypes(serviceId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/services/${serviceId}/widget_types`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction getRecentlyConnectedServices() {\n  const URL = `${config.get().ManagementBaseURL}/services/recently_connected`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction deleteServiceAccount(groupId, serviceId, deleteAssociatedWidgets) {\n  const params = deleteAssociatedWidgets ? '?delete_associated_widgets=1' : '';\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/accounts/${serviceId}${params}`;\n  return fetchJSONWithCredentials(URL, { method: 'DELETE' });\n}\n\nfunction createServiceAccount(groupId, serviceId, accountData) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/accounts`;\n  const { user, password, name } = accountData;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({\n      service: serviceId,\n      extra: omit(accountData, 'user', 'password', 'name'),\n      basic_auth: {\n        user,\n        password,\n      },\n      name,\n    }),\n  }).catch(err => {\n    if (409 === err.status) {\n      throw new Error('The account details entered could not be authorized');\n    }\n    throw new Error('An error occurred saving the account details');\n  });\n}\n\nfunction getAllDashboards() {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/dashboards`,\n  );\n}\n\nfunction getDashboard(dashboardId) {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/dashboards/${dashboardId}`,\n  );\n}\n\nfunction getAllSharingLoops() {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/sharing_loops`,\n  );\n}\n\nfunction getUser() {\n  return fetchJSONWithCredentials(`${config.get().ManagementBaseURL}/user`);\n}\n\nfunction patchUser(body) {\n  const URL = `${config.get().ManagementBaseURL}/user`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PATCH',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n}\n\nfunction getPlans(orgId) {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/organizations/${orgId}/plans`,\n  );\n}\n\nfunction getOrganization(orgId) {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/organizations/${orgId}`,\n  );\n}\n\nfunction setCheckpoint(checkpoint) {\n  const URL = `${config.get().ManagementBaseURL}/checkpoints`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PATCH',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ checkpoint }),\n  });\n}\n\nfunction getPairingCode() {\n  const URL = `${config.get().ManagementBaseURL}/pairing_codes`;\n\n  return fetchAllJSON(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n  });\n}\n\nfunction getPairingStatus(code) {\n  const URL = `${config.get().ManagementBaseURL}/pairing_codes/${code}`;\n\n  return fetchAll(URL, {\n    method: 'GET',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n  });\n}\n\nfunction exchangeDeviceToken(token) {\n  const URL = `/tv/exchange/${token}`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction connectDevice(device) {\n  const URL = `${config.get().ManagementBaseURL}/devices`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    body: JSON.stringify(device),\n  });\n}\n\nfunction getDevices() {\n  return fetchJSONWithCredentials(`${config.get().ManagementBaseURL}/devices`);\n}\n\nfunction deleteDevice(id) {\n  const URL = `${config.get().ManagementBaseURL}/devices/${id}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n  });\n}\n\nfunction setDeviceName(id, name) {\n  const URL = `${config.get().ManagementBaseURL}/devices/${id}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PATCH',\n    body: JSON.stringify({ name }),\n  });\n}\n\nfunction setDeviceDashboard(id, dashboardId, type) {\n  const URL = `${config.get().ManagementBaseURL}/devices/${id}/broadcast`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PUT',\n    body: JSON.stringify({ type, id: dashboardId }),\n  });\n}\n\nfunction submitIntegrationRequest(content) {\n  return fetchAllJSON('/service-requests', {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n    body: JSON.stringify(content),\n  });\n}\n\nfunction getLogoUploadLink(dashboardId, filename) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/logos`;\n  const body = JSON.stringify({ filename });\n  return fetchJSONWithCredentials(URL, { method: 'POST', body });\n}\n\nfunction getGroups() {\n  const URL = `${config.get().ManagementBaseURL}/groups`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction createDashboard(groupId, dashboard) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/dashboards`;\n  const body = JSON.stringify(dashboard);\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body,\n  });\n}\n\nfunction getGroupDashboards(groupId) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/dashboards`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction getPeople() {\n  const URL = `${config.get().ManagementBaseURL}/people`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction getGroupLoops(groupId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/sharing_loops`;\n\n  return fetchJSONWithCredentials(URL);\n}\n\nfunction createLoop(loop) {\n  const URL = `${config.get().ManagementBaseURL}/sharing_loops`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    body: JSON.stringify(loop),\n  });\n}\n\nfunction updateLoop(loopId, loop) {\n  const URL = `${config.get().ManagementBaseURL}/sharing_loops/${loopId}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PUT',\n    body: JSON.stringify(loop),\n  });\n}\n\nfunction deleteLoop(loopId) {\n  const URL = `${config.get().ManagementBaseURL}/sharing_loops/${loopId}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n  });\n}\n\nfunction updateGroup(groupId, body) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PUT',\n    body: JSON.stringify(body),\n  });\n}\n\nfunction setDashboardFromTemplate(\n  dashboardId,\n  serviceAccountId,\n  template,\n  defaultQuery,\n) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/from_template`;\n  const body = {\n    service_account_id: serviceAccountId,\n    template,\n    default_queries_context: defaultQuery,\n  };\n\n  return fetchAllWithCredentials(URL, {\n    method: 'PUT',\n    body: JSON.stringify(body),\n  });\n}\n\nfunction deleteWidget(dashboardId, widgetKey) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/widgets/${widgetKey}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n  });\n}\n\nfunction enableToggle(toggle) {\n  const URL = `${config.get().ManagementBaseURL}/toggles/${toggle}`;\n  return fetchAllWithCredentials(URL, { method: 'POST' });\n}\n\nfunction disableToggle(toggle) {\n  const URL = `${config.get().ManagementBaseURL}/toggles/${toggle}`;\n  return fetchAllWithCredentials(URL, { method: 'DELETE' });\n}\n\nfunction saveSegmentationAnswers(orgId, body) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/organizations/${orgId}/segmentation_answers`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PUT',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n}\n\nexport {\n  getServices,\n  getServiceAccounts,\n  getWidgetsForService,\n  getService,\n  getServiceWidgetTypes,\n  createServiceAccount,\n  createDashboard,\n  getAllDashboards,\n  getDashboard,\n  getUser,\n  getOrganization,\n  getPlans,\n  patchUser,\n  setCheckpoint,\n  getRecentlyConnectedServices,\n  getPairingCode,\n  getPairingStatus,\n  connectDevice,\n  getDevices,\n  deleteDevice,\n  setDeviceName,\n  setDeviceDashboard,\n  getLogoUploadLink,\n  submitIntegrationRequest,\n  exchangeDeviceToken,\n  getGroups,\n  getGroupDashboards,\n  getPeople,\n  getAllSharingLoops,\n  getGroupLoops,\n  deleteLoop,\n  updateLoop,\n  createLoop,\n  updateGroup,\n  deleteServiceAccount,\n  setDashboardFromTemplate,\n  deleteWidget,\n  enableToggle,\n  disableToggle,\n  saveSegmentationAnswers,\n};\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { TIME_OPTION, GROUPED_TIMESPAN_OPTIONS } from '../ui-field-options';\nimport { getDefaultGoal } from '../../universal/transformers/universal/helpers';\nimport {\n  operatorRequiresValues,\n  getCombinedFiltersValues,\n} from '../universal-config-helpers';\nimport { getStateToSave, getStateToRestore } from '../../actions/helpers';\nimport { map, some, keys, isUndefined, last, isEmpty } from 'lodash';\nimport {\n  submit,\n  setSource,\n  setConfig,\n  fetchAndUpdateSubquery,\n  universalSetError,\n} from './universal-config-actions';\nimport {\n  setServiceAccounts,\n  bootstrapGraph,\n} from './universal-bootstrap-actions';\n\nexport const setDetailsColumns = createAction(\n  'UniversalQuery:SET_DETAILS_COLUMNS',\n);\nexport const addDetailsColumn = createAction(\n  'UniversalQuery:ADD_DETAILS_COLUMN',\n);\nexport const addMetric = createAction('UniversalQuery:ADD_METRIC');\nexport const fetchFilterSuggestionsStart = createAction(\n  'UniversalQuery:FETCH_FILTER_SUGGESTIONS_START',\n);\nexport const removeDetailsColumn = createAction(\n  'UniversalQuery:REMOVE_DETAILS_COLUMN',\n);\nexport const removeFilter = createAction('UniversalQuery:REMOVE_FILTER');\nexport const removeMetric = createAction('UniversalQuery:REMOVE_METRIC');\nexport const setFilter = createAction('UniversalQuery:SET_FILTER');\nexport const setFilterForm = createAction('UniversalQuery:SET_FILTER_FORM');\nexport const setGlobalFilter = createAction('UniversalQuery:SET_GLOBAL_FILTER');\nexport const setGroupByBucket = createAction(\n  'UniversalQuery:SET_GROUP_BY_BUCKET',\n);\nexport const setGroupByCategory = createAction(\n  'UniversalQuery:SET_GROUP_BY_CATEGORY',\n);\nexport const setMetricAggregate = createAction(\n  'UniversalQuery:SET_METRIC_AGGREGATE',\n);\nexport const setMetricField = createAction('UniversalQuery:SET_METRIC_FIELD');\nexport const setSplitBy = createAction('UniversalQuery:SET_SPLIT_BY');\nexport const setOrderBy = createAction('UniversalQuery:SET_ORDER_BY');\nexport const setOrderByExtra = createAction(\n  'UniversalQuery:SET_ORDER_BY_EXTRA',\n);\nexport const setTimeField = createAction('UniversalQuery:SET_TIME_FIELD');\nexport const setTimeOperands = createAction('UniversalQuery:SET_TIME_OPERANDS');\nexport const setTimespanComparisonOff = createAction(\n  'UniversalQuery:SET_TIMESPAN_COMPARISON_OFF',\n);\nexport const setTimespanComparisonOn = createAction(\n  'UniversalQuery:SET_TIMESPAN_COMPARISON_ON',\n);\nexport const setTimespanComparisonOperator = createAction(\n  'UniversalQuery:SET_TIMESPAN_COMPARISON_OPERATOR',\n);\nexport const setTimespanComparisonType = createAction(\n  'UniversalQuery:SET_TIMESPAN_COMPARISON_TYPE',\n);\nexport const setVIPFilter = createAction('UniversalQuery:SET_VIP_FILTER');\nexport const setVisualisationError = createErrorAction(\n  'UniversalQuery:SET_VISUALISATION_ERROR',\n);\nexport const setVisualisationType = createAction(\n  'UniversalQuery:SET_VISUALISATION_TYPE',\n);\nexport const toggleDataSourcePanel = createAction(\n  'UniversalQuery:TOGGLE_DATA_SOURCE_PANEL',\n);\nexport const validate = createAction('UniversalQuery:VALIDATE');\nexport const updateNumberFormat = createAction(\n  'UniversalQuery:UPDATE_NUMBER_FORMAT',\n);\nexport const setPrerequisites = createAction(\n  'UniversalQuery:SET_PREREQUISITES',\n);\nexport const clearPrerequisites = createAction(\n  'UniversalQuery:CLEAR_PREREQUISITES',\n);\n\nexport const switchVisualisationType = type => (dispatch, getState) => {\n  const {\n    universal: { config },\n  } = getState();\n  const { type: currentType } = config;\n\n  if (currentType === type) {\n    return;\n  }\n\n  dispatch(setVisualisationType({ vizType: type }));\n\n  dispatch(submit());\n};\n\nexport const updateMetric = (field, index) => (dispatch, getState) => {\n  const {\n    user: { user: { features: featureFlags = [] } = {} } = {},\n  } = getState();\n  dispatch(setMetricField({ field, index, featureFlags }));\n  dispatch(submit());\n};\n\nexport const updateGroupBy = field => (dispatch, getState) => {\n  // In most cases, all \"datetime\" fields will be replaced by a single `TIME_OPTION`, however\n  // sometimes if we are using custom fields, we will have \"datetime\" fields that aren't replaced\n  // and in these cases, we still want to bucket\n  if (field === TIME_OPTION || field.type === 'datetime') {\n    const {\n      uiQuery: { bucket },\n    } = getState().universal;\n    dispatch(setGroupByBucket(bucket));\n  } else {\n    // Fetch values if on a field with custom values\n    if (field.type === 'enum') {\n      dispatch(fetchAndUpdateSubquery(field));\n    }\n    dispatch(setGroupByCategory(field));\n  }\n  dispatch(submit());\n};\n\nexport const updateAggregation = (aggregate, index) => dispatch => {\n  dispatch(setMetricAggregate({ aggregate, index }));\n  dispatch(submit());\n};\n\nexport const addNewMetric = () => dispatch => {\n  dispatch(addMetric());\n  dispatch(submit());\n};\n\nexport const removeMetricAtIndex = index => dispatch => {\n  dispatch(removeMetric(index));\n  dispatch(submit());\n};\n\nexport const updateFilter = (index, rawValue) => dispatch => {\n  // Map filter specific props to query filter props\n  const value = {};\n\n  if (rawValue.since_start_of) {\n    const { quantity, unit } = rawValue.since_start_of;\n    value.operator = 'timespan';\n    value.operands = [quantity, unit];\n  } else {\n    const { values } = rawValue;\n    value.operator = rawValue.operator;\n    if (values && values.length) {\n      value.operands = values.map(op => op.key || op);\n    }\n  }\n\n  dispatch(\n    setFilter({\n      index,\n      field: rawValue.field,\n      value,\n    }),\n  );\n  dispatch(submit());\n};\n\nexport const setGlobalFilterValue = (_value, index, combinedFilters) => async (\n  dispatch,\n  getState,\n) => {\n  if (combinedFilters) {\n    const {\n      uiQuery: { globalFilters = [] },\n    } = getState().universal;\n    getCombinedFiltersValues(combinedFilters, globalFilters).forEach(\n      payload => {\n        dispatch(setGlobalFilter(payload));\n      },\n    );\n  }\n\n  const value = { ..._value, is_global: true };\n  dispatch(setGlobalFilter({ index, value }));\n  try {\n    await dispatch(bootstrapGraph([], [], true));\n    dispatch(submit());\n  } catch (err) {\n    dispatch(universalSetError(err));\n  }\n};\n\nexport const setVIPFilterValue = (\n  _value,\n  index,\n  runSubmit = true,\n) => dispatch => {\n  const value = _value ? { ..._value, is_vip: true } : {};\n  dispatch(setVIPFilter({ index, value }));\n  if (runSubmit) {\n    dispatch(submit());\n  }\n};\n\nexport const editFilter = filterForm => async (dispatch, getState) => {\n  if (!keys(filterForm).length) {\n    dispatch(setFilterForm({}));\n    return;\n  }\n\n  const {\n    _filterModal: {\n      index: currentIndex,\n      field: currentField,\n      operator: currentOperator,\n    } = {},\n    subQueryResults,\n  } = getState().universal;\n\n  const { field } = filterForm;\n  const fieldValues = field.getValues(subQueryResults);\n\n  /**\n   * Clear current input and values when:\n   * - First time opening panel (filterForm.values is not yet set)\n   * - Changing the filter field (index and field have changed)\n   * - Changing to operator that does not use values (ie `is_null`/`is_not_null`)\n   * - Changing to a contains operator from any other operator\n   */\n\n  if (\n    !filterForm.values ||\n    (currentIndex === filterForm.index && currentField !== filterForm.field) ||\n    !operatorRequiresValues(filterForm.operator) ||\n    some(\n      ['contains', 'matches'],\n      operator =>\n        (filterForm.operator.includes(operator) &&\n          currentOperator &&\n          !currentOperator.includes(operator)) ||\n        (!filterForm.operator.includes(operator) &&\n          currentOperator &&\n          currentOperator.includes(operator)),\n    )\n  ) {\n    filterForm.values = [];\n    filterForm.value = '';\n  }\n\n  // When setting a timefield, set default timespan option\n  if (field.type === 'datetime' && !filterForm.since_start_of) {\n    filterForm.since_start_of = GROUPED_TIMESPAN_OPTIONS[0][0];\n  } else if (field.type !== 'datetime') {\n    // When operator is not set or when changing to a field\n    // that doesn't support current operator, default it to 'in'\n    if (\n      !filterForm.operator ||\n      (!field.supports_null_values && filterForm.operator.includes('null')) ||\n      (!field.supports_contains_operators &&\n        filterForm.operator.includes('contains'))\n    ) {\n      filterForm.operator = 'in';\n    }\n\n    if (field.restrict_single_value) {\n      filterForm.operator = 'in';\n\n      // When setting single value filter, set default option\n      if (!filterForm.values.length && fieldValues) {\n        filterForm.values = [fieldValues[0]];\n      }\n    }\n\n    // Boolean override\n    if (field.type === 'boolean') {\n      filterForm.operator = 'in';\n\n      if (!filterForm.values.length) {\n        filterForm.values = [true];\n      }\n    }\n  }\n\n  dispatch(setFilterForm(filterForm));\n\n  if (field.hasValues() && !fieldValues) {\n    dispatch(fetchFilterSuggestionsStart());\n    await dispatch(fetchAndUpdateSubquery(field));\n\n    // Set default value for single value filter\n    if (field.restrict_single_value) {\n      const newValues = field.getValues(getState().universal.subQueryResults);\n\n      // It's possible filter values have returned empty. For now we don't\n      // handle it in the UI, but check here to prevent throwing error.\n      if (newValues && newValues.length) {\n        dispatch(\n          setFilterForm({\n            ...filterForm,\n            values: [newValues[0]],\n          }),\n        );\n      }\n    }\n  }\n};\n\nexport const closeFilterConfig = () => dispatch => {\n  dispatch(setFilterForm({}));\n};\n\nexport const removeFilterFromQuery = index => dispatch => {\n  dispatch(removeFilter(index));\n  dispatch(submit());\n};\n\nexport const updateTimespanOperands = value => dispatch => {\n  const { quantity, unit } = value;\n  const operands = [quantity, unit];\n\n  dispatch(setTimeOperands(operands));\n  dispatch(submit());\n};\n\nexport const updateSplitBy = field => dispatch => {\n  dispatch(setSplitBy(field));\n  if (!isEmpty(field)) {\n    // Fetch values if on a field with custom values\n    dispatch(fetchAndUpdateSubquery(field));\n  }\n  dispatch(submit());\n};\n\nexport const updateOrderBy = field => dispatch => {\n  dispatch(setOrderBy(field));\n  dispatch(submit());\n};\n\nexport const updateOrderByExtra = extra => dispatch => {\n  dispatch(setOrderByExtra(extra));\n  dispatch(submit());\n};\n\nexport const saveState = paths => (dispatch, getState) => {\n  const { config } = getState().universal;\n  const newConfig = getStateToSave(config, paths);\n\n  dispatch(setConfig(newConfig));\n};\n\nexport const restoreState = (paths, defaults) => (dispatch, getState) => {\n  const { config } = getState().universal;\n  const newConfig = getStateToRestore(config, paths, defaults);\n\n  dispatch(setConfig(newConfig));\n};\n\nexport const restoreStateGoal = () => (dispatch, getState) => {\n  const {\n    queryResults = [],\n    config,\n    uiQuery: { metrics: [{ node: { type } = {} } = {}] = [] } = {},\n  } = getState().universal;\n  const newConfig = getStateToRestore(config, ['goal']);\n\n  // Compute and apply a default goal if never been set and we've got data\n  if (isUndefined(newConfig.goal) && queryResults[0].length) {\n    const defaultGoal = getDefaultGoal(queryResults[0], type);\n    const defaults = {\n      goal: `${defaultGoal}`,\n    };\n    dispatch(restoreState(['goal'], defaults));\n  } else {\n    dispatch(setConfig(newConfig));\n  }\n};\n\nexport const setServiceAccountId = id => (dispatch, getState) => {\n  const { source } = getState().universal;\n  dispatch(setSource({ ...source, service_account_id: `${id}` }));\n};\n\nexport const switchServiceAccount = id => async dispatch => {\n  dispatch(setServiceAccountId(id));\n  try {\n    await dispatch(bootstrapGraph(['globalFilters'], ['globalFilters'], true));\n    dispatch(submit());\n  } catch (err) {\n    dispatch(universalSetError(err));\n  }\n};\n\nexport const updateServiceAccounts = serviceAccounts => async dispatch => {\n  dispatch(setServiceAccounts(serviceAccounts));\n\n  const { id } = last(serviceAccounts);\n  dispatch(setServiceAccountId(id));\n  try {\n    await dispatch(bootstrapGraph(['globalFilters'], ['globalFilters'], true));\n    dispatch(submit());\n  } catch (err) {\n    dispatch(universalSetError(err));\n  }\n};\n\nexport const updateTimespanComparison = ({ active, operator }) => dispatch => {\n  if (active === true) {\n    dispatch(setTimespanComparisonOn());\n  }\n\n  if (active === false) {\n    dispatch(setTimespanComparisonOff());\n  }\n\n  if (operator) {\n    dispatch(setTimespanComparisonOperator(operator));\n  }\n\n  // TODO: We should be able to only run the query when active is true\n  // and simply remove comparison from state on the setTimespanComparisonOff action\n  dispatch(submit());\n};\n\nexport const setDetailsColumnNodes = nodes => dispatch => {\n  dispatch(setDetailsColumns(nodes));\n  dispatch(submit());\n};\n\nexport const addNewDetailsColumn = col => dispatch => {\n  dispatch(addDetailsColumn(col));\n  dispatch(submit());\n};\n\nexport const removeDetailsColumnAtIndex = index => dispatch => {\n  dispatch(removeDetailsColumn(index));\n  dispatch(submit());\n};\n\nexport const updatePrerequisites = values => (dispatch, getState) => {\n  const {\n    uiQuery: { prerequisites: prerequisiteNodes },\n  } = getState().universal;\n\n  // Sanity check that we have the same number of nodes and values\n  // If we don't, something has gone wrong\n  if (values.length !== prerequisiteNodes.length) {\n    throw new Error('Incorrect number of prerequisite values / nodes');\n  }\n\n  const newPrerequisiteNodes = map(prerequisiteNodes, (node, index) => {\n    return {\n      ...node,\n      extra: {\n        ...node.extra,\n        operands: [values[index]],\n      },\n    };\n  });\n\n  dispatch(setPrerequisites(newPrerequisiteNodes));\n\n  dispatch(submit());\n  dispatch(bootstrapGraph([], [], true));\n};\n","import { decode } from 'he';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport universalService from '../../universal/services/universal-service';\nimport { getConfig } from '../../lib/widget-service';\nimport { deserialize } from '../../universal/serializers';\nimport { validate, setVisualisationError } from './universal-query-actions';\nimport {\n  bootstrapUniversalService,\n  bootstrapServiceAccounts,\n  bootstrapGraph,\n  setRawQueries,\n  resetInitial,\n  setNoServiceAccountsAndOpenPanel,\n  NoServiceAccountError,\n  SilentlyChangedServiceAccountError,\n  setService,\n  setServiceAccounts,\n  setServiceAccountId,\n} from './universal-bootstrap-actions';\nimport * as mirageActions from '../mirage/mirage-actions';\nimport {\n  startPusherChannel,\n  clearQueuedData,\n  PusherError,\n} from './universal-socket-actions';\nimport { forEachRight, omit, pull, includes, isUndefined } from 'lodash';\nimport {\n  ENABLED_CACHE,\n  getSubQueryResult,\n  applyPreferences,\n} from '../query-helpers';\nimport { getPreferences } from '../persist-config-helpers';\n\nexport const clearQueryResults = createAction(\n  'UniversalConfig:CLEAR_QUERY_RESULTS',\n);\nexport const fetchVizDataStart = createAction(\n  'UniversalConfig:FETCH_VIZ_DATA_START',\n);\nexport const fetchVizDataSuccess = createAction(\n  'UniversalConfig:FETCH_VIZ_DATA_SUCCESS',\n);\nexport const setCancelledQueries = createAction(\n  'UniversalConfig:SET_CANCELLED_QUERIES',\n);\nexport const setConfig = createAction('UniversalConfig:SET_CONFIG');\nexport const setGraph = createAction('UniversalConfig:SET_GRAPH');\nexport const setAPISettings = createAction('UniversalConfig:SET_API_SETTINGS');\nexport const setPreset = createAction('UniversalConfig:SET_PRESET');\nexport const setQueryIds = createAction('UniversalConfig:SET_QUERY_IDS');\nexport const setSource = createAction('UniversalConfig:SET_SOURCE');\nexport const universalSetError = createErrorAction('UniversalConfig:SET_ERROR');\nexport const recomputeQueries = createErrorAction(\n  'UniversalConfig:RECOMPUTE_QUERIES',\n);\nexport const updateSubQueryResults = createAction(\n  'UniversalConfig:UPDATE_SUBQUERY_RESULTS',\n);\nexport const updateColumnNumberFormat = createAction(\n  'UniversalConfig:UPDATE_COLUMN_NUMBER_FORMAT',\n);\nexport const disableQueries = createAction('UniversalConfig:DISABLE_QUERIES');\n\nexport const cancelQueries = (reason, clearQueryIds, _queryIds) => (\n  dispatch,\n  getState,\n) => {\n  const {\n    pusherChannel,\n    queryIds: qIds,\n    queriesFetchDone,\n  } = getState().universal;\n  const forceCancel = !!_queryIds;\n  const queryIds = _queryIds || qIds;\n  // Remove query IDs from state so they don't throw an error when cancelled\n  if (clearQueryIds) dispatch(setQueryIds([]));\n\n  dispatch(setCancelledQueries(queryIds));\n\n  try {\n    queryIds.forEach((queryId, index) => {\n      if (forceCancel || !queriesFetchDone || !queriesFetchDone[index]) {\n        universalService.cancelQuery(queryId, pusherChannel, reason);\n      }\n    });\n  } catch (cancelErr) {\n    // We silently fail on purpose here as our design is robust to not listen\n    // to the query\n  }\n};\n\nexport const fetchAndUpdateSubquery = field => async (dispatch, getState) => {\n  const { universal } = getState();\n  const { subQueryResults: currentSubQueryResults = {} } = universal;\n  if (field.hasValues() && !field.getValues(currentSubQueryResults)) {\n    const resourceName = field.getResourceName();\n    const subQueryResult = await getSubQueryResult(field, universal);\n    const cleanResult = subQueryResult.map(({ name, ...rest }) => ({\n      ...rest,\n      name: !!name ? decode(name) : null,\n    }));\n    dispatch(updateSubQueryResults({ [resourceName]: cleanResult }));\n  }\n};\n\nconst receivedQueryIds = queryIds => (dispatch, getState) => {\n  dispatch(setQueryIds(queryIds));\n  dispatch(clearQueryResults());\n\n  const {\n    universal: { queuedData },\n  } = getState();\n  const ids = [...queryIds];\n\n  if (queuedData.length) {\n    forEachRight(queuedData, data => {\n      const { queryId } = data;\n\n      if (ids.includes(queryId)) {\n        if (data.error) {\n          dispatch(setVisualisationError(data.error));\n          return false;\n        }\n\n        dispatch(fetchVizDataSuccess(data));\n        pull(ids, queryId);\n\n        // Stop when there are no more query IDs\n        if (!ids.length) return false;\n      }\n      return true;\n    });\n\n    dispatch(clearQueuedData());\n  }\n};\n\nexport const runQuery = () => async (dispatch, getState) => {\n  const {\n    pusherChannel,\n    timezone,\n    source = {},\n    queriesEnabled,\n    config = {},\n  } = getState().universal;\n\n  // At this point, redirect queries for Mirage widgets to Mirage\n  if (source.isMirage) {\n    dispatch(mirageActions.runMirageQuery());\n    return;\n  }\n\n  if (!queriesEnabled) {\n    dispatch(recomputeQueries());\n    return;\n  }\n\n  // For the Leaderboard, Table and Feed visualisations, without a limit, it creates a payload\n  // with far too much data, which Tabloid will be very unhappy with. So for those visualisations,\n  // we put a limit on the queries\n  let queryLimit;\n  const LIMITED_VISUALISATION_TYPES = ['leaderboard', 'table', 'feed'];\n  const QUERY_RESULTS_LIMIT = 20;\n  if (includes(LIMITED_VISUALISATION_TYPES, config.type)) {\n    queryLimit = QUERY_RESULTS_LIMIT;\n  }\n\n  const delivery = {\n    mode: 'async',\n    provider: 'pusher',\n    destination: pusherChannel,\n  };\n  try {\n    dispatch(fetchVizDataStart());\n    const {\n      queries,\n      queryFetchCursor,\n      config: { queryOptions = {} },\n    } = getState().universal;\n\n    const payloads = await Promise.all(\n      queries.map(query => {\n        const beQuery = {\n          ...query,\n          source,\n          ...(queryLimit && { limit: queryLimit }),\n        };\n\n        return universalService.runQuery(\n          beQuery,\n          delivery,\n          ENABLED_CACHE,\n          timezone,\n          queryOptions,\n        );\n      }),\n    );\n\n    const queryIds = payloads.map(r => r.query_id);\n\n    // Only process latest response\n    if (queryFetchCursor === getState().universal.queryFetchCursor) {\n      dispatch(receivedQueryIds(queryIds));\n    } else {\n      dispatch(cancelQueries('changed config option', false, queryIds));\n    }\n  } catch (err) {\n    dispatch(setVisualisationError(err));\n  }\n};\n\nexport const submit = () => (dispatch, getState) => {\n  dispatch(cancelQueries('changed config option', true));\n  dispatch(validate());\n\n  const { previewError } = getState().universal;\n\n  if (!previewError) {\n    dispatch(runQuery());\n  }\n};\n\nconst handleErrors = (error, dispatch) => {\n  if (error instanceof NoServiceAccountError) {\n    dispatch(setNoServiceAccountsAndOpenPanel());\n    return;\n  } else if (error instanceof PusherError) {\n    dispatch(setVisualisationError(error));\n  } else {\n    dispatch(universalSetError(error));\n  }\n};\n\nconst _triggerFirstQueries = () => (dispatch, getState) => {\n  // Check pusher is ready and pusher callback has not trigger run query yet\n  const { isPusherReady, queryIds = [] } = getState().universal;\n  if (isPusherReady && !queryIds.length) {\n    dispatch(runQuery());\n  }\n};\n\nexport const initConfig = (\n  serviceId,\n  dashboardId,\n  presetId,\n  startPusher = true,\n) => async (dispatch, getState) => {\n  try {\n    dispatch(resetInitial());\n    startPusher && dispatch(startPusherChannel(dashboardId));\n    await dispatch(bootstrapUniversalService(dashboardId, serviceId));\n\n    const {\n      universal: {\n        source: { integration },\n      },\n    } = getState();\n    let queries;\n\n    if (presetId) {\n      const preset = await universalService.fetchPreset(integration, presetId);\n      if (!preset) {\n        throw new Error(`Preset \"${presetId}\" not found`);\n      }\n      dispatch(setPreset(preset));\n      queries = preset.queries;\n    } else {\n      // When creating a new custom widget\n      // TODO update metadata to use `queries = []`  and remove type: 'number'\n      const metadata = await universalService.fetchMetadata(integration);\n      const { initialQueries } = metadata;\n      const { query } = initialQueries.number;\n      queries = [query];\n    }\n\n    // set queries before to set service accounts in case it throws an error\n    // when no service accounts are set....\n    dispatch(setRawQueries(queries));\n    await dispatch(bootstrapServiceAccounts());\n\n    let defaultsFor = ['globalFilters', 'vipFilters'];\n    const preferences = await getPreferences(getState().universal);\n    if (preferences) {\n      // When preferences are applicable we do not override filter values\n      // It acts the same way as getWidgetConfig in that case\n      defaultsFor = ['vipFilters'];\n      queries = applyPreferences(queries, preferences);\n    }\n    // Set queries again with preferences\n    dispatch(setRawQueries(queries));\n\n    await dispatch(bootstrapGraph(defaultsFor, ['globalFilters'], false));\n    if (startPusher) {\n      dispatch(_triggerFirstQueries());\n    } else {\n      // Because we did not run first queries we've never got the queries from\n      // uiQueries and we might miss filters added automatically while\n      // bootstraping\n      dispatch(recomputeQueries());\n    }\n  } catch (error) {\n    handleErrors(error, dispatch);\n  }\n};\n\nexport const getWidgetConfig = (widgetId, dashboardId) => async dispatch => {\n  try {\n    dispatch(resetInitial());\n    dispatch(startPusherChannel(dashboardId));\n    const json = await getConfig(widgetId);\n    const {\n      service: { id: serviceId },\n      service_account: { id: accountId = null } = {},\n    } = json;\n    const config = deserialize('universal', null, json);\n    const { queries: storedQueries } = config;\n    const queries = storedQueries.map(q => omit(q, 'source'));\n    const { mirageConfig } = config;\n\n    dispatch(setConfig(config));\n    await dispatch(bootstrapUniversalService(dashboardId, serviceId));\n\n    if (!isUndefined(mirageConfig)) {\n      dispatch(mirageActions.bootstrapMirageFromConfig(mirageConfig));\n    }\n\n    dispatch(setRawQueries(queries));\n\n    try {\n      await dispatch(bootstrapServiceAccounts(accountId, true));\n      await dispatch(bootstrapGraph([], ['globalFilters'], false));\n    } catch (err) {\n      // When service account is not available anymore we need to reset queries\n      // and to apply the new service account.\n      // TODO explain changes to the user\n      if (err instanceof SilentlyChangedServiceAccountError) {\n        await dispatch(\n          bootstrapGraph(['globalFilters'], ['globalFilters'], true),\n        );\n      } else {\n        throw err;\n      }\n    }\n    dispatch(_triggerFirstQueries());\n  } catch (error) {\n    handleErrors(error, dispatch);\n  }\n};\n\nexport const initialiseDefaultValues = (service, serviceAccount) => async (\n  dispatch,\n  getState,\n) => {\n  try {\n    dispatch(resetInitial());\n    dispatch(disableQueries());\n    dispatch(setService(service));\n    dispatch(setServiceAccounts([serviceAccount]));\n    const {\n      universal: {\n        source: { integration },\n      },\n    } = getState();\n    const metadata = await universalService.fetchMetadata(integration);\n    const { initialQueries } = metadata;\n    const { query } = initialQueries.number;\n    const queries = [query];\n    dispatch(setRawQueries(queries));\n    dispatch(setServiceAccountId(serviceAccount.id));\n    await dispatch(\n      bootstrapGraph(['globalFilters', 'vipFilters'], ['globalFilters'], false),\n    );\n    dispatch(recomputeQueries());\n  } catch (error) {\n    handleErrors(error, dispatch);\n  }\n};\n","module.exports = (__webpack_require__(28))(1092);","import createAction from '../../lib/redux/create-action';\nimport { setDashboard } from '../../dashboard/actions/dashboard-actions';\nimport {\n  find,\n  isEmpty,\n  isUndefined,\n  reduce,\n  zipObject,\n  chain,\n  some,\n  map,\n} from 'lodash';\nimport {\n  getDashboard,\n  getService,\n  getServiceAccounts,\n} from '../../services/management-service';\nimport { intercom } from '../../lib/global';\nimport { getCombinedFiltersValues } from '../universal-config-helpers';\nimport { getServiceAccountId } from '../persist-config-helpers';\nimport { runQueryInContext, getSubQueryResult } from '../query-helpers';\nimport universalService from '../../universal/services/universal-service';\nimport {\n  setVIPFilterValue,\n  toggleDataSourcePanel,\n  setPrerequisites,\n} from './universal-query-actions';\nimport {\n  fetchAndUpdateSubquery,\n  universalSetError,\n} from './universal-config-actions';\nimport {\n  buildGraph,\n  addVirtualFields,\n  injectCustomFieldsInGraph,\n  getNodeFromSubquery,\n} from '../graph';\nimport { extendableBuiltinGen } from '../../universal';\nimport {\n  resetGlobalFilters,\n  getPrerequisitesFromQueries,\n} from '../reducer/ui-query-reducer/other-ui-query-reducer-methods';\nimport WidgetMenu from '../../widget-menu/widget-menu-component';\nimport { VIEWS as INSTRUMENT_MENU_VIEWS } from '../../instrument-menu/instrument-menu-constants';\nimport { formatMessage } from '../../lib/i18n';\nimport * as mirageActions from '../mirage/mirage-actions';\n\nexport const resetInitial = createAction('UniversalBootstrap:RESET_INITIAL');\nexport const resetGraph = createAction('UniversalBootstrap:RESET_GRAPH');\nexport const setAPISettings = createAction(\n  'UniversalBootstrap:SET_API_SETTINGS',\n);\nexport const setConfigReady = createAction(\n  'UniversalBootstrap:SET_CONFIG_READY',\n);\nexport const setExistingDashboardContext = createAction(\n  'UniversalBootstrap:SET_EXISTING_DASHBOARD_CONTEXT',\n);\nexport const setGraph = createAction('UniversalBootstrap:SET_GRAPH');\nexport const setRawQueries = createAction('UniversalBootstrap:SET_RAW_QUERIES');\nexport const setInitialQueries = createAction(\n  'UniversalBootstrap:SET_INITIAL_QUERIES',\n);\nexport const setGlobalFiltersFromQueries = createAction(\n  'UniversalBootstrap:SET_GLOBAL_FILTERS_FROM_QUERIES',\n);\nexport const setPrerequisitesFromQueries = createAction(\n  'UniversalBootstrap:SET_PREREQUISITES_FROM_QUERIES',\n);\nexport const setQueryOptions = createAction(\n  'UniversalBootstrap:SET_QUERY_OPTIONS',\n);\nexport const setService = createAction('UniversalBootstrap:SET_SERVICE');\nexport const setServiceAccountId = createAction(\n  'UniversalBootstrap:SET_SERVICE_ACCOUNT_ID',\n);\nexport const setServiceAccounts = createAction(\n  'UniversalBootstrap:SET_SERVICE_ACCOUNTS',\n);\nexport const setGlobalFilter = createAction(\n  'UniversalBootstrap:SET_GLOBAL_FILTER',\n);\nexport const setUiOptions = createAction('UniversalBootstrap:SET_UI_OPTIONS');\nexport const setNoServiceAccounts = createAction(\n  'UniversalBootstrap:SET_NO_SERVICE_ACCOUNTS',\n);\nexport const setPrerequisiteOptions = createAction(\n  'UniversalBootstrap:SET_PREREQUISITE_OPTIONS',\n);\n\n// Both actions will eventually open the panel but this action creator is here\n// to distinguish between compact and normal universal config\nexport const setNoServiceAccountsAndOpenPanel = () => (dispatch, getState) => {\n  const {\n    widgetMenu: { view } = {},\n    instrumentMenu: { view: instrumentMenuView } = {},\n  } = getState();\n\n  if (\n    view === WidgetMenu.VIEWS.EDIT ||\n    instrumentMenuView === INSTRUMENT_MENU_VIEWS.EDIT\n  ) {\n    dispatch(setNoServiceAccounts());\n  } else {\n    dispatch(\n      toggleDataSourcePanel({\n        showDataSourcePanel: true,\n        addingNewConnection: true,\n      }),\n    );\n  }\n};\n\nexport class NoServiceAccountError extends extendableBuiltinGen(Error) {\n  constructor(message) {\n    super(message); // extendablebuiltingen is buggy and does not set message\n    this.message = message;\n  }\n}\nexport class SilentlyChangedServiceAccountError extends extendableBuiltinGen(\n  Error,\n) {\n  constructor(message) {\n    super(message); // extendablebuiltingen is buggy and does not set message\n    this.message = message;\n  }\n}\nexport class NoValuesForGlobalFilterError extends extendableBuiltinGen(Error) {\n  constructor(message) {\n    super(message); // extendablebuiltingen is buggy and does not set message\n    this.message = message;\n  }\n}\n\nconst _getQueryOptions = (options, universalState) => {\n  return Promise.all(\n    options.map(({ query }) => {\n      return runQueryInContext(query, universalState);\n    }),\n  ).then(qr => {\n    return reduce(\n      qr,\n      (queryOpts, r, i) => {\n        const { keys } = options[i];\n        const [values] = r;\n        return {\n          ...queryOpts,\n          ...zipObject(keys, values),\n        };\n      },\n      {},\n    );\n  });\n};\n\nconst _withoutCombined = filters =>\n  filters.filter(({ extra = {} }) => !extra.is_combined);\n\nconst _loadGlobalFilters = async (dispatch, getState) => {\n  const { uiQuery: { globalFilters = [] } = {} } = getState().universal;\n  const globalsToFetch = _withoutCombined(globalFilters);\n\n  await Promise.all(\n    globalsToFetch.map(gf => dispatch(fetchAndUpdateSubquery(gf.node))),\n  );\n};\n\nconst _setGlobalFilters = (dispatch, getState) => {\n  const {\n    subQueryResults,\n    uiQuery: { globalFilters = [] } = {},\n  } = getState().universal;\n  const globalsToFetch = _withoutCombined(globalFilters);\n\n  globalsToFetch.forEach((f, index) => {\n    const [firstOption] = f.node.getValues(subQueryResults);\n\n    // If a filter is defined as global, but has no values, we throw a specific\n    // error to handle this\n    if (isUndefined(firstOption)) {\n      const error = new NoValuesForGlobalFilterError(\n        formatMessage('universal.config.compact.noValuesForGlobalFiltersError'),\n      );\n      dispatch(universalSetError(error));\n      throw error;\n    }\n\n    const value = {\n      operands: [firstOption.key],\n      operator: 'in',\n      is_global: true,\n    };\n    dispatch(setGlobalFilter({ value, index }));\n\n    if (firstOption.combinedFilters) {\n      getCombinedFiltersValues(\n        firstOption.combinedFilters,\n        globalFilters,\n      ).forEach(payload => {\n        dispatch(setGlobalFilter(payload));\n      });\n    }\n  });\n};\n\nconst _loadVIPFilters = setDefaults => async (dispatch, getState) => {\n  const { uiQuery: { vipFilters = [] } = {} } = getState().universal;\n  await Promise.all(\n    vipFilters.map(vf => dispatch(fetchAndUpdateSubquery(vf.node))),\n  );\n\n  if (setDefaults) {\n    const { subQueryResults } = getState().universal;\n    vipFilters.forEach((f, index) => {\n      const { extra } = f;\n      // Set VIP filter default value when not set\n      if (!extra || isEmpty(extra)) {\n        const [firstOption] = f.node.getValues(subQueryResults);\n        const value = { operands: [firstOption.key], operator: 'in' };\n        dispatch(setVIPFilterValue(value, index, false));\n      }\n    });\n  }\n};\n\nexport const bootstrapUniversalService = (dashboardId, serviceId) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    dashboard: { dashboard: currentDashboard } = {},\n    dataSources: { services = [] } = {},\n  } = getState();\n  if (!currentDashboard) {\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n  } else {\n    // Hydrate context from dashboard\n    dispatch(setExistingDashboardContext({ dashboard: currentDashboard }));\n  }\n\n  let service;\n  if (services.length) {\n    service = find(services, { id: serviceId });\n  }\n  if (!service) {\n    service = await getService(serviceId);\n  }\n  dispatch(setService(service));\n};\n\nexport const bootstrapServiceAccounts = (\n  currentAccountId,\n  editWidget,\n) => async (dispatch, getState) => {\n  const {\n    universal: {\n      source: { integration, isMirage },\n      groupId,\n      service,\n    },\n    serviceAccounts: allServiceAccounts = {},\n  } = getState();\n\n  let serviceAccounts;\n\n  if (isMirage) {\n    dispatch(mirageActions.initMirageServiceAccount(service));\n    return;\n  }\n\n  if (allServiceAccounts[integration]) {\n    serviceAccounts = allServiceAccounts[integration];\n  } else {\n    serviceAccounts = await getServiceAccounts(groupId, [integration]);\n  }\n\n  if (!serviceAccounts.length) {\n    throw new NoServiceAccountError('No service accounts');\n  }\n  dispatch(setServiceAccounts(serviceAccounts));\n\n  // Select current service account based on config, local storage or\n  // default to first one available.\n  let id = currentAccountId;\n  if (!id) {\n    // TODO if falls back on first one use switch account mechanism\n    id = await getServiceAccountId(integration, serviceAccounts);\n    // Reconnecting an existing widget\n    if (editWidget) {\n      dispatch(setServiceAccountId(id)); // Dispatch to set id first\n      throw new SilentlyChangedServiceAccountError(\n        'New service account selected',\n      );\n    }\n  }\n  dispatch(setServiceAccountId(id));\n};\n\nexport const loadPrerequisites = (graph, prerequisitesMetadata) => async (\n  dispatch,\n  getState,\n) => {\n  const { universal } = getState();\n  const { serviceAccounts, source } = universal;\n\n  const saFilters = chain(prerequisitesMetadata.service_account_filters)\n    .filter(n => !n.exclude_from_query)\n    .map(f => {\n      return getNodeFromSubquery(graph, f, true);\n    })\n    .value();\n\n  const allValues = await Promise.all(\n    serviceAccounts.map(async sa => {\n      const allSaFiltersValues = await Promise.all(\n        saFilters.map(async node => {\n          const resourceName = node.getResourceName();\n          let saFilterValues;\n\n          try {\n            saFilterValues = await getSubQueryResult(\n              node,\n              {\n                ...universal,\n                source: { ...source, service_account_id: `${sa.id}` },\n              },\n              true,\n            );\n          } catch (err) {\n            // If there are no values here, we swallow the error to avoid breaking\n            // the entire compact config on account of one single set of filter values\n            saFilterValues = [];\n          }\n          return { [resourceName]: saFilterValues };\n        }),\n      );\n\n      // Flatten into a more readable structure\n      const saFiltersKeyValues = reduce(\n        allSaFiltersValues,\n        (acc, v) => {\n          return {\n            ...acc,\n            ...v,\n          };\n        },\n        {},\n      );\n\n      return { id: sa.id, name: sa.name, values: saFiltersKeyValues };\n    }),\n  );\n\n  const tree = prerequisitesMetadata.build_prerequisite_options(allValues);\n\n  dispatch(setPrerequisiteOptions(tree));\n};\n\nconst firstValueAt = (selections, level) => {\n  if (!selections) return undefined;\n\n  if (level === 0) {\n    return selections[0].id;\n  }\n\n  if (!selections[0].children || isEmpty(selections[0].children)) {\n    return null;\n  }\n\n  return firstValueAt(selections[0].children, level - 1);\n};\n\nexport const setDefaultPrerequisiteValues = prerequisiteNodes => (\n  dispatch,\n  getState,\n) => {\n  const {\n    universal: {\n      uiOptions: { prerequisites: prerequisiteOptions },\n      source,\n    },\n  } = getState();\n\n  const serviceAccountPrerequisites = find(\n    prerequisiteOptions,\n    option => option.id.toString() === source.service_account_id.toString(),\n  );\n\n  // We need to make sure that the original query used to create the widget gets\n  // populated with the default prerequisite values\n\n  // Note the `index + 1` below. We're starting at the second level down in the\n  // tree because the first layer is the service account, and subsequent layers are\n  // the prerequisites\n  const newPrerequisiteNodes = map(prerequisiteNodes, (node, index) => {\n    let operands = firstValueAt([serviceAccountPrerequisites], index + 1);\n    operands = operands ? [operands] : undefined;\n\n    return {\n      ...node,\n      extra: {\n        ...node.extra,\n        operands,\n      },\n    };\n  });\n\n  dispatch(setPrerequisites(newPrerequisiteNodes));\n};\n\nconst initialise = () => async (dispatch, getState) => {\n  // Fetch & set relevant content from metadata: Api settings, graph, uiOptions\n  const {\n    universal: {\n      source: { integration },\n      queriesEnabled,\n    },\n  } = getState();\n  const metadata = await universalService.fetchMetadata(integration);\n  dispatch(setAPISettings(metadata.api));\n  const graph = buildGraph(metadata);\n  dispatch(setGraph(graph));\n\n  return { metadata, graph, queriesEnabled };\n};\n\nconst setUpPrerequisites = (graph, metadata, queries) => async dispatch => {\n  await dispatch(loadPrerequisites(graph, metadata.prerequisites));\n\n  // Pull the values for prerequisites from the query in the widget config\n  const newPrerequisites = getPrerequisitesFromQueries(\n    graph,\n    queries,\n    metadata.prerequisites.service_account_filters,\n  );\n\n  if (\n    some(newPrerequisites, prerequisite => isEmpty(prerequisite.extra.operands))\n  ) {\n    // We may not have any values (if it's a new widget, for example), so we\n    // also want to fill in some defaults if we don't find what we want\n    dispatch(setDefaultPrerequisiteValues(newPrerequisites));\n  } else {\n    dispatch(setPrerequisites(newPrerequisites));\n  }\n};\n\nconst setUpAdditionalFields = (graph, metadata, queriesEnabled) => async (\n  dispatch,\n  getState,\n) => {\n  // We are now all with required filter values to fetch additional metadata,\n  // queryOptions etc..\n  if (metadata.options) {\n    const queryOptions = await _getQueryOptions(\n      metadata.options,\n      getState().universal,\n    );\n    dispatch(setQueryOptions(queryOptions));\n  }\n\n  // Mutate the graph with new potential new nodes\n  if (queriesEnabled) {\n    await injectCustomFieldsInGraph(graph, getState().universal);\n    addVirtualFields(graph);\n  }\n\n  // Update uiOptions metrics with custom metadata\n  dispatch(setUiOptions(metadata.metricCategories));\n};\n\nconst fetchSubqueryData = defaults => (dispatch, getState) => {\n  const {\n    uiQuery: {\n      globalFilters: _globalFilters = [],\n      filters = [],\n      groupBy = [],\n      splitBy = [],\n    } = {},\n  } = getState().universal;\n\n  // If we set defaults for globalfilters don't fetch them again\n  let globalFilters = [];\n  if (!defaults.includes('globalFilters')) {\n    globalFilters = _globalFilters;\n  }\n\n  const arraysToFetch = [...globalFilters, ...filters, ...groupBy, ...splitBy];\n  for (const entry of arraysToFetch) {\n    const { node } = entry;\n    dispatch(fetchAndUpdateSubquery(node));\n  }\n};\n\nexport const bootstrapGraph = (\n  defaults = [], // set default filter value\n  loadFilters = [], // load (fetch) filter values\n  _resetGraph = false,\n) => async (dispatch, getState) => {\n  let { queries } = getState().universal;\n\n  if (_resetGraph) {\n    dispatch(resetGraph());\n    queries = resetGlobalFilters(queries, defaults);\n  }\n  intercom('update');\n\n  const { metadata, graph, queriesEnabled } = await dispatch(initialise());\n\n  dispatch(setUiOptions(metadata.metricCategories));\n\n  // [2] - set global filters\n  dispatch(setGlobalFiltersFromQueries({ queries, graph }));\n\n  // [PREREQUISITES]\n  if (metadata.prerequisites) {\n    await dispatch(setUpPrerequisites(graph, metadata, queries));\n  }\n\n  // [3] - Get / set values for global universal filters\n  try {\n    if (loadFilters.includes('globalFilters')) {\n      await _loadGlobalFilters(dispatch, getState);\n    }\n\n    if (defaults.includes('globalFilters')) {\n      _setGlobalFilters(dispatch, getState);\n    }\n  } catch (err) {\n    if (err instanceof NoValuesForGlobalFilterError) return;\n\n    throw err;\n  }\n\n  // [4] - Mutate the graph with new potential new nodes\n  await dispatch(setUpAdditionalFields(graph, metadata, queriesEnabled));\n\n  // Graph might have changed, re-compute missing options\n  dispatch(setInitialQueries(queries));\n\n  await dispatch(_loadVIPFilters(defaults.includes('vipFilters')));\n\n  // Config is ready we can now reveal the config\n  dispatch(setConfigReady());\n\n  // Fetch (async) subquery data for filters\n  dispatch(fetchSubqueryData(defaults));\n};\n","import { every } from 'lodash';\nimport { isValidEmail } from '../lib/user';\n\nconst validateEmailAddresses = addresses => every(addresses, isValidEmail);\n\nexport { validateEmailAddresses };\n","import { find } from 'lodash';\nimport { trackEvent } from '@Tracking';\nimport { permissionsChanged } from '@Tracking/events';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport * as toastActions from '../../toast/actions';\nimport * as toastConstants from '../../toast/toast-constants';\nimport {\n  getGroupDashboards as getGroupDashboardsService,\n  getPeople as getPeopleService,\n  getServiceAccounts as getGroupDataSourcesService,\n  deleteServiceAccount as deleteDataSourceService,\n} from '../../services/management-service';\nimport * as permissionService from '../../services/permission-service';\nimport { auth as reconnectOAuth } from '../../lib/oauth';\nimport { open as openPopup } from '../../lib/popup-window';\nimport { validateEmailAddresses } from '../../people/helpers';\nimport { getUserDisplayName } from '../../admin/helpers';\nimport { router } from '../../router';\nimport {\n  track,\n  trackSnowplow,\n  userPermissionConstants,\n} from '../../lib/tracker';\nimport { formatMessage } from '../../lib/i18n';\nimport waitForState from '../../lib/wait-for-state';\nimport { userById } from '../../admin/reducer';\n\nexport const getDashboardsStart = createAction('Groups:GET_DASHBOARDS_START');\nexport const getDashboardsSuccess = createAction(\n  'Groups:GET_DASHBOARDS_SUCCESS',\n);\nexport const getDashboardsFailed = createErrorAction(\n  'Groups:GET_DASHBOARDS_FAILED',\n);\n\nexport const getPeopleStart = createAction('Groups:GET_PEOPLE_START');\nexport const getPeopleSuccess = createAction('Groups:GET_PEOPLE_SUCCESS');\nexport const getPeopleFailed = createErrorAction('Groups:GET_PEOPLE_FAILED');\n\nexport const getDataSourcesStart = createAction(\n  'Groups:GET_DATA_SOURCES_START',\n);\nexport const getDataSourcesSuccess = createAction(\n  'Groups:GET_DATA_SOURCES_SUCCESS',\n);\nexport const getDataSourcesFailed = createErrorAction(\n  'Groups:GET_DATA_SOURCES_FAILED',\n);\n\nexport const setPermissionsStart = createAction('Groups:SET_PERMISSIONS_START');\nexport const setPermissionsSuccess = createAction(\n  'Groups:SET_PERMISSIONS_SUCCESS',\n);\nexport const setPermissionsFailed = createErrorAction(\n  'Groups:SET_PERMISSIONS_FAILED',\n);\n\nexport const revokeAccountOwnerStart = createAction(\n  'Groups:REVOKE_ACCOUNT_OWNER_START',\n);\nexport const revokeAccountOwnerSuccess = createAction(\n  'Groups:REVOKE_ACCOUNT_OWNER_SUCCESS',\n);\nexport const revokeAccountOwnerFailed = createErrorAction(\n  'Groups:REVOKE_ACCOUNT_OWNER_FAILED',\n);\n\nexport const makeAccountOwnerStart = createAction(\n  'Groups:MAKE_ACCOUNT_OWNER_START',\n);\nexport const makeAccountOwnerSuccess = createAction(\n  'Groups:MAKE_ACCOUNT_OWNER_SUCCESS',\n);\nexport const makeAccountOwnerFailed = createErrorAction(\n  'Groups:MAKE_ACCOUNT_OWNER_FAILED',\n);\n\nexport const demoteToDashboardViewOnlyStart = createAction(\n  'Groups:DEMOTE_TO_DASHBOARD_VIEW_ONLY_START',\n);\nexport const demoteToDashboardViewOnlySuccessful = createAction(\n  'Groups:DEMOTE_TO_DASHBOARD_VIEW_ONLY_SUCCESSFUL',\n);\nexport const demoteToDashboardViewOnlyFailed = createAction(\n  'Groups:DEMOTE_TO_DASHBOARD_VIEW_ONLY_FAILED',\n);\n\nexport const promoteToMemberStart = createAction(\n  'Groups:PROMOTE_TO_MEMBER_START',\n);\nexport const promoteToMemberSuccess = createAction(\n  'Groups:PROMOTE_TO_MEMBER_SUCCESS',\n);\nexport const promoteToMemberFailed = createErrorAction(\n  'Groups:PROMOTE_TO_MEMBER_FAILED',\n);\n\nexport const inviteMembersStart = createAction('Groups:INVITE_MEMBERS_START');\nexport const inviteMembersSuccess = createAction(\n  'Groups:INVITE_MEMBERS_SUCCESS',\n);\nexport const inviteMembersFailed = createErrorAction(\n  'Groups:INVITE_MEMBERS_FAILED',\n);\nexport const inviteMembersEmailInvalid = createErrorAction(\n  'Groups:INVITE_MEMBERS_EMAIL_INVALID',\n);\nexport const inviteMembersClearError = createErrorAction(\n  'Groups:INVITE_MEMBERS_CLEAR_ERROR',\n);\n\nexport const openReconnectModal = createAction('Groups:OPEN_RECONNECT_MODAL');\nexport const closeReconnectModal = createAction('Groups:CLOSE_RECONNECT_MODAL');\nexport const reconnectDataSourceStart = createAction(\n  'Groups:RECONNECT_DATA_SOURCE_START',\n);\nexport const reconnectDataSourceSuccess = createAction(\n  'Groups:RECONNECT_DATA_SOURCE_SUCCESS',\n);\nexport const reconnectDataSourceCancelled = createAction(\n  'Groups:RECONNECT_DATA_SOURCE_CANCELLED',\n);\nexport const reconnectDataSourceFailed = createErrorAction(\n  'Groups:RECONNECT_DATA_SOURCE_FAILED',\n);\n\nexport const deleteDataSourceStart = createAction(\n  'Groups:DELETE_DATA_SOURCE_START',\n);\nexport const deleteDataSourceSuccess = createAction(\n  'Groups:DELETE_DATA_SOURCE_SUCCESS',\n);\nexport const deleteDataSourceFailed = createErrorAction(\n  'Groups:DELETE_DATA_SOURCE_FAILED',\n);\n\nexport const openDashboardPermissionsModalStart = createAction(\n  'Groups:OPEN_DASHBOARD_PERMISSIONS_MODAL_START',\n);\nexport const openDashboardPermissionsModalSuccess = createAction(\n  'Groups:OPEN_DASHBOARD_PERMISSIONS_MODAL_SUCCESS',\n);\nexport const openDashboardPermissionsModalFailed = createErrorAction(\n  'Groups:OPEN_DASHBOARD_PERMISSIONS_MODAL_FAILED',\n);\n\nexport const openUserPermissionsModalStart = createAction(\n  'Groups:OPEN_USER_PERMISSIONS_MODAL_START',\n);\nexport const openUserPermissionsModalSuccess = createAction(\n  'Groups:OPEN_USER_PERMISSIONS_MODAL_SUCCESS',\n);\nexport const openUserPermissionsModalFailed = createErrorAction(\n  'Groups:OPEN_USER_PERMISSIONS_MODAL_FAILED',\n);\n\nconst trackPermissionsChange = (prevRole, nextRole, source) => {\n  const properties = {\n    target_user_previous_permission: prevRole,\n    target_user_new_permission: nextRole,\n  };\n\n  if (source) properties.source = source;\n\n  track('Changed permission', {\n    properties,\n  });\n\n  trackEvent(\n    permissionsChanged({\n      'From permission': prevRole,\n      'To permission': nextRole,\n    }),\n  );\n};\n\nexport const getDashboards = groupId => async dispatch => {\n  dispatch(getDashboardsStart(groupId));\n\n  try {\n    const dashboards = await getGroupDashboardsService(groupId);\n\n    dispatch(getDashboardsSuccess(dashboards));\n  } catch (error) {\n    dispatch(getDashboardsFailed(error));\n\n    // Rethrow the error because this thunk is composed by the\n    // openDashboardPermissionsModal groups action, which\n    // needs to know if this action fails.\n    throw error;\n  }\n};\n\nexport const getPeople = () => async dispatch => {\n  dispatch(getPeopleStart());\n\n  try {\n    const people = await getPeopleService();\n\n    dispatch(getPeopleSuccess({ people }));\n  } catch (error) {\n    dispatch(getPeopleFailed(error));\n\n    // Re-throw error as this action is used in\n    // `inviteMembers` and `openUserPermissionsModal`\n    throw error;\n  }\n};\n\nexport const getDataSources = groupId => async dispatch => {\n  dispatch(getDataSourcesStart());\n\n  try {\n    const dataSources = await getGroupDataSourcesService(groupId);\n\n    dispatch(getDataSourcesSuccess({ dataSources }));\n  } catch (error) {\n    dispatch(getDataSourcesFailed(error));\n  }\n};\n\nconst getNameForUserWithId = (getState, userId) => {\n  const { allUsers } = getState();\n\n  const user = userById(allUsers, userId);\n\n  return getUserDisplayName(user);\n};\n\nconst getEmailForUserWithId = (getState, userId) => {\n  const { allUsers } = getState();\n\n  const { email } = userById(allUsers, userId) || {};\n\n  return email;\n};\n\nconst getRoleForUser = (getState, userId) => {\n  const { allUsers } = getState();\n  const { permission } = find(allUsers.members, { id: userId });\n  return permission;\n};\n\nconst getTrackingStringFromRole = role => {\n  return role === 'admin'\n    ? userPermissionConstants.GROUP_ADMIN\n    : userPermissionConstants.GROUP_VIEWER;\n};\n\nexport const setPermissions = (groupId, userId, role) => async (\n  dispatch,\n  getState,\n) => {\n  const previousRole = getRoleForUser(getState, userId);\n  dispatch(setPermissionsStart({ userId, role }));\n\n  try {\n    await permissionService.setRole(groupId, userId, role);\n\n    trackPermissionsChange(\n      getTrackingStringFromRole(previousRole),\n      getTrackingStringFromRole(role),\n    );\n\n    dispatch(setPermissionsSuccess());\n  } catch (error) {\n    dispatch(setPermissionsFailed(error, { userId, role: previousRole }));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const revokeAccountOwner = (userId, groupId) => async (\n  dispatch,\n  getState,\n) => {\n  dispatch(revokeAccountOwnerStart(userId));\n\n  try {\n    const revokeeName = getNameForUserWithId(getState, userId);\n\n    await permissionService.revokeAccountOwner(userId, groupId);\n\n    trackPermissionsChange(\n      userPermissionConstants.OWNER,\n      userPermissionConstants.GROUP_ADMIN,\n    );\n\n    dispatch(revokeAccountOwnerSuccess({ userId }));\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('groups.people.revokeOwnerSuccessful', { revokeeName }),\n      ),\n    );\n  } catch (error) {\n    dispatch(revokeAccountOwnerFailed(error, userId));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const makeAccountOwner = userId => async (dispatch, getState) => {\n  dispatch(makeAccountOwnerStart(userId));\n\n  try {\n    await permissionService.makeAccountOwner(userId);\n\n    const previousRole = getRoleForUser(getState, userId);\n\n    trackPermissionsChange(\n      getTrackingStringFromRole(previousRole),\n      userPermissionConstants.OWNER,\n    );\n\n    dispatch(makeAccountOwnerSuccess(userId));\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('groups.people.makeOwnerSuccessful'),\n      ),\n    );\n  } catch (error) {\n    dispatch(makeAccountOwnerFailed(error, userId));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const demoteToDashboardViewOnly = (\n  groupId,\n  userId,\n  source = 'Group members page',\n) => async (dispatch, getState) => {\n  try {\n    dispatch(demoteToDashboardViewOnlyStart({ userId }));\n    await permissionService.removeUserFromGroup(groupId, userId);\n\n    const previousRole = getRoleForUser(getState, userId);\n\n    trackPermissionsChange(\n      getTrackingStringFromRole(previousRole),\n      userPermissionConstants.DASHBOARD_VIEWER,\n      source,\n    );\n\n    dispatch(demoteToDashboardViewOnlySuccessful({ userId }));\n    dispatch(\n      toastActions.showToast({\n        type: toastConstants.DEMOTED_TO_DASHBOARD_VIEW_ONLY,\n        userId,\n      }),\n    );\n  } catch (e) {\n    dispatch(demoteToDashboardViewOnlyFailed({ userId }));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const promoteToMember = (userId, groupId) => async (\n  dispatch,\n  getState,\n) => {\n  dispatch(promoteToMemberStart({ userId }));\n\n  try {\n    const userName = getNameForUserWithId(getState, userId);\n    const email = getEmailForUserWithId(getState, userId);\n\n    await permissionService.promoteToMember(email, groupId);\n\n    trackPermissionsChange(\n      userPermissionConstants.DASHBOARD_VIEWER,\n      userPermissionConstants.GROUP_VIEWER,\n    );\n\n    dispatch(promoteToMemberSuccess({ userId }));\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('groups.people.promoteToMemberSuccessful', { userName }),\n      ),\n    );\n  } catch (error) {\n    dispatch(promoteToMemberFailed(error, { userId }));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nconst getInviteErrorPayload = error => {\n  if (!error.errors) {\n    return { id: 'people.errorMessage' };\n  }\n\n  const [firstError] = error.errors;\n\n  const getEmailAddressValues = () => {\n    const { addresses: faultyAddresses = [] } = firstError;\n    const count = faultyAddresses.length;\n    const addressesStr = faultyAddresses.join(', ');\n    return { addressesStr, count };\n  };\n\n  switch (firstError.type) {\n    case 'ErrInviteLimitExceeded':\n      const { count: remaining = 0 } = firstError;\n      if (remaining === 0) {\n        return {\n          id: 'people.errorMessage.errInviteLimitExceededZero',\n        };\n      }\n\n      return {\n        id: 'people.errorMessage.errInviteLimitExceeded',\n        values: { remaining },\n      };\n    case 'ErrInAnotherOrganization':\n      return {\n        id: 'people.errorMessage.errInAnotherOrganization',\n        values: getEmailAddressValues(),\n      };\n    case 'ErrAlreadyHasAccess':\n      return {\n        id: 'people.errorMessage.errAlreadyHasAccess',\n        values: getEmailAddressValues(),\n      };\n    default:\n      return { id: 'people.errorMessage' };\n  }\n};\n\nexport const inviteMembers = (groupId, addresses, role) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n  const emails = addresses.split(',').map(s => s.trim());\n\n  if (!validateEmailAddresses(emails)) {\n    dispatch(inviteMembersEmailInvalid());\n    return;\n  }\n\n  dispatch(inviteMembersStart());\n\n  const newUsers = emails.map(email => ({ type: 'user', role, email }));\n\n  try {\n    await permissionService.inviteUsersToGroup(groupId, newUsers);\n\n    const trackingPermission =\n      role === 'admin'\n        ? userPermissionConstants.GROUP_ADMIN\n        : userPermissionConstants.GROUP_VIEWER;\n    track('Added User', {\n      properties: {\n        source: 'invite modal',\n        target_user_permission: trackingPermission,\n      },\n    });\n    trackSnowplow('user_add', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n    });\n\n    dispatch(inviteMembersSuccess());\n    dispatch(getPeople());\n    dispatch(toastActions.showSuccessToast(formatMessage('people.inviteSent')));\n\n    router.removeQueryParam('invite');\n    router.removeQueryParam('invite-admin');\n  } catch (error) {\n    const payload = getInviteErrorPayload(error);\n\n    dispatch(inviteMembersFailed(error, payload));\n  }\n};\n\nexport const deleteDataSource = (\n  groupId,\n  dataSourceId,\n  deleteAssociatedWidgets,\n) => async dispatch => {\n  dispatch(deleteDataSourceStart());\n\n  try {\n    await deleteDataSourceService(\n      groupId,\n      dataSourceId,\n      deleteAssociatedWidgets,\n    );\n    dispatch(deleteDataSourceSuccess({ dataSourceId }));\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('groups.deleteDataSourceSuccessMessage'),\n      ),\n    );\n  } catch (error) {\n    dispatch(deleteDataSourceFailed());\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const reconnectDataSource = (groupId, dataSource) => async dispatch => {\n  const { service, id: dataSourceId } = dataSource;\n\n  dispatch(closeReconnectModal());\n  dispatch(reconnectDataSourceStart());\n\n  try {\n    const popup = openPopup('geckoOAuth');\n    await reconnectOAuth(popup, service, groupId, {}, dataSourceId);\n\n    dispatch(reconnectDataSourceSuccess({ dataSourceId }));\n  } catch (error) {\n    if ('Window closed' === error.message) {\n      dispatch(reconnectDataSourceCancelled({ dataSourceId }));\n    } else {\n      dispatch(reconnectDataSourceFailed(error, { dataSourceId }));\n      dispatch(\n        toastActions.showErrorToast(\n          formatMessage('datasources.reconnectionFailed'),\n        ),\n      );\n    }\n  }\n};\n\nexport const openDashboardPermissionsModal = (\n  groupId,\n  userId,\n) => async dispatch => {\n  dispatch(openDashboardPermissionsModalStart({ groupId, userId }));\n\n  try {\n    const groupDashboardsPromise = dispatch(getDashboards(groupId));\n\n    await groupDashboardsPromise;\n\n    dispatch(openDashboardPermissionsModalSuccess({ groupId, userId }));\n  } catch (error) {\n    dispatch(openDashboardPermissionsModalFailed(error, { groupId, userId }));\n  }\n};\n\nexport const openUserPermissionsModal = (groupId, dashboardId) => async (\n  dispatch,\n  getState,\n) => {\n  dispatch(openUserPermissionsModalStart({ groupId, dashboardId }));\n\n  try {\n    const groupDashboardsPromise = waitForState(getState, state => {\n      return Object.keys(state.allDashboards).length > 0;\n    });\n\n    await groupDashboardsPromise;\n\n    dispatch(openUserPermissionsModalSuccess({ groupId, dashboardId }));\n  } catch (error) {\n    dispatch(openUserPermissionsModalFailed(error, { groupId, dashboardId }));\n  }\n};\n\nexport const resendInvite = (groupId, userId) => async (dispatch, getState) => {\n  try {\n    await permissionService.resendInvite(groupId, userId);\n\n    const { owners, members, viewers } = getState().allUsers;\n    const { email } = [...owners, ...members, ...viewers].find(\n      user => user.id === userId,\n    );\n\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('people.resendInviteSuccess', { email }),\n      ),\n    );\n  } catch (err) {\n    if (err.type === 'ErrResendInviteRateLimitExceeded') {\n      dispatch(\n        toastActions.showErrorToast(\n          formatMessage('people.errorMessage.errResendInviteRateLimitExceeded'),\n        ),\n      );\n    } else {\n      dispatch(toastActions.showGenericErrorToast());\n    }\n  }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport style from './icon.scss';\n\nconst FONTS = {\n  FONT_AWESOME: 'fa',\n  GECKO_FONT: 'gecko',\n};\n\nconst FONT_WEIGHTS = {\n  FA_REGULAR: 'far',\n  FA_SOLID: 'fas',\n  FA_LIGHT: 'fal',\n};\n\nconst Icon = ({ name, muted, light, font, fontWeight }) => {\n  const className = classNames(\n    {\n      [`${fontWeight} fa-${name}`]: font === 'fa',\n      [`${style['gecko-font']} ${style[`gecko-${name}`]}`]: font === 'gecko',\n    },\n    { [style.muted]: !!muted },\n    { [style.light]: !!light },\n    { [style.default]: !light && !muted },\n  );\n  return <span className={className} aria-hidden=\"true\" />;\n};\n\nIcon.FONTS = FONTS;\nIcon.FONT_WEIGHTS = FONT_WEIGHTS;\n\nIcon.defaultProps = {\n  font: FONTS.FONT_AWESOME,\n  fontWeight: FONT_WEIGHTS.FA_SOLID,\n  muted: false,\n  light: false,\n};\n\nIcon.propTypes = {\n  name: PropTypes.string.isRequired,\n  font: PropTypes.oneOf([FONTS.FONT_AWESOME, FONTS.GECKO_FONT]),\n  fontWeight: PropTypes.oneOf([\n    FONT_WEIGHTS.FA_REGULAR,\n    FONT_WEIGHTS.FA_SOLID,\n    FONT_WEIGHTS.FA_LIGHT,\n  ]),\n  light: PropTypes.bool,\n  muted: PropTypes.bool,\n};\n\nexport default Icon;\n","import Icon from './icon';\n\nexport default Icon;\n","module.exports = vendor;","import { isEmpty, some, negate, find } from 'lodash';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport * as toastActions from '../../toast/actions';\nimport { INVITED_TAB_INDEX } from '../dashboard-constants';\nimport {\n  getDashboard,\n  getAllDashboards,\n} from '../../services/management-service';\nimport {\n  updateDashboard,\n  getViewOnlyUsers as getViewOnlyUsersService,\n} from '../../services/dashboard-service';\nimport { inviteReadOnlyUsers } from '../../services/permission-service';\nimport { fetchUsers } from '../../people/actions/people-actions';\nimport { isValidEmail } from '../../lib/user';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { formatMessage } from '../../lib/i18n';\nimport { redirect, getWindow } from '../../lib/global';\nimport { STORAGE_IMPORTING_SERVICE } from '../dashboard-constants';\nimport { trackEvent } from '@Tracking';\nimport {\n  dashboardCreatedSharingLink,\n  dashboardDeletedSharingLink,\n} from '@Tracking/events';\n\nexport const addDashboard = createAction('Dashboard:ADD_DASHBOARD');\nexport const deleteDashboard = createAction('Dashboard:DELETE_DASHBOARD');\nexport const changeDashboard = createAction('Dashboard:CHANGE_DASHBOARD');\nexport const setDashboards = createAction('Dashboard:SET_DASHBOARDS');\n\nexport const setDashboard = createAction('Dashboard:SET_DASHBOARD');\nexport const setAddress = createAction('Dashboard:SET_ADDRESS');\n\nexport const inviteUpdating = createAction('Dashboard:INVITE_UPDATING');\nexport const inviteSuccessful = createAction('Dashboard:INVITE_SUCCESSFULL');\nexport const inviteFailed = createAction('Dashboard:INVITE_FAILED');\nexport const setDashboardScaleFactor = createAction(\n  'Dashboard:SET_DASHBOARD_SCALE_FACTOR',\n);\nexport const setClassicboardScaleFactor = createAction(\n  'Dashboard:SET_CLASSICBOARD_SCALE_FACTOR',\n);\n\nexport const dashboardError = createErrorAction('Dashboard:ERROR');\nexport const updateSharingError = createErrorAction(\n  'Dashboard:UPDATE_SHARING_ERROR',\n);\nexport const inviteError = createErrorAction('Dashboard:INVITE_ERROR');\n\nexport const fetchDashboardStart = createAction(\n  'Dashboard:FETCH_DASHBOARD_START',\n);\nexport const toggleSharingStart = createAction(\n  'Dashboard:TOGGLE_SHARING_START',\n);\nexport const toggleSharingInviteTabStart = createAction(\n  'Dashboard:TOGGLE_SHARING_INVITE_START',\n);\nexport const addReadOnlyUsersStart = createAction(\n  'Dashboard:ADD_READONLY_USERS_START',\n);\n\nexport const setDashboardTitleStart = createAction(\n  'Dashboard:SET_DASHBOARD_TITLE_START',\n);\nexport const setDashboardTitleSuccess = createAction(\n  'Dashboard:SET_DASHBOARD_TITLE_SUCCESS',\n);\nexport const setDashboardTitleFailed = createErrorAction(\n  'Dashboard:SET_DASHBOARD_TITLE_FAILED',\n);\n\nexport const getViewOnlyUsersSuccess = createAction(\n  'Dashboard:GET_VIEW_ONLY_USERS_SUCCESS',\n);\nexport const setCurrentDashboardSharingLink = createAction(\n  'Dashboard:SET_CURRENT_DASHBOARD_SHARING_LINK',\n);\nexport const setIsMobile = createAction('Dashboard:SET_IS_MOBILE');\n\nexport const setImportingService = createAction(\n  'Dashboard:SET_IMPORTING_SERVICE',\n);\nexport const toggleImportingModal = createAction(\n  'Dashboard:TOGGLE_IMPORTING_MODAL',\n);\n\nexport const setSharingMode = createAction('Dashboard:SET_SHARING_MODE');\nexport const setEditMode = createAction('Dashboard:SET_EDIT_MODE');\n\nexport const initDashboard = dashboard => dispatch => {\n  dispatch(setDashboard(dashboard));\n\n  // Get the importing service from the local storage and store it in the state\n  const importingServiceRaw =\n    getWindow().sessionStorage.getItem(STORAGE_IMPORTING_SERVICE) || '{}';\n  const importingService = JSON.parse(importingServiceRaw);\n\n  if (!isEmpty(importingService)) {\n    dispatch(setImportingService(importingService));\n    getWindow().sessionStorage.removeItem(STORAGE_IMPORTING_SERVICE);\n  }\n};\n\nexport const getDashboardList = () => async dispatch => {\n  const dashboards = await getAllDashboards();\n  dispatch(setDashboards(dashboards));\n};\n\nexport const fetchDashboard = dashboardId => async dispatch => {\n  try {\n    dispatch(fetchDashboardStart(dashboardId));\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n  } catch (error) {\n    dispatch(dashboardError(error, 'dashboard.loadError'));\n  }\n};\n\nexport const toggleSharing = sharing => async (dispatch, getState) => {\n  const {\n    dashboard: { dashboard },\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n\n  try {\n    dispatch(toggleSharingStart(sharing));\n    const level = sharing ? 'public' : 'private';\n\n    track(`Make dashboard ${level}`);\n    trackSnowplow(`dashboard_make-${level}`, '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      group_id: `${dashboard.group_id}`,\n      dashboard_id: `${dashboard.id}`,\n      dashboard_name: `${dashboard.title}`,\n    });\n\n    const newDashboard = await updateDashboard(dashboard.id, {\n      ...dashboard,\n      sharing,\n    });\n    dispatch(setDashboard({ ...dashboard, ...newDashboard }));\n\n    if (sharing === true) {\n      trackEvent(dashboardCreatedSharingLink());\n    } else if (sharing === false) {\n      trackEvent(dashboardDeletedSharingLink());\n    }\n  } catch (error) {\n    dispatch(updateSharingError(error, 'sharing.updateSharingError'));\n  }\n};\n\nexport const toggleSharingInviteTab = index => async (dispatch, getState) => {\n  dispatch(toggleSharingInviteTabStart(index));\n\n  if (index !== INVITED_TAB_INDEX) {\n    // not invited tab\n    return;\n  }\n\n  const {\n    people: { users },\n    user,\n  } = getState();\n  if (!users) {\n    const { user: { default_group_id: groupId } = {} } = user;\n\n    await dispatch(fetchUsers(groupId));\n  }\n};\n\nexport const addReadOnlyUsers = (dashboardId, addresses) => async (\n  dispatch,\n  getState,\n) => {\n  dispatch(addReadOnlyUsersStart({ dashboardId, addresses }));\n\n  const emails = addresses.map(address => address.trim());\n\n  dispatch(inviteUpdating());\n\n  if (isEmpty(emails)) {\n    const error = new Error('ERR_NO_EMAILS_SUBMITTED');\n    dispatch(inviteError(error, 'share.invite.noEmailsSubmitted'));\n    return;\n  }\n\n  if (some(emails, negate(isValidEmail))) {\n    const error = new Error('ERR_INVALID_EMAIL');\n    dispatch(inviteError(error, 'share.invite.invalidEmail'));\n    return;\n  }\n\n  const {\n    people: { users: currentUsers },\n  } = getState();\n  const users = emails.map(email => {\n    const baseReadOnly = { type: 'user', role: 'read' };\n    const currentUser = find(currentUsers, { email });\n\n    if (currentUser) {\n      return { ...baseReadOnly, entity_id: currentUser.id };\n    }\n    return { ...baseReadOnly, email };\n  });\n\n  try {\n    const newUsers = await inviteReadOnlyUsers(dashboardId, users);\n    dispatch(inviteSuccessful(newUsers));\n    dispatch(toastActions.showSuccessToast(formatMessage('share.invite.sent')));\n  } catch (err) {\n    if (err.errors) {\n      // Adds a full stop for grammatical consistency.\n      dispatch(toastActions.showErrorToast(`${err.errors[0].messages[0]}.`));\n    } else {\n      dispatch(toastActions.showGenericErrorToast());\n    }\n\n    dispatch(inviteFailed());\n  }\n};\n\nexport const setDashboardTitle = title => async (dispatch, getState) => {\n  const {\n    dashboard: { dashboard },\n  } = getState();\n  const { id } = dashboard;\n\n  dispatch(setDashboardTitleStart(title));\n\n  try {\n    await updateDashboard(id, { ...dashboard, title });\n\n    dispatch(setDashboardTitleSuccess(title));\n    dispatchToGeckoJS('dashboard:refresh');\n  } catch (error) {\n    dispatch(setDashboardTitleFailed(error, title));\n  }\n};\n\n// Not wrapped in a try/catch as we need errors to propagate\n// as this is used in `openUserPermissionsModal`\nexport const getViewOnlyUsers = dashboardId => async dispatch => {\n  const users = await getViewOnlyUsersService(dashboardId);\n  // This assumes that the end point only returns dashboard view only users\n  // which seems to be the case in my testing.\n  const userIds = users.map(user => user.id);\n  dispatch(getViewOnlyUsersSuccess({ dashboardId, userIds }));\n};\n\nexport const addWidget = () => (dispatch, getState) => {\n  const {\n    dashboard: { dashboard: { id: dashboardId } = {} },\n  } = getState();\n  redirect(`/v4/dashboards/${dashboardId}`);\n};\n\nexport { INVITED_TAB_INDEX };\n","import {\n  showToast,\n  showSuccessToast,\n  showErrorToast,\n  showGenericErrorToast,\n  hideToast,\n  showScheduledToast,\n  scheduleToast,\n} from './toast-actions';\n\nexport {\n  showToast,\n  showSuccessToast,\n  showErrorToast,\n  showGenericErrorToast,\n  hideToast,\n  showScheduledToast,\n  scheduleToast,\n};\n","module.exports = (__webpack_require__(28))(175);","import createAction from '../../lib/redux/create-action';\nimport { dispatchEvent } from '../../lib/dispatch-event';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { showGenericErrorToast } from '../../toast/actions';\nimport { patchConfig } from '../../lib/widget-service';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  widgetIndicatorsAdded,\n  widgetIndicatorsEdited,\n  widgetIndicatorsDeleted,\n  widgetNumberFormattingEdited,\n} from '@Tracking/events';\nimport { isUniversal } from '../../lib/service';\nimport { isNumber, difference, filter, get, isEqual, isEmpty } from 'lodash';\nimport * as universalConfigSaveActions from '../../universal-config/actions/universal-config-save-actions';\nimport * as editWidgetActions from '../../widget/edit-widget/actions/edit-widget-actions';\nimport WidgetMenu from '../widget-menu-component';\nimport { getIntegrationTrackingDetails } from '../../data-sources/data-sources-helpers';\n\nexport const addRecord = createAction('WidgetMenu:ADD_RECORD');\nexport const removeRecord = createAction('WidgetMenu:REMOVE_RECORD');\nexport const openMenu = createAction('WidgetMenu:OPEN_MENU');\nexport const closeMenu = createAction('WidgetMenu:CLOSE_MENU');\nexport const openCopyModal = createAction('WidgetMenu:OPEN_COPY_MODAL');\nexport const updateNumberFormat = createAction(\n  'WidgetMenu:UPDATE_NUMBER_FORMAT',\n);\nexport const updateStatusIndicatorValue = createAction(\n  'WidgetMenu:UPDATE_STATUS_INDICATOR_VALUE',\n);\nexport const doOpenNumberFormatter = createAction(\n  'WidgetMenu:OPEN_NUMBER_FORMATTER',\n);\nexport const doOpenWidgetStatusIndicator = createAction(\n  'WidgetMenu:OPEN_WIDGET_STATUS_INDICATOR',\n);\nexport const saveNewNumberFormat = createAction(\n  'WidgetMenu:SAVE_NEW_NUMBER_FORMAT',\n);\nexport const saveNewIndicator = createAction('WidgetMenu:SAVE_NEW_INDICATOR');\nexport const openDeleteModal = createAction('WidgetMenu:OPEN_DELETE_MODAL');\nexport const openEditWidget = createAction('WidgetMenu:OPEN_EDIT_WIDGET');\nexport const toggleQueryEditor = createAction('WidgetMenu:TOGGLE_QUERY_EDITOR');\nexport const openNumberFormatter = widgetKey => (dispatch, getState) => {\n  const { widgets } = getState();\n  const widget = widgets[widgetKey];\n  const { config: { numberFormat } = {} } = widget;\n\n  dispatch(doOpenNumberFormatter(numberFormat));\n};\n\nexport const openWidgetStatusIndicator = widgetKey => (dispatch, getState) => {\n  const { widgets = {} } = getState();\n  const {\n    config: { indicators },\n  } = widgets[widgetKey];\n\n  dispatch(doOpenWidgetStatusIndicator(indicators));\n};\n\nexport const doCloseMenu = () => (dispatch, getState) => {\n  const { widgetKey } = getState().widgetMenu;\n\n  dispatch(closeMenu());\n  dispatchToGeckoJS('widget-menu', {\n    open: false,\n    widgetKey,\n  });\n};\n\nexport const handleIndicatorTracking = async (\n  widget,\n  store,\n  newIndicators,\n  integration,\n) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    dashboard: { dashboard: { id: dashboardId } = {} } = {},\n  } = store;\n\n  const originalIndicators = get(widget, 'config.indicators', {});\n  // Pull out a list of the new types of indicators that have been added\n  const getStates = indicatorsList =>\n    filter(indicatorsList, i => !isNumber(i) && i !== 'neutral');\n\n  // these will check if there are new indicators and only keep those\n  const newStates = difference(\n    getStates(newIndicators.thresholds),\n    getStates(originalIndicators.thresholds),\n  );\n\n  const hasRemovedIndicators =\n    isEmpty(newIndicators.thresholds) &&\n    !isEmpty(originalIndicators.thresholds);\n  const hasAddedIndicators =\n    !isEmpty(newIndicators.thresholds) &&\n    isEmpty(originalIndicators.thresholds);\n  // only send an edited event if there are new states\n  const hasEditedIndicators = !isEqual(newIndicators, originalIndicators);\n\n  // legacy tracking\n  newStates.forEach(state => {\n    track('Indicator set', {\n      properties: {\n        type: state,\n        userId,\n        orgId,\n        widgetId: widget.id,\n        dashboardId,\n      },\n    });\n  });\n\n  const trackingProps = {\n    'Legacy widget ID': `${widget.id}`,\n    Visualisation: widget.visualisation.vizType,\n    'Widget type ID': `${widget.widgetType.id}`,\n    'Widget type name': widget.widgetType.title,\n    ...getIntegrationTrackingDetails(integration),\n  };\n\n  if (hasRemovedIndicators) {\n    await trackEvent(widgetIndicatorsDeleted(trackingProps));\n  } else if (hasAddedIndicators) {\n    await trackEvent(widgetIndicatorsAdded(trackingProps));\n  } else if (hasEditedIndicators) {\n    await trackEvent(widgetIndicatorsEdited(trackingProps));\n  }\n};\n\nexport const saveIndicatorConfig = ({ key }) => async (dispatch, getState) => {\n  try {\n    const {\n      widgetMenu: { indicators: newIndicators },\n      widgets: { [key]: widget },\n    } = getState();\n\n    dispatch(doCloseMenu());\n    dispatch(saveNewIndicator({ widgetKey: key, indicators: newIndicators }));\n    dispatchToGeckoJS('widget:indicators:change', {\n      widgetKey: key,\n      indicators: newIndicators,\n    });\n\n    const integration = {\n      name: widget.serviceTitle,\n      slug: widget.serviceName,\n    };\n\n    await handleIndicatorTracking(\n      widget,\n      getState(),\n      newIndicators,\n      integration,\n    );\n\n    await patchConfig(key, { indicators: newIndicators });\n  } catch (e) {\n    dispatch(showGenericErrorToast());\n  }\n};\n\nexport const deleteStatusIndicatorConfig = ({ key }) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    dashboard: { dashboard: { id: dashboardId } = {} } = {},\n    widgets,\n  } = getState();\n  const widget = widgets[key];\n\n  try {\n    dispatch(doCloseMenu());\n    dispatch(saveNewIndicator({ widgetKey: key, indicators: [] }));\n\n    track('Indicators deleted', {\n      properties: {\n        userId,\n        orgId,\n        widgetId: widget.id,\n        dashboardId,\n      },\n    });\n\n    trackEvent(\n      widgetIndicatorsDeleted({\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.visualisation.vizType,\n        'Widget type ID': `${widget.widgetType.id}`,\n        'Widget type name': widget.widgetType.title,\n        ...getIntegrationTrackingDetails({\n          name: widget.serviceTitle,\n          slug: widget.serviceName,\n        }),\n      }),\n    );\n\n    dispatchToGeckoJS('widget:indicators:change', {\n      widgetKey: key,\n      indicators: [],\n    });\n\n    await patchConfig(key, { indicators: [] });\n  } catch (e) {\n    dispatch(showGenericErrorToast());\n  }\n};\n\nexport const handleNumberFormattingTracking = (\n  widget,\n  newConfig,\n  integration,\n) => {\n  const { numberFormat } = newConfig;\n  const { numberFormat: oldFormat } = widget.config || {};\n\n  if (isEqual(numberFormat, oldFormat)) {\n    return Promise.resolve();\n  }\n\n  track('Number formatting edited');\n\n  return trackEvent(\n    widgetNumberFormattingEdited({\n      'Legacy widget ID': `${widget.id}`,\n      Visualisation: widget.visualisation.vizType,\n      'Widget type ID': `${widget.widgetType.id}`,\n      'Widget type name': widget.widgetType.title,\n      ...getIntegrationTrackingDetails(integration),\n    }),\n  );\n};\n\nexport const saveNumberFormat = (widgetKey, target) => (dispatch, getState) => {\n  const { numberFormat } = getState().widgetMenu;\n  const widget = getState().widgets[widgetKey];\n\n  dispatch(doCloseMenu());\n  dispatch(saveNewNumberFormat({ widgetKey, numberFormat }));\n\n  dispatchEvent(target, 'widget-action', {\n    type: 'widget:config:change',\n    config: { numberFormat },\n  });\n\n  patchConfig(widgetKey, { numberFormat });\n\n  const integration = {\n    name: widget.serviceTitle,\n    slug: widget.serviceName,\n  };\n\n  handleNumberFormattingTracking(widget, { numberFormat }, integration);\n};\n\nexport const closeAndSave = () => (dispatch, getState) => {\n  const state = getState();\n\n  if (state.widgetMenu.view !== WidgetMenu.VIEWS.EDIT) {\n    dispatch(doCloseMenu());\n    return;\n  }\n\n  const { widgetKey, serviceName } = state.editWidget;\n  const { dashboard } = state.dashboard;\n\n  if (isUniversal(serviceName)) {\n    dispatch(universalConfigSaveActions.updateWidget(widgetKey, dashboard.id));\n  } else {\n    dispatch(editWidgetActions.updateWidget(widgetKey, dashboard.id));\n  }\n  dispatch(doCloseMenu());\n};\n","import { forEach } from 'lodash';\nimport { getLogoUploadLink } from './management-service';\n\nconst postLogo = (url, body) => {\n  // Expect external URL like S3 here. No need to apply csrfFetch\n  return fetch(url, {\n    method: 'POST',\n    body,\n    headers: {\n      enctype: 'multipart/form-data',\n    },\n  }).then(response => {\n    if (response.status === 204) {\n      return response;\n    }\n    throw new Error('Logo upload failed');\n  });\n};\n\nexport const uploadLogo = async (dashboardId, file) => {\n  const {\n    upload: { url, fields },\n  } = await getLogoUploadLink(dashboardId, file.name);\n\n  const formData = new FormData();\n  forEach(fields, (value, key) => {\n    formData.append(key, value);\n  });\n  formData.append('file', file);\n\n  const postResponse = await postLogo(url, formData);\n  const { headers } = postResponse;\n\n  return decodeURIComponent(headers.get('location'));\n};\n","import { fetchJSONWithCredentials } from '../universal/fetch';\nimport config from '../universal/config';\n\nconst postCustomCSS = (url, body) => {\n  return fetchJSONWithCredentials(url, {\n    method: 'POST',\n    body,\n    headers: {\n      enctype: 'multipart/form-data',\n    },\n  });\n};\n\nexport const uploadCustomCSS = async (dashboardId, file) => {\n  const url = `${config.get().ManagementBaseURL}/dashboards/${dashboardId}/css`;\n\n  const formData = new FormData();\n  formData.append('css', file);\n\n  const dashboard = await postCustomCSS(url, formData);\n\n  const { css } = dashboard;\n\n  return css;\n};\n","import { without, mapValues } from 'lodash';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport {\n  UPLOAD_LOGO_STATE_STARTED,\n  UPLOAD_LOGO_STATE_FAILED,\n  UPLOAD_CUSTOM_CSS_STATE_STARTED,\n  UPLOAD_CUSTOM_CSS_STATE_FAILED,\n} from '../customize-constants';\nimport { FOOTER_SWITCHED_ON } from '../../toast/toast-constants';\nimport { router } from '../../router';\nimport { updateDashboard } from '../../services/dashboard-service';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport {\n  showGenericErrorToast,\n  showToast,\n} from '../../toast/actions/toast-actions';\nimport { moveOffCanvas } from '../../widget/actions/widget-actions';\nimport { refreshDashboard } from '../../services/app-service';\nimport { getWindow } from '../../lib/global';\nimport { uploadLogo as serviceUploadLogo } from '../../services/logo-upload-service';\nimport { uploadCustomCSS as serviceUploadCustomCSS } from '../../services/custom-css-upload-service';\nimport waitForState from '../../lib/wait-for-state';\nimport filterByAllowances from '../filter-by-allowances';\nimport { track } from '../../lib/tracker';\nimport { isWidgetOutOfFrame } from '../../dashboard/box-layout/helpers';\nimport { FRAME_WIDTH } from '../../dashboard/box-layout/box-layout-constants';\nimport { USER_THEME } from '../../dashboard/themes/theme-constants';\nimport { trackEvent } from '@Tracking';\nimport { dashboardSavedCustomization } from '@Tracking/events';\n\nexport const loading = createAction('Customize:LOADING');\nexport const initialiseValues = createAction('Customize:INITIALISE_VALUES');\nexport const cancel = createAction('Customize:CANCEL');\nexport const setTheme = createAction('Customize:SET_THEME');\nexport const setThemeBackground = createAction(\n  'Customize:SET_THEME_BACKGROUND',\n);\nexport const setThemeWidgetStyle = createAction(\n  'Customize:SET_THEME_WIDGET_STYLE',\n);\nexport const setShowGridPreview = createAction(\n  'Customize:SET_SHOW_GRID_PREVIEW',\n);\nexport const setScaleToFit = createAction('Customize:SET_SCALE_TO_FIT');\nexport const setTvMode = createAction('Customize:SET_TV_MODE');\nexport const setGridSize = createAction('Customize:SET_GRID_SIZE');\nexport const setLargeTitles = createAction('Customize:SET_LARGE_TITLES');\nexport const setShowFooter = createAction('Customize:SET_SHOW_FOOTER');\nexport const setShowClock = createAction('Customize:SET_SHOW_CLOCK');\nexport const setShowLogo = createAction('Customize:SET_SHOW_LOGO');\nexport const setLogoSuccessful = createAction('Customize:SET_LOGO_SUCCESSFUL');\nexport const setLogoFailed = createErrorAction('Customize:SET_LOGO_FAILED');\nexport const setLogoValidationFailed = createAction(\n  'Customize:SET_LOGO_VALIDATION_FAILED',\n);\nexport const saveStart = createAction('Customize:SAVE_START');\nexport const saveSuccessful = createAction('Customize:SAVE_SUCCESSFUL');\nexport const saveFailed = createErrorAction('Customize:SAVE_FAILED');\nexport const uploadLogoStart = createAction('Customize:UPLOAD_LOGO_START');\nexport const uploadLogoSuccessful = createAction(\n  'Customize:UPLOAD_LOGO_SUCCESSFUL',\n);\nexport const uploadLogoFailed = createErrorAction(\n  'Customize:UPLOAD_LOGO_FAILED',\n);\nexport const setCustomCSSValidationFailed = createAction(\n  'Customize:SET_CUSTOM_CSS_VALIDATION_FAILED',\n);\nexport const uploadCustomCSSStart = createAction(\n  'Customize:UPLOAD_CUSTOM_CSS_START',\n);\nexport const uploadCustomCSSSuccessful = createAction(\n  'Customize:UPLOAD_CUSTOM_CSS_SUCCESSFUL',\n);\nexport const uploadCustomCSSFailed = createErrorAction(\n  'Customize:UPLOAD_CUSTOM_CSS_FAILED',\n);\nexport const setCustomCSSLoaded = createErrorAction(\n  'Customize:SET_CUSTOM_CSS_LOADED',\n);\nexport const setColumns = createAction('Customize:SET_COLUMNS');\n\nexport const mount = () => async (dispatch, getState) => {\n  dispatch(loading());\n\n  await waitForState(\n    getState,\n    state => !!state.dashboard.dashboard && !!state.dashboard.areWidgetsLoaded,\n  );\n\n  const {\n    dashboard: { dashboard },\n    widgets,\n  } = getState();\n\n  dispatch(initialiseValues({ dashboard, widgets }));\n};\n\nconst waitForLogoUpload = async getState => {\n  let { uploadLogoState } = getState().customize;\n\n  if (uploadLogoState === UPLOAD_LOGO_STATE_STARTED) {\n    await waitForState(\n      getState,\n      state => state.customize.uploadLogoState !== UPLOAD_LOGO_STATE_STARTED,\n    );\n\n    ({ uploadLogoState } = getState().customize);\n    if (uploadLogoState === UPLOAD_LOGO_STATE_FAILED) {\n      throw new Error('Save cancelled due to logo upload failed.');\n    }\n  }\n};\n\nconst waitForCustomCSSUpload = async getState => {\n  let { uploadCustomCSSState } = getState().customize;\n\n  if (uploadCustomCSSState === UPLOAD_CUSTOM_CSS_STATE_STARTED) {\n    await waitForState(\n      getState,\n      state =>\n        state.customize.uploadCustomCSSState !==\n        UPLOAD_CUSTOM_CSS_STATE_STARTED,\n    );\n\n    ({ uploadCustomCSSState } = getState().customize);\n    if (uploadCustomCSSState === UPLOAD_CUSTOM_CSS_STATE_FAILED) {\n      throw new Error('Save cancelled due to Custom CSS upload failed.');\n    }\n  }\n};\n\nexport const save = () => async (dispatch, getState) => {\n  try {\n    dispatch(saveStart());\n\n    await Promise.all([\n      waitForLogoUpload(getState),\n      waitForCustomCSSUpload(getState),\n    ]);\n\n    const {\n      dashboard: {\n        dashboard,\n        dashboard: { tv_mode: currentTvMode, id, toggles },\n      },\n      customize,\n      user: { user: { allowances = {} } = {} },\n    } = getState();\n\n    const values = filterByAllowances(customize.values, allowances);\n\n    const {\n      theme,\n      themeBackgroundColor,\n      themeWidgetStyle,\n      scaleToFit,\n      tvMode,\n      showFooter,\n      showClock,\n      showLogo,\n      logoSrc,\n      widgets: { largeTitles },\n    } = values;\n\n    // Map `largeTitles` to a dashboard toggles\n    const newToggles = without(toggles, 'large_widget_titles');\n    if (largeTitles) {\n      newToggles.push('large_widget_titles');\n    }\n\n    const isGridLayout = newToggles.includes('grid');\n    const columns = isGridLayout\n      ? FRAME_WIDTH / values.gridSize\n      : values.columns;\n\n    const updatedDashboard = await updateDashboard(id, {\n      ...dashboard,\n      theme,\n      columns,\n      scale_when_fullscreen: scaleToFit,\n      tv_mode: tvMode,\n      toggles: newToggles,\n      customization: {\n        ...dashboard.customization,\n        themeBackgroundColor,\n        themeWidgetStyle,\n        showFooter,\n        showClock,\n        showLogo,\n        logoSrc,\n      },\n    });\n\n    // Move any off-frame widgets into the off-canvas area\n    if (isGridLayout) {\n      mapValues(customize.widgets, widget => {\n        if (isWidgetOutOfFrame(widget.layout)) {\n          dispatch(moveOffCanvas(widget.widgetKey, false));\n        }\n      });\n    }\n\n    dispatch(\n      saveSuccessful({\n        dashboard: updatedDashboard,\n        widgets: customize.widgets,\n      }),\n    );\n\n    if (!currentTvMode && tvMode) {\n      track('Customize Appearance saved with Fonts = Large');\n    }\n    if (currentTvMode && !tvMode) {\n      track('Customize Appearance saved with Fonts = Small');\n    }\n\n    trackEvent(\n      dashboardSavedCustomization({\n        Theme: theme,\n        ...(theme === USER_THEME && {\n          'Custom Theme Background Color': themeBackgroundColor,\n          'Custom Theme Widget Style': themeWidgetStyle,\n        }),\n        'Scale to fit': scaleToFit,\n        'TV font': tvMode,\n        'Show footer': showFooter,\n        'Show clock': showClock,\n        'Show logo': showLogo,\n        'Number of columns': columns,\n      }),\n    );\n\n    router.navigate(`/edit/dashboards/${id}`);\n\n    // Show toast if footer is shown\n    if (values.showFooter && !isGridLayout) {\n      dispatch(showToast({ type: FOOTER_SWITCHED_ON }));\n    }\n\n    // reload remote dashboards and current edit dashboard\n    refreshDashboard(id);\n    dispatchToGeckoJS('dashboard:refresh');\n  } catch (error) {\n    dispatch(saveFailed(error));\n    dispatch(showGenericErrorToast());\n  }\n};\n\nconst uploadLogo = file => async (dispatch, getState) => {\n  dispatch(uploadLogoStart());\n\n  try {\n    const {\n      dashboard: {\n        dashboard: { id },\n      },\n    } = getState();\n    const url = await serviceUploadLogo(id, file);\n\n    dispatch(uploadLogoSuccessful(url));\n  } catch (error) {\n    dispatch(uploadLogoFailed(error));\n  }\n};\n\nexport const setLogo = file => dispatch => {\n  try {\n    if (!file) {\n      dispatch(setLogoSuccessful(null));\n      return;\n    }\n\n    if (!['image/png', 'image/jpeg', 'image/gif'].includes(file.type)) {\n      dispatch(\n        setLogoValidationFailed('customize.validationFileTypeInvalidImage'),\n      );\n      return;\n    }\n\n    if (file.size > 2000000) {\n      dispatch(setLogoValidationFailed('customize.validationFileTooLarge'));\n      return;\n    }\n\n    const url = getWindow().URL.createObjectURL(file);\n\n    dispatch(setLogoSuccessful(url));\n    dispatch(uploadLogo(file));\n  } catch (error) {\n    dispatch(setLogoFailed(error, 'customize.errorPreviewingFile'));\n  }\n};\n\nconst uploadCustomCSS = file => async (dispatch, getState) => {\n  dispatch(uploadCustomCSSStart());\n\n  try {\n    const {\n      dashboard: {\n        dashboard: { id },\n      },\n    } = getState();\n    const url = await serviceUploadCustomCSS(id, file);\n\n    dispatch(uploadCustomCSSSuccessful(url));\n  } catch (error) {\n    dispatch(uploadCustomCSSFailed(error));\n  }\n};\n\nexport const setCustomCSS = file => dispatch => {\n  try {\n    if (!['text/css'].includes(file.type)) {\n      dispatch(\n        setCustomCSSValidationFailed('customize.validationFileTypeInvalidCSS'),\n      );\n      return;\n    }\n\n    if (file.size > 2000000) {\n      dispatch(\n        setCustomCSSValidationFailed('customize.validationFileTooLarge'),\n      );\n      return;\n    }\n\n    dispatch(uploadCustomCSS(file));\n  } catch (error) {\n    dispatch(uploadCustomCSSFailed(error));\n  }\n};\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { range, partial } from 'lodash';\nimport classNames from 'classnames';\n\nimport style from './loading-spinner.scss';\n\nconst THEMES = {\n  DARK: 'dark',\n  LIGHT: 'light',\n};\n\nconst SIZES = {\n  SMALL: 20,\n  MEDIUM: 32,\n  LARGE: 40,\n};\n\nclass LoadingSpinner extends Component {\n  renderCircle(theme, n) {\n    const classes = classNames(style.circle, style[`circle${n}`], {\n      [style.dark]: theme === 'dark',\n    });\n    return <div key={n} className={classes} />;\n  }\n\n  render() {\n    const { size, theme, delay } = this.props;\n    const renderCircle = partial(this.renderCircle, theme);\n\n    let inlineStyle = { width: size, height: size };\n\n    if (delay) {\n      const animation = 'cubic-bezier(1, 0, 1, 0)';\n      inlineStyle = {\n        WebkitAnimation: `${delay}ms ${animation}`,\n        MozAnimation: `${delay}ms ${animation}`,\n        OAnimation: `${delay}ms ${animation}`,\n      };\n    }\n\n    return (\n      <div className={style.wrapper} style={inlineStyle}>\n        {range(1, 13).map(renderCircle)}\n      </div>\n    );\n  }\n}\n\nLoadingSpinner.THEMES = THEMES;\nLoadingSpinner.SIZES = SIZES;\n\nLoadingSpinner.defaultProps = {\n  size: SIZES.SMALL,\n  theme: THEMES.LIGHT,\n  delay: 0,\n};\n\nLoadingSpinner.propTypes = {\n  delay: PropTypes.number,\n  size: PropTypes.oneOfType([\n    PropTypes.number,\n    PropTypes.oneOf([SIZES.SMALL, SIZES.MEDIUM, SIZES.LARGE]),\n  ]),\n  theme: PropTypes.oneOf([THEMES.LIGHT, THEMES.DARK]),\n};\n\nexport default LoadingSpinner;\n","import LoadingSpinner from './loading-spinner';\nexport default LoadingSpinner;\n","export const DARK_THEME = 'dark';\nexport const LIGHT_THEME = 'light';\nexport const NAVY_THEME = 'navy';\nexport const PURPLE_THEME = 'purple';\nexport const USER_THEME = 'user';\nexport const CUSTOM_THEME = 'custom';\nexport const DASHIES_DARK_THEME = 'dashiesDark';\nexport const DASHIES_LIGHT_THEME = 'dashiesLight';\nexport const VALID_THEMES = [\n  DARK_THEME,\n  LIGHT_THEME,\n  NAVY_THEME,\n  PURPLE_THEME,\n  USER_THEME,\n  CUSTOM_THEME,\n];\nexport const VALID_THEMES_INCLUDING_DASHIES = [\n  ...VALID_THEMES,\n  DASHIES_DARK_THEME,\n  DASHIES_LIGHT_THEME,\n];\nexport const DARK_WIDGET_STYLE = 'dark';\nexport const LIGHT_WIDGET_STYLE = 'light';\nexport const AUTO_WIDGET_STYLE = 'auto';\nexport const VALID_WIDGET_STYLES = [\n  DARK_WIDGET_STYLE,\n  LIGHT_WIDGET_STYLE,\n  AUTO_WIDGET_STYLE,\n];\n","import {\n  chain,\n  dropRightWhile,\n  findIndex,\n  forEachRight,\n  isNumber,\n  isUndefined,\n  reverse,\n  reduce,\n} from 'lodash';\n\nconst GROUPING_RE = /(\\d)(?=(\\d{3})+(?!\\d))/g;\n\nconst FALLBACK_CURRENCIES = {\n  USD: '$',\n  GBP: '£',\n  EUR: '€',\n};\n\nconst ABBREVIATIONS = {\n  T: {\n    abbreviation: 'T', // trillions\n    divider: 1e12,\n  },\n  B: {\n    abbreviation: 'B', // billions\n    divider: 1e9,\n  },\n  M: {\n    abbreviation: 'M', // millions\n    divider: 1e6,\n  },\n  K: {\n    abbreviation: 'K', // thousands\n    divider: 1e3,\n  },\n  none: {\n    abbreviation: undefined, // disabled abbreviation\n    divider: 1,\n  },\n};\n\nconst MAX_PRECISION = 20;\n\nconst DURATION_UNIT = {\n  years: 'y',\n  days: 'd',\n  hours: 'h',\n  minutes: 'm',\n  seconds: 's',\n  milliseconds: 'ms',\n};\n\nlet LOCALE_SUPPORT = false;\n// Test for support of the locales arg in `toLocaleString`\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString#Example:_Checking_for_support_for_locales_and_options_arguments\ntry {\n  (0).toLocaleString('i');\n} catch (e) {\n  LOCALE_SUPPORT = e.name === 'RangeError';\n}\n\n// return abbreviation for huge numbers\nfunction getAbbreviation(value, abbreviation) {\n  if (!isUndefined(abbreviation)) {\n    return ABBREVIATIONS[abbreviation];\n  }\n\n  if (value >= 1e12) {\n    return ABBREVIATIONS.T;\n  } else if (value >= 1e9) {\n    return ABBREVIATIONS.B;\n  } else if (value >= 1e6) {\n    return ABBREVIATIONS.M;\n  } else if (value >= 1e4) {\n    return ABBREVIATIONS.K;\n  }\n\n  return ABBREVIATIONS.none;\n}\n\n/*\n * Rules for decimal places\n * If abbreviation then up to 1 decimal place\n * If number < 10 then up to 3 decimal places\n * If number < 100 then up to 2 decimal places\n * If number < 1000 then up to 1 decimal place\n * If number >= 1000 then 0 decimal place\n */\nfunction getPrecision(value, abbreviation) {\n  if (!isUndefined(abbreviation) && abbreviation !== 'none') {\n    return 1;\n  }\n\n  if (value < 10) {\n    return 3;\n  } else if (value < 100) {\n    return 2;\n  } else if (value < 1000) {\n    return 1;\n  }\n\n  return 0;\n}\n\nfunction getSuffix(format, unit, prefix, suffix, currencySuffix) {\n  const hasPrefixOrSuffix = !isUndefined(prefix) || !isUndefined(suffix);\n  if (hasPrefixOrSuffix) {\n    return suffix;\n  }\n\n  switch (format) {\n    case 'decimal':\n      return unit;\n    case 'percent':\n      return '%';\n    case 'currency':\n      return currencySuffix;\n    default:\n      return undefined;\n  }\n}\n\nfunction localeFormatter(\n  value,\n  { autoPrecision, precision, abbreviation, format, unit, prefix, suffix },\n) {\n  const currency = format === 'currency' ? unit : undefined;\n  const style = format === 'percent' ? 'decimal' : format;\n  const negative = value < 0 ? '-' : undefined;\n  const absoluteValue = Math.abs(value);\n\n  // When a precision is given, use that as minimum and maximum for fraction digits\n  // otherwise use 0 as minimum and the autoPrecision as maximum (strips away trailing zeros)\n  let minimumFractionDigits = 0;\n\n  let maximumFractionDigits = autoPrecision;\n\n  if ('none' === precision) {\n    maximumFractionDigits = MAX_PRECISION;\n  } else if (!isUndefined(precision)) {\n    minimumFractionDigits = precision;\n    maximumFractionDigits = precision;\n  }\n\n  const numberValue = absoluteValue.toLocaleString(undefined, {\n    minimumFractionDigits,\n    maximumFractionDigits,\n  });\n\n  const formattedValue = absoluteValue.toLocaleString(undefined, {\n    style,\n    currency,\n    minimumFractionDigits,\n    maximumFractionDigits,\n  });\n\n  const [currencyPrefix, currencySuffix] = formattedValue.split(numberValue);\n\n  const hasPrefixOrSuffix = !isUndefined(prefix) || !isUndefined(suffix);\n  let computedPrefix;\n  if (hasPrefixOrSuffix) {\n    computedPrefix = prefix;\n  } else if (currencyPrefix && currencyPrefix !== '') {\n    computedPrefix = currencyPrefix;\n  }\n\n  const computedSuffix = getSuffix(\n    format,\n    unit,\n    prefix,\n    suffix,\n    currencySuffix,\n  );\n\n  return {\n    negative,\n    prefix: computedPrefix,\n    abbreviation,\n    suffix: computedSuffix,\n    numberValue,\n  };\n}\n\n// Safari and old IE\nfunction fallbackFormatter(\n  value,\n  { autoPrecision, precision, abbreviation, format, unit, prefix, suffix },\n) {\n  let roundedValue;\n  const negative = value < 0 ? '-' : undefined;\n  const absoluteValue = Math.abs(value);\n\n  // When a precision is given, we want to show trailing zeros,\n  // that's why .toFixed is used.\n  // When no precision is given fall back on the autoPrecision and\n  // strip away trailing zeros.\n  if ('none' === precision) {\n    roundedValue = absoluteValue;\n  } else if (!isUndefined(precision)) {\n    roundedValue = absoluteValue.toFixed(precision);\n  } else {\n    // Lose precision\n    const pow = Math.pow(10, autoPrecision);\n    roundedValue = Math.round(absoluteValue * pow) / pow;\n  }\n\n  // Group with thousand separators\n  const [intDigits, fractionDigits] = roundedValue.toString().split('.');\n\n  // only format the hundreds with separators\n  const integerDigits = intDigits.replace(GROUPING_RE, '$1,');\n\n  // Support a small number of common currency symbols\n  let currencyPrefix, currencySuffix;\n  if (format === 'currency') {\n    if (FALLBACK_CURRENCIES[unit]) {\n      currencyPrefix = FALLBACK_CURRENCIES[unit];\n    } else {\n      currencySuffix = `${unit}`;\n    }\n  }\n\n  const numberValue = fractionDigits\n    ? `${integerDigits}.${fractionDigits}`\n    : `${integerDigits}`;\n\n  const hasPrefixOrSuffix = !isUndefined(prefix) || !isUndefined(suffix);\n  const computedPrefix = hasPrefixOrSuffix ? prefix : currencyPrefix;\n  const computedSuffix = getSuffix(\n    format,\n    unit,\n    prefix,\n    suffix,\n    currencySuffix,\n  );\n\n  return {\n    negative,\n    prefix: computedPrefix,\n    abbreviation,\n    suffix: computedSuffix,\n    numberValue,\n  };\n}\n\n// Use toLocaleString when available\nconst formatter = LOCALE_SUPPORT ? localeFormatter : fallbackFormatter;\n\nfunction getFormattedNumberSegments(\n  val,\n  { format = 'decimal', unit, referenceValue, numberFormat = {} } = {},\n) {\n  let value = val;\n\n  // Percentages are expected as floats\n  if (format === 'percent') {\n    value *= 100;\n  }\n\n  const {\n    abbreviation: fixedAbbreviation,\n    precision,\n    prefix,\n    suffix,\n  } = numberFormat;\n\n  let reference = Math.abs(value);\n\n  // When referenceValue is given use that value to get abbreviation and divider\n  // so we can more easily compare disparate values\n  // Don't apply comparison formatting to 0\n  if (!isUndefined(referenceValue) && val !== 0) {\n    reference = Math.abs(referenceValue);\n  }\n\n  const { abbreviation, divider } = getAbbreviation(\n    reference,\n    fixedAbbreviation,\n  );\n  const autoPrecision = getPrecision(reference, abbreviation);\n\n  const dividedValue = value / divider;\n\n  return formatter(dividedValue, {\n    autoPrecision,\n    precision,\n    abbreviation,\n    format,\n    unit,\n    prefix,\n    suffix,\n  });\n}\n\n// Implement similar logic to HumanizeDuration.js\n//\n// We cannot use Moment duration as it does not allow us to drop\n// years, months and weeks units.\nexport const SUPPORTED_UNITS = [\n  'years',\n  'days',\n  'hours',\n  'minutes',\n  'seconds',\n  'milliseconds',\n];\nconst UNIT_MEASURES = {\n  years: 31536000000,\n  days: 86400000,\n  hours: 3600000,\n  minutes: 60000,\n  seconds: 1000,\n  milliseconds: 1,\n};\nconst UNIT_THRESHOLDS = {\n  years: 1,\n  days: { t: 183, m: 365 },\n  hours: { t: 12, m: 24 },\n  minutes: { t: 30, m: 60 },\n  seconds: { t: 30, m: 60 },\n  milliseconds: { t: 500, m: 1000 },\n};\n\nconst toMs = (rawValue, inputUnit = 'milliseconds') => {\n  const val = Math.abs(parseFloat(rawValue));\n  return val * UNIT_MEASURES[inputUnit];\n};\n\nconst fromMs = (milliseconds, outputUnit = 'milliseconds') =>\n  milliseconds / UNIT_MEASURES[outputUnit];\n\n/**\n inputUnit - The unit rawValue is supplied in. A unit smaller than this will never be returned.\n largest - Represents the maximum number of units to return for the duration.\n maxUnit - If defined, will never return a bigger unit.\n  Ie if the duration is `1 day, 2 hours` but maxUnit='hours', it will return `26 hours` instead.\n */\nconst getDurationSegments = (\n  rawValue,\n  inputUnit = 'milliseconds',\n  largest = 2,\n  maxUnit = SUPPORTED_UNITS[0],\n) => {\n  let ms = toMs(rawValue, inputUnit);\n\n  // The given unit is the smallest supported unit so we don't want to show more\n  // precision than that\n  const SUPPORTED_UNITS_FOR_INPUT_UNIT = dropRightWhile(\n    SUPPORTED_UNITS.slice(SUPPORTED_UNITS.indexOf(maxUnit)),\n    unit => unit !== inputUnit,\n  );\n\n  return chain(SUPPORTED_UNITS_FOR_INPUT_UNIT)\n    .reduce((segments, unitName) => {\n      let unitCount;\n      const unitMS = UNIT_MEASURES[unitName];\n\n      if (unitName === inputUnit) {\n        // ms is our smallest unit: no decimals\n        unitCount = Math.round(ms / unitMS);\n      } else {\n        unitCount = Math.floor(ms / unitMS);\n      }\n      // Remove what we just figured out.\n      ms -= unitCount * unitMS;\n      return [...segments, [unitCount, unitName]];\n    }, [])\n    .thru(segments => {\n      // back propagate rounding based on requested maximum number of units\n      // 1 - Get largest unit with non 0 value\n      const largestUnit = findIndex(segments, ([val]) => val !== 0);\n      const indexToTriggerRound = largestUnit + largest + 1;\n\n      // No need to round if largest unit with value is milliseconds\n      // OR\n      // smallest unit to trigger round is smaller than milliseconds\n      if (\n        largestUnit === SUPPORTED_UNITS.length - 1 ||\n        indexToTriggerRound > SUPPORTED_UNITS.length\n      ) {\n        return segments;\n      }\n\n      // 2 - take all segments used to compute round\n      const segmentsToBubbleOn = segments.slice(0, indexToTriggerRound);\n\n      // 3 - Bubble and round up if necessary\n      let needRoundUp;\n      const roundedSegments = [];\n      forEachRight(segmentsToBubbleOn, ([val, unit], i) => {\n        if (i + 1 === indexToTriggerRound) {\n          // Possible value to round\n          needRoundUp = val > UNIT_THRESHOLDS[unit].t;\n          roundedSegments.push([0, unit]);\n        } else {\n          // Propagate previous rounded value if so\n          let tmpVal = needRoundUp ? val + 1 : val;\n          needRoundUp = tmpVal === UNIT_THRESHOLDS[unit].m; // round if max of current unit\n          tmpVal = needRoundUp ? 0 : tmpVal;\n          roundedSegments.push([tmpVal, unit]);\n        }\n      });\n\n      return reverse(roundedSegments);\n    })\n    .dropWhile(([value]) => value === 0)\n    .take(largest)\n    .value();\n};\n\nconst parseDurationInput = (input, outputUnit) => {\n  const ms = reduce(\n    input,\n    (total, value, key) => {\n      return total + UNIT_MEASURES[key] * value;\n    },\n    0,\n  );\n\n  return ms / UNIT_MEASURES[outputUnit];\n};\n\nconst getInputFromDuration = (\n  rawValue,\n  inputUnit = 'milliseconds',\n  largest = 2,\n  smallestSegmentUnit = 'milliseconds',\n) => {\n  let value = rawValue;\n\n  if (smallestSegmentUnit !== inputUnit) {\n    const valueInMs = toMs(value, inputUnit);\n    value = valueInMs / UNIT_MEASURES[smallestSegmentUnit];\n  }\n\n  const allUnits = chain(SUPPORTED_UNITS)\n    .dropRightWhile(unit => unit !== smallestSegmentUnit)\n    .takeRight(largest)\n    .value();\n\n  const largestSegmentUnit = allUnits[0];\n\n  const segments = getDurationSegments(\n    value,\n    smallestSegmentUnit,\n    largest,\n    largestSegmentUnit,\n  );\n  const allUnitsArray = allUnits.map(u => [0, u]);\n\n  return reduce(\n    [...allUnitsArray, ...segments],\n    (total, [v, unit]) => {\n      total[unit] = `${v}`;\n      return total;\n    },\n    {},\n  );\n};\n\nconst humanizeDuration = (val, unit) => {\n  const segments = getDurationSegments(val, unit);\n\n  if (!segments.length) {\n    // Render 0 as 0 with provided unit\n    return `0${DURATION_UNIT[unit]}`;\n  }\n\n  return segments.map(([v, u]) => `${v}${DURATION_UNIT[u]}`).join(' ');\n};\n\nfunction humaniseNumber(val, options = {}) {\n  if (!isNumber(val)) {\n    return val;\n  }\n\n  if (options.format === 'duration') {\n    return humanizeDuration(val, options.unit);\n  }\n  const {\n    negative = '',\n    prefix = '',\n    abbreviation = '',\n    suffix = '',\n    numberValue,\n  } = getFormattedNumberSegments(val, options);\n\n  const separator = abbreviation && suffix ? ' ' : '';\n\n  return `${negative}${prefix}${numberValue}${abbreviation}${separator}${suffix}`;\n}\n\nexport {\n  ABBREVIATIONS,\n  UNIT_MEASURES,\n  getAbbreviation,\n  toMs,\n  fromMs,\n  getDurationSegments,\n  getFormattedNumberSegments,\n  getPrecision,\n  getSuffix,\n  parseDurationInput,\n  getInputFromDuration,\n  humaniseNumber,\n};\n","import {\n  chain,\n  cloneDeep,\n  filter,\n  find,\n  forEach,\n  forOwn,\n  includes,\n  intersectionWith,\n  isArray,\n  pick,\n  template,\n  uniq,\n  zipObject,\n  without,\n} from 'lodash';\nimport { formatMessage } from '../lib/i18n';\nimport { runQueryInContext } from './query-helpers';\nimport { TYPE_TO_GROUP } from './ui-field-options';\n\nconst BASE_NODE_PROPS = ['key', 'type', 'name', 'values', 'unit'];\n\nexport class Node {\n  constructor(node) {\n    Object.assign(this, node);\n\n    if (this.query_template_for_values) {\n      this.query_custom_values = JSON.parse(\n        template(this.query_template_for_values)(node),\n      );\n    }\n  }\n\n  getRoot() {\n    if (this.root) {\n      return this.root;\n    }\n\n    return this.primary_resource;\n  }\n\n  getPath(useFK) {\n    if (this.type === 'count') return null;\n    const path = [];\n    if (this.virtual_join) {\n      path.push(this.virtual_join);\n    }\n    if (useFK && this.foreign_key) path.push(this.foreign_key);\n    else if (!useFK && this.target_key) {\n      path.push(this.key, this.target_key);\n    } else {\n      path.push(this.key);\n    }\n\n    return path.join('.');\n  }\n\n  getCustom() {\n    return this.custom;\n  }\n\n  isCustomField() {\n    return this.category === Node.CUSTOM_FIELD;\n  }\n\n  getResourceName() {\n    if (this.resource) return this.resource;\n    if (this.values_from) return this.values_from.resource;\n    if (this.query_custom_values) return this.key;\n    return null;\n  }\n\n  formatKey(value) {\n    if (this.values_from) {\n      return value[this.values_from.key];\n    }\n\n    if (this.foreign_key) {\n      return value[this.primary_key];\n    }\n\n    return value.id;\n  }\n\n  formatValue(value) {\n    if (this.values_from) {\n      return value[this.values_from.key];\n    }\n\n    if (this.foreign_key) {\n      return value[this.target_key];\n    }\n\n    return value.name;\n  }\n\n  getValues(collection, grouped = false) {\n    if (this.values) return this.values;\n    const data = collection[this.getResourceName()];\n    if (!data) return null;\n\n    if (grouped && this.groupValues) {\n      // /!\\ This returns a nested array\n      const groupedOptions = [];\n      chain(data)\n        .groupBy(this.groupValues)\n        .forIn((options, name) => {\n          groupedOptions.push({\n            name,\n            options: options.map(t => ({\n              key: this.formatKey(t),\n              value: this.formatValue(t),\n              ...this.getValueExtras(t),\n            })),\n          });\n        })\n        .value();\n\n      return groupedOptions;\n    }\n\n    return data.map(t => ({\n      key: this.formatKey(t),\n      value: this.formatValue(t),\n      ...this.getValueExtras(t),\n    }));\n  }\n\n  getValueExtras(value) {\n    const extras = {};\n    if (this.combined_filters) {\n      extras.combinedFilters = this.combined_filters.map(cf => cf(value));\n    }\n    return extras;\n  }\n\n  getMatchingValue(collection, q) {\n    const values = this.getValues(collection);\n    return find(values, { key: q });\n  }\n\n  getQueryForValue() {\n    if (this.query_custom_values) {\n      return this.query_custom_values;\n    }\n    if (this.values_from) {\n      return {\n        select: [\n          {\n            path: this.values_from.key,\n            resource: this.values_from.resource,\n          },\n        ],\n      };\n    }\n    if (this.foreign_key) {\n      const tk = isArray(this.target_key) ? this.target_key : [this.target_key];\n      return {\n        select: [\n          { path: this.primary_key, resource: this.resource },\n          ...tk.map(p => ({ path: p, resource: this.resource })),\n        ],\n      };\n    }\n    return null;\n  }\n\n  hasValues() {\n    return !!(\n      this.type === 'enum' ||\n      this.foreign_key ||\n      this.values_from ||\n      this.query_custom_values\n    );\n  }\n\n  hasGroupedValues() {\n    return !!this.groupValues;\n  }\n\n  isEqualTo(node) {\n    const { primary_resource: resource, key, custom } = node;\n    const possibleIds = [];\n    if (this.equivalents && this.equivalents[resource]) {\n      possibleIds.push(`${resource}:${this.equivalents[resource]}`);\n    }\n\n    possibleIds.push(`${this.primary_resource}:${this.custom || this.key}`);\n\n    return possibleIds.indexOf(`${resource}:${custom || key}`) !== -1;\n  }\n}\n\nNode.CUSTOM_FIELD = 'Custom field';\nNode.DATETIME = 'Datetime';\n\nexport const getDetailsNode = (graph, resource) => {\n  const entryNode = find(graph, { root: resource });\n  return find(entryNode.output, { type: 'details' });\n};\n\nexport const getNodeFromSubquery = (graph, subquery, tryFK = false) => {\n  const { resource, path, custom } = subquery;\n  const entryNode = find(graph, { root: resource });\n  const requestedPath = custom || path;\n\n  if (!path && !custom) {\n    // case of countable resource.\n    return entryNode;\n  }\n\n  return find(entryNode.output, n => {\n    if (custom) {\n      return n.getCustom() === custom;\n    }\n    return n.getPath(tryFK) === requestedPath;\n  });\n};\n\nexport const buildBaseSubquery = (graph, entry, inputNode, tryFK = false) => {\n  const path = inputNode.getPath(tryFK);\n  const subquery = { resource: entry };\n  if (path) {\n    subquery.path = path;\n  }\n\n  if (inputNode.getCustom()) {\n    subquery.custom = inputNode.getCustom();\n  }\n\n  return subquery;\n};\n\n// Extend graph with custom fields. Use the specified query to fetch\n// extra fields and merge them with correct format with original fields.\n// DOES NOT RETURN BUT MUTATE!\nexport const injectCustomFieldsInGraph = async (graph, universalState) => {\n  const roots = filter(graph, 'root');\n  const allCustomNodes = [];\n\n  await Promise.all(\n    roots.map(root => {\n      const { custom_fields_queries: customQueries } = root;\n      if (!customQueries) {\n        return null;\n      }\n      return Promise.all(\n        customQueries.map(({ query }) => {\n          return runQueryInContext(query, universalState);\n        }),\n      ).then(queriesResults => {\n        queriesResults.forEach((results, i) => {\n          if (!results) {\n            return;\n          }\n\n          const customQuery = customQueries[i];\n          const {\n            query: { select: selectQuery },\n          } = customQuery;\n          const fieldTemplates = customQueries[i].field_templates || [];\n\n          const customNodes = results.reduce((nodes, result) => {\n            const fields = [];\n\n            fieldTemplates.forEach(fieldTemplate => {\n              // Default field properties, can be overridden by field_templates\n              const field = {\n                type: 'enum',\n                category: Node.CUSTOM_FIELD,\n              };\n\n              // Map query paths to fetched values\n              const templateValues = zipObject(\n                selectQuery.map(s => s.path),\n                result,\n              );\n\n              // Add each prop from template to field\n              forEach(fieldTemplate, (value, prop) => {\n                // When prop is a string, compile template, else pass prop to\n                // field as is. Don't compile query_template_for_values as this\n                // is done in Node.\n                if (\n                  typeof value === 'string' &&\n                  prop !== 'query_template_for_values'\n                ) {\n                  field[prop] = template(value)(templateValues);\n                } else {\n                  field[prop] = value;\n                }\n              });\n\n              // For some integrations, we want to provide the list of supported\n              // values for a given field. In order to support that feature\n              // we will consider the last tuple to be the list of values if\n              // this one is an array.\n              const fieldValues = result[result.length - 1];\n              if (isArray(fieldValues)) {\n                field.values = fieldValues.map(s => ({ key: s, value: s }));\n              }\n\n              fields.push(field);\n            });\n\n            const newNodes = fields.map(f => {\n              return new Node({\n                primary_resource: root.root,\n                ...f,\n              });\n            });\n\n            return [...nodes, ...newNodes];\n          }, []);\n\n          root.output.push(...customNodes);\n          allCustomNodes.push(...customNodes);\n        });\n      });\n    }),\n  ).then(() => {\n    graph.push(...allCustomNodes);\n  });\n};\n\n// Add relation between resources\n// DOES NOT RETURN BUT MUTATE!\nexport const addVirtualFields = graph => {\n  const roots = filter(graph, 'root');\n  const rootsWithRel = filter(roots, r => r.relations);\n\n  // Collect and create new node following relation\n  const extraNodes = {};\n  rootsWithRel.forEach(r => {\n    r.relations.forEach(relation => {\n      const targetedResource = find(roots, { root: relation.res });\n      extraNodes[r.root] = chain(targetedResource.output)\n        .filter(n => {\n          if (\n            !r.equivalent_fields ||\n            !n.key ||\n            !r.equivalent_fields[relation.res]\n          ) {\n            return true;\n          }\n          return !r.equivalent_fields[relation.res][n.key];\n        })\n        .map(n => {\n          return new Node({\n            ...cloneDeep(n),\n            input: [r],\n            virtual_join: relation.name,\n          });\n        })\n        .value();\n    });\n  });\n\n  // Append new node to each root\n  rootsWithRel.forEach(r => {\n    r.output.push(...extraNodes[r.root]);\n  });\n  // Append all new node ref to base graph\n  forOwn(extraNodes, nodes => graph.push(...nodes));\n\n  // recompute rules\n  graph.forEach(node => {\n    forOwn(node.rules, (rules, ruleName) => {\n      if (node[ruleName]) {\n        // Node has been updated already\n        return;\n      }\n      node[ruleName] = rules.map(rule => {\n        if (!rule) return null;\n        const siblings = node.input[0].output;\n        return find(siblings, n => n.isEqualTo(rule));\n      });\n    });\n  });\n};\n\nexport const buildGraph = metadata => {\n  const graph = [];\n  const {\n    resources = [],\n    equivalent_fields: allEquivalentFields = {},\n  } = metadata;\n\n  const nodesWithBase = [];\n  const foreignNodes = [];\n  const nodesWithColumns = [];\n\n  resources.forEach(res => {\n    const entry = new Node({\n      root: res.name,\n      primary_key: res.primary_key,\n      custom_fields_queries: res.custom_fields_queries,\n      relations: res.rel,\n      equivalent_fields: allEquivalentFields[res.name],\n    });\n\n    if (res.countable) {\n      entry.type = 'count';\n      entry.name = formatMessage('universal.config.metric.count', {\n        value: res.human_readable_name,\n      });\n    }\n    const children = [];\n\n    const allFields = [...res.fields];\n\n    if (res.details) {\n      allFields.push({\n        ...res.details,\n        type: 'details',\n      });\n    }\n\n    allFields.forEach(field => {\n      const node = new Node({\n        primary_resource: res.name,\n        ...field,\n        input: [entry],\n      });\n\n      children.push(node);\n\n      if (node.base) {\n        nodesWithBase.push(node);\n      }\n      if (node.foreign_key) {\n        foreignNodes.push(node);\n      }\n      if (node.default_columns) {\n        nodesWithColumns.push(node);\n      }\n      if (!node.category && node.type === 'datetime') {\n        // Group all datetime fields together in dropdowns\n        node.category = Node.DATETIME;\n      }\n    });\n\n    entry.output = children;\n    graph.push(entry, ...children);\n  });\n\n  // Copy all properties from base node\n  nodesWithBase.forEach(node => {\n    const baseNode = getNodeFromSubquery(graph, node.base);\n    const baseNodeProps = pick(baseNode, BASE_NODE_PROPS);\n    const props = { ...baseNodeProps, ...node, base: baseNode };\n    Object.assign(node, props);\n  });\n\n  // Add primary key to all foreignKey\n  foreignNodes.forEach(node => {\n    const targetResource = getNodeFromSubquery(graph, {\n      resource: node.resource,\n    });\n    const props = { ...node, primary_key: targetResource.primary_key };\n    Object.assign(node, props);\n  });\n\n  nodesWithColumns.forEach(node => {\n    node.defaultColumns = node.default_columns.map(column => {\n      const siblings = node.input[0].output;\n      return find(siblings, n => n.isEqualTo(column));\n    });\n  });\n\n  return graph;\n};\n\nconst traverse = (node, visited = []) => {\n  if (visited.indexOf(node) !== -1) {\n    return null;\n  }\n  visited.push(node);\n\n  return node.output ? node.output.map(n => traverse(n, visited)) : node;\n};\n\nconst removeBaseFields = fields => {\n  const baseFields = fields.filter(f => !!f.base).map(f => f.base);\n  return without(fields, ...baseFields);\n};\n\nexport const getFieldsFromEntry = (graph, entry) => {\n  const entryNode = find(graph, { root: entry });\n\n  const fields = chain(traverse(entryNode))\n    .flattenDeep()\n    .compact()\n    .value();\n\n  const withoutBaseFields = removeBaseFields(fields);\n  return withoutBaseFields;\n};\n\nexport const getMetricFields = (graph, types) => {\n  const roots = filter(graph, 'root');\n\n  const fields = chain(roots)\n    .reduce((nodes, n) => {\n      if (n.type) {\n        // root node with type should be added\n        nodes.push(n);\n      }\n      const nodesFromRoot = chain(traverse(n))\n        .compact()\n        .value();\n      nodes.push(nodesFromRoot);\n      return nodes;\n    }, [])\n    .flatten()\n    .filter(\n      n => !n.virtual_join && types.includes(n.type) && !n.exclude_from_metrics,\n    )\n    .value();\n\n  return removeBaseFields(fields);\n};\n\nexport const getFieldsByType = (\n  graph,\n  types,\n  entries,\n  vizType,\n  predicateFn = () => true,\n) => {\n  // We're filtering out hidden fields as this is currently only used from\n  // ui-options. If we want to use this in other places we should think about\n  // refactoring and making it possible to return hidden fields too.\n  const uniqEntries = uniq(entries);\n  const allCandidateNodes = uniqEntries.map(entry => {\n    const root = find(graph, { root: entry });\n    return root.output.filter(\n      node =>\n        (!node.supported_visualisations ||\n          includes(node.supported_visualisations, vizType)) &&\n        includes(types, node.type) &&\n        !node.hidden &&\n        predicateFn(node),\n    );\n  });\n  // compute intersection of equivalents node\n  // this is expensive...\n  let nodes = allCandidateNodes;\n  if (uniqEntries.length > 1) {\n    nodes = intersectionWith(...allCandidateNodes, (a, b) => a.isEqualTo(b));\n  }\n\n  return chain(nodes)\n    .flatten()\n    .sortBy(({ type }) => types.indexOf(type))\n    .value();\n};\n\nexport const getChildrenFromEntry = (graph, entryResource) => {\n  const root = find(graph, { root: entryResource });\n  return root.output;\n};\n\nexport const getCompatibleMetrics = (\n  metrics,\n  metricType,\n  vizType,\n  entryResource,\n) => {\n  return filter(\n    metrics,\n    ({ type, supported_visualisations: sv, primary_resource: pm }) => {\n      const compatibleViz = sv ? sv.includes(vizType) : true;\n      const compatibleResource = pm === entryResource;\n      return (\n        compatibleViz &&\n        compatibleResource &&\n        TYPE_TO_GROUP[type] === TYPE_TO_GROUP[metricType]\n      );\n    },\n  );\n};\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { hasBodyScrollbar, getScrollbarWidth } from '../lib/dom-helper';\n\nimport style from './hide-body-scrollbars-style.scss';\n\nconst SHOW_SCROLLBAR_DELAY = 300;\n\nconst padContent = scrollbarWidth => {\n  const value = scrollbarWidth > 0 ? `${scrollbarWidth}px` : '';\n\n  document.body.style.paddingRight = value;\n\n  // We need to deal with the masthead when hiding or showing body scrollbars\n  // since it is position fixed and therefore needs special treatment.\n  const masthead = document.getElementById('base-masthead');\n  if (masthead) {\n    masthead.style.right = value;\n  }\n};\n\nconst getBodyClassList = () => {\n  return document.body.classList;\n};\n\nconst hideBodyScrollbar = () => {\n  const bodyClasses = getBodyClassList();\n  const scrollbarWidth = getScrollbarWidth();\n\n  bodyClasses.add(style.modalOpen);\n\n  if (hasBodyScrollbar()) {\n    padContent(scrollbarWidth);\n  }\n};\n\nconst showBodyScrollbar = () => {\n  const bodyClasses = getBodyClassList();\n\n  bodyClasses.remove(style.modalOpen);\n\n  // Reset padding to none\n  padContent(0);\n};\n\n/*\n * This HOC is responsible for hiding or showing scrollbars when opening a modal.\n * When there is a scrollbar on the body and the modal is visible, we want to hide them\n * and add some fake space for the scrollbar so that the content doesn't jump.\n */\nfunction hideBodyScrollbars(DecoratedComponent) {\n  class DecoratedHiddenBodyScrollbars extends PureComponent {\n    static get displayName() {\n      return `hideBodyScrollbars(${DecoratedComponent.name})`;\n    }\n\n    // eslint-disable-next-line camelcase\n    UNSAFE_componentWillReceiveProps(nextProps) {\n      const { visible } = nextProps;\n      const { visible: wasVisible } = this.props;\n\n      if (wasVisible === visible) {\n        return;\n      }\n\n      if (visible) {\n        this.hideBodyScrollbars();\n      } else {\n        setTimeout(() => showBodyScrollbar(), SHOW_SCROLLBAR_DELAY);\n      }\n    }\n\n    componentWillUnmount() {\n      showBodyScrollbar();\n    }\n\n    render() {\n      return <DecoratedComponent {...this.props} />;\n    }\n\n    hideBodyScrollbars() {\n      const hasScrollbars = hasBodyScrollbar();\n      hideBodyScrollbar(hasScrollbars);\n    }\n  }\n\n  DecoratedHiddenBodyScrollbars.propTypes = {\n    visible: PropTypes.bool,\n  };\n\n  return DecoratedHiddenBodyScrollbars;\n}\n\nexport default hideBodyScrollbars;\n","import ModalComponent, {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from './modal-component';\nimport bodyRenderer from '../../lib/body-renderer';\nimport hideBodyScrollbars from '../../hoc/hide-body-scrollbars';\n\nexport default bodyRenderer(hideBodyScrollbars(ModalComponent));\nexport { ModalSection, ModalHeading, ModalText };\n","import _, {\n  chain,\n  first,\n  isMatch,\n  reduce,\n  isArray,\n  set,\n  pick,\n  isUndefined,\n  omitBy,\n} from 'lodash';\nimport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n  greedilyParseFloat,\n  toBackendIndex,\n  toFrontendIndex,\n  INDEX_BASED,\n  isValidSelection,\n} from '../universal/spreadsheet-helpers';\nimport { humaniseNumber } from '../lib/humanise-number';\nimport {\n  getSelectionFormat,\n  getMixedInputValue,\n  getNumericCells,\n} from '../universal/transformers/spreadsheet/helpers';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\nconst cellRegex = /([a-zA-Z]+)?(\\d+)?/;\n\n// Return excel like colum string with a default 0 based index\n// From http://stackoverflow.com/a/1237333/2259520\nfunction getColumnLetter(col) {\n  let columnString = '';\n  let columnNumber = col + INDEX_BASED;\n\n  while (columnNumber > 0) {\n    const currentLetterNumber = (columnNumber - 1) % 26;\n    const currentLetter = ALPHABET[currentLetterNumber];\n    columnString = currentLetter + columnString;\n    columnNumber = (columnNumber - (currentLetterNumber + 1)) / 26;\n  }\n  return columnString;\n}\n\n// Return 0 based index of the excel column string\n// From http://stackoverflow.com/a/1237333/2259520\nconst getNumberFromLetter = col => {\n  let i;\n  let retVal = 0;\n  col = col.toUpperCase();\n  for (i = col.length - 1; i >= 0; i--) {\n    const colPiece = col[i];\n    const colNum = _.indexOf(ALPHABET, colPiece) + 1;\n    retVal += colNum * Math.pow(26, col.length - (i + 1));\n  }\n  return retVal - 1; // 0 based\n};\n\nconst getSelectionSize = selection => {\n  const [start, end] = selection;\n  const hasInfiniteRows = start[0] === -1;\n  const hasInfiniteCols = start[1] === -1;\n\n  const startSize = hasInfiniteRows ? -1 : Math.abs(end[0] - start[0]) + 1;\n  const endSize = hasInfiniteCols ? -1 : Math.abs(end[1] - start[1]) + 1;\n\n  return [startSize, endSize];\n};\n\nconst updateSelection = (selection, end, options) => {\n  const newSelection = {\n    ...selection,\n  };\n\n  // let newStart, newEnd; // Swap correct selection start/end if needed\n  const [startCol, startRow] = newSelection.start;\n\n  const [endCol, endRow] = end;\n  const newStartCol = Math.min(startCol, endCol);\n  const newStartRow = Math.min(startRow, endRow);\n  let newEndCol = Math.max(startCol, endCol);\n  let newEndRow = Math.max(startRow, endRow);\n  const colDiff = newEndCol - newStartCol;\n  const rowDiff = newEndRow - newStartRow;\n\n  // When restricted to a single dimension and an entire row/column have been\n  // selected then no selection updates are allowed\n  if (\n    options.restrictToSingleDimension &&\n    (startCol === -1 || startRow === -1)\n  ) {\n    return {\n      ...newSelection,\n      end: [startCol, startRow],\n    };\n  }\n\n  if (options.restrictToSingleDimension) {\n    if (rowDiff > 0) {\n      options.maxCols = 0;\n      options.maxRows = Infinity;\n    }\n\n    if (colDiff > 0) {\n      options.maxCols = Infinity;\n      options.maxRows = 0;\n    }\n  }\n\n  // Restrict the size of the column selection\n  if (colDiff > options.maxCols) {\n    newEndCol = newStartCol + options.maxCols;\n  }\n\n  // Restrict the size of the row selection\n  if (rowDiff > options.maxRows) {\n    newEndRow = newStartRow + options.maxRows;\n  }\n\n  return {\n    ...newSelection,\n    start: [newStartCol, newStartRow],\n    end: [newEndCol, newEndRow],\n  };\n};\n\nfunction selectToIndices(selection) {\n  return selection\n    .split(':')\n    .map(cell => cell.match(cellRegex))\n    .map(([, alpha, number]) => {\n      return [\n        alpha ? getNumberFromLetter(alpha) : undefined,\n        number ? toFrontendIndex(parseInt(number, 10)) : undefined,\n      ];\n    });\n}\n\nfunction inputToSelection(selection) {\n  let [start, end] = selection.split(':');\n  let [, alpha, number] = start.match(cellRegex);\n  start = [\n    alpha ? getNumberFromLetter(alpha) : -1,\n    number ? toFrontendIndex(parseInt(number, 10)) : -1,\n  ];\n  if (end) {\n    [, alpha, number] = end.match(cellRegex);\n    if (alpha && number) {\n      end = [getNumberFromLetter(alpha), toFrontendIndex(parseInt(number, 10))];\n    }\n  }\n\n  return [start, end];\n}\n\nconst selectionToString = function(selection) {\n  const [\n    [startCol = 0, startRow = 0],\n    // eslint-disable-next-line no-unused-vars\n    [endCol = startCol, endRow = startRow],\n  ] = selection;\n\n  const flatSelection = _.flatten(selection);\n\n  // return empty string if selection array is empty or a infinite selection\n  if (flatSelection.length === 0 || flatSelection.every(v => v === -1)) {\n    return '';\n  }\n\n  return selection\n    .map(value => {\n      return value\n        .map((val, index) => {\n          if (val === -1) {\n            return '';\n          }\n          index++;\n          if (index % 2 === 0) {\n            return val + 1;\n          }\n          return getColumnLetter(val);\n        })\n        .join('');\n    })\n    .join(':');\n};\n\nconst getWindowSize = function() {\n  const width =\n    window.innerWidth ||\n    document.documentElement.clientWidth ||\n    document.body.clientWidth;\n\n  const height =\n    window.innerHeight ||\n    document.documentElement.clientHeight ||\n    document.body.clientHeight;\n\n  return [width, height];\n};\n\nfunction formatCellValue(cell) {\n  if (cell.human) {\n    return cell.human;\n  }\n\n  let value = cell.value;\n\n  const floatVal = parseFloat(cell.value);\n\n  if (cell.type === 'percentage' && isFinite(floatVal)) {\n    value = humaniseNumber(floatVal, { format: 'percent' });\n  }\n\n  return value || '';\n}\n\nfunction hasDisabledSelection(selection) {\n  const [xAxis, ...series] = selection;\n  // xaxis and at least one of series must be a valid selection\n  return (\n    !isValidSelection(xAxis) || series.filter(isValidSelection).length === 0\n  );\n}\n\nfunction stripInteger(value) {\n  const intValue = Math.floor(value);\n  if (intValue !== parseFloat(value)) {\n    return value;\n  }\n  return intValue.toString();\n}\n\nfunction unzipPathSelections(selections, parentPath) {\n  return reduce(\n    selections,\n    (memo, selection, path) => {\n      // Ignore empty selections (When the form is first initialised)\n      if (selection.some(isUndefined)) {\n        return memo;\n      }\n\n      const [[sampleIndex]] = selection;\n      if (isArray(sampleIndex)) {\n        // if multiple selection\n        const child = unzipPathSelections(selection, path);\n\n        const [childPaths, childSelections] = child;\n        const [paths, flatSelections] = memo;\n        return [\n          paths.concat(childPaths),\n          flatSelections.concat(childSelections),\n        ];\n      }\n\n      const [paths, flatSelections] = memo;\n      if (parentPath) {\n        paths.push(`${parentPath}[${path}]`);\n      } else {\n        paths.push(path);\n      }\n      flatSelections.push(selection);\n      return memo;\n    },\n    [[], []],\n  );\n}\n\n// zipObject with _.set to handle key as path\nfunction zipObjectPath(paths, values) {\n  return chain(paths)\n    .zip(values)\n    .reduce((memo, [key, value]) => {\n      set(memo, key, value);\n      return memo;\n    }, {})\n    .value();\n}\n\nfunction swapSelection(selection) {\n  if (!selection) return null;\n  const [[startCol, startRow], [endCol, endRow]] = selection;\n  return [\n    [startRow, startCol],\n    [endRow, endCol],\n  ];\n}\n\nfunction isEntireColumnSelection(selection) {\n  const [[, startRow], [endCol]] = selection;\n  // Full column and valid selection\n  return startRow === -1 && endCol !== -1;\n}\n\nfunction isEntireRowSelection(selection) {\n  return isEntireColumnSelection(swapSelection(selection));\n}\n\nfunction isEntireColumnOrRowSelection(selection) {\n  return isEntireColumnSelection(selection) || isEntireRowSelection(selection);\n}\n\nfunction isColumnSelection(selection) {\n  if (isEntireColumnSelection(selection)) {\n    return true;\n  }\n\n  const [[startCol, startRow], [endCol, endRow]] = selection;\n  // Column shape and not a 1x1 cell selection\n  return startCol === endCol && startRow !== endRow;\n}\n\nfunction isRowSelection(selection) {\n  return isColumnSelection(swapSelection(selection));\n}\n\nfunction getFullRowOrColumnHeaderIndex(selections, allSelectedCells) {\n  const filteredSelections = selections.filter(isValidSelection);\n\n  if (!filteredSelections.length) {\n    return null;\n  }\n  if (filteredSelections.every(isEntireColumnSelection)) {\n    let row = chain(allSelectedCells)\n      .flatten()\n      .map('row')\n      .min()\n      .value();\n    row = toFrontendIndex(row);\n    return { row };\n  }\n  if (filteredSelections.every(isEntireRowSelection)) {\n    let column = chain(allSelectedCells)\n      .flatten()\n      .map('column')\n      .min()\n      .value();\n    column = toFrontendIndex(column);\n    return { column };\n  }\n  return null;\n}\n\nfunction getFullHeaderFromCfg(config, cells, headerPaths) {\n  const selections = pick(config, headerPaths);\n  const definedSelections = omitBy(selections, isUndefined);\n  const [, flatSelections] = unzipPathSelections(definedSelections);\n  const allSelectedCells = getSelectedCells(cells, flatSelections);\n\n  return getFullRowOrColumnHeaderIndex(flatSelections, allSelectedCells);\n}\n\nfunction getHeaderCells(cells, selection) {\n  const allSelectedCells = getSelectedCells(cells, selection);\n  const headerIndices = getSelectionHeaderIndices(selection, allSelectedCells);\n\n  return chain(allSelectedCells)\n    .map(first)\n    .zip(headerIndices)\n    .map(([cell, headerIndex]) => {\n      if (isMatch(cell, headerIndex)) {\n        return cell;\n      }\n      return headerIndex;\n    })\n    .value();\n}\n\nfunction getHeaderCellsFromCfg(config, cells, headerPaths) {\n  const selections = pick(config, headerPaths);\n  const definedSelections = omitBy(selections, isUndefined);\n  const [paths, flatSelections] = unzipPathSelections(definedSelections);\n  const flatHeaderCells = getHeaderCells(cells, flatSelections);\n\n  return zipObjectPath(paths, flatHeaderCells);\n}\n\n// Return visible subset\nfunction getCanvasCells(cells, viewport, scrolls) {\n  if (!cells || !viewport) {\n    return [];\n  }\n  const [scrollCol, scrollRow] = scrolls;\n  const { columns, rows } = viewport;\n  const maxRow = scrollRow + rows;\n  const maxCol = scrollCol + columns;\n  let i;\n  let j;\n  const ret = [];\n  for (i = scrollRow; i <= maxRow; i++) {\n    const row = [];\n    for (j = scrollCol; j <= maxCol; j++) {\n      const cellValue = chain(cells)\n        .find({ row: i + INDEX_BASED, column: j + INDEX_BASED })\n        .thru(cell => formatCellValue(cell || {})) // eslint-disable-line no-loop-func\n        .value();\n\n      row.push(cellValue);\n    }\n    ret.push(row);\n  }\n\n  return ret;\n}\n\nconst setMinMaxFromDefaults = state => {\n  const { config, cells } = state;\n  const { value, type, min, max, _minDefault, _maxDefault } = config;\n\n  if (type !== 'geckometer') {\n    return state;\n  }\n\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const numericCells = getNumericCells(selectedCells);\n  const [format] = getSelectionFormat(numericCells);\n\n  let minValue;\n  if (\n    isUndefined(min) ||\n    isUndefined(getMixedInputValue(cells, min.value, format))\n  ) {\n    minValue = _minDefault;\n  } else {\n    minValue = min.value;\n  }\n\n  let maxValue;\n  if (\n    isUndefined(max) ||\n    isUndefined(getMixedInputValue(cells, max.value, format))\n  ) {\n    maxValue = _maxDefault;\n  } else {\n    maxValue = max.value;\n  }\n\n  const updatedConfig = {\n    ...config,\n    min: { value: minValue },\n    max: { value: maxValue },\n  };\n  return { ...state, config: updatedConfig };\n};\n\nconst toRenderableState = state => {\n  return setMinMaxFromDefaults(state);\n};\n\nexport {\n  toBackendIndex,\n  toFrontendIndex,\n  getColumnLetter,\n  getNumberFromLetter,\n  getSelectionSize,\n  selectToIndices,\n  inputToSelection,\n  selectionToString,\n  getWindowSize,\n  getSelectedCells,\n  formatCellValue,\n  isValidSelection,\n  hasDisabledSelection,\n  stripInteger,\n  greedilyParseFloat,\n  unzipPathSelections,\n  zipObjectPath,\n  swapSelection,\n  isEntireColumnSelection,\n  isEntireRowSelection,\n  isEntireColumnOrRowSelection,\n  isColumnSelection,\n  isRowSelection,\n  getFullRowOrColumnHeaderIndex,\n  getFullHeaderFromCfg,\n  getSelectionHeaderIndices,\n  getHeaderCells,\n  getHeaderCellsFromCfg,\n  getCanvasCells,\n  toRenderableState,\n  updateSelection,\n};\n","import createAction from '../../lib/redux/create-action';\nimport * as toastStorage from '../toast-storage';\nimport { formatMessage } from '../../lib/i18n';\n\nexport const showToast = createAction('Toast:SHOW_TOAST');\nexport const showSuccessToast = createAction('Toast:SHOW_SUCCESS_TOAST');\nexport const showErrorToast = createAction('Toast:SHOW_ERROR_TOAST');\nexport const showGenericErrorToast = () =>\n  showErrorToast(formatMessage('generic.request.failure'));\nexport const hideToast = createAction('Toast:HIDE_TOAST');\n\n// Thunk actions\nexport const showScheduledToast = () => dispatch => {\n  const toast = toastStorage.loadToastFromStorage();\n\n  if (!toast) {\n    return;\n  }\n\n  dispatch(showToast(toast));\n};\n\nexport const scheduleToast = toast => (dispatch, getState) => {\n  toastStorage.scheduleToast(toast, getState);\n};\n","import {\n  chain,\n  conformsTo,\n  intersection,\n  isEqual,\n  isString,\n  uniqBy,\n  without,\n} from 'lodash';\nimport {\n  getInputFromDuration as _getInputFromDuration,\n  parseDurationInput,\n  toMs,\n  UNIT_MEASURES,\n} from '../lib/humanise-number';\nimport {\n  getTimespanLabel,\n  getTimespanHint,\n} from '../components/config-filters/timespan-helper';\n\nexport const UNIVERSAL_VISUALISATIONS = [\n  'number',\n  'geckometer',\n  'line',\n  'column',\n  'bar',\n  'leaderboard',\n  'table',\n  'feed',\n];\n\n// Cannot use PropTypes checker outside of React environment.\n// This replicate a pure JS checker\nexport const isDurationInput = input =>\n  conformsTo(input, {\n    days: isString,\n    hours: isString,\n    minutes: isString,\n  });\n\nexport const isEmptyDurationInput = input =>\n  isEqual(input, {\n    days: '',\n    hours: '',\n    minutes: '',\n  });\n\nexport const TIMESPAN_TYPES = ['datetime'];\nexport const GROUP_BY_CATEGORY_TYPES = ['string', 'enum'];\nexport const GROUP_BY_TIME_TYPES = ['datetime'];\nexport const FILTER_FIELD_TYPES = [\n  'custom',\n  'string',\n  'enum',\n  'datetime',\n  'boolean',\n];\nexport const DETAILS_TYPES = ['string', 'enum', 'datetime', 'boolean'];\nexport const ORDER_BY_TYPES = ['datetime'];\n\nexport const AGGREGATE_OPTIONS = [\n  { name: 'Avg', fullName: 'Average', key: 'avg' },\n  { name: 'Med', fullName: 'Median', key: 'median' },\n  { name: 'Max', fullName: 'Maximum', key: 'max' },\n  { name: 'Min', fullName: 'Minimum', key: 'min' },\n  { name: 'Sum', fullName: 'Sum', key: 'sum' },\n];\n\nexport const TIMESPAN_OPERATORS = {\n  TIMESPAN: 'timespan',\n  PREV_TIMESPAN: 'prev_timespan',\n  PREV_SAME_TIMESPAN: 'prev_same_timespan',\n  PREV_PARTIAL_TIMESPAN: 'prev_partial_timespan',\n};\n\nexport const TIME_OPTION = { key: 'time', name: 'Time', category: 'Datetime' };\nexport const ALL_OPTION = { key: '__universal_default', value: 'All' };\nexport const TIMESPAN_CUSTOM_OPTION = {\n  key: '__universal_custom_ts',\n  label: 'Custom period...',\n};\nexport const TIME_COMPARISON_OPTION = {\n  key: '__universal_time_comparison',\n  label: 'Compare to previous period',\n};\n\nexport const GROUPED_TIMESPAN_OPTIONS = [\n  [\n    { unit: 'day', quantity: 7 },\n    { unit: 'day', quantity: 14 },\n    { unit: 'day', quantity: 28 },\n    { unit: 'day', quantity: 30 },\n    { unit: 'day', quantity: 90 },\n  ],\n  [\n    { unit: 'day', quantity: 1 },\n    { unit: 'week', quantity: 1 },\n    { unit: 'month', quantity: 1 },\n    { unit: 'quarter', quantity: 1 },\n    { unit: 'year', quantity: 1 },\n  ],\n];\n\nexport const getGroupedTimespanOptionsWithHint = () => {\n  return GROUPED_TIMESPAN_OPTIONS.map(g =>\n    g.map(opt => ({\n      ...opt,\n      label: getTimespanLabel(opt.unit, opt.quantity),\n      hint: getTimespanHint(opt.unit, opt.quantity),\n    })),\n  );\n};\n\nexport const MAX_NUMBER_OF_METRICS = {\n  line: 9,\n  column: 3,\n  bar: 1,\n  number: 1,\n  leaderboard: 1,\n  geckometer: 1,\n  table: 5,\n};\n\nexport const TYPE_TO_GROUP = {\n  duration: 'Duration',\n  datetime: 'Date/Datetime',\n  int: 'Number',\n  float: 'Number',\n  count: 'Number',\n  percent: 'Percentage',\n  currency: 'Currency',\n};\n\nconst TIMESPAN_TRANSFORM = {\n  week: { toUnit: 'day', multiplier: 7 },\n  month: { toUnit: 'day', multiplier: 31 },\n  quarter: { toUnit: 'day', multiplier: 31 * 3 },\n};\n\nconst TYPE_ORDER = [\n  'Number',\n  'Currency',\n  'Percentage',\n  'Duration',\n  'Date/Datetime',\n];\n\nexport const groupMetrics = (options, categoryOrder = []) => {\n  const typeOrderStartIndex = categoryOrder.length;\n  return chain(options)\n    .groupBy(opt => opt.category || TYPE_TO_GROUP[opt.type] || opt.type)\n    .map((val, name) => ({ name, options: val }))\n    .sortBy(g => {\n      const catIndex = categoryOrder.indexOf(g.name);\n      return catIndex > -1\n        ? catIndex\n        : typeOrderStartIndex + TYPE_ORDER.indexOf(g.name);\n    })\n    .value();\n};\n\nexport const areMetricsTypesCompatible = metrics => {\n  if (metrics.length === 1) return true;\n\n  const uniqTypes = uniqBy(metrics, ({ type }) => TYPE_TO_GROUP[type]);\n  return uniqTypes.length === 1;\n};\n\nexport const groupCustomFields = options => {\n  return chain(options)\n    .groupBy(opt => opt.isCustomField && opt.isCustomField())\n    .map((val, isCustomGroup) => ({\n      name: isCustomGroup === 'true' ? 'Custom fields' : null,\n      options: val,\n    }))\n    .sortBy(g => [null, 'Custom fields'].indexOf(g.name))\n    .value();\n};\n\nexport const getInputFromDuration = (duration, unit) => {\n  // Universal UI always want to show D H and M inputs\n  return _getInputFromDuration(duration, unit, 3, 'minutes');\n};\n\nexport const getMsFromTimespan = operands => {\n  let [quantity, unit] = operands;\n\n  // Convert week and month timespans to days\n  if (TIMESPAN_TRANSFORM[unit]) {\n    quantity = quantity * TIMESPAN_TRANSFORM[unit].multiplier;\n    unit = TIMESPAN_TRANSFORM[unit].toUnit;\n  }\n\n  return toMs(quantity, `${unit}s`);\n};\n\nexport const durationToDays = (quantity, unit) =>\n  getMsFromTimespan([quantity, unit]) / UNIT_MEASURES.days;\n\nexport const getMaxQuantityForUnit = (value, unit) => {\n  if (!value) return null;\n  const transform = TIMESPAN_TRANSFORM[unit];\n\n  if (transform) {\n    return Math.floor(\n      parseDurationInput({ milliseconds: value }, `${transform.toUnit}s`) /\n        transform.multiplier,\n    );\n  }\n\n  return Math.floor(parseDurationInput({ milliseconds: value }, `${unit}s`));\n};\n\nexport const vizSupportsTimespanComparison = viz =>\n  ['number', 'line'].includes(viz);\n\nexport const timespanSupportsPrevSameComparison = (unit, quantity) =>\n  quantity === 1 && ['day', 'month', 'quarter'].includes(unit);\n\nexport const canTimespanCompare = (maxTimePeriod, operands = []) => {\n  if (!maxTimePeriod || !operands.length) return true;\n\n  const totalTime = getMsFromTimespan(operands) * 2;\n  return totalTime <= maxTimePeriod;\n};\n\nexport const getTSComparisonOperatorForViz = (vizType, currentOperator) => {\n  if (currentOperator === TIMESPAN_OPERATORS.PREV_SAME_TIMESPAN) {\n    return TIMESPAN_OPERATORS.PREV_SAME_TIMESPAN;\n  }\n\n  return vizType === 'number'\n    ? TIMESPAN_OPERATORS.PREV_PARTIAL_TIMESPAN\n    : TIMESPAN_OPERATORS.PREV_TIMESPAN;\n};\n\n// eslint-disable-next-line no-unused-vars\nexport const getVisualisationsForMetric = (metric, featureFlags = []) => {\n  let viz = [...UNIVERSAL_VISUALISATIONS];\n  const { type, supported_visualisations: sv } = metric;\n\n  // Details logic to only support table and feed\n  if (type === 'details') {\n    viz = ['table', 'feed'];\n  } else {\n    viz = without(viz, 'feed');\n  }\n\n  if (sv) {\n    viz = intersection(sv, viz);\n  }\n\n  return viz;\n};\n\nexport const canFormatNumberForType = type => {\n  return ['int', 'float', 'count', 'percent', 'currency'].indexOf(type) > -1;\n};\n","import moment from 'moment-timezone';\nimport { last } from 'lodash';\n\nconst truncate = (unit, tVal) => {\n  if (unit === 'week') {\n    // Go back to the most recent Monday.\n    tVal.day('Monday');\n    // truncate to midnight\n    truncate('day', tVal);\n  } else {\n    tVal.startOf(unit);\n  }\n};\n\nconst getTimespan = (tz, quantity, unit) => {\n  // Subtract 1 so that \"1 day ago\" just means \"the most recent\n  // midnight\", and \"2 days ago\" is midnight yesterday.\n  const offset = quantity - 1;\n\n  const now = tz ? moment.tz(tz) : moment();\n  const start = now.clone();\n  let end;\n  truncate(unit, start);\n\n  switch (unit) {\n    case 'minute':\n    case 'hour':\n    case 'day':\n    case 'month':\n    case 'quarter':\n    case 'year':\n      start.subtract(offset, `${unit}s`);\n      // Second is the smallest unit we support for now. Removing a second allow\n      // us to cover exactly the quantity\n      end = start\n        .clone()\n        .add(quantity, `${unit}s`)\n        .subtract(1, 'seconds');\n      break;\n    case 'week':\n      // Go back in time 7 days per week.\n      start.subtract(offset * 7, 'days');\n      end = start\n        .clone()\n        .add(quantity * 7, `days`)\n        .subtract(1, 'seconds');\n      break;\n    default:\n      throw new Error('timespan unit not supported');\n  }\n\n  return [start, end];\n};\n\n/*\n * getBucketRange\n *\n * Given a unit and a quantity (e.g. 1, \"week\") returns a\n * start and end timestamp. The end timestamp will be\n * \"now\" rounded to the nearest bucket.\n *\n * example:\n * getBucketRange('Europe/London', 1, 'week', 'day')\n *\n * result:\n * [2017-01-01T00:00:00, 2017-01-07T00:00:00]\n */\nconst getBucketRange = (tz, quantity, unit, bucket = 'day') => {\n  const [start, end] = getTimespan(tz, quantity, unit);\n  truncate(bucket, end);\n  return [start.format(), end.format()];\n};\n\n/*\n * getBuckets\n *\n * Given a unit and a quantity (e.g. 1, \"week\") returns an\n * array of timestamps that are the result of splitting\n * that duration into buckets. The last item in the\n * series will be \"now\" rounded to the nearest bucket.\n *\n * example:\n * getBuckets('Europe/London', 1, 'week', 'day')\n *\n * result:\n * [\n *   2017-01-01T00:00:00,\n *   2017-01-02T00:00:00,\n *   2017-01-03T00:00:00,\n *   2017-01-04T00:00:00,\n *   2017-01-05T00:00:00,\n *   2017-01-06T00:00:00,\n *   2017-01-07T00:00:00,\n * ]\n */\nconst getBuckets = (tz, quantity, unit, bucket = 'day') => {\n  const [start, end] = getTimespan(tz, quantity, unit);\n  truncate(bucket, end);\n\n  const buckets = [start];\n\n  while (last(buckets).isBefore(end)) {\n    const nevValue = last(buckets)\n      .clone()\n      .add(1, `${bucket}s`);\n    buckets.push(nevValue);\n  }\n\n  if (start.isSame(end)) {\n    buckets.push(end);\n  }\n\n  return buckets.map(b => b.format());\n};\n\nexport default getTimespan;\nexport { truncate, getTimespan, getBucketRange, getBuckets };\n","import moment from 'moment-timezone';\nimport {\n  chain,\n  capitalize,\n  fill,\n  find,\n  findIndex,\n  isNull,\n  last,\n  max,\n  unionWith,\n  unzip,\n} from 'lodash';\nimport { truncate, getBuckets } from '../../lib/timespan';\n\nexport const SPLIT_TYPES = ['enum', 'string'];\n\n// TODO be able to use i18n here..\nexport const DEFAULT_LABEL = 'No value';\n\nexport const getMainColumnField = config => {\n  const { type, queryMetas: [{ select = [] } = {}] = [] } = config;\n\n  switch (type) {\n    case 'number':\n    case 'geckometer':\n      return select[0];\n    case 'bar':\n    case 'column':\n    case 'line':\n    case 'leaderboard':\n      return last(select);\n    default:\n      return {};\n  }\n};\n\nexport const getIncompleteFromNow = (timezone, unit) => {\n  const now = timezone ? moment.tz(timezone) : moment();\n  const start = now.clone();\n\n  truncate(unit, start);\n\n  return start.format();\n};\n\n/*\n * ensureTimespan\n *\n * Given a time series where the x-axis is a datetime and\n * the y-axis is a numeric value it ensures that missing\n * buckets are filled in with null y-axis values.\n */\nexport const ensureTimespan = (series, timezone, qty, unit, bucket) => {\n  const buckets = getBuckets(timezone, qty, unit, bucket);\n\n  return unionWith(\n    series,\n    buckets.map(b => [b, null]),\n    ([t], [t1]) => t === t1,\n  );\n};\n\nexport const getEnumHumanValue = (key, values) => {\n  // On numeric keys when using splitBy, keys are converted to strings\n  // so convert all keys to strings before comparing\n  const stringKey = key.toString();\n  const { value } =\n    find(values, ({ key: valueKey }) => valueKey.toString() === stringKey) ||\n    {};\n  return value || stringKey;\n};\n\nconst getSeriesName = ({ aggregate, name } = {}) => {\n  if (!name) return undefined;\n  if (!aggregate || aggregate === 'count') return name;\n  return `(${capitalize(aggregate)}) ${name}`;\n};\n\nconst sortSeries = (name, values) => {\n  if (!values) return name;\n  return findIndex(values, v => v.key === name);\n};\n\nexport const getMultilineScatterSeries = (\n  payload,\n  selectMeta,\n  isTimespanComparisonOn,\n) => {\n  // Check if first data point has multiple series\n  if (payload[0].length < 3) {\n    return null;\n  }\n\n  // If using split by the second select is categorical\n  if (\n    !isTimespanComparisonOn &&\n    SPLIT_TYPES.indexOf(selectMeta[1].type) !== -1\n  ) {\n    const { values } = selectMeta[1];\n    // Push default label at the tail of series\n    const allValues = values && [...values, { key: DEFAULT_LABEL }];\n    return chain(payload)\n      .reduce((result, point) => {\n        const [x, name, y] = point;\n        const label = name || DEFAULT_LABEL;\n        (result[label] || (result[label] = [])).push([x, y]);\n        return result;\n      }, {})\n      .map((data, key) => ({ data, key }))\n      .sortBy(s => sortSeries(s.key, allValues))\n      .map(({ data, key }) => ({\n        data,\n        name: getEnumHumanValue(key, allValues),\n      }))\n      .value();\n  }\n\n  // Multiple metrics\n  return chain(payload)\n    .reduce((result, point) => {\n      const [xAxis, ...yAxis] = point;\n\n      yAxis.forEach((y, index) => {\n        (result[index] || (result[index] = [])).push([xAxis, y]);\n      });\n\n      return result;\n    }, [])\n    .map((data, index) => ({\n      name: getSeriesName(selectMeta[index + 1]),\n      data,\n      type: isTimespanComparisonOn && index === 1 ? 'secondary' : undefined,\n    }))\n    .value();\n};\n\nexport const getMultilineSeriesAndLabels = (payload, selectMeta) => {\n  let labels, series;\n\n  // Check if first data point has multiple series\n  if (payload[0].length < 3) {\n    return { labels, series };\n  }\n\n  // If using split by the second select is categorical\n  if (SPLIT_TYPES.indexOf(selectMeta[1].type) !== -1) {\n    const { values } = selectMeta[1];\n    // Push default label at the tail of series\n    const allValues = values && [...values, { key: DEFAULT_LABEL }];\n\n    labels = chain(payload)\n      .map(point => point[0])\n      .uniq()\n      .value();\n    const numXPoints = labels.length;\n\n    series = chain(payload)\n      .reduce((result, point) => {\n        const [labelX, name, y] = point;\n        const label = name || DEFAULT_LABEL;\n\n        if (!result[label]) {\n          // Create array with space for each x-axis point\n          result[label] = fill(Array(numXPoints), null);\n        }\n\n        const index = labels.indexOf(labelX);\n        result[label][index] = y;\n\n        return result;\n      }, {})\n      .map((data, key) => ({ data, key }))\n      .sortBy(s => sortSeries(s.key, allValues))\n      .map(({ data, key }) => ({\n        data,\n        name: getEnumHumanValue(key, allValues),\n      }))\n      .value();\n\n    return { labels, series };\n  }\n\n  // Multiple metrics\n  [labels, ...series] = unzip(payload);\n\n  series = series.map((s, index) => ({\n    name: getSeriesName(selectMeta[index + 1]),\n    data: s,\n  }));\n\n  return { labels, series };\n};\n\nexport const getDefaultGoal = (data, format) => {\n  const dimensions = unzip(data);\n  // Take first series if 2 dimensions\n  const values = dimensions.length > 1 ? dimensions[1] : dimensions[0];\n  const maxValue = max(values);\n  const goalValue = maxValue * (1 - 0.2);\n  const goal = format === 'percent' ? goalValue * 100 : goalValue;\n\n  return Math.round(goal);\n};\n\nexport const getFormat = (mainColumn, config, useRelativeTime = false) => {\n  const { type, unit } = mainColumn;\n\n  if (type === 'duration') {\n    return { format: type, unit };\n  } else if (type === 'datetime') {\n    return { format: type, useRelativeTime };\n  } else if (type === 'percent' || type === 'image') {\n    return { format: type };\n  } else if (type === 'currency') {\n    const { queryOptions: { currency } = {} } = config;\n    return { format: type, unit: currency || 'USD' };\n  }\n  return { format: 'decimal' };\n};\n\n// Always return `null` or `[42]`\nexport const parseNumberValue = (wrappedValue = [[null]]) => {\n  if (!wrappedValue.length) return null;\n  // When on a time metric and there is no data available,\n  // the value returned from the backend is an array with null ([null])\n  // In this case set value to null (instead of default [null]) to render empty component.\n  return isNull(wrappedValue[0]) || isNull(wrappedValue[0][0])\n    ? null\n    : wrappedValue[0];\n};\n\n/*\n * fillInValues\n *\n * For a time series we may not always get values from the backend\n * for every time bucket. In this case the y-axis value will be null.\n * For a numeric value like \"CSAT\" it makes sense to differentiate\n * between null and 0, but for a count null means 0.\n */\nexport const fillInValues = (series, seriesType) => {\n  if (seriesType !== 'count') {\n    return series;\n  }\n\n  return series.map(([x, y]) => (isNull(y) ? [x, 0] : [x, y]));\n};\n","export const splitQueryString = (query = '') => {\n  if (query.length === 0) {\n    return {};\n  }\n\n  const list = query.replace(/^\\?/, '').split('&');\n\n  return list.reduce((acc, item) => {\n    const [key, value] = item.split('=');\n\n    return { ...acc, [key]: value };\n  }, {});\n};\n\nexport const joinQueryParams = (params = '') => {\n  return Object.keys(params).reduce((acc, key, index) => {\n    return index === 0\n      ? `?${key}=${params[key]}`\n      : `${acc}&${key}=${params[key]}`;\n  }, '');\n};\n","import { createBrowserHistory } from 'history';\nimport { splitQueryString, joinQueryParams } from './lib/url';\n\nconst history = createBrowserHistory();\n\n/**\n * navigate\n *\n * Navigate using client side routing\n *\n * @param {string} path\n */\nconst navigate = path => {\n  history.push(path);\n};\n\n/**\n * getQueryParams\n *\n * Returns values in the query string as key value pairs\n * note: This is currently imported and used by Gecko-JS\n */\nconst getQueryParams = () => {\n  const { search } = history.location;\n  return splitQueryString(search);\n};\n\n/**\n * getQueryParam\n *\n * For a given key returns the value in the query string\n *\n * @param {string} param\n */\nconst getQueryParam = param => {\n  const { search } = history.location;\n  const queryParams = splitQueryString(search);\n  return queryParams[param];\n};\n\n/**\n * setQueryParam\n *\n * Adds an item to the query string\n *\n * @param {string} param\n * @param {string} value\n */\nconst setQueryParam = (param, value) => {\n  const { pathname, search } = history.location;\n  const queryParams = splitQueryString(search);\n\n  queryParams[param] = value;\n\n  history.replace({\n    pathname,\n    search: joinQueryParams(queryParams),\n  });\n};\n\n/**\n * removeQueryParam\n *\n * Removes an item from the query string\n *\n * @param {string} param\n */\nconst removeQueryParam = param => {\n  const { pathname, search } = history.location;\n  const queryParams = splitQueryString(search);\n\n  delete queryParams[param];\n\n  history.replace({\n    pathname,\n    search: joinQueryParams(queryParams),\n  });\n};\n\nconst router = {\n  navigate,\n  goBack: () => history.goBack(),\n  getHistory: () => history,\n  getQueryParams,\n  getQueryParam,\n  setQueryParam,\n  removeQueryParam,\n};\n\n// TODO stop exporting `navigate` directly, it makes spying difficult\nexport { navigate, router, history };\n","import { isEmpty, values, isUndefined, last, has, some, get } from 'lodash';\nimport createAction from '../../lib/redux/create-action';\nimport localForage from 'localforage/dist/localforage.nopromises';\nimport * as widgetService from '../../lib/widget-service';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { redirect } from '../../lib/global';\nimport { formatMessage } from '../../lib/i18n';\nimport { getEditWidgetPath } from '../../lib/path';\nimport * as managementService from '../../services/management-service';\nimport activatedMirageIntegrations from '../../universal-config/mirage/activated-mirage-integrations';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport * as toastConstants from '../../toast/toast-constants';\nimport waitForState from '../../lib/wait-for-state';\nimport { isUniversal } from '../../lib/service';\nimport { DEFAULT_SIZE } from '../../visualisation/helpers';\nimport {\n  convertWidgetLayoutFromGrid,\n  convertWidgetLayoutToGrid,\n} from '../../dashboard/box-layout/helpers';\nimport {\n  OFF_CANVAS_WIDGET_LOCATION,\n  DASHBOARD_WIDGET_LOCATION,\n  STORAGE_KEY_LAST_ADDED_WIDGET,\n  LOCATION_CHANGE_DRAG,\n  LOCATION_CHANGE_CLICK,\n} from '../constants/widget-location-constants';\nimport { dataReceived } from '../../widget-data/actions/widget-data-actions';\nimport {\n  openMenu,\n  closeMenu,\n  openEditWidget,\n} from '../../widget-menu/actions/widget-menu-actions';\nimport importUniversalCompactConfig from '../../universal-config/components/universal-compact-config/import-universal-compact-config';\nimport * as mirageHelpers from '../../universal-config/mirage/mirage-helpers';\nimport WidgetMenu from '../../widget-menu/widget-menu-component';\nimport { getIntegrationTrackingDetails } from '../../data-sources/data-sources-helpers';\nimport { trackEvent } from '@Tracking';\nimport {\n  widgetMovedOffCanvas,\n  widgetMovedToCanvas,\n  widgetCopied,\n  widgetDeleted,\n} from '@Tracking/events';\n\nconst fullOpenMenu = ({ widgetKey, view }) => dispatch => {\n  dispatch(openMenu({ widgetKey, view }));\n  dispatchToGeckoJS('widget-menu', { open: true, widgetKey });\n};\n\nexport const setWidgets = createAction('Widgets:SET_WIDGETS');\nexport const widgetAdded = createAction('Widgets:WIDGET_ADDED');\nexport const widgetChanged = createAction('Widgets:WIDGET_CHANGED');\nexport const widgetConfigChanged = createAction('Widgets:CONFIG_CHANGED');\nexport const widgetRemoved = createAction('Widgets:WIDGET_REMOVED');\nexport const widgetDragStart = createAction('Widgets:DRAG_START');\nexport const widgetDragEnd = createAction('Widgets:DRAG_END');\nexport const widgetLocationChanged = createAction('Widgets:LOCATION_CHANGED');\nexport const anticipateWidgetLocationChange = createAction(\n  'Widgets:ANTICIPATE_WIDGET_LOCATION_CHANGE',\n);\nexport const locationChangeStart = createAction(\n  'Widgets:LOCATION_CHANGE_START',\n);\nexport const locationChangeAccomplished = createAction(\n  'Widgets:LOCATION_CHANGE_ACCOMPLISHED',\n);\nexport const locationChangeEnd = createAction('Widgets:LOCATION_CHANGE_END');\nexport const launchCelebration = createAction('Widgets:LAUNCH_CELEBRATION');\nexport const finishCelebration = createAction('Widgets:FINISH_CELEBRATION');\nexport const setAwaitingInitialServerSideRefresh = createAction(\n  'Widgets:SET_AWAITING_INITIAL_SERVER_SIDE_REFRESH',\n);\n\nexport const addWidget = ({ widget, widgetType }) => (dispatch, getState) => {\n  const {\n    dashboard: { dashboard },\n  } = getState();\n\n  const transformedWidget = {\n    ...widget,\n    widget: {\n      ...widget.widget,\n      layout: convertWidgetLayoutToGrid(widget.widget.layout, dashboard),\n    },\n  };\n\n  dispatch(widgetAdded({ widget: transformedWidget, widgetType }));\n};\n\nexport const reset = ({ widgets: widgetsPayload, widgetTypes }) => async (\n  dispatch,\n  getState,\n) => {\n  await waitForState(getState, state => !!state.dashboard.dashboard);\n\n  // Update the stored list of actived mirage integrations\n  // so that we know from the integrations page which\n  // universal integrations already have mirage widgets\n  // and which do not.\n  const mirageInterations = activatedMirageIntegrations.getFromWidgets(\n    widgetsPayload,\n  );\n  activatedMirageIntegrations.set(mirageInterations);\n\n  const {\n    dashboard: { dashboard },\n  } = getState();\n  const adjustedWidgets = widgetsPayload.map(widget => {\n    return {\n      ...widget,\n      widget: {\n        ...widget.widget,\n        layout: convertWidgetLayoutToGrid(widget.widget.layout, dashboard),\n      },\n    };\n  });\n\n  dispatch(setWidgets({ widgets: adjustedWidgets, widgetTypes }));\n  const lastWidgetKey = await localForage.getItem(\n    STORAGE_KEY_LAST_ADDED_WIDGET,\n  );\n  if (lastWidgetKey) {\n    // We need to ensure that widget / widgetData state is loaded before\n    // we can dispatch the action to move the widget into the `editWidget` state\n    dispatch(\n      fullOpenMenu({\n        widgetKey: lastWidgetKey,\n        view: WidgetMenu.VIEWS.EDIT,\n      }),\n    );\n    await waitForState(\n      getState,\n      state =>\n        !!state.widgets[lastWidgetKey] && !!state.widgetData[lastWidgetKey],\n    );\n\n    const { widgets, widgetData } = getState();\n\n    dispatch(\n      openEditWidget({\n        widget: widgets[lastWidgetKey],\n        data: widgetData[lastWidgetKey],\n      }),\n    );\n    localForage.removeItem(STORAGE_KEY_LAST_ADDED_WIDGET);\n  }\n\n  /*\n   * Preload the universal config bundle if the\n   * dashboard contains any universal widgets.\n   */\n  if (dashboard.can_edit) {\n    const formattedWidgets = getState().widgets;\n    const hasUniversalWidgets = some(formattedWidgets, widget =>\n      isUniversal(widget.serviceName),\n    );\n\n    if (hasUniversalWidgets) {\n      importUniversalCompactConfig();\n    }\n  }\n};\n\nexport const layoutChanged = (widgetKey, layout) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    widgets,\n    dashboard: { dashboard },\n  } = getState();\n  const { layout: originalLayout, location: originalLocation } = widgets[\n    widgetKey\n  ];\n  const transformedLayout = convertWidgetLayoutFromGrid(layout, dashboard);\n\n  dispatch(\n    widgetLocationChanged({\n      widgetKey,\n      location: DASHBOARD_WIDGET_LOCATION,\n      layout,\n    }),\n  );\n\n  try {\n    // BE stores layout data at root of JSON\n    await widgetService.updateLocation(widgetKey, {\n      location: DASHBOARD_WIDGET_LOCATION,\n      layout: transformedLayout,\n    });\n  } catch (error) {\n    dispatch(\n      widgetLocationChanged({\n        widgetKey,\n        location: originalLocation,\n        layout: originalLayout,\n      }),\n    );\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const usesCompactConfig = serviceName =>\n  isUniversal(serviceName) || serviceName === 'database';\n\nexport const editWidget = widgetKey => (dispatch, getState) => {\n  const {\n    dashboard,\n    widgets,\n    widgetData,\n    user: { user, organization },\n  } = getState();\n  const { id: dashboardId } = dashboard.dashboard;\n  const widget = widgets[widgetKey];\n  const data = widgetData[widgetKey];\n  const { serviceName } = widget || {};\n\n  if (usesCompactConfig(serviceName)) {\n    // Make sure menu is open as we might click on edit widget outside of the menu\n    dispatch(fullOpenMenu({ widgetKey }));\n    dispatch(openEditWidget({ widget, data }));\n  } else {\n    dispatch(closeMenu());\n    const editPath = getEditWidgetPath({\n      widgetKey,\n      dashboardId,\n      serviceName,\n      user,\n      organization,\n    });\n    redirect(editPath);\n  }\n};\n\nexport const deleteWidget = widgetKey => async (dispatch, getState) => {\n  try {\n    const {\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n      dashboard: {\n        dashboard: { id: dashboardId },\n      },\n    } = getState();\n    const widget = getState().widgets[widgetKey] || {};\n\n    dispatch(widgetRemoved(widgetKey));\n    await managementService.deleteWidget(dashboardId, widgetKey);\n\n    // Remove from Mirage-activated services if needed\n    if (mirageHelpers.isMirageWidget(widget)) {\n      const integration = get(widget, 'config.mirageConfig.integration.name');\n      activatedMirageIntegrations.remove(integration);\n    }\n\n    // First we unmount all the widgets from gecko-js, and then we can notify\n    // gecko-js to remove the widget from the collection. Without a setTimeout\n    // there is an invariant exception somewhere in react\n    setTimeout(() => {\n      dispatchToGeckoJS('widget:deleted', widgetKey); // Notify gecko-js\n    }, 0);\n\n    // NOTE this event was always lower-case as opposed to other ones :-(\n    track('widget removed', {\n      properties: {\n        widget_id: widget.id,\n        widget_type_id: widget.widget_type,\n        service_name: widget.serviceTitle,\n        'Service Title': widget.serviceTitle,\n        'Service Name': widget.serviceName,\n      },\n    });\n\n    trackEvent(\n      widgetDeleted({\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.visualisation.vizType,\n        'Widget type ID': `${widget.widgetType.id}`,\n        'Widget type name': widget.widgetType.title,\n        ...getIntegrationTrackingDetails({\n          name: widget.serviceTitle,\n          slug: widget.serviceName,\n        }),\n      }),\n    );\n\n    trackSnowplow('widget_delete', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_name: widget.serviceTitle,\n    });\n  } catch (e) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const widgetUpdateConfig = ({ key, attributes }) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    widgets: {\n      [key]: { config: originalConfig },\n    },\n  } = getState();\n\n  dispatch(\n    widgetConfigChanged({\n      key,\n      config: { ...originalConfig, ...attributes },\n    }),\n  );\n\n  try {\n    await widgetService.patchConfig(key, attributes);\n  } catch (error) {\n    dispatch(\n      widgetConfigChanged({\n        key,\n        config: originalConfig,\n      }),\n    );\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const copyWidget = ({ widgetKey, dashboard }) => async (\n  dispatch,\n  getState,\n) => {\n  try {\n    const state = getState();\n    // const { user: { id: userId, organization_id: orgId } = {} } = state.user;\n    const currentDashboard = state.dashboard.dashboard;\n    const originalWidget = state.widgets[widgetKey];\n    const {\n      user: {\n        user: { id: userId },\n        organization: { id: organizationId },\n      },\n    } = state;\n\n    const widget = await widgetService.copyToDashboard(\n      widgetKey,\n      currentDashboard.id,\n      dashboard.id,\n    );\n    dispatchToGeckoJS('widget:copied', {\n      widget,\n      dashboardId: dashboard.id,\n    });\n\n    const { configuration: { title } = {} } = widget;\n    const widgetTitle = !isEmpty(title)\n      ? title\n      : formatMessage('widget.copy.successToast.defaultWidgetTitle');\n    let toast;\n\n    if (dashboard.id !== currentDashboard.id) {\n      toast = toastActions.showToast({\n        type: toastConstants.WIDGET_COPIED,\n        widgetTitle,\n        dashboardTitle: dashboard.title,\n        dashboardPath: `/edit/dashboards/${dashboard.id}`,\n      });\n    } else {\n      const widgetHasMovedOffCanvas =\n        widget.location === OFF_CANVAS_WIDGET_LOCATION;\n      const message = widgetHasMovedOffCanvas\n        ? 'widget.copy.successToast.offCanvas'\n        : 'widget.copy.successToast.currentDashboard';\n\n      if (widgetHasMovedOffCanvas) {\n        track('Widget moved off-canvas', {\n          properties: {\n            org_id: `${organizationId}`,\n            user_id: `${userId}`,\n            widget_id: `${widget.id}`,\n            dashboard_id: `${currentDashboard.id}`,\n            moved_by_user: false,\n          },\n        });\n        trackSnowplow('widget_move-off-canvas', '1-0-0', {\n          org_id: `${organizationId}`,\n          user_id: `${userId}`,\n          widget_id: `${widget.id}`,\n          dashboard_id: `${currentDashboard.id}`,\n          moved_by_user: false,\n        });\n        trackEvent(\n          widgetMovedOffCanvas({\n            'Legacy widget ID': `${widget.id}`,\n            Visualisation: widget.visualisation.vizType,\n            'Widget type ID': `${widget.widgetType.id}`,\n            'Widget type name': `${widget.widgetType.title}`,\n            ...getIntegrationTrackingDetails({\n              name: originalWidget.serviceTitle,\n              slug: originalWidget.serviceName,\n            }),\n          }),\n        );\n      }\n\n      toast = toastActions.showSuccessToast(\n        formatMessage(message, {\n          widgetTitle,\n        }),\n      );\n    }\n\n    dispatch(toast);\n\n    track('Widget added', {\n      properties: {\n        inception: 'copy_widget',\n        widget_id: originalWidget.id,\n        widget_type_id: originalWidget.widget_type,\n        service_name: originalWidget.serviceTitle,\n        'Service Title': originalWidget.serviceTitle,\n        'Service Name': originalWidget.serviceName,\n      },\n    });\n\n    trackEvent(\n      widgetCopied({\n        'Legacy widget ID': `${originalWidget.id}`,\n        Visualisation: originalWidget.visualisation.vizType,\n        'Widget type ID': `${originalWidget.widgetType.id}`,\n        'Widget type name': originalWidget.widgetType.title,\n        ...getIntegrationTrackingDetails({\n          name: originalWidget.serviceTitle,\n          slug: originalWidget.serviceName,\n        }),\n      }),\n    );\n\n    // trackSnowplow('widget_copy', '1-0-0', {\n    //   user_id: `${userId}`,\n    //   org_id: `${orgId}`,\n    //   source_widget_id: `${originalWidget.id}`,\n    //   target_widget_id: `${widget.id}`,\n    //   source_dashboard_id: `${currentDashboard.id}`,\n    //   target_dashboard_id: `${dashboard.id}`,\n    //   service_id: `${widget.services[0].id}`,\n    //   service_name: widget.services[0].name,\n    // });\n  } catch (e) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nconst _getNextWidgetOrder = (widgets, widget = {}) => {\n  const { order = 0 } = widget.layout || {};\n\n  const widgetList = values(widgets).filter(w => !isUndefined(w.layout));\n  const maxOrder = Math.max(...widgetList.map(w => w.layout.order));\n\n  // If the widget is not already at the top\n  if (order < maxOrder) {\n    return maxOrder + 1;\n  }\n\n  // If there is more than one widget with the same zIndex\n  if (widgetList.filter(w => w.layout.order === maxOrder).length > 1) {\n    return maxOrder + 1;\n  }\n\n  return order;\n};\n\nconst _getNextStableWidgetOrder = widgets => {\n  const stableWidgets = values(widgets).filter(\n    widget => widget.location === OFF_CANVAS_WIDGET_LOCATION,\n  );\n  const maxOrder = Math.max(0, ...stableWidgets.map(w => w.stableOrder || 0));\n\n  return maxOrder + 1;\n};\n\nexport const resizeWidget = ({ widgetKey, size }) => (dispatch, getState) => {\n  const { widgets } = getState();\n  const widget = widgets[widgetKey];\n\n  const layout = {\n    left: widget.layout.left,\n    top: widget.layout.top,\n    order: _getNextWidgetOrder(widgets, widget),\n    pixel_width: size.width,\n    pixel_height: size.height,\n  };\n\n  dispatch(layoutChanged(widgetKey, layout));\n  dispatchToGeckoJS('widget:resized', {\n    widgetKey,\n    layout,\n  });\n};\n\nexport const moveWidget = ({ widgetKey, position }) => (dispatch, getState) => {\n  const {\n    widgets,\n    dashboard: { dashboard },\n    user: {\n      user: { id: userId },\n      organization: { id: organizationId },\n    },\n  } = getState();\n  const widget = widgets[widgetKey];\n  const order = _getNextWidgetOrder(widgets, widget);\n\n  if (\n    widget.layout.left !== position.left ||\n    widget.layout.top !== position.top ||\n    widget.layout.order !== order ||\n    widget.location === OFF_CANVAS_WIDGET_LOCATION\n  ) {\n    // If we were off-canvas, and we're moving onto the dashboard, track it\n    if (widget.location === OFF_CANVAS_WIDGET_LOCATION) {\n      const [defaultWidth, defaultHeight] = DEFAULT_SIZE;\n      const convertedLayout = convertWidgetLayoutToGrid(\n        { ...position, pixel_width: defaultWidth, pixel_height: defaultHeight },\n        dashboard,\n      );\n      dispatch(\n        layoutChanged(widgetKey, {\n          ...widget.layout,\n          ...convertedLayout,\n          left: position.left,\n          top: position.top,\n          order,\n        }),\n      );\n      track('Widget moved on-canvas', {\n        properties: {\n          org_id: `${organizationId}`,\n          user_id: `${userId}`,\n          widget_id: `${widget.id}`,\n          dashboard_id: `${dashboard.id}`,\n        },\n      });\n      trackSnowplow('widget_move-on-canvas', '1-0-0', {\n        org_id: `${organizationId}`,\n        user_id: `${userId}`,\n        widget_id: `${widget.id}`,\n        dashboard_id: `${dashboard.id}`,\n      });\n      trackEvent(\n        widgetMovedToCanvas({\n          'Legacy widget ID': `${widget.id}`,\n          Visualisation: `${widget.visualisation.vizType}`,\n          'Widget type ID': `${widget.widgetType.id}`,\n          'Widget type name': `${widget.widgetType.title}`,\n          ...getIntegrationTrackingDetails({\n            name: widget.serviceTitle,\n            slug: widget.serviceName,\n          }),\n        }),\n      );\n    } else {\n      dispatch(\n        layoutChanged(widgetKey, {\n          ...widget.layout,\n          left: position.left,\n          top: position.top,\n          order,\n        }),\n      );\n    }\n  }\n};\n\nexport const moveOffCanvas = (widgetKey, userAction) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    widgets,\n    dashboard: { dashboard },\n    user: {\n      user: { id: userId },\n      organization: { id: organizationId },\n    },\n  } = getState();\n  const {\n    layout: originalLayout,\n    id: widgetId,\n    widgetType: { id: widgetTypeId, title: widgetTypeTitle },\n    visualisation: { vizType: visualisationType },\n    serviceName,\n    serviceTitle,\n  } = widgets[widgetKey];\n  const isUserAction = [LOCATION_CHANGE_CLICK, LOCATION_CHANGE_DRAG].includes(\n    userAction,\n  );\n\n  const trackMove = () => {\n    track('Widget moved off-canvas', {\n      properties: {\n        org_id: `${organizationId}`,\n        user_id: `${userId}`,\n        widget_id: `${widgetId}`,\n        dashboard_id: `${dashboard.id}`,\n        moved_by_user: isUserAction,\n      },\n    });\n    trackSnowplow('widget_move-off-canvas', '1-0-0', {\n      org_id: `${organizationId}`,\n      user_id: `${userId}`,\n      widget_id: `${widgetId}`,\n      dashboard_id: `${dashboard.id}`,\n      moved_by_user: isUserAction,\n    });\n    trackEvent(\n      widgetMovedOffCanvas({\n        'Legacy widget ID': `${widgetId}`,\n        Visualisation: visualisationType,\n        'Widget type ID': `${widgetTypeId}`,\n        'Widget type name': `${widgetTypeTitle}`,\n        ...getIntegrationTrackingDetails({\n          name: serviceTitle,\n          slug: serviceName,\n        }),\n      }),\n    );\n  };\n\n  try {\n    const [pixelWidth, pixelHeight] = DEFAULT_SIZE;\n    const stableOrder = _getNextStableWidgetOrder(widgets);\n    const layout = {\n      top: 0,\n      left: 0,\n      order: 1,\n      pixel_width: pixelWidth,\n      pixel_height: pixelHeight,\n    };\n    const transformedLayout = convertWidgetLayoutToGrid(layout, dashboard);\n\n    const locationChangeMove = () =>\n      widgetLocationChanged({\n        widgetKey,\n        location: OFF_CANVAS_WIDGET_LOCATION,\n        layout: transformedLayout,\n        stableOrder,\n      });\n\n    if (isUserAction && userAction === LOCATION_CHANGE_CLICK) {\n      dispatch(locationChangeStart(widgetKey));\n\n      setTimeout(() => {\n        dispatch(locationChangeMove());\n        dispatch(locationChangeAccomplished(widgetKey));\n\n        setTimeout(() => {\n          dispatch(locationChangeEnd(widgetKey));\n        }, 350);\n      }, 580);\n    } else {\n      dispatch(locationChangeMove());\n    }\n\n    await widgetService.updateLocation(widgetKey, {\n      location: OFF_CANVAS_WIDGET_LOCATION,\n    });\n\n    trackMove();\n  } catch (e) {\n    dispatch(\n      widgetLocationChanged({\n        widgetKey,\n        location: DASHBOARD_WIDGET_LOCATION,\n        layout: originalLayout,\n      }),\n    );\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const processDataReceived = payload => (dispatch, getState) => {\n  const { key, data: newData } = payload;\n  const {\n    dashboard: {\n      dashboard: { id: dashboardId },\n    },\n    widgetData: { [key]: { data: currentData = {} } = {} } = {},\n    widgets: { [key]: widget } = {},\n    user: { user: { features = [] } = {} },\n  } = getState();\n\n  const canCelebrate = !(\n    features.includes('disable-celebrations') ||\n    has(widget, 'config.indicators.thresholds')\n  );\n\n  const { comparison = {} } = newData;\n  const {\n    visualisation = {},\n    config: { template: { type } = {} } = {},\n    serviceTitle,\n    serviceId,\n  } = widget;\n  const isPercentageThresholdType =\n    comparison.thresholdType === 'percentage' ||\n    isUndefined(comparison.thresholdType);\n\n  // The below is slightly more complex than it should be, due to handling both legacy and new\n  // number widgets, this will be refactored soon\n  const hasValue = !!currentData.value || has(currentData, 'item[0].value');\n  const isNumberViz =\n    visualisation.type === 'number' ||\n    (visualisation.type === 'polymorphic' && type === 'number');\n  const hasGoal = comparison.type === 'goal' || has(widget, 'config.threshold');\n\n  if (hasValue && isNumberViz && hasGoal && isPercentageThresholdType) {\n    let currentValue, newValue, threshold;\n\n    if (currentData.item) {\n      // Handle legacy number widgets\n      currentValue = currentData.item[0].value;\n      newValue = newData.item[0].value;\n      threshold = parseFloat(widget.config.threshold);\n    } else {\n      // Handle new number widgets\n      currentValue = last(currentData.value);\n      newValue = last(newData.value);\n      threshold = newData.threshold;\n    }\n\n    if (canCelebrate && currentValue < threshold && newValue >= threshold) {\n      dispatch(launchCelebration(key));\n\n      track('Widget celebrating', {\n        properties: {\n          dashboard_id: dashboardId,\n          widget_id: widget.id,\n          service_id: serviceId,\n          service_name: serviceTitle,\n        },\n      });\n    }\n  }\n\n  dispatch(dataReceived(payload));\n};\n","import { isArray, reduce, isFinite, last, map } from 'lodash';\nimport {\n  getSelectedCells,\n  greedilyParseFloat,\n} from '../../spreadsheet-helpers';\nimport { parseNumberBasedOnFormat } from '../../lib/parse-number';\n\nconst DECIMAL = ['decimal'];\nconst DATETIME = ['datetime'];\nconst PERCENT = ['percent'];\n\nfunction isCurrency(selections) {\n  return (\n    selections.length && selections.every(cell => cell.type === 'currency')\n  );\n}\n\nfunction isSameCurrency(selections) {\n  const { currency } = selections[0];\n  return (\n    selections.length && selections.every(cell => cell.currency === currency)\n  );\n}\n\nfunction isPercentage(selections) {\n  return (\n    selections.length &&\n    selections.every(\n      selection =>\n        selection.type === 'percentage' || selection.type === 'percent',\n    )\n  );\n}\n\nfunction isNumber(selections) {\n  return (\n    selections.length &&\n    selections.every(selection => selection.type === 'number')\n  );\n}\n\nfunction isDatetime(selections) {\n  return (\n    selections.length &&\n    selections.every(selection => selection.type === 'datetime')\n  );\n}\n\nfunction getMixedInputValue(cells, inputValue, format) {\n  let value = inputValue;\n  let parseFormat = format;\n\n  const isSelected = isArray(value);\n  if (isSelected) {\n    const selectedCells = getSelectedCells(cells, [value]);\n    if (!selectedCells[0][0]) {\n      return undefined;\n    }\n    value = selectedCells[0][0].value;\n\n    // Special case selections that are percentages as they are stored\n    // divided by 100! For example 12% is stored as 0.12.\n    if (format === 'percent') {\n      parseFormat = 'decimal';\n    }\n  }\n\n  return parseNumberBasedOnFormat(value, parseFormat);\n}\n\nfunction getSelectionFormat(selections) {\n  if (isDatetime(selections)) {\n    return DATETIME;\n  }\n\n  if (isPercentage(selections)) {\n    return PERCENT;\n  }\n\n  if (isCurrency(selections) && isSameCurrency(selections)) {\n    const { currency } = selections[0];\n    return ['currency', currency];\n  }\n\n  return DECIMAL;\n}\n\nfunction getNumericCells(selectedCells) {\n  return reduce(\n    selectedCells,\n    (acc, item) => {\n      const numericValue = greedilyParseFloat(item.value);\n\n      if (isFinite(numericValue)) {\n        acc.push({ ...item, value: numericValue });\n      }\n\n      return acc;\n    },\n    [],\n  );\n}\n\nfunction getGeckometerValue(value, cells) {\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const numericCells = getNumericCells(selectedCells);\n  const values = map(numericCells, 'value');\n\n  return last(values);\n}\n\nexport {\n  isPercentage,\n  isNumber,\n  isDatetime,\n  getMixedInputValue,\n  getSelectionFormat,\n  getNumericCells,\n  getGeckometerValue,\n};\n","/* global API_HOST */\nimport fetchJSON from '../universal/fetch';\nimport { isUndefined } from 'lodash';\nimport { getWindow } from './global';\nimport { getDefaultSize } from '../visualisation/helpers';\nimport {\n  WIDGET_POSITION_KEY,\n  CONTAINER_AREA_KEY,\n} from '../dashboard/dashboard-constants';\n\nconst formatPatchedConfig = config => {\n  const properties = Object.keys(config);\n\n  return properties.reduce((acc, property) => {\n    const shouldDeleteValue = isUndefined(config[property]);\n\n    /*\n     * Passing a property { '_x_delete': true } instructs\n     * management api to completely delete x from the config\n     */\n    if (shouldDeleteValue) {\n      return {\n        ...acc,\n        [`_${property}_delete`]: true,\n      };\n    }\n\n    return {\n      ...acc,\n      [property]: config[property],\n    };\n  }, {});\n};\n\nconst getInitialContainerArea = () => {\n  const storedArea = getWindow().sessionStorage.getItem(CONTAINER_AREA_KEY);\n  if (!storedArea) {\n    return undefined;\n  }\n\n  const parsedArea = JSON.parse(storedArea);\n  return {\n    row_start: parsedArea.rowStart,\n    column_start: parsedArea.columnStart,\n    row_span: parsedArea.rowSpan,\n    column_span: parsedArea.columnSpan,\n  };\n};\n\nfunction create(data) {\n  const { config = {}, config: { template: { type } = {} } = {} } = data;\n  const [width, height] = getDefaultSize(type);\n\n  const position =\n    JSON.parse(getWindow().sessionStorage.getItem(WIDGET_POSITION_KEY)) || {};\n\n  return fetchJSON(`${API_HOST}/widgets`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n    body: JSON.stringify({\n      top: position.top,\n      left: position.left,\n      pixel_width: width,\n      pixel_height: height,\n      ...data,\n      config: {\n        ...config,\n        initial_container_area: getInitialContainerArea(),\n      },\n    }),\n  });\n}\n\nfunction update(widgetId, data) {\n  return fetchJSON(`${API_HOST}/widgets/${widgetId}`, {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n    body: JSON.stringify(data),\n  });\n}\n\nfunction patchConfig(widgetId, config) {\n  const formattedConfig = formatPatchedConfig(config);\n\n  return fetchJSON(`${API_HOST}/widgets/${widgetId}/config`, {\n    method: 'PATCH',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n    body: JSON.stringify(formattedConfig),\n  });\n}\n\nfunction getConfig(widgetId) {\n  return fetchJSON(`${API_HOST}/widgets/${widgetId}`, {\n    method: 'GET',\n    headers: {\n      Accept: 'application/json',\n    },\n    credentials: 'include',\n  });\n}\n\nfunction copyToDashboard(widgetId, from, to, location) {\n  // For Dashies, we are able to specify a location (ie. dashboard position) for the\n  // copied widget to appear in\n  const parseLocation = locationToParse => ({\n    row_start: locationToParse.rowStart,\n    column_start: locationToParse.columnStart,\n    row_span: locationToParse.rowSpan,\n    column_span: locationToParse.columnSpan,\n  });\n\n  const body = location\n    ? JSON.stringify({\n        config: { initial_container_area: parseLocation(location) },\n      })\n    : undefined;\n\n  return fetchJSON(\n    `${API_HOST}/dashboards/${from}/widgets/${widgetId}/copy?dashboard[]=${to}`,\n    {\n      method: 'POST',\n      headers: {\n        Accept: 'application/json',\n      },\n      credentials: 'include',\n      body,\n    },\n  );\n}\n\nfunction updateLocation(widgetId, payload) {\n  return fetchJSON(`${API_HOST}/widgets/${widgetId}/location`, {\n    method: 'PUT',\n    headers: {\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n    body: JSON.stringify(payload),\n  });\n}\n\nexport {\n  create,\n  update,\n  getConfig,\n  patchConfig,\n  copyToDashboard,\n  updateLocation,\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"flex\":\"flex---1f2GU\",\"inlineFlex\":\"inlineFlex---MEjxH\",\"flexAuto\":\"flexAuto---21ooH\",\"flexShrink\":\"flexShrink---3OkNO\",\"flexNone\":\"flexNone---6JXWz\",\"flexFill\":\"flexFill---3trS-\",\"flexEqualWidth\":\"flexEqualWidth---3DImv\",\"directionColumn\":\"directionColumn---1YDJd\",\"flexWrap\":\"flexWrap---2I6NQ\",\"align-stretch\":\"align-stretch---3Fu7j\",\"align-center\":\"align-center---8z6Cl\",\"align-baseline\":\"align-baseline---3Hec7\",\"align-flex-start\":\"align-flex-start---3a9Hn\",\"align-flex-end\":\"align-flex-end---TvAzG\",\"justify-center\":\"justify-center---DeOre\",\"justify-space-around\":\"justify-space-around---2vn-G\",\"justify-space-between\":\"justify-space-between---RylTY\",\"justify-flex-start\":\"justify-flex-start---GVCGg\",\"justify-flex-end\":\"justify-flex-end---eifIx\",\"col-1\":\"col-1---1jdHW\",\"col-2\":\"col-2---uM3ON\",\"col-3\":\"col-3---wxEgF\",\"col-4\":\"col-4---2I7Jp\",\"col-5\":\"col-5---1PNFo\",\"col-6\":\"col-6---1JxvK\",\"col-7\":\"col-7---1saVW\",\"col-8\":\"col-8---18HbW\",\"col-9\":\"col-9---1K2RQ\",\"col-10\":\"col-10---3mnnK\",\"col-11\":\"col-11---vg3um\",\"col-12\":\"col-12---3kAN8\",\"sm-1\":\"sm-1---3OwUv\",\"sm-2\":\"sm-2---316Zr\",\"sm-3\":\"sm-3---w2_z9\",\"sm-4\":\"sm-4---3ZAMO\",\"sm-5\":\"sm-5---3M4uE\",\"sm-6\":\"sm-6---1BIw0\",\"sm-7\":\"sm-7---_4vBY\",\"sm-8\":\"sm-8---3kkFy\",\"sm-9\":\"sm-9---1j3DN\",\"sm-10\":\"sm-10---1Q6or\",\"sm-11\":\"sm-11---u3mcs\",\"sm-12\":\"sm-12---3WVBD\",\"md-1\":\"md-1---_K5iL\",\"md-2\":\"md-2---2jKA_\",\"md-3\":\"md-3---IW_wQ\",\"md-4\":\"md-4---1_Cl_\",\"md-5\":\"md-5---g1mbs\",\"md-6\":\"md-6---HSbDE\",\"md-7\":\"md-7---wjDCz\",\"md-8\":\"md-8---djxtR\",\"md-9\":\"md-9---3Lhnv\",\"md-10\":\"md-10---sCTVv\",\"md-11\":\"md-11---2iw3X\",\"md-12\":\"md-12---1qKOL\",\"lg-1\":\"lg-1---TnDsR\",\"lg-2\":\"lg-2---3CWrU\",\"lg-3\":\"lg-3---qdWpM\",\"lg-4\":\"lg-4---mcixx\",\"lg-5\":\"lg-5---11fdo\",\"lg-6\":\"lg-6---3uRs1\",\"lg-7\":\"lg-7---27w7u\",\"lg-8\":\"lg-8---2FWc-\",\"lg-9\":\"lg-9---1c8hl\",\"lg-10\":\"lg-10---2oDjf\",\"lg-11\":\"lg-11---2r7dm\",\"lg-12\":\"lg-12---8M5g6\",\"margin-0\":\"margin-0---3DB4x\",\"margin-0-25\":\"margin-0-25---1AFkD\",\"margin-0-5\":\"margin-0-5---3WYRV\",\"margin-0-75\":\"margin-0-75---1BPfp\",\"margin-1\":\"margin-1---3bD0j\",\"margin-1-25\":\"margin-1-25---lI4Zf\",\"margin-1-5\":\"margin-1-5---bBtVu\",\"margin-1-75\":\"margin-1-75---2kA3L\",\"margin-2\":\"margin-2---2B0IK\",\"margin-2-25\":\"margin-2-25---3YvgY\",\"margin-2-5\":\"margin-2-5---2K9pb\",\"margin-2-75\":\"margin-2-75---3_ljG\",\"margin-3\":\"margin-3---16SLM\",\"margin-3-25\":\"margin-3-25---3IDu1\",\"margin-3-5\":\"margin-3-5---3nFjM\",\"margin-3-75\":\"margin-3-75---2nlOH\",\"margin-4\":\"margin-4---3hxCh\",\"margin-top-0\":\"margin-top-0---1xU3V\",\"margin-right-0\":\"margin-right-0---3cdLg\",\"margin-bottom-0\":\"margin-bottom-0---v3s03\",\"margin-left-0\":\"margin-left-0---1FCsi\",\"margin-top-0-25\":\"margin-top-0-25---14UxV\",\"margin-right-0-25\":\"margin-right-0-25---3BYx4\",\"margin-bottom-0-25\":\"margin-bottom-0-25---33M2C\",\"margin-left-0-25\":\"margin-left-0-25---3tIO3\",\"margin-top-0-5\":\"margin-top-0-5---21fNp\",\"margin-right-0-5\":\"margin-right-0-5---5x1Ig\",\"margin-bottom-0-5\":\"margin-bottom-0-5---24WwB\",\"margin-left-0-5\":\"margin-left-0-5---22uI9\",\"margin-top-0-75\":\"margin-top-0-75---kW1kH\",\"margin-right-0-75\":\"margin-right-0-75---2TDA9\",\"margin-bottom-0-75\":\"margin-bottom-0-75---1pmby\",\"margin-left-0-75\":\"margin-left-0-75---3JUXT\",\"margin-top-1\":\"margin-top-1---UyZZH\",\"margin-right-1\":\"margin-right-1---XTvA9\",\"margin-bottom-1\":\"margin-bottom-1---3bBhP\",\"margin-left-1\":\"margin-left-1---1R4B_\",\"margin-top-1-25\":\"margin-top-1-25---2Y-u_\",\"margin-right-1-25\":\"margin-right-1-25---1KCkG\",\"margin-bottom-1-25\":\"margin-bottom-1-25---1r1tZ\",\"margin-left-1-25\":\"margin-left-1-25---3gDPN\",\"margin-top-1-5\":\"margin-top-1-5---1Z92B\",\"margin-right-1-5\":\"margin-right-1-5---3T_wb\",\"margin-bottom-1-5\":\"margin-bottom-1-5---44S8a\",\"margin-left-1-5\":\"margin-left-1-5---2kYdb\",\"margin-top-1-75\":\"margin-top-1-75---2cVNA\",\"margin-right-1-75\":\"margin-right-1-75---DFrpv\",\"margin-bottom-1-75\":\"margin-bottom-1-75---ZYyWP\",\"margin-left-1-75\":\"margin-left-1-75---1-YOB\",\"margin-top-2\":\"margin-top-2---37IPj\",\"margin-right-2\":\"margin-right-2---1HJoR\",\"margin-bottom-2\":\"margin-bottom-2---1D9_A\",\"margin-left-2\":\"margin-left-2---1bes4\",\"margin-top-2-25\":\"margin-top-2-25---2yoYA\",\"margin-right-2-25\":\"margin-right-2-25---27HxM\",\"margin-bottom-2-25\":\"margin-bottom-2-25---NgUW8\",\"margin-left-2-25\":\"margin-left-2-25---3UJOA\",\"margin-top-2-5\":\"margin-top-2-5---2dzt3\",\"margin-right-2-5\":\"margin-right-2-5---8V9cu\",\"margin-bottom-2-5\":\"margin-bottom-2-5---1POG_\",\"margin-left-2-5\":\"margin-left-2-5---3p3fQ\",\"margin-top-2-75\":\"margin-top-2-75---1zS7c\",\"margin-right-2-75\":\"margin-right-2-75---2yBpu\",\"margin-bottom-2-75\":\"margin-bottom-2-75---wmITJ\",\"margin-left-2-75\":\"margin-left-2-75---lfD-E\",\"margin-top-3\":\"margin-top-3---VNCQS\",\"margin-right-3\":\"margin-right-3---3fQWr\",\"margin-bottom-3\":\"margin-bottom-3---3VWeY\",\"margin-left-3\":\"margin-left-3---OYsRy\",\"margin-top-3-25\":\"margin-top-3-25---3Qd71\",\"margin-right-3-25\":\"margin-right-3-25---1mxas\",\"margin-bottom-3-25\":\"margin-bottom-3-25---1OmA3\",\"margin-left-3-25\":\"margin-left-3-25---2VTcu\",\"margin-top-3-5\":\"margin-top-3-5---3auud\",\"margin-right-3-5\":\"margin-right-3-5---2xxb5\",\"margin-bottom-3-5\":\"margin-bottom-3-5---18bwl\",\"margin-left-3-5\":\"margin-left-3-5---FecMe\",\"margin-top-3-75\":\"margin-top-3-75---2Vnqq\",\"margin-right-3-75\":\"margin-right-3-75---3pyPR\",\"margin-bottom-3-75\":\"margin-bottom-3-75---3d3XI\",\"margin-left-3-75\":\"margin-left-3-75---2BVGj\",\"margin-top-4\":\"margin-top-4---1nzv9\",\"margin-right-4\":\"margin-right-4---NERmd\",\"margin-bottom-4\":\"margin-bottom-4---4X6H_\",\"margin-left-4\":\"margin-left-4---XwPLH\",\"padding-0\":\"padding-0---1i2Cn\",\"padding-0-25\":\"padding-0-25---ah2u0\",\"padding-0-5\":\"padding-0-5---1Ck2I\",\"padding-0-75\":\"padding-0-75---1tPkP\",\"padding-1\":\"padding-1---T3W72\",\"padding-1-25\":\"padding-1-25---2TvIY\",\"padding-1-5\":\"padding-1-5---MKrge\",\"padding-1-75\":\"padding-1-75---31Ybe\",\"padding-2\":\"padding-2---2Qq1N\",\"padding-2-25\":\"padding-2-25---1uc8S\",\"padding-2-5\":\"padding-2-5---2gJBb\",\"padding-2-75\":\"padding-2-75---1MT33\",\"padding-3\":\"padding-3---8gbSe\",\"padding-3-25\":\"padding-3-25---1YuYL\",\"padding-3-5\":\"padding-3-5---2XzL3\",\"padding-3-75\":\"padding-3-75---bkPV-\",\"padding-4\":\"padding-4---MPE24\",\"padding-top-0\":\"padding-top-0---2Dr-z\",\"padding-right-0\":\"padding-right-0---2_DCe\",\"padding-bottom-0\":\"padding-bottom-0---2VNnF\",\"padding-left-0\":\"padding-left-0---2H-bt\",\"padding-top-0-25\":\"padding-top-0-25---3bH0z\",\"padding-right-0-25\":\"padding-right-0-25---1ZPZl\",\"padding-bottom-0-25\":\"padding-bottom-0-25---2I8h1\",\"padding-left-0-25\":\"padding-left-0-25---Sv2_c\",\"padding-top-0-5\":\"padding-top-0-5---3klIQ\",\"padding-right-0-5\":\"padding-right-0-5---ZzetJ\",\"padding-bottom-0-5\":\"padding-bottom-0-5---1xnGz\",\"padding-left-0-5\":\"padding-left-0-5---3GY4A\",\"padding-top-0-75\":\"padding-top-0-75---tdSMo\",\"padding-right-0-75\":\"padding-right-0-75---3Mjlb\",\"padding-bottom-0-75\":\"padding-bottom-0-75---1Hdj2\",\"padding-left-0-75\":\"padding-left-0-75---3HVm1\",\"padding-top-1\":\"padding-top-1---b71Pq\",\"padding-right-1\":\"padding-right-1---2mp7H\",\"padding-bottom-1\":\"padding-bottom-1---3_Ppy\",\"padding-left-1\":\"padding-left-1---1JvBz\",\"padding-top-1-25\":\"padding-top-1-25---31zNk\",\"padding-right-1-25\":\"padding-right-1-25---3bx-x\",\"padding-bottom-1-25\":\"padding-bottom-1-25---33j5V\",\"padding-left-1-25\":\"padding-left-1-25---3S_g-\",\"padding-top-1-5\":\"padding-top-1-5---1JN9V\",\"padding-right-1-5\":\"padding-right-1-5---1kd1L\",\"padding-bottom-1-5\":\"padding-bottom-1-5---1YQYj\",\"padding-left-1-5\":\"padding-left-1-5---2oMPh\",\"padding-top-1-75\":\"padding-top-1-75---2MEae\",\"padding-right-1-75\":\"padding-right-1-75---2JT9v\",\"padding-bottom-1-75\":\"padding-bottom-1-75---ByV9h\",\"padding-left-1-75\":\"padding-left-1-75---avBWx\",\"padding-top-2\":\"padding-top-2---3l1IN\",\"padding-right-2\":\"padding-right-2---3Lm1G\",\"padding-bottom-2\":\"padding-bottom-2---3MjGE\",\"padding-left-2\":\"padding-left-2---XGP6z\",\"padding-top-2-25\":\"padding-top-2-25---2pKsr\",\"padding-right-2-25\":\"padding-right-2-25---CHxJO\",\"padding-bottom-2-25\":\"padding-bottom-2-25---3HKM3\",\"padding-left-2-25\":\"padding-left-2-25---iEOXu\",\"padding-top-2-5\":\"padding-top-2-5---hvTow\",\"padding-right-2-5\":\"padding-right-2-5---1I3fL\",\"padding-bottom-2-5\":\"padding-bottom-2-5---2rC_w\",\"padding-left-2-5\":\"padding-left-2-5---r1Dv7\",\"padding-top-2-75\":\"padding-top-2-75---3u2t2\",\"padding-right-2-75\":\"padding-right-2-75---2okC4\",\"padding-bottom-2-75\":\"padding-bottom-2-75---3gzI1\",\"padding-left-2-75\":\"padding-left-2-75---25lqV\",\"padding-top-3\":\"padding-top-3---3kI-t\",\"padding-right-3\":\"padding-right-3---2rg32\",\"padding-bottom-3\":\"padding-bottom-3---IICaT\",\"padding-left-3\":\"padding-left-3---2O17F\",\"padding-top-3-25\":\"padding-top-3-25---BzgfV\",\"padding-right-3-25\":\"padding-right-3-25---2dhAZ\",\"padding-bottom-3-25\":\"padding-bottom-3-25---1fKwe\",\"padding-left-3-25\":\"padding-left-3-25---UlZoa\",\"padding-top-3-5\":\"padding-top-3-5---1u2dC\",\"padding-right-3-5\":\"padding-right-3-5---3k0AA\",\"padding-bottom-3-5\":\"padding-bottom-3-5---3UZRc\",\"padding-left-3-5\":\"padding-left-3-5---1XuGp\",\"padding-top-3-75\":\"padding-top-3-75---1tolk\",\"padding-right-3-75\":\"padding-right-3-75---2f3BY\",\"padding-bottom-3-75\":\"padding-bottom-3-75---2Wzfm\",\"padding-left-3-75\":\"padding-left-3-75---fTMrO\",\"padding-top-4\":\"padding-top-4---3xPZr\",\"padding-right-4\":\"padding-right-4---2CrUk\",\"padding-bottom-4\":\"padding-bottom-4---2rYOe\",\"padding-left-4\":\"padding-left-4---PIaTG\",\"gutter-0\":\"gutter-0---1rtsu\",\"gutter-0-25\":\"gutter-0-25---1LdLd\",\"gutter-0-5\":\"gutter-0-5---nx_Pu\",\"gutter-0-75\":\"gutter-0-75---9sANE\",\"gutter-1\":\"gutter-1---A1WH8\",\"gutter-1-25\":\"gutter-1-25---2aBoK\",\"gutter-1-5\":\"gutter-1-5---1au0f\",\"gutter-1-75\":\"gutter-1-75---3lTGR\",\"gutter-2\":\"gutter-2---Hd029\",\"gutter-2-25\":\"gutter-2-25---3iGKB\",\"gutter-2-5\":\"gutter-2-5---3VRVb\",\"gutter-2-75\":\"gutter-2-75---IY6lc\",\"gutter-3\":\"gutter-3---3q2pa\",\"gutter-3-25\":\"gutter-3-25---Ww0_U\",\"gutter-3-5\":\"gutter-3-5---1UDtA\",\"gutter-3-75\":\"gutter-3-75---3x_WU\",\"gutter-4\":\"gutter-4---3g31-\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { isFunction, isEmpty } from 'lodash';\n\n// Allows us to pass Backbone views off as React components\n// By proxying rendering through a slim wrapper component.\n// The upside being that we can use them with react-router.\n\nlet COMPONENTS = {};\nlet broker;\n\nfunction clearViews() {\n  COMPONENTS = {};\n}\n\nconst dispatchToGeckoJS = (name, options) => {\n  if (broker) {\n    broker.trigger(name, options);\n  } else {\n    // If there are no views registered, we probably aren't using Gecko-JS\n    // However if there are views registered and there's no broker, we have a problem\n    if (!isEmpty(COMPONENTS)) {\n      throw new Error('No broker registered');\n    }\n  }\n};\n\nclass GeckoComponent extends Component {\n  componentDidMount() {\n    const { View } = this.props;\n    const domNode = findDOMNode(this);\n    const view = (this.__view__ = new View(this.props));\n\n    // Expose the gecko-js broker to pass messages (while we work on theming)\n    broker = view.getBroker();\n\n    domNode.insertBefore(view.getDOMNode(), domNode.firstChild);\n    view.render(this.props);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    this.__view__.render(nextProps);\n  }\n\n  componentWillUnmount() {\n    this.__view__.remove();\n  }\n\n  render() {\n    const { children } = this.props;\n    return <div className=\"gecko-js-bridge\">{children}</div>;\n  }\n}\n\nGeckoComponent.propTypes = {\n  View(props, propName) {\n    const View = props[propName];\n\n    if (!isFunction(View.prototype.render)) {\n      return new Error(`\\`render\\` method on ${View.name} is missing`);\n    }\n\n    if (!isFunction(View.prototype.getDOMNode)) {\n      return new Error(`\\`getDOMNode\\` method on ${View.name} is missing`);\n    }\n\n    return null;\n  },\n  children: PropTypes.node,\n};\n\nfunction useView(viewName) {\n  if (__DEV__ && !COMPONENTS[viewName]) {\n    throw new Error(`No GeckoView registered with key \"${viewName}\"`);\n  }\n\n  return COMPONENTS[viewName];\n}\n\nfunction registerView(viewName, View) {\n  if (__DEV__ && COMPONENTS[viewName]) {\n    throw new Error(\n      `Attempt to register duplicate view with key \"${viewName}\"`,\n    );\n  }\n\n  class WrappedGeckoComponent extends Component {\n    render() {\n      return <GeckoComponent {...this.props} View={View} />;\n    }\n  }\n  COMPONENTS[viewName] = WrappedGeckoComponent;\n}\n\nexport { GeckoComponent, registerView, clearViews, useView, dispatchToGeckoJS };\n","// make then timestamps by typing `Math.floor(new Date().getTime()/1000.0)`\n// and use an online epoch converter to check what you got\nexport const SERVICE_CUTOFF_TIMESTAMPS = {\n  salesforce: 1455540456,\n  ga2: 1563283485,\n};\n\n// compare moment an organisation was created against the\n// cut-off time of a legacy service\nconst showLegacyService = (service, organizationCreated) => {\n  if (organizationCreated === undefined) return false;\n  if (!SERVICE_CUTOFF_TIMESTAMPS[service] || !organizationCreated) return true;\n\n  return SERVICE_CUTOFF_TIMESTAMPS[service] > organizationCreated;\n};\n\nexport { showLegacyService };\n","import { chain, forEach, includes, sortBy } from 'lodash';\nimport { showLegacyService } from '../lib/has-legacy-service';\n\nconst SERVICE_LABELS = {\n  alpha: [],\n  beta: ['hubspot3'],\n  legacy: [\n    'salesforce',\n    'custom',\n    'pipedrive',\n    'facebookads',\n    'csv',\n    'hubspot2',\n    'ga2',\n  ],\n  new: [],\n};\n\nexport const UNIVERSAL_SERVICES = [\n  'facebookadsUniversal',\n  'freshdesk',\n  'gaUniversal',\n  'hubspot3',\n  'intercom3',\n  'pipedrive2',\n  'spacecargo',\n  'zendeskUniversal',\n  'zendeskchat',\n  'universal-demo',\n];\n\nexport const SPREADSHEET_SERVICE_NAMES = [\n  'gsheets',\n  'dropbox',\n  'onedrivebusiness',\n  'hostedexcel',\n];\n\nconst HIDDEN_SERVICE_NAMES = ['onedrivebusiness', 'dropbox', 'hostedexcel'];\nconst HAS_PRESETS = [\n  'facebookadsUniversal',\n  'freshdesk',\n  'gaUniversal',\n  'hubspot3',\n  'intercom3',\n  'pipedrive2',\n  'spacecargo',\n  'zendeskUniversal',\n  'zendeskchat',\n];\n\nexport const getIntegrationTrackingDetails = ({ slug, name }) => {\n  if (SPREADSHEET_SERVICE_NAMES.includes(slug)) {\n    return {\n      'Integration name': 'Spreadsheets',\n      'Integration slug': 'spreadsheets',\n      'Data source': slug,\n    };\n  }\n\n  return {\n    'Integration name': name,\n    'Integration slug': slug,\n  };\n};\n\nconst getServiceLabel = service => {\n  const { key: serviceKey, name } = service;\n  let label;\n  forEach(SERVICE_LABELS, (services, key) => {\n    if (includes(services, serviceKey || name)) label = key;\n  });\n  return label;\n};\n\nconst removeHiddenService = (service, hiddenServices) => {\n  const { name } = service;\n  if (includes(hiddenServices, name)) {\n    return [];\n  }\n  return [service];\n};\n\nconst handleAliasedService = service => {\n  const { name } = service;\n\n  switch (name) {\n    case 'spreadsheets':\n      const excelService = {\n        ...service,\n        title: 'Excel',\n        key: 'excel',\n        name: 'excel',\n        keywords: ['excel', 'office', 'xls'],\n        isAliased: true,\n      };\n      const googleSheetsService = {\n        ...service,\n        title: 'Google Sheets',\n        key: 'googlesheets',\n        name: 'googlesheets',\n        keywords: ['gsheets', 'google sheets', 'gdocs', 'google'],\n        isAliased: true,\n      };\n\n      return [excelService, googleSheetsService, service];\n    default:\n      return [service];\n  }\n};\n\nconst handleLegacyService = (service, organizationCreated) => {\n  const { name } = service;\n  switch (name) {\n    case 'salesforce':\n      const newSalesforceService = {\n        ...service,\n        polymorphic: true,\n      };\n\n      if (showLegacyService(name, organizationCreated)) {\n        const legacySf = { ...service, isLegacy: true, polymorphic: false };\n        return [newSalesforceService, legacySf];\n      }\n\n      return [newSalesforceService];\n    case 'gsheets':\n      // Remove old gsheets service\n      // Note: We can't remove the service from the backend\n      // because it's proxied by the `spreadsheets` service\n      return [];\n    case 'zendesk2': // Add fake new zendesk service\n      const newZendeskService = {\n        ...service,\n        polymorphic: true,\n      };\n\n      return [newZendeskService];\n    case 'ga2': // Add fake new Google analytics service\n      const newGaService = {\n        ...service,\n        polymorphic: true,\n      };\n\n      if (showLegacyService(name, organizationCreated)) {\n        const legacyGaService = {\n          ...service,\n          polymorphic: false,\n        };\n        return [newGaService, legacyGaService];\n      }\n\n      return [newGaService];\n    case 'facebookads': // Add fake new facebookads service\n      const newFacebookAdsService = {\n        ...service,\n        polymorphic: true,\n      };\n      const legacyFacebookAds = {\n        ...service,\n        polymorphic: false,\n      };\n\n      return [newFacebookAdsService, legacyFacebookAds];\n\n    default:\n      return [service];\n  }\n};\n\nconst transformPolymorphic = service => {\n  if (!service.polymorphic) return service;\n\n  const { name } = service;\n\n  switch (name) {\n    case 'salesforce':\n      return {\n        ...service,\n        key: 'salesforceNew',\n      };\n    case 'zendesk2':\n      return {\n        ...service,\n        key: 'zendeskUniversal',\n      };\n    case 'ga2':\n      return {\n        ...service,\n        key: 'gaUniversal',\n      };\n    case 'facebookads':\n      return {\n        ...service,\n        key: 'facebookadsUniversal',\n      };\n\n    default:\n      return service;\n  }\n};\n\nconst transformUniversal = service => {\n  const { key, name } = service;\n  if (includes(UNIVERSAL_SERVICES, key || name)) {\n    return {\n      ...service,\n      isUniversal: true,\n    };\n  }\n\n  return service;\n};\n\nconst transformPresets = service => {\n  const { key, name } = service;\n  if (includes(HAS_PRESETS, key || name)) {\n    return {\n      ...service,\n      hasPresets: true,\n    };\n  }\n\n  return service;\n};\n\nexport const sortByTitle = services => {\n  return sortBy(services, ({ title = '' }) => title.toLowerCase());\n};\n\n// Remove hidden services and add/remove legacy services to integration list\nexport const buildServiceList = (\n  services,\n  organizationCreated,\n  featureFlags = [], // eslint-disable-line no-unused-vars\n) => {\n  let hiddenServices = HIDDEN_SERVICE_NAMES;\n  if (!featureFlags.includes('universal_spacecargo')) {\n    hiddenServices = [...hiddenServices, 'spacecargo'];\n  }\n\n  return chain(services)\n    .reduce((amendedServices, service) => {\n      return [\n        ...amendedServices,\n        ...removeHiddenService(service, hiddenServices),\n      ];\n    }, [])\n    .reduce((transformedServices, service) => {\n      const aliasedServices = handleAliasedService(service);\n\n      return [...transformedServices, ...aliasedServices];\n    }, [])\n    .thru(sortByTitle)\n    .reduce((transformedServices, service) => {\n      const formattedService = handleLegacyService(\n        service,\n        organizationCreated,\n        featureFlags,\n      );\n\n      return [...transformedServices, ...formattedService];\n    }, [])\n    .value();\n};\n\n// Add keys, labels and isUniversal flag. Used from both integration list and recent connections list\nexport const transformServices = services => {\n  return chain(services)\n    .map(transformPolymorphic)\n    .map(transformUniversal)\n    .map(transformPresets)\n    .map(service => {\n      const label = getServiceLabel(service);\n      return label ? { ...service, label } : service;\n    })\n    .map(service => ({ ...service, key: service.key || service.name }))\n    .value();\n};\n","import initDataSource from './init-data-source-action';\nimport { setState } from './data-source-connector-actions';\n\nconst initFlow = ({\n  dashboardId,\n  groupId,\n  services,\n  serviceId,\n  serviceType,\n}) => dispatch => {\n  // Fetch data\n  initDataSource({ dashboardId, groupId, services, serviceId, serviceType })(\n    dispatch,\n  );\n  // Show panel\n  dispatch(setState({ isPanelVisible: true }));\n};\n\nexport default initFlow;\n","import {\n  getDashboard,\n  getService,\n  getServiceAccounts,\n} from '../../services/management-service';\nimport { auth } from '../../lib/oauth';\nimport { open as openPopup } from '../../lib/popup-window';\nimport { createConnection } from '../../services/data-source-service';\nimport servicePicker from '../../services/service-picker';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { connectionCreated, connectionFailed } from '@Tracking/events';\nimport { result, filter, last, omit } from 'lodash';\nimport initFlow from './init-flow-action';\nimport { fileFetchFailed } from './fetch-files-action';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { getIntegrationTrackingDetails } from '../../data-sources/data-sources-helpers';\n\nexport const togglesOAuthWindow = createAction(\n  'DataSourceConnector:TOGGLE_OAUTH_WINDOW',\n);\nexport const createConnectionSuccessful = createAction(\n  'DataSourceConnector:CREATE_CONNECTION_SUCCESS',\n);\nexport const createConnectionFailed = createErrorAction(\n  'DataSourceConnector:CREATE_CONNECTION_ERROR',\n);\nexport const connectionCancelled = createAction(\n  'DataSourceConnector:CANCEL_CONNECTION',\n);\nexport const fetchServiceSuccessful = createAction(\n  'DataSourceConnector:FETCH_SERVICE_SUCCESS',\n);\nexport const fetchServiceFailed = createErrorAction(\n  'DataSourceConnector:FETCH_SERVICE_ERROR',\n);\nexport const switchServiceStart = createAction(\n  'DataSourceConnector:SWITCHING_SERVICE',\n);\nexport const switchServiceSuccessful = createAction(\n  'DataSourceConnector:SWITCH_SERVICE',\n);\nexport const switchAccountStart = createAction(\n  'DataSourceConnector:SWITCHING_ACCOUNT',\n);\nexport const switchAccountSuccessful = createAction(\n  'DataSourceConnector:SWITCH_ACCOUNT',\n);\nexport const accountAddSuccessful = createAction(\n  'DataSourceConnector:ADD_ACCOUNT',\n);\nexport const accountAddFailed = createErrorAction(\n  'DataSourceConnector:ADD_ACCOUNT_ERROR',\n);\nexport const setState = createAction('DataSourceConnector:SET');\nexport const initFailed = createErrorAction('DataSourceConnector:INIT_ERROR');\n\nfunction getFreshServiceAccountId(serviceAccounts, serviceName) {\n  const serviceAccount = filter(serviceAccounts, {\n    service: { name: serviceName },\n  });\n\n  const serviceAccountId = result(last(serviceAccount), 'id');\n\n  return serviceAccountId && parseInt(serviceAccountId, 10);\n}\n\n// **onaddconnectionsuccess** callback replace GeckoJS handler after successfully\n// connect an account. GeckoJS handle closing the connection panel and redirect\n// to service page.\nexport const addConnection = (\n  groupId,\n  service,\n  extraParams,\n  onAddConnectionSuccess,\n) => async (dispatch, getState) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n  const trackingProps = { service_name: service.name, is_universal: true };\n\n  track('App - Clicked connect', { properties: trackingProps });\n  trackSnowplow('service-connect_click', '1-0-0', {\n    user_id: `${userId}`,\n    org_id: `${orgId}`,\n    service_id: `${service.id}`,\n    service_name: `${service.name}`,\n    is_universal: true,\n  });\n\n  dispatch(togglesOAuthWindow(true));\n\n  try {\n    await createConnection(groupId, service, extraParams);\n\n    track('App - Authorised Service', {\n      properties: trackingProps,\n    });\n    trackSnowplow('service_authorize', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      service_id: `${service.id}`,\n      service_name: `${service.name}`,\n    });\n\n    trackEvent(\n      connectionCreated({\n        'Auth type': service.auth_type,\n        ...getIntegrationTrackingDetails({\n          name: service.title,\n          slug: service.name,\n        }),\n      }),\n    );\n\n    dispatch(createConnectionSuccessful(service));\n    if (onAddConnectionSuccess) {\n      onAddConnectionSuccess();\n    } else {\n      dispatchToGeckoJS('connect:service:success', service);\n    }\n  } catch (error) {\n    // don't dispatch error if it's just the window closing\n    if (error.message === 'Window closed') {\n      dispatch(togglesOAuthWindow(false));\n    } else {\n      track('App - Failed to authorise service', {\n        properties: { ...trackingProps, reason: error.message },\n      });\n      trackEvent(\n        connectionFailed({\n          'Auth type': service.auth_type,\n          ...getIntegrationTrackingDetails({\n            name: service.title,\n            slug: service.name,\n          }),\n          'Connection failure reason': error.message,\n        }),\n      );\n      dispatch(createConnectionFailed(error, error.message));\n    }\n  }\n};\n\nexport const cancelConnection = () => dispatch => {\n  dispatch(setState({ isPanelVisible: false }));\n\n  setTimeout(() => {\n    dispatch(connectionCancelled());\n    dispatchToGeckoJS('connect:account:cancel', {});\n  }, 200);\n};\n\nexport const initConnector = (dashboardId, serviceId) => async dispatch => {\n  try {\n    const [service, { group_id: groupId }] = await Promise.all([\n      getService(serviceId),\n      getDashboard(dashboardId),\n    ]);\n\n    dispatch(fetchServiceSuccessful({ service, groupId }));\n  } catch (error) {\n    dispatch(fetchServiceFailed(error, error.message));\n  }\n};\n\nexport const switchService = service => async dispatch => {\n  const { name, serviceAccounts } = service;\n  const serviceAccountId = parseInt(result(last(serviceAccounts), 'id'), 10);\n\n  dispatch(switchServiceStart({ serviceName: name, serviceAccountId }));\n\n  try {\n    const files = await servicePicker(name).fetchList(name, {\n      serviceAccountId,\n    });\n    dispatch(\n      switchServiceSuccessful({ serviceName: name, serviceAccountId, files }),\n    );\n  } catch (error) {\n    dispatch(fileFetchFailed(error));\n  }\n};\n\nexport const addAccount = (groupId, service, trackingProps) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n  if (trackingProps) {\n    track('App - Clicked connect', { properties: trackingProps });\n    trackSnowplow('service-connect_click', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      service_id: `${service.id}`,\n      service_name: `${service.name}`,\n    });\n  }\n\n  // Open the window syncronously so we don't fall foul of pop up blockers\n  const popup = openPopup('geckoOauth');\n\n  dispatch(togglesOAuthWindow(true));\n\n  try {\n    await auth(popup, service, groupId, {}); // Service connected: Fetch again\n    if (trackingProps) {\n      track('App - Authorised Service', {\n        properties: omit(trackingProps, 'type'),\n      });\n      trackSnowplow('service_authorize', '1-0-0', {\n        user_id: `${userId}`,\n        org_id: `${orgId}`,\n        service_id: `${service.id}`,\n        service_name: `${service.name}`,\n      });\n      trackEvent(\n        connectionCreated({\n          'Auth type': service.auth_type,\n          ...getIntegrationTrackingDetails({\n            name: service.title,\n            slug: service.name,\n          }),\n        }),\n      );\n    }\n    const { name } = service;\n    // Get last service account for default unified service\n    const [serviceName, serviceAccounts] = await Promise.all([\n      name,\n      getServiceAccounts(groupId, [name]),\n    ]);\n    const serviceAccountId = getFreshServiceAccountId(\n      serviceAccounts,\n      serviceName,\n    );\n\n    if (!serviceAccountId) {\n      throw new Error(`No service account for ${serviceName}`);\n    }\n\n    dispatch(\n      // Early dispatch to give feedback to ui\n      switchAccountStart({ serviceAccountId }),\n    );\n\n    try {\n      const files = await servicePicker(serviceName).fetchList(serviceName, {\n        serviceAccountId,\n      });\n\n      dispatch(\n        accountAddSuccessful({\n          serviceName,\n          serviceAccounts,\n          serviceAccountId,\n          files,\n        }),\n      );\n    } catch (error) {\n      dispatch(fileFetchFailed(error));\n    }\n  } catch (error) {\n    if (trackingProps) {\n      const errorProps = {\n        ...omit(trackingProps, 'type'),\n        reason: error.message,\n      };\n      track('App - Failed to authorise service', { properties: errorProps });\n      trackEvent(\n        connectionFailed({\n          'Auth type': service.auth_type,\n          ...getIntegrationTrackingDetails({\n            name: service.title,\n            slug: service.name,\n          }),\n          'Connection failure reason': error.message,\n        }),\n      );\n    }\n\n    // don't dispatch error if it's just the window closing\n    if (error.message === 'Window closed') {\n      dispatch(togglesOAuthWindow(false));\n    } else {\n      dispatch(\n        accountAddFailed(error, {\n          message: error.message,\n          serviceName: service.name,\n        }),\n      );\n    }\n  }\n};\n\nexport const switchAccount = (\n  serviceName,\n  serviceAccountIdString,\n) => async dispatch => {\n  const serviceAccountId = parseInt(serviceAccountIdString, 10);\n\n  dispatch(switchAccountStart({ serviceAccountId }));\n\n  try {\n    const files = await servicePicker(serviceName).fetchList(serviceName, {\n      serviceAccountId,\n    });\n    dispatch(\n      switchAccountSuccessful({\n        serviceAccountId,\n        files,\n      }),\n    );\n  } catch (error) {\n    dispatch(fileFetchFailed(error));\n  }\n};\n\nexport const initPanelOldIntegration = () => dispatch =>\n  dispatch(setState({ isPanelVisible: true }));\n\nexport const init = ({\n  dashboardId,\n  groupId,\n  services,\n  serviceId,\n  serviceType,\n}) => dispatch => {\n  try {\n    initFlow({\n      dashboardId,\n      groupId,\n      services,\n      serviceId,\n      serviceType,\n    })(dispatch);\n  } catch (error) {\n    dispatch(initFailed(error, { message: error.message }));\n  }\n};\n","export const DATA_FETCH_ERROR = 'SalesforceConfig:DATA_FETCH_ERROR';\nexport const DATA_FETCH_START = 'SalesforceConfig:DATA_FETCH_START';\nexport const DATA_FETCH_SUCCESSFUL = 'SalesforceConfig:DATA_FETCH_SUCCESSFUL';\nexport const INIT_CONFIG_ERROR = 'SalesforceConfig:INIT_CONFIG_ERROR';\nexport const INIT_CONFIG_LOADING = 'SalesforceConfig:INIT_CONFIG_LOADING';\nexport const INIT_CONFIG_SUCCESSFUL = 'SalesforceConfig:INIT_CONFIG_SUCCESSFUL';\nexport const SET_STATE_PROPS = 'SalesforceConfig:SET_STATE_PROPS';\nexport const SWITCH_VISUALISATION_TYPE =\n  'SalesforceConfig:SWITCH_VISUALISATION_TYPE';\nexport const UPDATE_CONFIG = 'SalesforceConfig:UPDATE_CONFIG';\nexport const WIDGET_CONFIG_FETCH_FAILED =\n  'SalesforceConfig:WIDGET_CONFIG_FETCH_FAILED';\nexport const WIDGET_CREATION_START = 'SalesforceConfig:WIDGET_CREATION_START';\nexport const WIDGET_CREATION_FAILED = 'SalesforceConfig:WIDGET_CREATION_FAILED';\nexport const WIDGET_UPDATE_START = 'SalesforceConfig:WIDGET_UPDATE_START';\nexport const TOGGLE_TABLE_HEADERS = 'SalesforceConfig:TOGGLE_TABLE_HEADERS';\nexport const SET_PROGRESS_GOAL = 'SalesforceConfig:SET_PROGRESS_GOAL';\n","export const LOCATIONS = {\n  AdminInviteModal: 'Admin | Invite modal',\n  AdminLoops: 'Admin | Loops',\n  AdminDashboards: 'Admin | dashboards',\n  DashboardAddWidgetDropdown: 'Dashboard | Add widget dropdown menu',\n  DashboardShareMenu: 'Dashboard | Share menu',\n  DashboardDeleteModal: 'Dashboard | Delete modal',\n  HeaderPeopleModal: 'Header | People modal',\n  IntegrationsMainList: 'Integrations | Main list',\n  IntegrationsRecentList: 'Integrations | Recent list',\n  Toast: 'Toast',\n};\n\nexport const PERMISSIONS = {\n  OWNER: 'owner',\n  GROUP_ADMIN: 'group_admin',\n  GROUP_VIEWER: 'group_read_only',\n  DASHBOARD_VIEWER: 'dashboard_view_only',\n};\n","import { max } from 'lodash';\n\nfunction getAttributeValue(target, dataAttribute) {\n  // IE does not support dataset ;(\n  return target.dataset\n    ? target.dataset[dataAttribute]\n    : target.getAttribute(`data-${dataAttribute}`);\n}\n\nfunction getActiveElement() {\n  return document.activeElement;\n}\n\nfunction checkValidity(domNode) {\n  return domNode.checkValidity();\n}\n\nfunction scrollElement(domNode, left, top) {\n  domNode.scrollLeft += left;\n  domNode.scrollTop += top;\n}\n\nfunction getScrollHeight() {\n  // Safari uses window.document.body.scrollHeight, all\n  // other browsers use window.document.documentElement.scrollHeight\n  return max([\n    window.document.documentElement.scrollHeight,\n    window.document.body.scrollHeight,\n  ]);\n}\n\nfunction collectOffsets(domNode) {\n  let currentNode = domNode;\n  let offsetLeft = 0;\n  let offsetTop = 0;\n\n  while (currentNode) {\n    offsetTop += currentNode.offsetTop;\n    offsetLeft += currentNode.offsetLeft;\n    currentNode = currentNode.offsetParent;\n  }\n\n  return [offsetLeft, offsetTop];\n}\n\nfunction getStylesForSelector(selector) {\n  return Array.from(document.querySelectorAll(selector)).map(el => el.style);\n}\n\nfunction getEventDistanceFromElement(event, domNode) {\n  let x = 0;\n  let y = 0;\n\n  const rect = domNode.getBoundingClientRect();\n\n  if (event.pageX > rect.right) {\n    x = event.pageX - rect.right;\n  }\n\n  if (event.pageY > rect.bottom) {\n    y = event.pageY - rect.bottom;\n  }\n\n  if (event.pageX < rect.left) {\n    x = -(rect.left - Math.max(0, event.pageX));\n  }\n\n  if (event.pageY < rect.top) {\n    y = -(rect.top - Math.max(0, event.pageY));\n  }\n\n  return { x, y };\n}\n\nfunction getBoundingClientRect(domNode) {\n  return domNode.getBoundingClientRect();\n}\n\nfunction getClientSize(domNode) {\n  return [domNode.clientWidth, domNode.clientHeight];\n}\n\nfunction getScaledClientSize(domNode) {\n  const rect = domNode.getBoundingClientRect();\n  return [rect.width, rect.height];\n}\n\nfunction getOffsetSize(domNode) {\n  return [domNode.offsetWidth, domNode.offsetHeight];\n}\n\nfunction getScrollOffsets(domNode) {\n  return [domNode.scrollLeft, domNode.scrollTop];\n}\n\n// determines if there is a scrollbar on body\nfunction hasBodyScrollbar() {\n  const windowHeight =\n    window.innerHeight ||\n    document.documentElement.clientHeight ||\n    document.body.clientHeight;\n\n  const documentHeight = Math.max(\n    document.documentElement.clientHeight,\n    document.body.scrollHeight,\n    document.documentElement.scrollHeight,\n    document.body.offsetHeight,\n    document.documentElement.offsetHeight,\n  );\n\n  if (windowHeight < documentHeight) {\n    return true;\n  }\n\n  return false;\n}\n\n// gets the width of the scrollbar\nfunction getScrollbarWidth() {\n  const scrollDiv = document.createElement('div');\n  scrollDiv.style.position = 'absolute';\n  scrollDiv.style.top = '-9999px';\n  scrollDiv.style.width = '50px';\n  scrollDiv.style.width = '50px';\n  scrollDiv.style.overflow = 'scroll';\n\n  document.body.appendChild(scrollDiv);\n  const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n  document.body.removeChild(scrollDiv);\n\n  return scrollbarWidth;\n}\n\nexport {\n  getAttributeValue,\n  getActiveElement,\n  checkValidity,\n  collectOffsets,\n  getClientSize,\n  getOffsetSize,\n  getScaledClientSize,\n  getScrollOffsets,\n  hasBodyScrollbar,\n  getScrollbarWidth,\n  getEventDistanceFromElement,\n  scrollElement,\n  getBoundingClientRect,\n  getStylesForSelector,\n  getScrollHeight,\n};\n","import _, {\n  chain,\n  first,\n  isMatch,\n  reduce,\n  isArray,\n  set,\n  pick,\n  isUndefined,\n  omitBy,\n  isEmpty,\n  last,\n  initial,\n} from 'lodash';\nimport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n  greedilyParseFloat,\n  toBackendIndex,\n  toFrontendIndex,\n  INDEX_BASED,\n  isValidSelection,\n} from '../../universal/spreadsheet-helpers';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport {\n  getSelectionFormat,\n  getMixedInputValue,\n  getNumericCells,\n} from '../../universal/transformers/spreadsheet/helpers';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\nconst cellRegex = /([a-zA-Z]+)?(\\d+)?/;\n\n// Return excel like colum string with a default 0 based index\n// From http://stackoverflow.com/a/1237333/2259520\nfunction getColumnLetter(col) {\n  let columnString = '';\n  let columnNumber = col + INDEX_BASED;\n\n  while (columnNumber > 0) {\n    const currentLetterNumber = (columnNumber - 1) % 26;\n    const currentLetter = ALPHABET[currentLetterNumber];\n    columnString = currentLetter + columnString;\n    columnNumber = (columnNumber - (currentLetterNumber + 1)) / 26;\n  }\n  return columnString;\n}\n\n// Return 0 based index of the excel column string\n// From http://stackoverflow.com/a/1237333/2259520\nconst getNumberFromLetter = function(col) {\n  let i;\n  let retVal = 0;\n  col = col.toUpperCase();\n  for (i = col.length - 1; i >= 0; i--) {\n    const colPiece = col[i];\n    const colNum = _.indexOf(ALPHABET, colPiece) + 1;\n    retVal += colNum * Math.pow(26, col.length - (i + 1));\n  }\n  return retVal - 1; // 0 based\n};\n\nconst getSelectionSize = function(selection) {\n  const [start, end] = selection;\n\n  return [Math.abs(end[0] - start[0]) + 1, Math.abs(end[1] - start[1]) + 1];\n};\n\nconst convertSelectionToObjectFormat = selection => {\n  const [start, end] = selection;\n\n  return {\n    firstCell: start,\n    start,\n    end,\n    size: getSelectionSize(selection),\n  };\n};\n\nconst convertSelectionToArrayFormat = ({ start, end }) => {\n  return [start, end];\n};\n\nconst updateSelection = (selection, end, options) => {\n  const newSelection = {\n    ...selection,\n  };\n\n  // let newStart, newEnd; // Swap correct selection start/end if needed\n  const [startCol, startRow] = newSelection.firstCell;\n\n  const [endCol, endRow] = end;\n  const newStartCol = Math.min(startCol, endCol);\n  const newStartRow = Math.min(startRow, endRow);\n  let newEndCol = Math.max(startCol, endCol);\n  let newEndRow = Math.max(startRow, endRow);\n  const colDiff = newEndCol - newStartCol;\n  const rowDiff = newEndRow - newStartRow;\n\n  // When restricted to a single dimension and an entire row/column have been\n  // selected then no selection updates are allowed\n  if (\n    options.restrictToSingleDimension &&\n    (startCol === -1 || startRow === -1)\n  ) {\n    return {\n      ...newSelection,\n      end: [startCol, startRow],\n    };\n  }\n\n  if (options.restrictToSingleDimension) {\n    if (rowDiff > 0) {\n      options.maxCols = 0;\n      options.maxRows = Infinity;\n    }\n\n    if (colDiff > 0) {\n      options.maxCols = Infinity;\n      options.maxRows = 0;\n    }\n  }\n\n  // Restrict the size of the column selection\n  if (colDiff > options.maxCols) {\n    newEndCol = newStartCol + options.maxCols;\n  }\n\n  // Restrict the size of the row selection\n  if (rowDiff > options.maxRows) {\n    newEndRow = newStartRow + options.maxRows;\n  }\n\n  return {\n    ...newSelection,\n    start: [newStartCol, newStartRow],\n    end: [newEndCol, newEndRow],\n  };\n};\n\nfunction selectToIndices(selection) {\n  return selection\n    .split(':')\n    .map(cell => cell.match(cellRegex))\n    .map(([, alpha, number]) => {\n      return [\n        alpha ? getNumberFromLetter(alpha) : undefined,\n        number ? toFrontendIndex(parseInt(number, 10)) : undefined,\n      ];\n    });\n}\n\nfunction inputToSelection(selection) {\n  let [start, end] = selection.split(':');\n  let [, alpha, number] = start.match(cellRegex);\n\n  if (start) {\n    start = [\n      alpha ? getNumberFromLetter(alpha) : -1,\n      number ? toFrontendIndex(parseInt(number, 10)) : -1,\n    ];\n  }\n  if (end) {\n    [, alpha, number] = end.match(cellRegex);\n    end = [\n      alpha ? getNumberFromLetter(alpha) : -1,\n      number ? toFrontendIndex(parseInt(number, 10)) : -1,\n    ];\n  }\n\n  return [start, end];\n}\n\nconst selectionToString = function(selection) {\n  const [\n    [startCol = 0, startRow = 0],\n    // eslint-disable-next-line no-unused-vars\n    [endCol = startCol, endRow = startRow],\n  ] = selection;\n\n  const flatSelection = _.flatten(selection);\n\n  // return empty string if selection array is empty or a infinite selection\n  if (flatSelection.length === 0 || flatSelection.every(v => v === -1)) {\n    return '';\n  }\n\n  return selection\n    .map(value => {\n      return value\n        .map((val, index) => {\n          if (val === -1) {\n            return '';\n          }\n          index++;\n          if (index % 2 === 0) {\n            return val + 1;\n          }\n          return getColumnLetter(val);\n        })\n        .join('');\n    })\n    .join(':');\n};\n\nconst getWindowSize = function() {\n  const width =\n    window.innerWidth ||\n    document.documentElement.clientWidth ||\n    document.body.clientWidth;\n\n  const height =\n    window.innerHeight ||\n    document.documentElement.clientHeight ||\n    document.body.clientHeight;\n\n  return [width, height];\n};\n\nfunction formatCellValue(cell) {\n  if (cell.human) {\n    return cell.human;\n  }\n\n  let value = cell.value;\n\n  const floatVal = parseFloat(cell.value);\n\n  if (cell.type === 'percentage' && isFinite(floatVal)) {\n    value = humaniseNumber(floatVal, { format: 'percent' });\n  }\n\n  return value || '';\n}\n\nfunction hasDisabledSelection(selection) {\n  const [xAxis, ...series] = selection;\n  // xaxis and at least one of series must be a valid selection\n  return (\n    !isValidSelection(xAxis) || series.filter(isValidSelection).length === 0\n  );\n}\n\nfunction stripInteger(value) {\n  const intValue = Math.floor(value);\n  if (intValue !== parseFloat(value)) {\n    return value;\n  }\n  return intValue.toString();\n}\n\nfunction unzipPathSelections(selections, parentPath) {\n  return reduce(\n    selections,\n    (memo, selection, path) => {\n      // Ignore empty selections (When the form is first initialised)\n      if (selection.some(isUndefined)) {\n        return memo;\n      }\n\n      const [[sampleIndex]] = selection;\n      if (isArray(sampleIndex)) {\n        // if multiple selection\n        const child = unzipPathSelections(selection, path);\n\n        const [childPaths, childSelections] = child;\n        const [paths, flatSelections] = memo;\n        return [\n          paths.concat(childPaths),\n          flatSelections.concat(childSelections),\n        ];\n      }\n\n      const [paths, flatSelections] = memo;\n      if (parentPath) {\n        paths.push(`${parentPath}[${path}]`);\n      } else {\n        paths.push(path);\n      }\n      flatSelections.push(selection);\n      return memo;\n    },\n    [[], []],\n  );\n}\n\n// zipObject with _.set to handle key as path\nfunction zipObjectPath(paths, values) {\n  return chain(paths)\n    .zip(values)\n    .reduce((memo, [key, value]) => {\n      set(memo, key, value);\n      return memo;\n    }, {})\n    .value();\n}\n\nfunction swapSelection(selection) {\n  if (!selection) return null;\n  const [[startCol, startRow], [endCol, endRow]] = selection;\n  return [\n    [startRow, startCol],\n    [endRow, endCol],\n  ];\n}\n\nfunction isEntireColumnSelection(selection) {\n  const [[, startRow], [endCol]] = selection;\n  // Full column and valid selection\n  return startRow === -1 && endCol !== -1;\n}\n\nfunction isEntireRowSelection(selection) {\n  return isEntireColumnSelection(swapSelection(selection));\n}\n\nfunction isEntireColumnOrRowSelection(selection) {\n  return isEntireColumnSelection(selection) || isEntireRowSelection(selection);\n}\n\nfunction isColumnSelection(selection) {\n  if (isEntireColumnSelection(selection)) {\n    return true;\n  }\n\n  const [[startCol, startRow], [endCol, endRow]] = selection;\n  // Column shape and not a 1x1 cell selection\n  return startCol === endCol && startRow !== endRow;\n}\n\nfunction isRowSelection(selection) {\n  return isColumnSelection(swapSelection(selection));\n}\n\nfunction getFullRowOrColumnHeaderIndex(selections, allSelectedCells) {\n  const filteredSelections = selections.filter(isValidSelection);\n\n  if (!filteredSelections.length) {\n    return null;\n  }\n  if (filteredSelections.every(isEntireColumnSelection)) {\n    let row = chain(allSelectedCells)\n      .flatten()\n      .map('row')\n      .min()\n      .value();\n    row = toFrontendIndex(row);\n    return { row };\n  }\n  if (filteredSelections.every(isEntireRowSelection)) {\n    let column = chain(allSelectedCells)\n      .flatten()\n      .map('column')\n      .min()\n      .value();\n    column = toFrontendIndex(column);\n    return { column };\n  }\n  return null;\n}\n\nfunction getFullHeaderFromCfg(config, cells, headerPaths) {\n  const selections = pick(config, headerPaths);\n  const definedSelections = omitBy(selections, isUndefined);\n  const [, flatSelections] = unzipPathSelections(definedSelections);\n  const allSelectedCells = getSelectedCells(cells, flatSelections);\n\n  return getFullRowOrColumnHeaderIndex(flatSelections, allSelectedCells);\n}\n\nfunction getHeaderCells(cells, selection) {\n  const allSelectedCells = getSelectedCells(cells, selection);\n  const headerIndices = getSelectionHeaderIndices(selection, allSelectedCells);\n\n  return chain(allSelectedCells)\n    .map(first)\n    .zip(headerIndices)\n    .map(([cell, headerIndex]) => {\n      if (isMatch(cell, headerIndex)) {\n        return cell;\n      }\n      return headerIndex;\n    })\n    .value();\n}\n\nfunction getHeaderCellsFromCfg(config, cells, headerPaths) {\n  const selections = pick(config, headerPaths);\n  const definedSelections = omitBy(selections, isUndefined);\n  const [paths, flatSelections] = unzipPathSelections(definedSelections);\n  const flatHeaderCells = getHeaderCells(cells, flatSelections);\n\n  return zipObjectPath(paths, flatHeaderCells);\n}\n\n// Return visible subset\nfunction getCanvasCells(cells, viewport, scrolls) {\n  if (!cells || !viewport) {\n    return [];\n  }\n  const [scrollCol, scrollRow] = scrolls;\n  const { columns, rows } = viewport;\n  const maxRow = scrollRow + rows;\n  const maxCol = scrollCol + columns;\n  let i;\n  let j;\n  const ret = [];\n  for (i = scrollRow; i <= maxRow; i++) {\n    const row = [];\n    for (j = scrollCol; j <= maxCol; j++) {\n      const cellValue = chain(cells)\n        .find({ row: i + INDEX_BASED, column: j + INDEX_BASED })\n        .thru(cell => formatCellValue(cell || {})) // eslint-disable-line no-loop-func\n        .value();\n\n      row.push(cellValue);\n    }\n    ret.push(row);\n  }\n\n  return ret;\n}\n\nconst setMinMaxFromDefaults = state => {\n  const { config, cells } = state;\n  const { value, type, min, max, _minDefault, _maxDefault } = config;\n\n  if (type !== 'geckometer') {\n    return state;\n  }\n\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const numericCells = getNumericCells(selectedCells);\n  const [format] = getSelectionFormat(numericCells);\n\n  let minValue;\n  if (\n    isUndefined(min) ||\n    isUndefined(getMixedInputValue(cells, min.value, format))\n  ) {\n    minValue = _minDefault;\n  } else {\n    minValue = min.value;\n  }\n\n  let maxValue;\n  if (\n    isUndefined(max) ||\n    isUndefined(getMixedInputValue(cells, max.value, format))\n  ) {\n    maxValue = _maxDefault;\n  } else {\n    maxValue = max.value;\n  }\n\n  const updatedConfig = {\n    ...config,\n    min: { value: minValue },\n    max: { value: maxValue },\n  };\n  return { ...state, config: updatedConfig };\n};\n\nconst toRenderableState = state => {\n  return setMinMaxFromDefaults(state);\n};\n\nconst _convertRangeToColumns = range => {\n  const { start, end } = range;\n  const [firstColumn, firstRow] = start;\n  const [lastColumn, lastRow] = end;\n\n  const selection = [];\n\n  for (let i = firstColumn; i <= lastColumn; i++) {\n    selection.push([\n      [i, firstRow],\n      [i, lastRow],\n    ]);\n  }\n\n  return selection;\n};\n\nconst _convertRangeToRows = range => {\n  //   {\n  //     firstCell: [0, 1],\n  //     start: [0, 1],\n  //     end: [4, 5],\n  //     size: [5, 5]\n  //   }\n\n  // [\n  //   [ [0, 1], [4, 1] ],\n  //   [ [0, 2], [4, 2] ],\n  //   [ [0, 3], [4, 3] ],\n  // ];\n\n  const { start, end } = range;\n  const [firstColumn, firstRow] = start;\n  const [lastColumn, lastRow] = end;\n\n  const selection = [];\n\n  for (let i = firstRow; i <= lastRow; i++) {\n    selection.push([\n      [firstColumn, i],\n      [lastColumn, i],\n    ]);\n  }\n\n  return selection;\n};\n\nconst convertSelectionRangesToColumns = ranges =>\n  chain(ranges)\n    .map(_convertRangeToColumns)\n    .flatten()\n    .value();\n\nconst convertSelectionRangesToRows = ranges =>\n  chain(ranges)\n    .map(_convertRangeToRows)\n    .flatten()\n    .value();\n\nconst areSelectionsTheSameLength = (a, b) => {\n  // Handles the case for columns\n  if (a[0][1] === b[0][1] && a[1][1] === b[1][1]) {\n    return true;\n  }\n\n  // Handles the case for rows\n  if (a[0][0] === b[0][0] && a[1][0] === b[1][0]) {\n    return true;\n  }\n\n  return false;\n};\n\nconst areSelectionsAdjascent = (a, b) => {\n  // Handles the case for columns\n  if (a[1][0] === b[0][0] - 1) {\n    return true;\n  }\n\n  // Handles the case for rows\n  if (a[1][1] === b[0][1] - 1) {\n    return true;\n  }\n\n  return false;\n};\n\n/**\n * compressSelections\n *\n * Takes an array of selections that are in a single dimension\n * i.e. a single row or a single column\n * and tries to compress them into multi-dimensional selectons.\n *\n * If 2 or more adjascent colums or rows have the same length\n * then they can be compressed into a single selection.\n *\n * If any adjascent columns have mismatched lenghts however\n * they cannot be compressed and will remain separate.\n */\nconst compressSelections = selections =>\n  selections.reduce((compressed, selection) => {\n    if (isEmpty(compressed)) {\n      return [selection];\n    }\n\n    const previous = last(compressed);\n\n    if (\n      areSelectionsTheSameLength(previous, selection) &&\n      areSelectionsAdjascent(previous, selection)\n    ) {\n      return [...initial(compressed), [previous[0], selection[1]]];\n    }\n\n    return [...compressed, selection];\n  }, []);\n\nexport {\n  toBackendIndex,\n  toFrontendIndex,\n  getColumnLetter,\n  getNumberFromLetter,\n  getSelectionSize,\n  selectToIndices,\n  inputToSelection,\n  selectionToString,\n  getWindowSize,\n  getSelectedCells,\n  formatCellValue,\n  isValidSelection,\n  hasDisabledSelection,\n  stripInteger,\n  greedilyParseFloat,\n  unzipPathSelections,\n  zipObjectPath,\n  swapSelection,\n  isEntireColumnSelection,\n  isEntireRowSelection,\n  isEntireColumnOrRowSelection,\n  isColumnSelection,\n  isRowSelection,\n  getFullRowOrColumnHeaderIndex,\n  getFullHeaderFromCfg,\n  getSelectionHeaderIndices,\n  getHeaderCells,\n  getHeaderCellsFromCfg,\n  getCanvasCells,\n  toRenderableState,\n  updateSelection,\n  convertSelectionRangesToColumns,\n  convertSelectionRangesToRows,\n  convertSelectionToObjectFormat,\n  convertSelectionToArrayFormat,\n  compressSelections,\n};\n","export const getComparisonValue = (values = [], { valueOption }) => {\n  switch (valueOption) {\n    case 'previousValue':\n      return values[values.length - 2];\n    case 'firstValue':\n    default:\n      const [first] = values;\n      return first;\n  }\n};\n\nexport const DEFAULT_SIZE = [230, 230];\n\nexport const getDefaultSize = type => {\n  switch (type) {\n    case 'leaderboard':\n      return [230, 470];\n    case 'number':\n    case 'geckometer':\n    case 'text':\n      return [230, 230];\n    case 'line':\n    case 'column':\n    case 'bar':\n    case 'table':\n    case 'feed':\n    case 'funnel':\n      return [470, 230];\n    default:\n      return DEFAULT_SIZE;\n  }\n};\n\nexport const getMinimumHeight = type => {\n  switch (type) {\n    case 'text':\n    case 'image':\n    case 'number':\n      return 0.5;\n    default:\n      return 1;\n  }\n};\n\nexport const getHumanReadableName = type => {\n  const name = {\n    bar: 'Bar Chart',\n    clock: 'Clock',\n    column: 'Column Chart',\n    geckometer: 'Gauge',\n    funnel: 'Funnel',\n    leaderboard: 'Leaderboard',\n    line: 'Line Chart',\n    number: 'Number',\n    map: 'Map',\n    table: 'Table',\n    feed: 'Feed',\n    text: 'Text',\n    rag: 'RAG',\n    ragcolumn: 'RAG Column',\n    pie: 'Pie Chart',\n    highcharts: 'Highcharts',\n    list: 'List',\n    monitoring: 'Monitoring',\n    bullet: 'Bullet Chart',\n    image: 'Image',\n  }[type];\n\n  if (name) {\n    return name;\n  }\n\n  throw new Error(\n    `The visualisation type '${type}' has no human readable name.\nBe sure to add one in src/visualisation/helpers.js`,\n  );\n};\n\nexport const isHalfHeight = height => height < 230;\n\nexport const isSmallDimension = dimension => dimension < 470;\nexport const isMediumDimension = dimension => dimension < 710;\nexport const isLargeDimension = dimension => dimension < 950;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport Layout, { Column } from '../../layout';\n\nimport style from './drop-item-style.scss';\n\nconst DropItemComponent = ({\n  layoutClassName,\n  innerClassName,\n  innerIconClassName,\n  children,\n  getIcon,\n  isSmall,\n  onClick,\n  selected,\n  dividerTop,\n  dividerBottom,\n  noPadding,\n  hasLeftIcon,\n}) => {\n  const classes = classNames(layoutClassName, style.dropItem, {\n    [style.pointer]: onClick,\n  });\n\n  const innerWrapperClasses = classNames(style.innerWrapper, innerClassName, {\n    [style.small]: isSmall,\n    [style.dividerTop]: dividerTop,\n    [style.dividerBottom]: dividerBottom,\n    [style.unpadded]: noPadding,\n    [style.hasLeftIcon]: hasLeftIcon,\n  });\n  const selectedClasses = classNames(\n    style.iconLeftWrapper,\n    innerIconClassName,\n    {\n      [style.selected]: selected,\n    },\n  );\n\n  return (\n    <li role=\"menuitem\" tabIndex={-1} className={classes} onClick={onClick}>\n      <div className={innerWrapperClasses}>\n        {hasLeftIcon && (\n          <div className={selectedClasses}>{getIcon && getIcon()}</div>\n        )}\n        <div className={style.content}>{children}</div>\n      </div>\n    </li>\n  );\n};\n\nDropItemComponent.defaultProps = {\n  hasLeftIcon: false,\n};\n\nDropItemComponent.propTypes = {\n  children: PropTypes.node,\n  dividerBottom: PropTypes.bool,\n  dividerTop: PropTypes.bool,\n  getIcon: PropTypes.func,\n  hasLeftIcon: PropTypes.bool,\n  innerClassName: PropTypes.string,\n  innerIconClassName: PropTypes.string,\n  isSmall: PropTypes.bool,\n  layoutClassName: PropTypes.string,\n  noPadding: PropTypes.bool,\n  selected: PropTypes.bool,\n  onClick: PropTypes.func,\n};\n\n// We use Layout instead of Row here as we want don't want it to wrap\nconst ItemWithRightHint = ({ label, hint }) => (\n  <Layout flex>\n    <Column flexAuto>{label}</Column>\n    {hint && <Column className={style.hint}>{hint}</Column>}\n  </Layout>\n);\n\nItemWithRightHint.propTypes = {\n  hint: PropTypes.node,\n  label: PropTypes.node,\n};\n\nexport { DropItemComponent as default, ItemWithRightHint };\n","import DropItem, { ItemWithRightHint } from './drop-item-component';\nexport { DropItem as default, ItemWithRightHint };\n","import { omit, get, every } from 'lodash';\nimport { create, update, getConfig } from '../../lib/widget-service';\nimport {\n  getSpreadsheet,\n  getWorksheet,\n} from '../../universal/services/spreadsheet-service';\nimport { getDashboard } from '../../services/management-service';\nimport { setDashboard } from '../../dashboard/actions/dashboard-actions';\nimport { serialize, deserialize } from '../../universal/serializers';\nimport { redirect } from '../../lib/global';\nimport {\n  track,\n  trackSnowplow,\n  trackSwitchVisualisation,\n} from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { widgetCreated, widgetConfigEdited } from '@Tracking/events';\nimport { getHumanReadableName } from '../../visualisation/helpers';\nimport getVisualisationHelpers from '../spreadsheet-config-component/get-visualisation-helpers';\nimport getVisualisationHelpersV2 from '../spreadsheet-config-component-v2/get-visualisation-helpers';\nimport { translate } from '../../lib/config-mapper';\nimport { getStateToSave, getStateToRestore } from '../../actions/helpers';\nimport { toRenderableState } from '../helpers';\nimport * as pathHelpers from '../../lib/path';\nimport widgetStorage from '../../lib/widget-storage';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport * as grapqhlDashboardHelpers from '../../dashboard/graphql-dashboard-helpers';\nimport { getIntegrationTrackingDetails } from '../../data-sources/data-sources-helpers';\n\nimport { handleGoalTracking } from '../../widget/edit-widget/actions/edit-widget-actions';\nimport {\n  handleIndicatorTracking,\n  handleNumberFormattingTracking,\n} from '../../widget-menu/actions/widget-menu-actions';\n\nexport const doSetActiveField = createAction(\n  'SpreadsheetConfig:SET_ACTIVE_FIELD',\n);\nexport const doSetValue = createAction('SpreadsheetConfig:SET_VALUE');\nexport const doSetValues = createAction('SpreadsheetConfig:SET_VALUES');\n\nexport const widgetCreationStart = createAction(\n  'SpreadsheetConfig:WIDGET_CREATION_START',\n);\nexport const widgetCreationSuccessful = createAction(\n  'SpreadsheetConfig:WIDGET_CREATION_SUCCESSFUL',\n);\nexport const widgetCreationFailed = createErrorAction(\n  'SpreadsheetConfig:WIDGET_CREATION_FAILED',\n);\n\nexport const widgetUpdateStart = createAction(\n  'SpreadsheetConfig:WIDGET_UPDATE_START',\n);\nexport const widgetUpdateSuccessful = createAction(\n  'SpreadsheetConfig:WIDGET_UPDATE_SUCCESSFUL',\n);\nexport const widgetUpdateFailed = createErrorAction(\n  'SpreadsheetConfig:WIDGET_UPDATE_FAILED',\n);\n\nexport const widgetConfigFetchStart = createAction(\n  'SpreadsheetConfig:WIDGET_CONFIG_FETCH_START',\n);\nexport const widgetConfigFetchSuccessful = createAction(\n  'SpreadsheetConfig:WIDGET_CONFIG_FETCH_SUCCESSFUL',\n);\nexport const widgetConfigFetchFailed = createErrorAction(\n  'SpreadsheetConfig:WIDGET_CONFIG_FETCH_FAILED',\n);\n\nexport const initSpreadsheetConfigStart = createAction(\n  'SpreadsheetConfig:INIT_SPREADSHEET_CONFIG_START',\n);\nexport const initSpreadsheetConfigSuccessful = createAction(\n  'SpreadsheetConfig:INIT_SPREADSHEET_CONFIG_SUCCESSFUL',\n);\nexport const initSpreadsheetConfigFailed = createErrorAction(\n  'SpreadsheetConfig:INIT_SPREADSHEET_CONFIG_FAILED',\n);\n\nexport const doSwitchVisualisationType = createAction(\n  'SpreadsheetConfig:SWITCH_VISUALISATION_TYPE',\n);\nexport const toggleFilePicker = createAction(\n  'SpreadsheetConfig:TOGGLE_FILE_PICKER',\n);\nexport const updateNumberFormat = createAction(\n  'SpreadsheetConfig:UPDATE_NUMBER_FORMAT',\n);\nexport const deleteTableColumn = createAction(\n  'SpreadsheetConfig:DELETE_TABLE_COLUMN',\n);\nexport const reorderTableColumn = createAction(\n  'SpreadsheetConfig:REORDER_TABLE_COLUMN',\n);\n\nexport const DEFAULT_TYPE = 'line';\n\n// TODO share this between gecko-js and polecat\nconst CACHE_PREFIX = 'widgetData:';\n\nexport const set = createAction('SpreadsheetConfig:SET');\nexport const setConfig = set; // Alias `set` to `setConfig` to maintain compatibility with the other integrations\n\nexport const createWidget = (dashboardId, type, service) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    spreadsheets,\n  } = getState();\n  const state = toRenderableState(spreadsheets);\n  const { config } = state;\n  const { columns = [], hasHeader } = config;\n  const forSerialization = { ...state, ...config };\n\n  const data = {\n    dashboard_id: dashboardId,\n    ...serialize('spreadsheets', type, forSerialization), // hardcoded spreadsheets service\n  };\n\n  const visualisation = getHumanReadableName(type);\n\n  dispatch(widgetCreationStart());\n\n  track('Spreadsheets - Click Add to Dashboard', {\n    properties: {\n      visualisation,\n      data_source: service,\n    },\n  });\n\n  try {\n    const widget = await create(data);\n\n    track('Widget added', {\n      properties: {\n        widget_id: widget.id,\n        widget_type_id: widget.widget_type_id,\n        service_name: widget.services[0].name,\n        service_id: widget.services[0].id,\n        widget_type_name: visualisation,\n        visualisation,\n        source: 'Spreadsheets',\n      },\n    });\n\n    trackEvent(\n      widgetCreated({\n        ...getIntegrationTrackingDetails({\n          name: 'Spreadsheets',\n          slug: service,\n        }),\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: type,\n        'Widget type ID': `${widget.widget_type_id}`,\n      }),\n    );\n\n    trackSnowplow('widget_add', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.services[0].id}`,\n      service_name: widget.services[0].name,\n      visualisation_type: type,\n    });\n\n    /*\n     * Track Table widget usage\n     */\n    if (type === 'table') {\n      const isColumnFilled = col => !every(col, selection => selection === -1);\n\n      track('Spreadsheets - Added table viz', {\n        properties: {\n          column_count: columns.filter(isColumnFilled).length,\n          has_header: hasHeader,\n        },\n      });\n    }\n\n    dispatch(widgetCreationSuccessful());\n\n    // add a delay for redirecting, to wait for mixpanel tracker to be finished\n    redirect(\n      pathHelpers.getDashboardPath(dashboardId.toString(), widget.id),\n      300,\n    );\n  } catch (error) {\n    dispatch(widgetCreationFailed(error));\n  }\n};\n\nexport const updateWidget = (widgetKey, dashboardId, type) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    spreadsheets,\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n  const state = toRenderableState(spreadsheets);\n  const { initialConfig } = spreadsheets;\n  const { worksheetId, fileId, config } = state;\n  const forSerialization = {\n    ...state,\n    ...config,\n    worksheetId,\n    fileId,\n  };\n\n  dispatch(widgetUpdateStart());\n\n  let data = serialize('spreadsheets', type, forSerialization);\n\n  data = omit(data, ['service_account_id', 'dashboard_id']);\n\n  try {\n    const widget = await update(widgetKey, data);\n\n    // this to replicate the kind of data the widget is holding if on the\n    // dashboard page\n    const widgetPreUpdate = {\n      id: widgetKey,\n      widgetType: {},\n      service: {\n        title: widget.service.title,\n        name: 'spreadsheets',\n      },\n      serviceTitle: widget.service.title,\n      serviceName: 'spreadsheets',\n      visualisation: { vizType: type },\n      config: initialConfig,\n    };\n\n    const integration = {\n      name: 'Spreadsheets',\n      slug: widget.service.name,\n    };\n\n    const indicatorTrack = handleIndicatorTracking(\n      widgetPreUpdate,\n      getState(),\n      get(config, 'indicators', {}),\n      integration,\n    );\n\n    const goalTrack = handleGoalTracking(widgetPreUpdate, config, integration);\n    const formattingTrack = handleNumberFormattingTracking(\n      widgetPreUpdate,\n      config,\n      integration,\n    );\n\n    const configTrack = trackEvent(\n      widgetConfigEdited({\n        ...getIntegrationTrackingDetails(integration),\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: type,\n      }),\n    );\n\n    await indicatorTrack;\n    await goalTrack;\n    await formattingTrack;\n    await configTrack;\n\n    trackSnowplow('widget_update', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.service.id}`,\n      service_name: widget.service.title,\n      visualisation_type: type,\n    });\n\n    const graphqlDashboard =\n      grapqhlDashboardHelpers.getDashboardFromStorage(dashboardId) || {};\n    const isContainerLayout = grapqhlDashboardHelpers.isContainerLayout(\n      graphqlDashboard,\n    );\n\n    if (isContainerLayout) {\n      const instrumentId = await grapqhlDashboardHelpers.getInstrumentIdFromWidgetKey(\n        graphqlDashboard.id,\n        widgetKey,\n      );\n      widgetStorage.removeItem(`instrumentData:${instrumentId}`);\n    } else {\n      widgetStorage.removeItem(`${CACHE_PREFIX}${widgetKey}`);\n    }\n\n    dispatch(widgetUpdateSuccessful());\n\n    redirect(pathHelpers.getDashboardPath(dashboardId.toString(), widget.id));\n  } catch (error) {\n    dispatch(widgetUpdateFailed(error));\n  }\n};\n\nexport const getWidgetConfig = (widgetId, dashboardId) => async dispatch => {\n  dispatch(widgetConfigFetchStart());\n\n  try {\n    const json = await getConfig(widgetId);\n\n    const { template: { type = DEFAULT_TYPE } = {} } = json.config;\n    const key = json.key;\n    const config = deserialize('spreadsheets', type, json);\n\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n\n    let spreadsheet = null;\n    let worksheet = null;\n    let spreadsheetErrorType = null;\n\n    try {\n      spreadsheet = await getSpreadsheet(config.fileId, 300);\n    } catch (error) {\n      switch (error.type) {\n        case 'ErrResourceNotFound':\n        case 'ErrServiceAccountNotFound':\n          spreadsheetErrorType = error.type;\n          break;\n        default:\n          throw error;\n      }\n    }\n\n    const { fileId, worksheetId } = config;\n\n    if (!spreadsheetErrorType) {\n      worksheet = await getWorksheet(fileId, worksheetId);\n    }\n\n    dispatch(\n      widgetConfigFetchSuccessful({\n        config,\n        spreadsheet,\n        worksheet,\n        key,\n        spreadsheetErrorType,\n        showFilePicker: !!spreadsheetErrorType,\n      }),\n    );\n  } catch (error) {\n    dispatch(widgetConfigFetchFailed(error));\n  }\n};\n\nexport const initConfig = (fileId, dashboardId) => async dispatch => {\n  dispatch(initSpreadsheetConfigStart());\n\n  try {\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n\n    const spreadsheet = await getSpreadsheet(fileId, 300);\n\n    const { worksheets } = spreadsheet;\n    const { id: worksheetId } = worksheets[0];\n\n    const worksheet = await getWorksheet(fileId, worksheetId);\n    const config = getVisualisationHelpers(DEFAULT_TYPE).getDefaultConfig();\n\n    dispatch(\n      initSpreadsheetConfigSuccessful({\n        config,\n        spreadsheet,\n        worksheet,\n      }),\n    );\n  } catch (error) {\n    dispatch(initSpreadsheetConfigFailed(error));\n  }\n};\n\nexport const setActiveField = (path, value, options) =>\n  doSetActiveField({ path, value, options });\n\nexport const setValue = (path, value, activeFieldPath) =>\n  doSetValue({ path, value, activeFieldPath });\n\nexport const setValues = (state, activeFieldPath) =>\n  doSetValues({ state, activeFieldPath });\n\nexport const switchVisualisationType = type => (dispatch, getState) => {\n  const {\n    spreadsheets: { config: currentConfig, previousConfigs },\n    user: { user: { features = [] } = {} } = {},\n  } = getState();\n\n  const lastConfigForType = previousConfigs[type];\n\n  if (currentConfig.type === type) return;\n\n  const visualisationHelpers = !features.includes('ff:spreadsheetsDataRange')\n    ? getVisualisationHelpers(type)\n    : getVisualisationHelpersV2(type);\n\n  const defaults = visualisationHelpers.getDefaultConfig();\n\n  const mappedValues = translate(\n    visualisationHelpers.configMappingRules,\n    currentConfig,\n    lastConfigForType,\n    features,\n  );\n\n  const config = {\n    ...defaults,\n    ...lastConfigForType,\n    ...mappedValues,\n  };\n\n  trackSwitchVisualisation('spreadsheets', currentConfig.type, type);\n  dispatch(doSwitchVisualisationType(config));\n};\n\nexport const saveState = paths => (dispatch, getState) => {\n  const { config } = getState().spreadsheets;\n  const state = getStateToSave(config, paths);\n  dispatch(setValues(state));\n};\n\nexport const restoreState = paths => (dispatch, getState) => {\n  const { config } = getState().spreadsheets;\n  const state = getStateToRestore(config, paths);\n  dispatch(setValues(state, paths[0]));\n};\n","import Cookies from 'js-cookie';\n\n// This is in a separate module to hide the fact that we are using cookies.\n// We likely want to refactor this away from cookies to some other storage.\n// E.g. local storage or server side.\nconst getActiveDashboardId = () =>\n  parseInt(Cookies.get('gb_active_dashboard'), 10) || undefined;\n\nexport { getActiveDashboardId };\n","import delay from '../../lib/delay';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { isUndefined, isEmpty, find, defaultTo } from 'lodash';\nimport * as toastActions from '../../toast/actions';\nimport * as groupsActions from '../../groups/actions/groups-actions';\nimport * as loopActions from '../../admin/actions/loop-actions';\nimport {\n  getAllDashboards,\n  getAllSharingLoops,\n  connectDevice as connectDeviceService,\n  getDevices,\n  deleteDevice as deleteDeviceService,\n  setDeviceName as setDeviceNameService,\n  setDeviceDashboard,\n  enableToggle,\n  disableToggle,\n} from '../../services/management-service';\nimport {\n  refreshDashboard,\n  refreshSharingLoop,\n} from '../../services/app-service';\nimport { ADDED_SCREEN } from '../../toast/toast-constants';\nimport { getActiveDashboardId } from '../../services/active-dashboard-service';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { screenConnected } from '@Tracking/events';\n\n// Actions\nexport const setView = createAction('ManageScreens:SET_VIEW');\nexport const openUpgradeModal = createAction(\n  'ManageScreens:OPEN_UPGRADE_MODAL',\n);\nexport const openModal = createAction('ManageScreens:OPEN_MODAL');\nexport const closeModal = createAction('ManageScreens:CLOSE_MODAL');\nexport const setDevices = createAction('ManageScreens:SET_DEVICES');\n\n// Async actions\nexport const fetchDevicesStart = createAction(\n  'ManageScreens:FETCH_DEVICES_START',\n);\nexport const fetchDevicesSuccess = createAction(\n  'ManageScreens:FETCH_DEVICES_SUCCESS',\n);\nexport const fetchDevicesFailed = createAction(\n  'ManageScreens:FETCH_DEVICES_FAILED',\n);\n\nexport const openModalAndFetchDevices = () => async dispatch => {\n  dispatch(openModal());\n  dispatch(fetchDevicesStart());\n\n  try {\n    const devices = await getDevices();\n\n    dispatch(fetchDevicesSuccess(devices));\n\n    if (devices.length > 0) {\n      const [dashboards, loops] = await Promise.all([\n        getAllDashboards(),\n        getAllSharingLoops(),\n      ]);\n\n      dispatch(groupsActions.getDashboardsSuccess(dashboards));\n      dispatch(loopActions.getLoopsSuccess({ loops }));\n    }\n  } catch (err) {\n    dispatch(fetchDevicesFailed(err));\n  }\n};\n\nexport const connectDeviceStart = createAction(\n  'ManageScreens:CONNECT_DEVICE_START',\n);\nexport const connectDeviceSuccess = createAction(\n  'ManageScreens:CONNECT_DEVICE_SUCCESS',\n);\nexport const connectDeviceFailed = createAction(\n  'ManageScreens:CONNECT_DEVICE_FAILED',\n);\n\nexport const connectDevice = (code, currentDashboardId = undefined) => async (\n  dispatch,\n  getState,\n) => {\n  dispatch(connectDeviceStart());\n\n  try {\n    let dashboardId = currentDashboardId;\n\n    // If we are not on a dashboard then pick a dashboard\n    if (isUndefined(currentDashboardId)) {\n      const dashboards = await getAllDashboards();\n      if (isEmpty(dashboards)) {\n        throw new Error(\n          'No dashboards. Please create a dashboard before adding a screen.',\n        );\n      }\n\n      const activeDashboardId = getActiveDashboardId();\n      dashboardId = defaultTo(\n        find(dashboards, { id: activeDashboardId }),\n        dashboards[0],\n      ).id;\n    }\n\n    const {\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    } = getState();\n\n    const device = {\n      code,\n      content: {\n        type: 'dashboard',\n        id: dashboardId,\n      },\n    };\n\n    const {\n      id,\n      content: { type },\n    } = await connectDeviceService(device);\n    track('Screens - Connection successful');\n    trackSnowplow('screen_connect', '1-1-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      device_id: `${id}`,\n    });\n    trackEvent(\n      screenConnected({\n        'Screen ID': id,\n        'Screen content type': type,\n      }),\n    );\n    dispatch(toastActions.showToast({ type: ADDED_SCREEN }));\n\n    // Close modal after 2 seconds\n    await delay(2000);\n\n    dispatch(connectDeviceSuccess());\n  } catch (error) {\n    dispatch(connectDeviceFailed(error));\n  }\n};\n\nexport const refreshDeviceStart = createAction(\n  'ManageScreens:REFRESH_DEVICE_START',\n);\nexport const refreshDeviceSuccess = createAction(\n  'ManageScreens:REFRESH_DEVICE_SUCCESS',\n);\nexport const refreshDeviceFailed = createAction(\n  'ManageScreens:REFRESH_DEVICE_FAILED',\n);\n\nexport const refreshDevice = id => async (dispatch, getState) => {\n  dispatch(refreshDeviceStart(id));\n\n  const {\n    manageScreens: { devices },\n    allLoops,\n  } = getState();\n\n  try {\n    const device = find(devices, { id });\n\n    if (!device || !device.content || !device.content.id) {\n      return;\n    }\n\n    if (device.content.type === 'dashboard') {\n      await refreshDashboard(device.content.id);\n    }\n\n    if (device.content.type === 'sharing_loop') {\n      const sharingLoop = allLoops[device.content.id];\n      await refreshSharingLoop(sharingLoop.code);\n    }\n\n    dispatch(refreshDeviceSuccess(id));\n  } catch (error) {\n    dispatch(toastActions.showGenericErrorToast());\n    dispatch(refreshDeviceFailed(error));\n  }\n};\n\nexport const deleteDeviceStart = createAction(\n  'ManageScreens:DELETE_DEVICE_START',\n);\nexport const deleteDeviceSuccess = createAction(\n  'ManageScreens:DELETE_DEVICE_SUCCESS',\n);\nexport const deleteDeviceFailed = createAction(\n  'ManageScreens:DELETE_DEVICE_FAILED',\n);\n\nexport const deleteDevice = id => async dispatch => {\n  dispatch(deleteDeviceStart(id));\n\n  try {\n    await deleteDeviceService(id);\n    dispatch(deleteDeviceSuccess(id));\n  } catch (error) {\n    dispatch(toastActions.showGenericErrorToast());\n    dispatch(deleteDeviceFailed(error));\n  }\n};\n\nexport const setDeviceNameStart = createAction(\n  'ManageScreens:SET_DEVICE_NAME_START',\n);\nexport const setDeviceNameSuccess = createAction(\n  'ManageScreens:SET_DEVICE_NAME_SUCCESS',\n);\nexport const setDeviceNameFailed = createAction(\n  'ManageScreens:SET_DEVICE_NAME_FAILED',\n);\n\nexport const setDeviceName = (id, name) => async dispatch => {\n  dispatch(setDeviceNameStart({ id, name }));\n\n  try {\n    await setDeviceNameService(id, name);\n    dispatch(setDeviceNameSuccess({ id, name }));\n  } catch (err) {\n    dispatch(toastActions.showGenericErrorToast());\n    dispatch(setDeviceNameFailed(err));\n  }\n};\n\nexport const setDeviceConnectionStart = createAction(\n  'ManageScreens:SET_DEVICE_CONNECTION_START',\n);\nexport const setDeviceConnectionSuccess = createAction(\n  'ManageScreens:SET_DEVICE_CONNECTION_SUCCESS',\n);\nexport const setDeviceConnectionFailed = createAction(\n  'ManageScreens:SET_DEVICE_CONNECTION_FAILED',\n);\n\nexport const setDeviceConnection = (\n  id,\n  dashboardId,\n  type,\n) => async dispatch => {\n  dispatch(setDeviceConnectionStart({ id, dashboardId, type }));\n\n  try {\n    await setDeviceDashboard(id, dashboardId, type);\n    dispatch(setDeviceConnectionSuccess({ id, dashboardId, type }));\n  } catch (error) {\n    dispatch(setDeviceConnectionFailed(error));\n  }\n};\n\nexport const toggleLiteStart = createAction('ManageScreens:TOGGLE_LITE_START');\nexport const toggleLiteSuccess = createAction(\n  'ManageScreens:TOGGLE_LITE_SUCCESS',\n);\nexport const toggleLiteFailed = createErrorAction(\n  'ManageScreens:TOGGLE_LITE_FAILED',\n);\n\nexport const toggleLite = enabled => async dispatch => {\n  dispatch(toggleLiteStart(enabled));\n\n  const toggle = enabled ? enableToggle : disableToggle;\n\n  try {\n    await toggle('lite');\n    dispatch(toggleLiteSuccess());\n  } catch (error) {\n    dispatch(toggleLiteFailed(error));\n  }\n};\n","export const SUCCESS = 'Toast:SUCCESS';\nexport const ERROR = 'Toast:ERROR';\nexport const ADDED_SCREEN = 'Toast:ADDED_SCREEN';\nexport const FOOTER_SWITCHED_ON = 'Toast:FOOTER_SWITCHED_ON';\nexport const DEMOTED_TO_DASHBOARD_VIEW_ONLY =\n  'Toast:DEMOTED_TO_DASHBOARD_VIEW_ONLY';\nexport const SHARING_LINK_COPIED = 'Toast:SHARING_LINK_COPIED';\nexport const REGENERATED_SHARING_LINK = 'Toast::REGENERATED_SHARING_LINK';\nexport const REGENERATED_LOOP_SHARING_LINK =\n  'Toast::REGENERATED_LOOP_SHARING_LINK';\nexport const CREATED_LOOP = 'Toast::CREATED_LOOP';\nexport const ADD_A_GOAL = 'Toast::ADD_A_GOAL';\nexport const DASHBOARD_TEMPLATE_CREATE_ERROR =\n  'Toast::DASHBOARD_TEMPLATE_CREATE_ERROR';\nexport const WIDGET_COPIED = 'Toast::WIDGET_COPIED';\n","import { chain, map, last, slice } from 'lodash';\n\nconst DECIMAL = ['decimal'];\nconst DATETIME = ['datetime'];\nconst PERCENT = ['percent'];\n\nfunction getLabelType(labelType) {\n  switch (labelType) {\n    case 'currency':\n    case 'number':\n    case 'percentage':\n      return 'number';\n    case 'date':\n    case 'datetime':\n      return 'datetime';\n    default:\n      return 'standard';\n  }\n}\n\nfunction getYAxisFormat(labelType, unit) {\n  if (labelType === 'date' || labelType === 'datetime') {\n    return DATETIME;\n  }\n\n  if (labelType === 'percentage') {\n    return PERCENT;\n  }\n\n  if (labelType === 'currency') {\n    return ['currency', unit];\n  }\n\n  return DECIMAL;\n}\n\nfunction getSeries(pegSeries = {}) {\n  return chain(pegSeries)\n    .map(({ label, values }) => {\n      return { name: label, data: values };\n    })\n    .value();\n}\n\nfunction getXLabels(labelType, pegLabels) {\n  const labels = map(pegLabels, 'label');\n  const type = getLabelType(labelType);\n\n  return { labels, type };\n}\n\nconst getGeckometerValue = (config, total, series) => {\n  const { numberToDisplay } = config;\n\n  if (numberToDisplay !== 'latestRecord') {\n    return total;\n  }\n\n  if (!series.length) {\n    return undefined;\n  }\n  return last(series[0].values);\n};\n\n/*\n * The salesforce configuration is wrapped inside of a config object,\n * that is why we need to destructure in the transformer in order not to\n * introduce more logic in megatron\n */\nconst destructureSalesforceConfigWrap = transformer => (\n  data,\n  { config } = {},\n  context,\n) => {\n  return transformer(data, config, context);\n};\n\nconst limitSeriesTransformWrap = (limit, transformer) => (\n  data,\n  config,\n  context,\n) => {\n  const { series: initialSeries } = data;\n  const series = slice(initialSeries, 0, limit);\n  return transformer({ ...data, series }, config, context);\n};\n\nexport {\n  getYAxisFormat,\n  getSeries,\n  getXLabels,\n  getGeckometerValue,\n  destructureSalesforceConfigWrap,\n  limitSeriesTransformWrap,\n};\n","import { track } from '../../lib/tracker';\nimport DebouncePromise from '../../lib/debounce-promise';\nimport servicePicker from '../../services/service-picker';\nimport { router } from '../../router';\nimport actionPicker from '../../config-wrapper/action-picker';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { create } from '../../lib/widget-service';\nimport { redirect } from '../../lib/global';\nimport { serialize } from '../../universal/serializers';\nimport { trackEvent } from '@Tracking';\nimport {\n  spreadsheetsUrlSucceeded,\n  spreadsheetsUrlFailed,\n} from '@Tracking/events';\n\n// Redux actions\nfunction debouncify(fn) {\n  const queryManager = new DebouncePromise();\n  return (...args) => {\n    return queryManager.push(fn(...args));\n  };\n}\n\nexport const closeFilePicker = createAction('File:CLOSE_FILE_PICKER');\nexport const fetchFilesStart = createAction('File:FETCH_FILES_START');\nexport const fetchFilesFailed = createErrorAction('File:FETCH_FILES_ERROR');\nexport const fetchFilesSuccess = createAction('File:FETCH_FILES_SUCCESS');\nexport const filter = createAction('File:FILTER');\nexport const folderSelected = createAction('File:FOLDER_SELECTED');\nexport const obtainUUIDError = createErrorAction('File:OBTAIN_UUID_ERROR');\n\nconst spreadsheetsAuthType = 'null';\nconst spreadsheetsIntegrationName = 'Spreadsheets';\nconst spreadsheetsIntegrationSlug = 'spreadsheets';\n\nconst trackSpreadsheetsFileSuccess = serviceName => {\n  if (serviceName === 'hostedexcel') {\n    trackEvent(\n      spreadsheetsUrlSucceeded({\n        'Auth type': spreadsheetsAuthType,\n        'Integration name': spreadsheetsIntegrationName,\n        'Integration slug': spreadsheetsIntegrationSlug,\n        'Data source': serviceName,\n      }),\n    );\n  }\n};\n\nconst trackSpreadsheetsFileFailed = (serviceName, error) => {\n  if (serviceName === 'hostedexcel') {\n    trackEvent(\n      spreadsheetsUrlFailed({\n        'Auth type': spreadsheetsAuthType,\n        'Integration name': spreadsheetsIntegrationName,\n        'Integration slug': spreadsheetsIntegrationSlug,\n        'Data source': serviceName,\n        'URL failure reason': error,\n      }),\n    );\n  }\n};\n\nconst debouncedFetchList = debouncify((service, ...args) =>\n  service.fetchList(...args),\n);\n\nexport const searchFiles = (\n  serviceName,\n  serviceAccountId,\n  query,\n) => async dispatch => {\n  const service = servicePicker(serviceName);\n\n  dispatch(fetchFilesStart());\n\n  try {\n    const files = await debouncedFetchList(service, serviceName, {\n      serviceAccountId,\n      query: encodeURIComponent(query),\n    });\n\n    if (!files) {\n      throw Error('There was an error fetching your data.');\n    }\n\n    dispatch(fetchFilesSuccess({ files }));\n  } catch (err) {\n    dispatch(\n      fetchFilesFailed(err, {\n        isServiceAccountExpired: 'ErrOAuthTokenExpiredOrInvalid' === err.type,\n        message: err.message,\n      }),\n    );\n  }\n};\n\nexport const filterSearch = (attribute, query) => dispatch => {\n  dispatch(filter({ attribute, query }));\n};\n\nexport const openFile = (\n  serviceName,\n  fileOptions,\n  getRedirectPath,\n) => async dispatch => {\n  try {\n    const service = servicePicker(serviceName);\n\n    const { uuid } = await service.obtainUUID(serviceName, fileOptions);\n\n    trackSpreadsheetsFileSuccess(serviceName);\n\n    dispatch(closeFilePicker());\n\n    router.navigate(getRedirectPath(uuid));\n  } catch (err) {\n    if (serviceName === 'hostedexcel') {\n      track('Spreadsheets - URL failed', {\n        properties: {\n          error: err.toString(),\n          file_url: fileOptions.spreadsheetUrl,\n        },\n      });\n    }\n\n    trackSpreadsheetsFileFailed(serviceName, err.toString());\n\n    dispatch(\n      obtainUUIDError(err, {\n        message: err.toString(),\n      }),\n    );\n  }\n};\n\nexport const createTabularWidget = (\n  serviceAccountId,\n  dashboardId,\n  id,\n) => async dispatch => {\n  const visualisation = 'Table';\n  const service = servicePicker('salesforce');\n\n  try {\n    const { uuid } = await service.obtainUUID('salesforce', {\n      id,\n      serviceAccountId,\n    });\n\n    track('Salesforce new - Click Add Tabular Report', {\n      properties: { visualisation },\n    });\n\n    const configData = {\n      uuid,\n      config: { type: 'table' },\n    };\n    const data = {\n      dashboard_id: dashboardId,\n      ...serialize('salesforce', null, configData),\n    };\n\n    const widget = await create(data);\n\n    track('Widget added', {\n      properties: {\n        widget_id: widget.id,\n        widget_type_id: widget.widget_type_id,\n        service_name: widget.services[0].name,\n        service_id: widget.services[0].id,\n        widget_type_name: visualisation,\n        visualisation,\n        salesforce_version: '2016',\n      },\n    });\n\n    // add a delay for redirecting, to wait for mixpanel tracker to be finished\n    redirect(`/edit/dashboards/${dashboardId}#${widget.id}`, 300);\n  } catch (err) {\n    dispatch(\n      obtainUUIDError(err, {\n        message: err.toString(),\n      }),\n    );\n  }\n};\n\nexport const changeFile = (\n  serviceName,\n  fileOptions,\n  polecatService,\n) => async dispatch => {\n  try {\n    const service = servicePicker(serviceName);\n\n    const { uuid } = await service.obtainUUID(serviceName, fileOptions);\n\n    trackSpreadsheetsFileSuccess(serviceName);\n\n    dispatch(closeFilePicker());\n\n    dispatch(actionPicker(polecatService).changeFile(uuid));\n  } catch (err) {\n    if (serviceName === 'hostedexcel') {\n      track('Spreadsheets - URL failed', {\n        properties: {\n          error: err.toString(),\n          file_url: fileOptions.spreadsheetUrl,\n        },\n      });\n    }\n\n    trackSpreadsheetsFileFailed(serviceName, err.toString());\n\n    dispatch(\n      obtainUUIDError(err, {\n        message: err.toString(),\n      }),\n    );\n  }\n};\n\nexport const setSelectedFolder = folder => dispatch => {\n  dispatch(folderSelected({ folder }));\n};\n","export const OFF_CANVAS_WIDGET_LOCATION = 'off_canvas';\nexport const DASHBOARD_WIDGET_LOCATION = 'dashboard';\nexport const STORAGE_KEY_LAST_ADDED_WIDGET =\n  'editFromDashboard:lastAddedWidget';\nexport const LOCATION_CHANGE_DRAG = 'drag';\nexport const LOCATION_CHANGE_CLICK = 'click';\n","module.exports = (__webpack_require__(28))(147);","import { chain } from 'lodash';\n\nconst capitalizeFirstLetter = string =>\n  string.charAt(0).toUpperCase() + string.slice(1);\n\nfunction setOptGroupName(field) {\n  let optGroupName = capitalizeFirstLetter(field.type);\n  if (field.type === 'date' || field.type === 'datetime') {\n    optGroupName = 'Date/Datetime';\n  } else if (field.type === 'money') {\n    optGroupName = `Money (${field.currency_code})`;\n  }\n  return { optGroupName, ...field };\n}\n\nfunction mergeFields(groups, types, isOptGrouped) {\n  return chain(groups)\n    .pick(types)\n    .values()\n    .flatten()\n    .sortBy(f => {\n      if (isOptGrouped) {\n        // sort by optGroupName and name/key\n        return f.optGroupName + (f.name || f.key).toLowerCase();\n      }\n      return (f.name || f.key).toLowerCase();\n    })\n    .value();\n}\n\nfunction groupFields(fields) {\n  return chain(fields)\n    .map((field, key) => ({ key, ...field }))\n    .map(setOptGroupName)\n    .groupBy(field => {\n      if (field.type === 'date') {\n        return 'datetime';\n      }\n      return field.type;\n    })\n    .tap(groups => {\n      groups.groupable = mergeFields(groups, ['datetime', 'string']);\n      groups.numeric = mergeFields(\n        groups,\n        ['number', 'percentage', 'money'],\n        true,\n      );\n    })\n    .value();\n}\n\nexport default groupFields;\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { setDashboard } from '../../dashboard/actions/dashboard-actions';\nimport datasetService from '../../universal/services/dataset-service';\nimport { deserialize } from '../../universal/serializers';\nimport { getDashboard } from '../../services/management-service';\nimport { set, omit, isEmpty, cloneDeep } from 'lodash';\nimport { getConfig } from '../../lib/widget-service';\nimport DebouncePromise from '../../lib/debounce-promise';\nimport getVisualisationHelpers from '../components/get-visualisation-helpers';\nimport groupFields from '../lib/group-fields';\nimport { syncFiltersQuery } from '../lib/filters';\nimport { setTypedExtremum } from '../../lib/geckometer';\nimport { getStateToRestore } from '../../actions/helpers';\nimport {\n  ensureQuery,\n  getFieldTypes,\n  debouncify,\n  updateSortTableQuery,\n} from './dataset-action-helpers';\nimport { trackSwitchVisualisation } from '../../lib/tracker';\nimport tableHelpers from '../components/table-form/helpers';\nimport { FORM_TYPES } from '../components/table-form/table-form-constants';\n\nlet debouncedQueryAutocompleteValue;\n\nexport const setProgressGoal = createAction('Dataset:SET_PROGRESS_GOAL');\nexport const datasetSet = createAction('Dataset:SET');\nexport const datasetSetError = createErrorAction('Dataset:SET_ERROR');\nexport const setConfig = createAction('Dataset:SET_CONFIG');\nexport const resetConfig = createAction('Dataset:RESET_CONFIG');\nexport const saveState = createAction('Dataset:SAVE_STATE');\nexport const setTableType = createAction('Dataset:SET_TABLE_TYPE');\nexport const toggleFilePicker = createAction('Dataset:TOGGLE_FILE_PICKER');\nexport const resetQueryHistory = createAction('Dataset:RESET_QUERY_HISTORY');\nexport const updateColumnNumberFormat = createAction(\n  'Dataset:UPDATE_COLUMN_NUMBER_FORMAT',\n);\nexport const reorderColumn = createAction('Dataset:REORDER_COLUMN');\n\nconst _initialise = (dataSetId, dashboardId, widgetQuery) => async (\n  dispatch,\n  getState,\n) => {\n  const [dataSet, dashboard] = await Promise.all([\n    datasetService.fetchDataSet(dataSetId, { includesData: true }),\n    getDashboard(dashboardId),\n  ]);\n\n  const { timezone } = dashboard;\n  dispatch(setDashboard(dashboard));\n\n  const { fields } = dataSet;\n  const fieldGroups = groupFields(fields);\n  const { config } = getState().datasets;\n  const { type } = config;\n  let query;\n  let error = null;\n  try {\n    query = widgetQuery || ensureQuery(type, fieldGroups, config);\n  } catch (e) {\n    error = e;\n  }\n\n  dispatch(datasetSet({ timezone, showFilePicker: false }));\n\n  let queryResult;\n  if (!isEmpty(query)) {\n    try {\n      queryResult = await datasetService.queryDataSet(dataSetId, {\n        query,\n        type,\n        timezone,\n      });\n    } catch (err) {\n      // Should the query fail with `ErrResourceInvalid` then its likely that we're editing a\n      // widget for which the schema has changed so that its incompatible.\n      // So we'll regenerate a query for the new schema and drive on\n      if (err.type === 'ErrResourceInvalid') {\n        query = ensureQuery(type, fieldGroups, config);\n        queryResult = await datasetService.queryDataSet(dataSetId, {\n          query,\n          type,\n          timezone,\n        });\n      } else {\n        throw err;\n      }\n    }\n  }\n\n  dispatch(resetQueryHistory());\n\n  dispatch(\n    datasetSet({\n      dataSetId,\n      dataSet,\n      query,\n      fields,\n      fieldGroups,\n      queryResult,\n      error,\n      isLoading: false,\n    }),\n  );\n};\n\nconst debouncedQueryDataSet = debouncify((...args) =>\n  datasetService.queryDataSet(...args),\n);\n\nconst _updateQueryAndConfig = (query, config, timezone) => async (\n  dispatch,\n  getState,\n) => {\n  const state = { error: null };\n  if (query) {\n    state.query = { ...query };\n  }\n  if (config) {\n    state.config = { ...config };\n  }\n\n  dispatch(datasetSet(state));\n\n  if (query) {\n    // Then go and update the query result\n    const {\n      dataSetId,\n      fields,\n      config: { type },\n    } = getState().datasets;\n    const cleanQuery = syncFiltersQuery(query, fields, type);\n    const queryResult = await debouncedQueryDataSet(dataSetId, {\n      query: cleanQuery,\n      type,\n      timezone,\n    });\n\n    dispatch(datasetSet({ queryResult, query: cleanQuery }));\n  }\n};\n\nconst _autocomplete = formState => async (dispatch, getState) => {\n  debouncedQueryAutocompleteValue =\n    debouncedQueryAutocompleteValue || new DebouncePromise();\n  const { field, value = '', currentFieldType } = formState;\n  const {\n    dataSetId,\n    _filterModal: currentFormState = {},\n  } = getState().datasets;\n  const { value: currentValue, field: currentField } = currentFormState;\n  const shouldPerformSearch =\n    currentFieldType === 'string' &&\n    (currentValue !== value || currentField !== field) &&\n    field;\n\n  dispatch(datasetSet({ _filterModal: formState }));\n\n  if (shouldPerformSearch) {\n    const query = { field, prefix: value };\n    const queryResult = await debouncedQueryAutocompleteValue.push(\n      datasetService.queryAutocompleteValue(dataSetId, query),\n    );\n    const filterModal = {\n      ...formState,\n      highlightedItemIndex: 0, // reset index to auto focus first result\n      suggestions: queryResult.values,\n    };\n\n    dispatch(datasetSet({ _filterModal: filterModal }));\n  } else {\n    dispatch(datasetSet({ _filterModal: formState }));\n  }\n};\n\nexport const initConfig = (datasetId, dashboardId) => async dispatch => {\n  try {\n    dispatch(resetConfig());\n    await dispatch(_initialise(datasetId, dashboardId));\n  } catch (error) {\n    const showFilePicker = error.type === 'ErrResourceNotFound';\n    dispatch(datasetSetError(error, { showFilePicker, isLoading: false }));\n  }\n};\n\nexport const getWidgetConfig = (widgetId, dashboardId) => async dispatch => {\n  try {\n    const json = await getConfig(widgetId);\n    const config = deserialize('datasets', null, json);\n    const { query, dataSetId, min, max } = config;\n\n    const extendedConfig = {\n      ...setTypedExtremum('min', min),\n      ...setTypedExtremum('max', max),\n      ...config,\n    };\n\n    dispatch(\n      datasetSet({ config: omit(extendedConfig, 'query', 'dataSetId') }),\n    );\n    await dispatch(_initialise(dataSetId, dashboardId, query));\n  } catch (error) {\n    const showFilePicker = error.type === 'ErrResourceNotFound';\n    dispatch(datasetSetError(error, { showFilePicker, isLoading: false }));\n  }\n};\n\nexport const switchTableType = () => async (dispatch, getState) => {\n  try {\n    const {\n      datasets: {\n        fieldGroups,\n        _previousSummaryQuery,\n        _previousRawQuery,\n        config: { tableType },\n      },\n    } = getState();\n\n    let newQuery;\n\n    if (tableType === FORM_TYPES.SUMMARIZED) {\n      dispatch(setTableType(FORM_TYPES.RAW));\n\n      newQuery =\n        _previousRawQuery || tableHelpers.getDefaultQueryForRaw(fieldGroups);\n    } else {\n      dispatch(setTableType(FORM_TYPES.SUMMARIZED));\n\n      newQuery =\n        _previousSummaryQuery ||\n        tableHelpers.getDefaultQueryForSummary(fieldGroups);\n    }\n\n    await dispatch(_updateQueryAndConfig(newQuery));\n  } catch (error) {\n    dispatch(\n      datasetSetError(error, {\n        queryResult: undefined,\n      }),\n    );\n  }\n};\n\nexport const update = (query, config) => async (dispatch, getState) => {\n  const {\n    query: currentQuery,\n    config: currentConfig,\n    fields,\n    timezone,\n  } = getState().datasets;\n\n  const { type } = currentConfig;\n  let newQuery, newConfig;\n\n  if (query) {\n    const { path, value } = query;\n\n    newQuery = getVisualisationHelpers(type).updateQuery(\n      currentQuery,\n      path,\n      value,\n      fields,\n    );\n  }\n\n  // Merge and clone\n  if (config) {\n    const { path, value } = config;\n    newConfig = set(cloneDeep(currentConfig), path, value);\n  }\n\n  try {\n    await dispatch(_updateQueryAndConfig(newQuery, newConfig, timezone));\n  } catch (error) {\n    dispatch(datasetSetError(error));\n  }\n};\n\nexport const restoreState = (paths, defaults) => (dispatch, getState) => {\n  const { config } = getState().datasets;\n  const newConfig = getStateToRestore(config, paths, defaults);\n\n  dispatch(datasetSet({ config: { ...config, ...newConfig } }));\n};\n\nexport const refreshFile = () => async (dispatch, getState) => {\n  // Get the query and dataSetId from the store and trigger an update\n  const {\n    query,\n    dataSetId,\n    config: { type },\n    timezone,\n  } = getState().datasets;\n\n  const queryResult = await datasetService.queryDataSet(dataSetId, {\n    query,\n    type,\n    timezone,\n  });\n\n  dispatch(datasetSet({ queryResult }));\n};\n\nexport const switchVisualisationType = type => async (dispatch, getState) => {\n  try {\n    const {\n      dataSetId,\n      fieldGroups,\n      query: currentQuery,\n      config: currentConfig,\n      _previousQueries = {},\n      timezone,\n    } = getState().datasets;\n\n    const { type: currentType, ...restConfig } = currentConfig;\n    const config = { ...restConfig, type };\n    const VisualisationHelpers = getVisualisationHelpers(type);\n\n    // Keep the current query so we can switch back to it later\n    _previousQueries[currentType] = cloneDeep(currentQuery);\n\n    trackSwitchVisualisation('datasets', currentType, type);\n\n    let error = null;\n    let baseQuery;\n    try {\n      baseQuery =\n        _previousQueries[type] || ensureQuery(type, fieldGroups, config);\n    } catch (e) {\n      error = e;\n    }\n\n    let query = undefined;\n    if (baseQuery) {\n      query = VisualisationHelpers.mapQuery(\n        currentType,\n        currentQuery,\n        baseQuery,\n        getFieldTypes(fieldGroups),\n      );\n    }\n\n    _previousQueries[type] = cloneDeep(query);\n\n    dispatch(\n      datasetSet({\n        query,\n        queryResult: undefined,\n        config,\n        error,\n        isLoading: true,\n        _previousQueries,\n      }),\n    );\n\n    // Now update the queryResult\n    let queryResult;\n    if (!isEmpty(query)) {\n      queryResult = await datasetService.queryDataSet(dataSetId, {\n        query,\n        type,\n        timezone,\n      });\n    }\n\n    dispatch(datasetSet({ queryResult, isLoading: false }));\n  } catch (error) {\n    dispatch(datasetSetError(error));\n  }\n};\n\nexport const changeTableColumnField = ({ index, value }) => async (\n  dispatch,\n  getState,\n) => {\n  const { config = {} } = getState().datasets;\n  let { numberFormat = [] } = config;\n\n  numberFormat = [...numberFormat];\n  numberFormat[index] = null;\n\n  await dispatch(update({ path: `columns[${index}].field`, value }));\n\n  // Wait for the new data to be fetched before removing number formatting\n  // So there isn't a render where the number format update is applied\n  // to the old data\n  dispatch(datasetSet({ config: { ...config, numberFormat } }));\n};\n\nexport const changeColumnAggregate = ({ index, value }) => async (\n  dispatch,\n  getState,\n) => {\n  const { query } = getState().datasets;\n  const { columns = [], order_by: orderBy } = query;\n  const newColumns = cloneDeep(columns);\n\n  newColumns[index].aggregate = value;\n  const newColumn = newColumns[index];\n\n  if (newColumn.aggregate === newColumn._aggregate) {\n    delete newColumns[index]._aggregate;\n  }\n\n  // Check if order_by is using the column where the aggregation has changed.\n  // If yes, change also the aggregation in the order_by\n  let newOrderByQuery = {};\n  if (orderBy) {\n    if (\n      orderBy.field === columns[index].field &&\n      orderBy.aggregate === columns[index].aggregate\n    ) {\n      newOrderByQuery = { order_by: { ...orderBy, aggregate: value } };\n    } else {\n      newOrderByQuery = { order_by: orderBy };\n    }\n  }\n\n  const newQuery = { ...query, columns: newColumns, ...newOrderByQuery };\n  await dispatch(_updateQueryAndConfig(newQuery));\n};\n\nexport const updateNumberFormat = (format = {}) => (dispatch, getState) => {\n  const { config: { numberFormat = {} } = {} } = getState().datasets;\n  const newFormat = { ...numberFormat, ...format };\n\n  dispatch(update(null, { path: 'numberFormat', value: newFormat }));\n};\n\nexport const editFilter = formState => async (dispatch, getState) => {\n  const { fields } = getState().datasets;\n  const { field, isTimespan } = formState;\n  let currentFieldType;\n  if (isTimespan) {\n    // force datetime since _updated_at is not defined in fields\n    currentFieldType = 'datetime';\n  } else {\n    currentFieldType = field && fields[field].type;\n  }\n\n  const extendedFormState = {\n    ...formState,\n    currentFieldType,\n  };\n\n  // When switching from a date/datetime field we need to apply an operator\n  if (currentFieldType === 'string' && !formState.operator) {\n    extendedFormState.operator = 'in';\n  }\n\n  // When switching from a string to a date or datetime field we need to apply a default `since_start_of`\n  if (\n    (currentFieldType === 'date' || currentFieldType === 'datetime') &&\n    !formState.since_start_of\n  ) {\n    extendedFormState.since_start_of = { unit: 'all' };\n  }\n\n  await dispatch(_autocomplete(extendedFormState));\n  // TODO catch error and dispatch into _filterModal\n};\n\nexport const sortTable = columnIndex => async (dispatch, getState) => {\n  dispatch(datasetSet({ isContentLoading: true }));\n  const { query } = getState().datasets;\n  const newQuery = updateSortTableQuery(query, columnIndex);\n\n  await dispatch(_updateQueryAndConfig(newQuery));\n  dispatch(datasetSet({ isContentLoading: false }));\n};\n\nexport const removeTableColumn = index => (dispatch, getState) => {\n  const {\n    query: { columns },\n    config: { numberFormat = [] },\n  } = getState().datasets;\n\n  const newColumns = [...columns.slice(0, index), ...columns.slice(index + 1)];\n  const newColumnsQuery = {\n    path: 'columns',\n    value: newColumns,\n  };\n\n  let newConfig;\n  if (numberFormat.length) {\n    // Delete numberFormat for deleted column\n    const newFormat = [\n      ...numberFormat.slice(0, index),\n      ...numberFormat.slice(index + 1),\n    ];\n\n    newConfig = { path: 'numberFormat', value: newFormat };\n  }\n\n  dispatch(update(newColumnsQuery, newConfig));\n};\n","module.exports = (__webpack_require__(28))(1129);","module.exports = (__webpack_require__(28))(440);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"update\":\"update---GHVHq\",\"menuItemWrapper\":\"menuItemWrapper---2ljly\",\"menuItem\":\"menuItem---3iscp\",\"menuItemDisabled\":\"menuItemDisabled---3V1Sq\",\"menuItemLoading\":\"menuItemLoading---2qyUd\",\"spinnerWrapper\":\"spinnerWrapper---1bCnP\",\"menu\":\"menu---9X12y\",\"inside\":\"inside---1r7dr\",\"outside\":\"outside---jTn7O\",\"menuItemEdit\":\"menuItemEdit---QG2ju\",\"menuItemCopy\":\"menuItemCopy---AAgBB\",\"menuItemDuplicate\":\"menuItemDuplicate---EKeHO\",\"menuItemDelete\":\"menuItemDelete---3txU5\",\"menuItemMoveOffCanvas\":\"menuItemMoveOffCanvas---3cqvE\",\"menuItemFormatNumber\":\"menuItemFormatNumber---3AQMr\",\"menuItemWarning\":\"menuItemWarning---1HjLg\",\"menuItemCelebration\":\"menuItemCelebration---am9Ug\",\"icon\":\"icon---3I7eD\",\"menuTooltipWrapper\":\"menuTooltipWrapper---2GWdx\"};","import d3 from 'd3';\n\n// For simplicity, the colours other than the primary series are fixed\nconst MULTISERIES_COLOURS = [\n  d3.hsl(48, 0.74, 0.61),\n  d3.hsl(287, 0.74, 0.61),\n  d3.hsl(173, 0.74, 0.61),\n  d3.hsl(14, 0.74, 0.61),\n  d3.hsl(79, 0.74, 0.61),\n  d3.hsl(336, 0.74, 0.61),\n  d3.hsl(130, 0.74, 0.61),\n  d3.hsl(266, 0.74, 0.61),\n];\n\nexport default function ColourBrewer() {\n  this.init();\n}\n\nColourBrewer.prototype = {\n  init: function() {\n    const currentNeutralColourHex =\n      getComputedStyle(document.body).getPropertyValue(\n        '--chart-neutral-color',\n      ) || '#00D1FF';\n\n    this.colour = d3.rgb(currentNeutralColourHex);\n\n    this.colours = [this.colour, ...MULTISERIES_COLOURS];\n\n    this.next = 0;\n  },\n\n  /**\n   * TODO: Replace hardcoded colours with a function.\n   * this function will take this.colour as a base to compute the next\n   * colour.\n   **/\n  getNextColour: function() {\n    const colour = this.colours[this.next];\n    this.next++;\n    // For now will repeat colours after reaching the maximun of the brewery\n    if (this.next >= this.colours.length) {\n      this.next = 0;\n    }\n    return colour;\n  },\n};\n","import { connect } from 'react-redux';\nimport WidgetNumberFormatComponent from './widget-number-format-component';\nimport * as widgetMenuActions from '../actions/widget-menu-actions';\nimport { chain, includes } from 'lodash';\n\nconst NUMERIC_FORMATS = ['percent', 'currency', 'decimal'];\n\nconst getFormattableColumns = (columns, serviceName) =>\n  chain(columns)\n    .reduce((result, column, columnIndex) => {\n      const { format, heading } = column;\n\n      // Spreadsheets returns all columns as formattable columns\n      if (\n        serviceName !== 'spreadsheets' &&\n        !includes(NUMERIC_FORMATS, format)\n      ) {\n        return result;\n      }\n\n      let newColumn;\n\n      if (heading) {\n        newColumn = {\n          index: columnIndex,\n          label: heading,\n          hint: `Column ${columnIndex + 1}`,\n        };\n      } else {\n        newColumn = {\n          index: columnIndex,\n          label: `Column ${columnIndex + 1}`,\n        };\n      }\n      return [...result, newColumn];\n    }, [])\n    .value();\n\nconst mapStateToProps = ({ widgets, widgetMenu, widgetData }, props) => {\n  const { widgetKey } = props;\n  const { config: { template: { type } = {} } = {}, serviceName } =\n    widgets[widgetKey] || {};\n  const { data: { columns = [] } = {} } = widgetData[widgetKey] || {};\n\n  const { numberFormat } = widgetMenu;\n\n  let formattableColumns;\n\n  if (type === 'table') {\n    formattableColumns = getFormattableColumns(columns, serviceName);\n  }\n\n  return {\n    numberFormat,\n    formattableColumns,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { widgetKey } = props;\n\n  const onNumberFormatUpdate = ({ format, change, index }) => {\n    dispatch(\n      widgetMenuActions.updateNumberFormat({\n        widgetKey,\n        format,\n        change,\n        index,\n      }),\n    );\n  };\n  const onSave = e =>\n    dispatch(widgetMenuActions.saveNumberFormat(widgetKey, e.target));\n  const onClose = () => dispatch(widgetMenuActions.doCloseMenu());\n\n  return { onNumberFormatUpdate, onSave, onClose };\n};\n\nconst WidgetNumberFormatConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetNumberFormatComponent);\n\nexport default WidgetNumberFormatConnector;\n","import WidgetNumberFormat from './widget-number-format-connector';\nexport default WidgetNumberFormat;\n","import { connect } from 'react-redux';\nimport * as widgetMenuActions from '../actions/widget-menu-actions';\nimport * as widgetActions from '../../widget/actions/widget-actions';\nimport WidgetStatusIndicatorFormComponent from './widget-status-indicator-form-component';\nimport { isUndefined } from 'lodash';\n\nconst mapStateToProps = (\n  { widgetMenu, widgetData, widgets },\n  { widgetKey },\n) => {\n  const { data = {} } = widgetData[widgetKey] || {};\n  const {\n    config: { goal, type, comparison: { type: comparisonType } = {} },\n  } = widgets[widgetKey];\n\n  let { format, unit } = data;\n\n  if (type === 'number') {\n    const [{ type: customWidgetFormat } = {}] = data.item || [];\n\n    // Custom widgets support duration via an item `type`\n    if ('time_duration' === customWidgetFormat) {\n      format = 'duration';\n    }\n  }\n\n  return {\n    indicators: widgetMenu.indicators,\n    format,\n    hasGoal: comparisonType === 'goal' && !isUndefined(goal),\n    durationMetricUnit: unit,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { widgetKey: key }) => {\n  const onSave = () => {\n    dispatch(widgetMenuActions.saveIndicatorConfig({ key }));\n  };\n  const onChange = indicators => {\n    dispatch(widgetMenuActions.updateStatusIndicatorValue(indicators));\n  };\n  const onClose = () => {\n    dispatch(widgetMenuActions.doCloseMenu());\n  };\n  const onDelete = () => {\n    dispatch(widgetMenuActions.deleteStatusIndicatorConfig({ key }));\n  };\n  const onEditWidget = () => {\n    dispatch(widgetActions.editWidget(key));\n  };\n\n  return {\n    onClose,\n    onChange,\n    onSave,\n    onDelete,\n    onEditWidget,\n  };\n};\n\nconst WidgetStatusIndicatorFormConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetStatusIndicatorFormComponent);\n\nexport default WidgetStatusIndicatorFormConnector;\n","import WidgetStatusIndicatorFormConnector from './widget-status-indicator-form-connector';\nexport default WidgetStatusIndicatorFormConnector;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty, bindAll, sortBy } from 'lodash';\nimport ConfirmModal from '../../components/confirm-modal';\nimport FormattedMessage from '../../lib/i18n';\nimport Select from '../../components/form/select';\n\nimport style from './copy-widget-modal-style.scss';\n\nclass CopyWidgetModalComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      selectedDashboardId: props.currentDashboardId,\n    };\n\n    bindAll(this, [\n      'handleConfirm',\n      'handleSelectCurrentDashboard',\n      'handleSelectDifferentDashboard',\n    ]);\n  }\n\n  handleConfirm() {\n    const { dashboards, onConfirm } = this.props;\n    const { selectedDashboardId } = this.state;\n\n    if (selectedDashboardId) {\n      onConfirm(\n        dashboards.find(dashboard => dashboard.id === selectedDashboardId),\n      );\n    }\n  }\n\n  handleSelectCurrentDashboard() {\n    this.setDashboard(this.props.currentDashboardId);\n  }\n\n  handleSelectDifferentDashboard() {\n    const dashboard = this.getOtherDashboards()[0];\n\n    this.setDashboard(dashboard.id);\n  }\n\n  getOtherDashboards() {\n    const { dashboards = [], currentDashboardId } = this.props;\n    return sortBy(\n      dashboards.filter(dashboard => dashboard.id !== currentDashboardId),\n      dashboard => dashboard.title.toLowerCase(),\n    );\n  }\n\n  getWidgetTitle() {\n    const { widgetTitle } = this.props;\n\n    return isEmpty(widgetTitle) ? 'your widget' : widgetTitle;\n  }\n\n  render() {\n    const { visible, onClose, currentDashboardId } = this.props;\n    const { selectedDashboardId } = this.state;\n    const isCurrentDashboardSelected =\n      selectedDashboardId === currentDashboardId;\n\n    return (\n      <ConfirmModal\n        visible={visible}\n        onClose={onClose}\n        onConfirm={this.handleConfirm}\n        confirmButtonLabel={\n          <FormattedMessage id=\"widget.modal.copy.confirmButton\" />\n        }\n        heading={\n          <FormattedMessage\n            id=\"widget.modal.copy.heading\"\n            values={{\n              widgetTitle: this.getWidgetTitle(),\n            }}\n          />\n        }\n      >\n        <label className={style.radioLabel}>\n          <input\n            type=\"radio\"\n            checked={isCurrentDashboardSelected}\n            onChange={this.handleSelectCurrentDashboard}\n            className={style.radioInput}\n          />\n          <FormattedMessage id=\"widget.modal.copy.currentDashboard\" />\n        </label>\n        <label className={style.radioLabel}>\n          <input\n            type=\"radio\"\n            checked={!isCurrentDashboardSelected}\n            onChange={this.handleSelectDifferentDashboard}\n            className={style.radioInput}\n          />\n          <FormattedMessage id=\"widget.modal.copy.differentDashboard\" />\n        </label>\n        {!isCurrentDashboardSelected && (\n          <Select\n            isFullWidth\n            value={`${selectedDashboardId}`}\n            onChange={(_, value) => this.setDashboard(parseInt(value, 10))}\n          >\n            {this.getOtherDashboards().map(dashboard => (\n              <option key={dashboard.id} value={`${dashboard.id}`}>\n                {dashboard.title}\n              </option>\n            ))}\n          </Select>\n        )}\n      </ConfirmModal>\n    );\n  }\n\n  setDashboard(dashboardId) {\n    this.setState({ selectedDashboardId: dashboardId });\n  }\n}\n\nCopyWidgetModalComponent.defaultPropTypes = {\n  onClose: () => {},\n  onConfirm: () => {},\n  dashboards: [],\n};\n\nCopyWidgetModalComponent.propTypes = {\n  currentDashboardId: PropTypes.number.isRequired,\n  dashboards: PropTypes.array,\n  visible: PropTypes.bool,\n  widgetTitle: PropTypes.string,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default CopyWidgetModalComponent;\n","import { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { values } from 'lodash';\nimport * as widgetActions from '../../widget/actions/widget-actions';\nimport * as widgetMenuActions from '../actions/widget-menu-actions';\nimport CopyWidgetModal from './copy-widget-modal-component';\nimport WidgetMenu from '../widget-menu-component';\n\nconst mapStateToProps = (state, { widgetKey }) => {\n  const {\n    allDashboards,\n    dashboard: { dashboard = {} },\n    widgetMenu,\n    widgets,\n  } = state;\n\n  const visible =\n    widgetMenu.widgetKey === widgetKey &&\n    widgetMenu.view === WidgetMenu.VIEWS.COPY;\n  const widget = widgets[widgetKey] || {};\n  const { config: { title: widgetTitle } = {} } = widget;\n  const dashboards = values(allDashboards);\n\n  return {\n    currentDashboardId: dashboard.id,\n    dashboards,\n    visible,\n    widgetTitle,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { widgetKey } = props;\n\n  return {\n    onClose: () => dispatch(widgetMenuActions.closeMenu()),\n    onConfirm: dashboard => {\n      dispatch(widgetMenuActions.closeMenu());\n      dispatch(\n        widgetActions.copyWidget({\n          dashboard,\n          widgetKey,\n        }),\n      );\n    },\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps) => {\n  // sadly there's some weirdness with the modal\n  // (probably related to CSS transition component)\n  // that apparently means that the modal won't get a new visible\n  // prop set to false until the transition is complete\n  // so we check here if the modal is visible\n  // if not we prevent any further clicks of\n  // the submit button\n  const confirmIfVisible = dashboard => {\n    if (stateProps.visible) {\n      dispatchProps.onConfirm(dashboard);\n    }\n  };\n  return {\n    ...stateProps,\n    ...dispatchProps,\n    onConfirm: confirmIfVisible,\n  };\n};\nconst CopyWidgetModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(CopyWidgetModal);\n\nCopyWidgetModalConnector.propTypes = {\n  widgetKey: PropTypes.string.isRequired,\n};\n\nexport default CopyWidgetModalConnector;\n","import CopyWidgetModal from './copy-widget-modal-connector';\n\nexport default CopyWidgetModal;\n","import { connect } from 'react-redux';\nimport CompactConfig from './compact-config-component';\n\nconst mapStateToProps = (\n  {\n    widgets,\n    dashboard: {\n      dashboard: { timezone },\n    },\n  },\n  { widgetKey },\n) => ({\n  serviceName: widgets[widgetKey].serviceName,\n  dashboardTimezone: timezone,\n});\n\nexport default connect(mapStateToProps)(CompactConfig);\n","import { default as CompactConfigConnector } from './compact-config-connector';\nimport { default as CompactConfig } from './compact-config-component';\n\nimport { default as DashiesCompactConfig } from './dashies-compact-config-component';\nimport { default as DashiesCompactConfigConnector } from './dashies-compact-config-connector';\n\nexport { DashiesCompactConfig, CompactConfig, DashiesCompactConfigConnector };\nexport default CompactConfigConnector;\n","import WidgetMenuPositionerConnector from './widget-menu-positioner-connector';\n\nexport default WidgetMenuPositionerConnector;\n","import { connect } from 'react-redux';\nimport WidgetMenuPositioner from './widget-menu-positioner-component';\n\nconst mapStateToProps = ({ dashboard, widgets }, props) => {\n  const { widgetKey } = props;\n  const { scaleFactor = 1 } = dashboard;\n  const { layout: { pixel_width: pixelWidth } = {} } = widgets[widgetKey];\n\n  return {\n    widgetWidth: pixelWidth * scaleFactor,\n  };\n};\n\nconst WidgetMenuPositionerConnector = connect(mapStateToProps)(\n  WidgetMenuPositioner,\n);\n\nexport default WidgetMenuPositionerConnector;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { getWindow } from '../lib/global';\nimport DropItem from '../components/menu/drop-item';\nimport FormattedMessage, { FormattedHTMLMessage } from '../lib/i18n';\nimport WidgetNumberFormat from './widget-number-format';\nimport WidgetStatusIndicatorForm from './widget-status-indicator-form';\nimport ConfirmModal from '../components/confirm-modal';\nimport CopyWidgetModal from './copy-widget-modal';\nimport Icon from '@UI/icon';\nimport Tooltip from '../components/tooltip';\nimport Warning from '../components/warning';\nimport { isEmpty, values, concat, includes } from 'lodash';\nimport { DASHBOARD_WIDGET_LOCATION } from '../widget/constants/widget-location-constants';\nimport CompactConfig from '../compact-config';\nimport WidgetMenuPositioner from './widget-menu-positioner';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './widget-menu-style.scss';\n\nconst VIEWS = {\n  CLOSED: 'CLOSED',\n  COPY: 'COPY',\n  DELETE: 'DELETE',\n  EDIT: 'EDIT',\n  MENU: 'MENU',\n  NUMBER_FORMAT: 'NUMBER_FORMAT',\n  STATUS_INDICATORS: 'STATUS_INDICATORS',\n};\n\nfunction presentRefreshDelay(seconds, realTimeUpdates) {\n  if (realTimeUpdates) {\n    return <FormattedMessage id=\"widget.updateRealTime\" />;\n  }\n\n  if (seconds < 60) {\n    return <FormattedMessage id=\"widget.updateSeconds\" values={{ seconds }} />;\n  }\n\n  if (seconds < 7200) {\n    return (\n      <FormattedMessage\n        id=\"widget.updateMinutes\"\n        values={{ minutes: Math.round(seconds / 60) }}\n      />\n    );\n  }\n\n  return (\n    <FormattedMessage\n      id=\"widget.updateHours\"\n      values={{ hours: Math.round(seconds / 3600) }}\n    />\n  );\n}\n\nexport const DeleteWidgetModal = ({\n  visible,\n  widgetTitle,\n  onClose,\n  onConfirm,\n}) => (\n  <ConfirmModal\n    visible={visible}\n    isNegative\n    heading={\n      <FormattedMessage\n        id=\"widget.modal.delete.heading\"\n        values={{ widgetTitle: !isEmpty(widgetTitle) ? widgetTitle : 'widget' }}\n      />\n    }\n    confirmButtonLabel={\n      <FormattedMessage id=\"widget.modal.delete.deleteButton\" />\n    }\n    onClose={onClose}\n    onConfirm={onConfirm}\n  >\n    <Warning>\n      <FormattedMessage id=\"widget.modal.delete.description\" />\n    </Warning>\n  </ConfirmModal>\n);\nDeleteWidgetModal.propTypes = {\n  visible: PropTypes.bool,\n  widgetTitle: PropTypes.string,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nclass WidgetMenuComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      loading: [],\n    };\n  }\n\n  componentDidMount() {\n    this.setPosition();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (\n      this.props.view === VIEWS.NUMBER_FORMAT ||\n      this.props.view === VIEWS.EDIT\n    ) {\n      // We don't want to try to modify the menu DOM element when\n      // the number formatter is rendered instead of the menu\n      return;\n    }\n\n    if (prevProps.view !== VIEWS.CLOSED && this.props.view === VIEWS.CLOSED) {\n      return;\n    }\n\n    // Reposition the menu so that it fits onto the screen correctly\n    this.setPosition();\n  }\n\n  renderMenuItem({\n    key,\n    classes,\n    messageId,\n    onClick,\n    loading,\n    disabled,\n    disabledMessage,\n  }) {\n    const menuItemClasses = classNames(style.menuItem, classes, {\n      [style.menuItemDisabled]: disabled,\n      [style.menuItemLoading]: loading,\n    });\n\n    return (\n      <DropItem key={key} onClick={!disabled ? onClick : undefined} isSmall>\n        <div className={style.menuItemWrapper}>\n          <div className={menuItemClasses}>\n            <FormattedMessage id={messageId} />\n          </div>\n          {loading && (\n            <div className={style.spinnerWrapper}>\n              <LoadingSpinner theme={LoadingSpinner.THEMES.DARK} />\n            </div>\n          )}\n          {disabled && (\n            <Tooltip\n              className={style.menuTooltipWrapper}\n              tooltip={<FormattedHTMLMessage id={disabledMessage} />}\n            >\n              <div className={style.icon}>\n                <Icon name=\"about\" font={Icon.FONTS.GECKO_FONT} />\n              </div>\n            </Tooltip>\n          )}\n        </div>\n      </DropItem>\n    );\n  }\n\n  renderMenu() {\n    const {\n      canFormatNumber,\n      canSetIndicators,\n      isExpired,\n      isImporting,\n      isGridDashboard,\n      isStatusIndicatorsSet,\n      isDuplicateDisabled,\n      location,\n      onCopy,\n      onDuplicate,\n      onEdit,\n      onFormatNumber,\n      onMoveWidgetOffCanvas,\n      onOpenDeleteModal,\n      onOpenWidgetStatusIndicator,\n      realTimeUpdates,\n      refreshDelay,\n    } = this.props;\n\n    return (\n      <ul ref={el => (this.menu = el)} className={style.menu} role=\"menu\">\n        {!isExpired &&\n          this.renderMenuItem({\n            key: 'edit',\n            classes: style.menuItemEdit,\n            messageId: 'widget.menu.edit',\n            onClick: onEdit,\n            disabled: isImporting,\n            disabledMessage: 'widget.menu.importErrorTooltip',\n          })}\n        {canFormatNumber &&\n          this.renderMenuItem({\n            key: 'formatNumber',\n            classes: style.menuItemFormatNumber,\n            messageId: 'widget.menu.formatNumber',\n            onClick: onFormatNumber,\n          })}\n        {canSetIndicators &&\n          this.renderMenuItem({\n            key: 'warning',\n            classes: style.menuItemWarning,\n            messageId: isStatusIndicatorsSet\n              ? 'widget.menu.editStatusIndicators'\n              : 'widget.menu.addStatusIndicators',\n            onClick: onOpenWidgetStatusIndicator,\n          })}\n        {!isExpired &&\n          onCopy &&\n          this.renderMenuItem({\n            key: 'copy',\n            classes: style.menuItemCopy,\n            messageId: 'widget.menu.copy',\n            onClick: onCopy,\n          })}\n        {!isExpired &&\n          onDuplicate &&\n          this.renderMenuItem({\n            key: 'duplicate',\n            classes: style.menuItemDuplicate,\n            messageId: 'widget.menu.duplicate',\n            onClick: () => {\n              this.setState({\n                loading: concat(this.state.loading, ['duplicate']),\n              });\n              onDuplicate();\n            },\n            loading: includes(this.state.loading, 'duplicate'),\n            disabled: isDuplicateDisabled,\n            disabledMessage: 'widget.menu.duplicationDisabledTooltip',\n          })}\n        {isGridDashboard &&\n          location === DASHBOARD_WIDGET_LOCATION &&\n          this.renderMenuItem({\n            key: 'offCanvas',\n            classes: style.menuItemMoveOffCanvas,\n            messageId: 'widget.menu.moveOffCanvas',\n            onClick: onMoveWidgetOffCanvas,\n          })}\n        {onOpenDeleteModal &&\n          this.renderMenuItem({\n            key: 'delete',\n            classes: style.menuItemDelete,\n            messageId: 'widget.menu.delete',\n            onClick: onOpenDeleteModal,\n          })}\n\n        {(refreshDelay || realTimeUpdates) && (\n          <DropItem dividerTop isSmall>\n            <span className={style.update}>\n              {presentRefreshDelay(refreshDelay, realTimeUpdates)}\n            </span>\n          </DropItem>\n        )}\n      </ul>\n    );\n  }\n\n  renderContent() {\n    const {\n      canFormatNumber,\n      isStatusIndicatorsSet,\n      view,\n      widgetKey,\n    } = this.props;\n\n    switch (view) {\n      case VIEWS.EDIT:\n        return (\n          <WidgetMenuPositioner widgetKey={widgetKey}>\n            <CompactConfig\n              widgetKey={widgetKey}\n              canFormatNumber={canFormatNumber}\n            />\n          </WidgetMenuPositioner>\n        );\n\n      case VIEWS.STATUS_INDICATORS:\n        return (\n          <WidgetMenuPositioner widgetKey={widgetKey}>\n            <WidgetStatusIndicatorForm\n              widgetKey={widgetKey}\n              isEditing={isStatusIndicatorsSet}\n            />\n          </WidgetMenuPositioner>\n        );\n\n      case VIEWS.NUMBER_FORMAT:\n        return (\n          <WidgetMenuPositioner widgetKey={widgetKey}>\n            <WidgetNumberFormat widgetKey={widgetKey} />\n          </WidgetMenuPositioner>\n        );\n\n      default:\n        return this.renderMenu();\n    }\n  }\n\n  render() {\n    const {\n      widgetKey,\n      widgetTitle,\n      view,\n      onCopy,\n      onCloseDeleteModal,\n      onDeleteWidget,\n    } = this.props;\n\n    return (\n      <div ref={el => (this.container = el)}>\n        <DeleteWidgetModal\n          visible={view === VIEWS.DELETE}\n          widgetTitle={widgetTitle}\n          onClose={onCloseDeleteModal}\n          onConfirm={onDeleteWidget}\n        />\n        {onCopy && <CopyWidgetModal widgetKey={widgetKey} />}\n        {this.renderContent()}\n      </div>\n    );\n  }\n\n  setPosition() {\n    if (this.props.view === VIEWS.CLOSED || !this.menu) {\n      return;\n    }\n\n    this.menu.className = style.menu;\n\n    const { right } = this.menu.getBoundingClientRect();\n    const { clientWidth } = getWindow().document.documentElement;\n    const className = classNames(style.menu, {\n      [style.inside]: right > clientWidth,\n      [style.outside]: right <= clientWidth,\n    });\n\n    this.menu.className = className;\n  }\n}\n\nWidgetMenuComponent.VIEWS = VIEWS;\n\nWidgetMenuComponent.defaultProps = {\n  isExpired: false,\n  isImporting: false,\n  canFormatNumber: false,\n  location: DASHBOARD_WIDGET_LOCATION,\n  useCompactConfig: false,\n  view: VIEWS.CLOSED,\n};\n\nWidgetMenuComponent.propTypes = {\n  view: PropTypes.oneOf(values(VIEWS)).isRequired,\n  canFormatNumber: PropTypes.bool,\n  canSetIndicators: PropTypes.bool,\n  children: PropTypes.node,\n  isDuplicateDisabled: PropTypes.bool,\n  isExpired: PropTypes.bool,\n  isGridDashboard: PropTypes.bool,\n  isImporting: PropTypes.bool,\n  isStatusIndicatorsSet: PropTypes.bool,\n  location: PropTypes.string,\n  realTimeUpdates: PropTypes.bool,\n  refreshDelay: PropTypes.number,\n  useCompactConfig: PropTypes.bool,\n  widgetKey: PropTypes.string,\n  widgetTitle: PropTypes.string,\n  onCloseDeleteModal: PropTypes.func,\n  onCopy: PropTypes.func,\n  onDeleteWidget: PropTypes.func,\n  onDuplicate: PropTypes.func,\n  onEdit: PropTypes.func,\n  onFormatNumber: PropTypes.func,\n  onMoveWidgetOffCanvas: PropTypes.func,\n  onOpenDeleteModal: PropTypes.func,\n  onOpenWidgetStatusIndicator: PropTypes.func,\n};\n\nexport { WidgetMenuComponent as default };\n","module.exports = (__webpack_require__(28))(364);","import * as serviceLib from './service';\nimport { includes } from 'lodash';\nimport { getDashboardFromStorage } from '../dashboard/graphql-dashboard-helpers';\nimport canUseSpreadsheetsBeta from '../spreadsheet-config-beta/can-use-beta';\n\nconst getServicePath = (serviceName, options) => {\n  const {\n    dashboardId,\n    serviceId,\n    isLegacy,\n    isNewIntegration,\n    isUniversal,\n    hasAccounts,\n    hasPresets,\n  } = options;\n\n  if (isLegacy) {\n    return `/v4/dashboards/${dashboardId}/connect/heirloom/${serviceId}`;\n  }\n\n  if (isUniversal) {\n    if (hasAccounts && !hasPresets) {\n      return `/v4/dashboards/${dashboardId}/universal/${serviceId}`;\n    }\n\n    return `/v4/dashboards/${dashboardId}/connect/universal/${serviceName}`;\n  }\n\n  if (isNewIntegration) {\n    return `/v4/dashboards/${dashboardId}/connect/${serviceName}`;\n  }\n\n  const isSpreadsheets = includes(\n    ['spreadsheets', 'excel', 'googlesheets'],\n    serviceName,\n  );\n  if (isSpreadsheets) {\n    return `/v4/dashboards/${dashboardId}/connect/spreadsheets`;\n  }\n\n  switch (serviceName) {\n    case 'datasets':\n    case 'salesforce':\n    case 'database':\n      return `/v4/dashboards/${dashboardId}/connect/${serviceName}`;\n    default:\n      return `/v4/dashboards/${dashboardId}/connect/heirloom/${serviceId}`;\n  }\n};\n\nconst getWidgetTypePath = (\n  serviceName,\n  { dashboardId, serviceId, widgetTypeId },\n) => {\n  switch (serviceName) {\n    case 'spreadsheets':\n    case 'database':\n    case 'datasets':\n    case 'salesforce':\n      return `/v4/dashboards/${dashboardId}/connect/${serviceName}`;\n    default:\n      return `/v4/dashboards/${dashboardId}/widgets/new?serviceId=${serviceId}&widgetTypeId=${widgetTypeId}`;\n  }\n};\n\nconst getEditWidgetPath = ({\n  dashboardId,\n  widgetKey,\n  serviceName,\n  user,\n  organization,\n}) => {\n  let path = `/v4/dashboards/${dashboardId}`;\n\n  if (widgetKey) {\n    path += `/widgets/${widgetKey}`;\n\n    if (serviceLib.isUniversal(serviceName)) {\n      return `${path}/universal`;\n    }\n\n    switch (serviceName) {\n      case 'pegasus':\n        path += '/salesforce';\n        break;\n      case 'spreadsheets':\n        path += canUseSpreadsheetsBeta(user, organization)\n          ? '/spreadsheetsbeta/configure'\n          : '/spreadsheets';\n        break;\n      case 'datasets':\n        path += '/datasets';\n        break;\n      default:\n        break;\n    }\n  }\n\n  return path;\n};\n\n// Return dashboard path with GraphQL id if it's set.\nexport const getDashboardPath = (dashboardId, widgetId) => {\n  // Get all the dashboards from the session storage. See if the dashboard layout\n  // is a container layout. If yes, redirect to the correct dashboard path\n  // using the graphql dashboard id.\n  const dashboard = getDashboardFromStorage(dashboardId) || {};\n  const { layoutType = {} } = dashboard;\n  const isContainerLayout = layoutType.__typename === 'ContainerLayout';\n\n  if (isContainerLayout) {\n    return `/edit/dashboards/${dashboard.id}`;\n  }\n\n  const widgetHash = !!widgetId ? `#${widgetId}` : '';\n  return `/edit/dashboards/${dashboardId}${widgetHash}`;\n};\n\nconst getUrlParams = () => new URLSearchParams(window.location.search);\n\nexport { getServicePath, getWidgetTypePath, getEditWidgetPath, getUrlParams };\n","import { isUndefined, isString, isFinite } from 'lodash';\n\nconst parseNumberBasedOnFormat = (value, format) => {\n  if (!isString(value) && !isFinite(value)) {\n    // __DEV__ doesn't exist in megatron at the moment!\n    if (\n      typeof __DEV__ !== 'undefined' &&\n      __DEV__ &&\n      !isUndefined(value) &&\n      value !== null\n    ) {\n      console.warn(\n        'Unexpected value passed to `parseNumberBasedOnFormat`, was expecting a string.',\n        value,\n      );\n    }\n\n    return undefined;\n  }\n\n  let number = value;\n\n  if (isString(number)) {\n    number = parseFloat(value.replace(/[^0-9-.E]/gi, ''));\n  }\n\n  if (isNaN(number)) {\n    return undefined;\n  }\n\n  if (format === 'percent') {\n    return number / 100;\n  }\n\n  return number;\n};\n\nexport { parseNumberBasedOnFormat };\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Row } from '../layout';\nimport classNames from 'classnames';\n\nimport styles from './list-item-style.scss';\n\nconst ListItemMeta = ({ children }) => {\n  return <span className={styles.meta}>{children}</span>;\n};\nListItemMeta.propTypes = {\n  children: PropTypes.node,\n};\n\nconst ListItemOuter = ({ href, ...props }) =>\n  href ? <a {...props} href={href} /> : <li {...props} />;\n\nListItemOuter.propTypes = {\n  href: PropTypes.string,\n};\n\nconst ListItem = ({\n  children,\n  className,\n  hasHoverState,\n  href,\n  isHighlighted,\n  onClick,\n  type,\n}) => {\n  const classes = classNames(styles.item, {\n    [styles.itemTypeSmall]: type === 'small',\n    [className]: className,\n    [styles.hasHover]: hasHoverState,\n    [styles.isHighlighted]: isHighlighted,\n  });\n\n  return (\n    <ListItemOuter href={href} className={classes} onClick={onClick}>\n      <Row className={styles.row} align=\"center\">\n        {children}\n      </Row>\n    </ListItemOuter>\n  );\n};\n\nListItem.defaultProps = {\n  hasHoverState: true,\n  type: 'default',\n};\n\nListItem.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  hasHoverState: PropTypes.bool,\n  href: PropTypes.string,\n  isHighlighted: PropTypes.bool,\n  type: PropTypes.oneOf(['default', 'small']),\n  onClick: PropTypes.func,\n};\n\nexport { ListItem as default, ListItemMeta };\n","import ListItem, { ListItemMeta } from './list-item-component';\nexport { ListItem as default, ListItemMeta };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"customizePanelContent\":\"customizePanelContent---3gFA7\",\"container\":\"container---3Yt--\",\"inner\":\"inner---GdgsX\",\"buttonPanel\":\"buttonPanel---32xnE\",\"footerCardTitle\":\"footerCardTitle---3jL4W\",\"fontSizeButtons\":\"fontSizeButtons---2tfIj\",\"logoDropzone\":\"logoDropzone---3p2Ng\",\"logoUpload\":\"logoUpload---HAJZA\",\"logoUploadInstructions\":\"logoUploadInstructions---2mdsF\",\"logoDropNote\":\"logoDropNote---3zWRE\",\"logoUploadNote\":\"logoUploadNote---1xwLM\",\"logoDragActive\":\"logoDragActive---n2MzX\",\"logoRemove\":\"logoRemove---V1yWK\",\"logoPreview\":\"logoPreview----BudH\",\"controlImage\":\"controlImage---3eXnH\",\"activeControlImage\":\"activeControlImage---1vOCT\",\"iconContainer\":\"iconContainer---uG00f\"};","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\n\nimport styles from './image.scss';\n\n/*\n * This component is a very thin wrapper around the primitive\n * img JSX tag. It adds a nice fade-in effect when the image\n * loads so the user doesn't see a janky content shift.\n */\nclass Image extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { loaded: false };\n    this.handleLoad = this.handleLoad.bind(this);\n  }\n\n  handleLoad() {\n    this.setState({ loaded: true });\n  }\n\n  render() {\n    const { loaded } = this.state;\n    const className = classnames(styles.image, this.props.className, {\n      [styles.loading]: !loaded,\n    });\n\n    return (\n      <img {...this.props} onLoad={this.handleLoad} className={className} />\n    );\n  }\n}\n\nImage.propTypes = {\n  src: PropTypes.string.isRequired,\n  className: PropTypes.string,\n  height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default Image;\n","import Image from './image';\n\nexport default Image;\n","import { chain, isString, set, get, has, identity } from 'lodash';\n\nfunction prepareTranslators(rules) {\n  return chain(rules)\n    .map(v => (isString(v) ? [v] : v)) // eslint-disable-line no-confusing-arrow\n    .map(([sourceKey, translator, targetKey]) => [\n      sourceKey,\n      [translator || identity, targetKey || sourceKey],\n    ])\n    .value();\n}\n\nfunction apply(\n  Rules = [],\n  cfg = {},\n  lastCfg = {},\n  meta = {},\n  featureFlags = [],\n) {\n  const translators = prepareTranslators(Rules);\n\n  return chain(translators)\n    .filter(([sourcePath]) => has(cfg, sourcePath))\n    .map(([sourcePath, [translator, targetPath]]) => [\n      get(cfg, sourcePath),\n      translator,\n      targetPath,\n    ])\n    .map(([value, translator, targetPath]) => [\n      targetPath,\n      translator(value, get(lastCfg, targetPath), lastCfg, meta, featureFlags),\n    ])\n    .filter(([, value]) => value !== undefined)\n    .reduce((memo, pair) => set(memo, ...pair), {})\n    .value();\n}\n\nfunction translate(RuleSet, cfg, lastCfg, featureFlags) {\n  if (!RuleSet[cfg.type]) {\n    return {};\n  }\n\n  return apply(RuleSet[cfg.type], cfg, lastCfg, {}, featureFlags);\n}\n\nfunction applyAndMerge(Rules, cfg, lastCfg, meta) {\n  return { ...lastCfg, ...apply(Rules, cfg, lastCfg, meta) };\n}\n\nexport { translate, apply, applyAndMerge };\n","export default {\n  resources: [\n    {\n      name: 'campaigns',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'account_id',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            custom_conversions: 'account_id',\n            insights: 'account_id',\n            adsets: 'account_id',\n            ads: 'account_id',\n          },\n        },\n        {\n          key: 'name',\n          name: 'Campaigns',\n          type: 'string',\n        },\n        {\n          key: 'effective_status',\n          name: 'Effective Status',\n          type: 'enum',\n          category: 'campaign_fields',\n          values: [\n            { key: 'ACTIVE', value: 'Active' },\n            { key: 'PAUSED', value: 'Paused' },\n            { key: 'DELETED', value: 'Deleted' },\n            { key: 'PENDING_REVIEW', value: 'Pending Review' },\n            { key: 'DISAPPROVED', value: 'Disapproved' },\n            { key: 'PREAPPROVED', value: 'Preapproved' },\n            { key: 'PENDING_BILLING_INFO', value: 'Pending Billing Info' },\n            { key: 'CAMPAIGN_PAUSED', value: 'Campaign Paused' },\n            { key: 'ARCHIVED', value: 'Archived' },\n            { key: 'ADSET_PAUSED', value: 'Adset Paused' },\n            { key: 'WITH_ISSUES', value: 'With Issues' },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'adsets',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'account_id',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            custom_conversions: 'account_id',\n            insights: 'account_id',\n            campaigns: 'account_id',\n            ads: 'account_id',\n          },\n        },\n        {\n          key: 'name',\n          name: 'Ad sets',\n          type: 'string',\n        },\n        {\n          key: 'effective_status',\n          name: 'Effective Status',\n          type: 'enum',\n          category: 'adset_fields',\n          values: [\n            { key: 'ACTIVE', value: 'Active' },\n            { key: 'PAUSED', value: 'Paused' },\n            { key: 'DELETED', value: 'Deleted' },\n            { key: 'PENDING_REVIEW', value: 'Pending Review' },\n            { key: 'DISAPPROVED', value: 'Disapproved' },\n            { key: 'PREAPPROVED', value: 'Preapproved' },\n            { key: 'PENDING_BILLING_INFO', value: 'Pending Billing Info' },\n            { key: 'CAMPAIGN_PAUSED', value: 'Campaign Paused' },\n            { key: 'ARCHIVED', value: 'Archived' },\n            { key: 'ADSET_PAUSED', value: 'Adset Paused' },\n            { key: 'WITH_ISSUES', value: 'With Issues' },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'insights',\n      human_readable_name: 'insights',\n      countable: false,\n      fields: [\n        {\n          key: 'account_id',\n          name: 'Account',\n          type: 'string',\n          resource: 'ad_accounts',\n          foreign_key: 'account_id',\n          target_key: 'name',\n          hidden: true,\n          restrict_single_value: true,\n          equivalents: {\n            campaigns: 'account_id',\n            adsets: 'account_id',\n            ads: 'account_id',\n          },\n        },\n        {\n          key: 'reach',\n          name: 'Reach',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Performance',\n        },\n        {\n          key: 'impressions',\n          name: 'Impressions',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Performance',\n        },\n        {\n          key: 'clicks',\n          name: 'Clicks (all)',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Performance',\n        },\n        {\n          key: 'unique_clicks',\n          name: 'Unique clicks (all)',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Performance',\n        },\n        {\n          key: 'ctr',\n          name: 'CTR (all)',\n          type: 'percent',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Performance',\n        },\n        {\n          key: 'unique_ctr',\n          name: 'Unique CTR (all)',\n          type: 'percent',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Performance',\n        },\n        {\n          key: 'spend',\n          name: 'Amount Spent',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Costs',\n        },\n        {\n          key: 'cpm',\n          name: 'CPM (cost per 1000 impressions)',\n          type: 'currency',\n          aggregated: true,\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Costs',\n        },\n        {\n          key: 'cpp',\n          name: 'CPP (cost per 1000 people reached)',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Costs',\n        },\n        {\n          key: 'cpc',\n          name: 'CPC (all)',\n          type: 'currency',\n          aggregated: true,\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Costs',\n        },\n        {\n          key: 'purchase_roas',\n          name: 'Purchase ROAS',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Costs',\n        },\n        {\n          key: 'actions_link_click',\n          name: 'Link clicks',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_mobile_app_install',\n          name: 'App installs',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_page_engagement',\n          name: 'Page engagements',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_post_engagement',\n          name: 'Post engagements',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_leadgen_other',\n          name: 'Leads from lead form',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_video_view',\n          name: '3-second video views',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Campaign Results',\n        },\n        {\n          key: 'actions_complete_registration',\n          name: 'Number of completed registrations',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Conversions',\n        },\n        {\n          key: 'actions_purchase',\n          name: 'Number of purchases',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Conversions',\n        },\n        {\n          key: 'actions_offsite_conversion_fb_pixel_purchase',\n          name: 'Number of purchases (Facebook Pixel)',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Conversions',\n        },\n        {\n          key: 'actions_lead',\n          name: 'Number of leads',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Conversions',\n        },\n        {\n          key: 'actions_subscribe',\n          name: 'Number of subscribes',\n          type: 'float',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          aggregated: true,\n          category: 'Conversions',\n        },\n        {\n          key: 'cost_per_complete_registration',\n          name: 'Cost per completed registrations',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'cost_per_purchase',\n          name: 'Cost per purchase',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'cost_per_offsite_conversion_fb_pixel_purchase',\n          name: 'Cost per purchase (Facebook Pixel)',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'cost_per_lead',\n          name: 'Cost per lead',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'cost_per_subscribe',\n          name: 'Cost per subscribe',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'action_values_complete_registration',\n          name: 'Value of completed registrations',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'action_values_purchase',\n          name: 'Value of purchases',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'action_values_offsite_conversion_fb_pixel_purchase',\n          name: 'Value of purchases (Facebook Pixel)',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'action_values_lead',\n          name: 'Value of leads',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'action_values_subscribe',\n          name: 'Value of subscribes',\n          type: 'currency',\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          category: 'Conversions',\n        },\n        {\n          key: 'date_start',\n          name: 'date_start',\n          type: 'datetime',\n          exclude_from_filters: true,\n        },\n        {\n          key: 'campaign',\n          name: 'Campaign',\n          type: 'string',\n          category: 'insights_fields',\n          resource: 'campaigns',\n          foreign_key: 'campaign_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          exclude_from_groupby: true,\n        },\n        {\n          key: 'adset',\n          name: 'Ad set',\n          type: 'string',\n          category: 'insights_fields',\n          resource: 'adsets',\n          foreign_key: 'adset_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          exclude_from_groupby: true,\n        },\n        {\n          key: 'ad',\n          name: 'Ad',\n          type: 'string',\n          category: 'insights_fields',\n          resource: 'ads',\n          foreign_key: 'ad_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          exclude_from_groupby: true,\n        },\n        {\n          key: 'publisher_platform',\n          name: 'Publisher platform',\n          type: 'enum',\n          restrict_single_value: true,\n          rules: {\n            time_fields: [{ primary_resource: 'insights', key: 'date_start' }],\n          },\n          values: [\n            { key: 'facebook', value: 'Facebook' },\n            { key: 'instagram', value: 'Instagram' },\n            { key: 'messenger', value: 'Messenger' },\n            { key: 'audience_network', value: 'Audience Network' },\n          ],\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'name',\n                resource: 'custom_conversions',\n              },\n              {\n                path: 'id',\n                resource: 'custom_conversions',\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'actions_offsite_conversion.custom.<%= id %>',\n              name: 'Number of <%= name %>',\n              type: 'float',\n              aggregated: true,\n              category: 'Custom Conversions',\n            },\n            {\n              key: 'action_values_offsite_conversion.custom.<%= id %>',\n              name: 'Value of <%= name %>',\n              type: 'currency',\n              category: 'Custom Conversions',\n            },\n            {\n              key: 'cost_per_offsite_conversion.custom.<%= id %>',\n              name: 'Cost per <%= name %>',\n              type: 'currency',\n              category: 'Custom Conversions',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'custom_conversions',\n      private: true,\n      fields: [\n        {\n          key: 'account_id',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            insights: 'account_id',\n            campaigns: 'account_id',\n            adsets: 'account_id',\n            ads: 'account_id',\n          },\n        },\n      ],\n    },\n    {\n      name: 'ads',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'account_id',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            custom_conversions: 'account_id',\n            insights: 'account_id',\n            adsets: 'account_id',\n            campaigns: 'account_id',\n          },\n        },\n        {\n          key: 'name',\n          name: 'Ads',\n          type: 'string',\n        },\n      ],\n    },\n    {\n      name: 'ad_accounts',\n      primary_key: 'account_id',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n      ],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'insights',\n            path: 'clicks',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'account_id',\n          },\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n      },\n    },\n  },\n  options: [\n    {\n      keys: ['currency', 'account_timezone'],\n      query: {\n        select: [\n          {\n            resource: 'ad_accounts',\n            path: 'currency',\n          },\n          {\n            resource: 'ad_accounts',\n            path: 'timezone_name',\n          },\n        ],\n      },\n    },\n  ],\n  prerequisites: {\n    service_account_filters: [\n      {\n        resource: 'insights',\n        path: 'account_id',\n      },\n    ],\n    build_prerequisite_options: serviceAccounts => {\n      const prerequisites = serviceAccounts.map(sa => {\n        const { ad_accounts: adAccounts = [] } = sa.values;\n\n        return {\n          id: sa.id,\n          name: sa.name,\n          children: adAccounts.map(account => ({\n            id: account.account_id,\n            name: account.name,\n          })),\n        };\n      });\n\n      return prerequisites;\n    },\n  },\n};\n","export default {\n  api: {\n    max_time_period: 10368000000,\n  },\n  resources: [\n    {\n      name: 'tickets',\n      human_readable_name: 'tickets',\n      countable: true,\n      fields: [\n        {\n          custom: 'created_tickets',\n          name: 'Received tickets',\n          base: { resource: 'tickets' },\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'created_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          custom: 'resolved_tickets',\n          name: 'Resolved tickets',\n          base: { resource: 'tickets' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'tickets', key: 'stats.resolved_at' },\n            ],\n          },\n        },\n        {\n          key: 'first_reply_time',\n          name: 'First response time (calendar)',\n          type: 'duration',\n          unit: 'seconds',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'created_at' }],\n          },\n          reverse_comparison: true,\n          additional_info: {\n            content:\n              \"First response time is calculated based on the total difference between a ticket's created time and the time it's first replied to.<br/><br/>This differs from what you see in Freshdesk as they take your business hours into account. We're not currently able to get this data from Freshdesk, but you can <a href='mailto:support@freshdesk.com' target='_blank'>let them know</a> that you'd like to see support added.\",\n          },\n        },\n        {\n          key: 'resolution_time',\n          name: 'Resolution time (calendar)',\n          default_aggregation: 'avg',\n          type: 'duration',\n          unit: 'seconds',\n          rules: {\n            time_fields: [\n              { primary_resource: 'tickets', key: 'stats.resolved_at' },\n            ],\n          },\n          reverse_comparison: true,\n          additional_info: {\n            content:\n              \"Resolution time is calculated based on the total difference between a ticket's created time and the time it's resolved.<br/><br/>This differs from what you see in Freshdesk as they take your business hours into account. We're not currently able to get this data from Freshdesk, but you can <a href='mailto:support@freshdesk.com' target='_blank'>let them know</a> that you'd like to see support added.\",\n          },\n        },\n        {\n          key: 'type',\n          name: 'Type',\n          type: 'string',\n          category: 'ticket_fields',\n          supports_null_values: true,\n          values_from: { resource: 'ticket_types', key: 'name' },\n        },\n        {\n          key: 'priority',\n          name: 'Priority',\n          type: 'enum',\n          category: 'ticket_fields',\n          query_custom_values: {\n            select: [\n              {\n                path: 'id',\n                resource: 'ticket_priorities',\n              },\n              {\n                path: 'name',\n                resource: 'ticket_priorities',\n              },\n            ],\n          },\n        },\n        {\n          key: 'status',\n          name: 'Status',\n          type: 'enum',\n          category: 'ticket_fields',\n          query_custom_values: {\n            select: [\n              {\n                path: 'id',\n                resource: 'ticket_statuses',\n              },\n              {\n                path: 'name',\n                resource: 'ticket_statuses',\n              },\n            ],\n          },\n        },\n        {\n          key: 'source',\n          name: 'Source',\n          type: 'enum',\n          category: 'ticket_fields',\n          query_custom_values: {\n            select: [\n              {\n                path: 'id',\n                resource: 'ticket_sources',\n              },\n              {\n                path: 'name',\n                resource: 'ticket_sources',\n              },\n            ],\n          },\n        },\n        {\n          key: 'responder',\n          name: 'Agent',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'agents',\n          foreign_key: 'responder_id',\n          target_key: 'contact.name',\n          supports_null_values: true,\n          equivalents: {\n            satisfaction_ratings: 'responder',\n          },\n        },\n        {\n          key: 'group',\n          name: 'Group',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'groups',\n          foreign_key: 'group_id',\n          target_key: 'name',\n          supports_null_values: true,\n          equivalents: {\n            satisfaction_ratings: 'group',\n          },\n        },\n        {\n          key: 'company',\n          name: 'Company',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'companies',\n          foreign_key: 'company_id',\n          target_key: 'name',\n          supports_null_values: true,\n        },\n        {\n          key: 'product',\n          name: 'Product',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'products',\n          foreign_key: 'product_id',\n          target_key: 'name',\n          supports_null_values: true,\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'updated_at',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n        {\n          key: 'stats.resolved_at',\n          name: 'Resolved at',\n          type: 'datetime',\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'name',\n                resource: 'ticket_custom_fields',\n              },\n              {\n                path: 'label',\n                resource: 'ticket_custom_fields',\n              },\n              {\n                path: 'choices',\n                resource: 'ticket_custom_fields',\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: '<%= name %>',\n              name: '<%= label %>',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'agents',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        { key: 'contact.name', name: 'Name', type: 'string' },\n        { key: 'contact.email', name: 'Email', type: 'string' },\n        { key: 'contact.created_at', name: 'Created At', type: 'string' },\n      ],\n    },\n    {\n      name: 'groups',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'companies',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'products',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'satisfaction_ratings',\n      human_readable_name: 'satisfaction ratings',\n      primary_key: 'id',\n      rel: [\n        {\n          res: 'tickets',\n          name: 'ticket',\n        },\n      ],\n      fields: [\n        {\n          key: 'sat_score',\n          name: '% positive ratings',\n          type: 'percent',\n          aggregated: true,\n          rules: {\n            time_fields: [\n              { primary_resource: 'satisfaction_ratings', key: 'created_at' },\n            ],\n          },\n        },\n        {\n          key: 'created_at',\n          name: 'Created at (Sat Ratings)',\n          type: 'datetime',\n        },\n        {\n          key: 'responder',\n          name: 'Agent',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'agents',\n          foreign_key: 'agent_id',\n          target_key: 'contact.name',\n          equivalents: {\n            tickets: 'responder',\n          },\n        },\n        {\n          key: 'group',\n          name: 'Group',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'groups',\n          foreign_key: 'group_id',\n          target_key: 'name',\n          equivalents: {\n            tickets: 'group',\n          },\n        },\n      ],\n    },\n    {\n      name: 'ticket_types',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'ticket_priorities',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'ticket_statuses',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'ticket_sources',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'ticket_custom_fields',\n      private: true,\n      fields: [],\n    },\n  ],\n  equivalent_fields: {\n    satisfaction_ratings: {\n      tickets: { group: 'group', responder: 'responder' },\n    },\n  },\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'tickets',\n            aggregate: 'count',\n            custom: 'created_tickets',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n      },\n    },\n  },\n};\n","import { chain, map } from 'lodash';\n\nconst VALUES_QUERY_TEMPLATE =\n  '{\"select\": [ { \"resource\": \"reports\", \"path\": \"<%= key %>\" } ], \"filter\": [ { \"resource\": \"reports\", \"path\": \"date\", \"operator\": \"timespan\", \"operands\": [7, \"day\"] } ], \"group_by\": [ { \"resource\": \"reports\", \"path\": \"<%= key %>\", \"order\": \"desc\" } ], \"order_by\": [ { \"resource\": \"reports\", \"path\": \"metric.sessions\", \"order\": \"desc\" } ], \"limit\": 20 }';\nexport default {\n  resources: [\n    {\n      name: 'reports',\n      human_readable_name: 'reports',\n      fields: [\n        {\n          key: 'custom_filter',\n          name: 'Custom filter',\n          type: 'custom',\n          category: 'custom',\n        },\n        {\n          key: 'date',\n          name: 'Date',\n          type: 'datetime',\n          category: 'Datetime',\n        },\n        {\n          key: 'accountId',\n          name: 'Account',\n          type: 'string',\n          resource: 'accounts',\n          foreign_key: 'accountId',\n          target_key: 'name',\n          hidden: true,\n          restrict_single_value: true,\n          equivalents: {\n            accountSummaries: 'accountId',\n            goals: 'accountId',\n            customMetrics: 'accountId',\n            customDimensions: 'accountId',\n          },\n        },\n        {\n          key: 'propertyId',\n          name: 'Property',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            goals: 'propertyId',\n            customMetrics: 'propertyId',\n            customDimensions: 'propertyId',\n          },\n        },\n        {\n          key: 'viewId',\n          name: 'View',\n          type: 'string',\n          resource: 'accountSummaries',\n          foreign_key: 'viewId',\n          target_key: [\n            'viewId',\n            'viewName',\n            'propertyName',\n            'propertyId',\n            'accountName',\n            'accountId',\n          ],\n          formatValue: ({ viewName }) => viewName,\n          groupValues: ({ propertyName }) => propertyName,\n          combined_filters: [\n            ({ propertyId }) => {\n              return {\n                primary_resource: 'reports',\n                key: 'propertyId',\n                value: propertyId,\n              };\n            },\n          ],\n          restrict_single_value: true,\n          is_global: true,\n          exclude_from_groupby: true,\n          equivalents: {\n            goals: 'viewId',\n            views: 'id',\n          },\n        },\n        {\n          key: 'segment',\n          name: 'Segment',\n          type: 'string',\n          resource: 'segments',\n          category: 'Segments',\n          foreign_key: 'segmentId',\n          target_key: 'name',\n          exclude_from_groupby: true,\n          restrict_single_value: true,\n        },\n        {\n          key: 'metric.users',\n          type: 'int',\n          name: 'Users',\n          aggregated: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.newUsers',\n          type: 'int',\n          name: 'New users',\n          aggregated: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.percentNewSessions',\n          type: 'percent',\n          name: 'Percentage of new sessions',\n          aggregated: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.sessionsPerUser',\n          type: 'float',\n          name: 'Number of sessions per user',\n          aggregated: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.1dayUsers',\n          type: 'int',\n          name: '1 day active users',\n          aggregated: true,\n          supported_visualisations: ['line'],\n          show_expanded: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.7dayUsers',\n          type: 'int',\n          name: '7 day active users',\n          aggregated: true,\n          supported_visualisations: ['line'],\n          show_expanded: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.14dayUsers',\n          type: 'int',\n          name: '14 day active users',\n          aggregated: true,\n          supported_visualisations: ['line'],\n          show_expanded: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.28dayUsers',\n          type: 'int',\n          name: '28 day active users',\n          aggregated: true,\n          supported_visualisations: ['line'],\n          show_expanded: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.30dayUsers',\n          type: 'int',\n          name: '30 day active users',\n          aggregated: true,\n          supported_visualisations: ['line'],\n          show_expanded: true,\n          category: 'User',\n        },\n        {\n          key: 'metric.sessions',\n          type: 'int',\n          name: 'Sessions',\n          aggregated: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.bounceRate',\n          type: 'percent',\n          name: 'Bounce rate',\n          aggregated: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.avgSessionDuration',\n          type: 'duration',\n          name: 'Average session duration',\n          unit: 'seconds',\n          aggregated: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.bounces',\n          type: 'int',\n          name: 'Bounces',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.uniqueDimensionCombinations',\n          type: 'int',\n          name: 'Unique dimension combinations',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.hits',\n          type: 'int',\n          name: 'Hits',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Session',\n        },\n        {\n          key: 'metric.pageviews',\n          type: 'int',\n          name: 'Pageviews',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.uniquePageviews',\n          type: 'int',\n          name: 'Unique pageviews',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.avgTimeOnPage',\n          type: 'duration',\n          name: 'Average time on page',\n          unit: 'seconds',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.pageviewsPerSession',\n          type: 'float',\n          name: 'Pageviews per session',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.pageValue',\n          type: 'currency',\n          name: 'Page value',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.entrances',\n          type: 'int',\n          name: 'Entrances',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.entranceRate',\n          type: 'percent',\n          name: 'Entrance rate',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.exits',\n          type: 'int',\n          name: 'Exits',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.exitRate',\n          type: 'percent',\n          name: 'Exit rate',\n          aggregated: true,\n          category: 'Page',\n        },\n        {\n          key: 'metric.totalEvents',\n          type: 'int',\n          name: 'Events',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.uniqueEvents',\n          type: 'int',\n          name: 'Unique events',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.avgEventValue',\n          type: 'float',\n          name: 'Average event value',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.eventValue',\n          type: 'int',\n          name: 'Event value',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.eventsPerSessionWithEvent',\n          type: 'float',\n          name: 'Events per session',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.sessionsWithEvent',\n          type: 'int',\n          name: 'Sessions with event',\n          aggregated: true,\n          category: 'Events',\n        },\n        {\n          key: 'metric.goalStartsAll',\n          type: 'int',\n          name: 'Goal starts',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalCompletionsAll',\n          type: 'int',\n          name: 'Goal completions',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalConversionRateAll',\n          type: 'percent',\n          name: 'Goal conversion rate',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalAbandonsAll',\n          type: 'int',\n          name: 'Goal abandons',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalAbandonRateAll',\n          type: 'percent',\n          name: 'Goal abandonment rate',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalValueAll',\n          type: 'currency',\n          name: 'Goal value',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.goalValuePerSession',\n          type: 'currency',\n          name: 'Goal value per session',\n          aggregated: true,\n          category: 'Goals',\n        },\n        {\n          key: 'metric.transactionRevenue',\n          type: 'currency',\n          name: 'Revenue',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.itemRevenue',\n          type: 'currency',\n          name: 'Product revenue',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactions',\n          type: 'int',\n          name: 'Transactions',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.itemQuantity',\n          type: 'int',\n          name: 'Number of items purchased',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.uniquePurchases',\n          type: 'int',\n          name: 'Number of unique products purchased',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactionsPerSession',\n          type: 'percent',\n          name: 'Ecommerce conversion rate',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.revenuePerTransaction',\n          type: 'currency',\n          name: 'Average order value',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.itemsPerPurchase',\n          type: 'float',\n          name: 'Average number of items per purchase',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.revenuePerUser',\n          type: 'currency',\n          name: 'Average revenue per user',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactionRevenuePerSession',\n          type: 'currency',\n          name: 'Average revenue per session',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.revenuePerItem',\n          type: 'currency',\n          name: 'Average revenue per item',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productRevenuePerPurchase',\n          type: 'currency',\n          name: 'Average product revenue per purchase',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactionsPerUser',\n          type: 'float',\n          name: 'Average transactions per user',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.totalValue',\n          type: 'currency',\n          name: 'Total value',\n          aggregated: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactionTax',\n          type: 'currency',\n          name: 'Tax',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.transactionShipping',\n          type: 'currency',\n          name: 'Shipping',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.refundAmount',\n          type: 'currency',\n          name: 'Refund amount',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productRefundAmount',\n          type: 'currency',\n          name: 'Refund amount (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.totalRefunds',\n          type: 'int',\n          name: 'Number of refunds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.quantityRefunded',\n          type: 'int',\n          name: 'Number of refunds (by unit)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productRefunds',\n          type: 'int',\n          name: 'Number of refunds (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.buyToDetailRate',\n          type: 'percent',\n          name: 'Buy to detail rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.cartToDetailRate',\n          type: 'percent',\n          name: 'Cart to detail rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productDetailViews',\n          type: 'int',\n          name: 'Product page views (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productAddsToCart',\n          type: 'int',\n          name: 'Added to cart (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.quantityAddedToCart',\n          type: 'int',\n          name: 'Added to cart (by unit)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productRemovesFromCart',\n          type: 'int',\n          name: 'Removed from cart (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.quantityRemovedFromCart',\n          type: 'int',\n          name: 'Removed from cart (by unit)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productCheckouts',\n          type: 'int',\n          name: 'Checked out (by product)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.quantityCheckedOut',\n          type: 'int',\n          name: 'Checked out (by unit)',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productListCTR',\n          type: 'percent',\n          name: 'Product list - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productListClicks',\n          type: 'int',\n          name: 'Product list - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.productListViews',\n          type: 'int',\n          name: 'Product list - Views',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.internalPromotionCTR',\n          type: 'percent',\n          name: 'Internal promotion - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.internalPromotionClicks',\n          type: 'int',\n          name: 'Internal promotion - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.internalPromotionViews',\n          type: 'int',\n          name: 'Internal Promotion - Views',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'metric.screenviews',\n          type: 'int',\n          name: 'Screen views',\n          aggregated: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'metric.uniqueScreenviews',\n          type: 'int',\n          name: 'Unique screen views',\n          aggregated: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'metric.screenviewsPerSession',\n          type: 'float',\n          name: 'Average screen views per session',\n          aggregated: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'metric.avgScreenviewDuration',\n          type: 'duration',\n          name: 'Average time on screen',\n          unit: 'seconds',\n          aggregated: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'metric.socialInteractions',\n          type: 'int',\n          name: 'Social interactions',\n          aggregated: true,\n          category: 'Social interactions',\n        },\n        {\n          key: 'metric.socialInteractionsPerSession',\n          type: 'float',\n          name: 'Social interactions per session',\n          aggregated: true,\n          category: 'Social interactions',\n        },\n        {\n          key: 'metric.uniqueSocialInteractions',\n          type: 'int',\n          name: 'Unique social interactions',\n          aggregated: true,\n          category: 'Social interactions',\n        },\n        {\n          key: 'metric.avgPageLoadTime',\n          type: 'duration',\n          name: 'Average page load time',\n          unit: 'seconds',\n          aggregated: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgDomainLookupTime',\n          type: 'duration',\n          name: 'Average domain lookup time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgPageDownloadTime',\n          type: 'duration',\n          name: 'Average page download time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgRedirectionTime',\n          type: 'duration',\n          name: 'Average redirection time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgServerConnectionTime',\n          type: 'duration',\n          name: 'Average server connection time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgServerResponseTime',\n          type: 'duration',\n          name: 'Average server response time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgDomInteractiveTime',\n          type: 'duration',\n          name: 'Average document interactive time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgDomContentLoadedTime',\n          type: 'duration',\n          name: 'Average document content loaded time',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site speed',\n        },\n        {\n          key: 'metric.avgUserTimingValue',\n          type: 'duration',\n          name: 'Average user timing',\n          unit: 'seconds',\n          aggregated: true,\n          category: 'User timings',\n        },\n        {\n          key: 'metric.exceptions',\n          type: 'int',\n          name: 'Exceptions',\n          aggregated: true,\n          category: 'Exceptions',\n        },\n        {\n          key: 'metric.exceptionsPerScreenview',\n          type: 'percent',\n          name: 'Exceptions per screen',\n          aggregated: true,\n          category: 'Exceptions',\n        },\n        {\n          key: 'metric.fatalExceptions',\n          type: 'int',\n          name: 'Crashes',\n          aggregated: true,\n          category: 'Exceptions',\n        },\n        {\n          key: 'metric.fatalExceptionsPerScreenview',\n          type: 'percent',\n          name: 'Crashes per screen',\n          aggregated: true,\n          category: 'Exceptions',\n        },\n        {\n          key: 'metric.searchUniques',\n          type: 'int',\n          name: 'Searches',\n          aggregated: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchSessions',\n          type: 'int',\n          name: 'Sessions with search',\n          aggregated: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.percentSessionsWithSearch',\n          type: 'percent',\n          name: 'Percentage of sessions with search',\n          aggregated: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchResultViews',\n          type: 'int',\n          name: 'Search result views',\n          aggregated: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.avgSearchResultViews',\n          type: 'float',\n          name: 'Search result views per search',\n          aggregated: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.avgSearchDepth',\n          type: 'float',\n          name: 'Average search depth',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.avgSearchDuration',\n          type: 'duration',\n          name: 'Average time after search',\n          unit: 'seconds',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchExits',\n          type: 'int',\n          name: 'Search exits',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchExitRate',\n          type: 'percent',\n          name: 'Search exit rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchRefinements',\n          type: 'int',\n          name: 'Search refinements',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.percentSearchRefinements',\n          type: 'percent',\n          name: 'Search refinement rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.goalValueAllPerSearch',\n          type: 'currency',\n          name: 'Average goal value per search',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.searchGoalConversionRateAll',\n          type: 'percent',\n          name: 'Site search goal conversion rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'metric.impressions',\n          type: 'int',\n          name: 'Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.adClicks',\n          type: 'int',\n          name: 'Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.adCost',\n          type: 'currency',\n          name: 'Cost',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.CPC',\n          type: 'currency',\n          name: 'Cost per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.CTR',\n          type: 'percent',\n          name: 'Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.costPerConversion',\n          type: 'currency',\n          name: 'Cost per conversion',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.costPerGoalConversion',\n          type: 'currency',\n          name: 'Cost per goal conversion',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.CPM',\n          type: 'currency',\n          name: 'Cost per thousand impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.costPerTransaction',\n          type: 'currency',\n          name: 'Cost per transaction',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.ROAS',\n          type: 'percent',\n          name: 'Return on ad spend',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.RPC',\n          type: 'currency',\n          name: 'Revenue per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'metric.adsenseRevenue',\n          type: 'currency',\n          name: 'AdSense - Revenue',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseAdUnitsViewed',\n          type: 'int',\n          name: 'AdSense - Ad units viewed',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseAdsViewed',\n          type: 'int',\n          name: 'AdSense - Ad viewed',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseAdsClicks',\n          type: 'int',\n          name: 'AdSense - Ads clicked',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsensePageImpressions',\n          type: 'int',\n          name: 'AdSense - Page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseCTR',\n          type: 'percent',\n          name: 'AdSense - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseECPM',\n          type: 'currency',\n          name: 'AdSense - Effective cost per thousand page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseExits',\n          type: 'int',\n          name: 'AdSense - Exits',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseViewableImpressionPercent',\n          type: 'percent',\n          name: 'AdSense - Viewable impression rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adsenseCoverage',\n          type: 'percent',\n          name: 'AdSense - Coverage',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Adsense',\n        },\n        {\n          key: 'metric.adxImpressions',\n          type: 'int',\n          name: 'AdX - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxImpressionsPerSession',\n          type: 'float',\n          name: 'AdX - Impressions per session',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxCoverage',\n          type: 'percent',\n          name: 'AdX - Coverage',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxMonetizedPageviews',\n          type: 'int',\n          name: 'AdX - Monetized Pageviews',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxClicks',\n          type: 'int',\n          name: 'AdX - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxCTR',\n          type: 'percent',\n          name: 'AdX - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxECPM',\n          type: 'currency',\n          name: 'AdX - Effective cost per thousand page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxRevenue',\n          type: 'currency',\n          name: 'AdX - Revenue',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxRevenuePer1000Sessions',\n          type: 'currency',\n          name: 'AdX - Revenue per thousand sessions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.adxViewableImpressionsPercent',\n          type: 'percent',\n          name: 'AdX - Viewable impression rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'Ad Exchange',\n        },\n        {\n          key: 'metric.dcmImpressions',\n          type: 'int',\n          name: 'DCM - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmClicks',\n          type: 'int',\n          name: 'DCM - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmCost',\n          type: 'currency',\n          name: 'DCM - Cost',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmCPC',\n          type: 'currency',\n          name: 'DCM - Cost per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmCTR',\n          type: 'percent',\n          name: 'DCM - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmFloodlightQuantity',\n          type: 'int',\n          name: 'DCM - Conversions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmFloodlightRevenue',\n          type: 'currency',\n          name: 'DCM - Revenue',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmROAS',\n          type: 'percent',\n          name: 'DCM - Return on ad spend',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dcmRPC',\n          type: 'currency',\n          name: 'DCM - Revenue per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'metric.dfpImpressions',\n          type: 'int',\n          name: 'DFP - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpImpressionsPerSession',\n          type: 'float',\n          name: 'DFP - Impressions per session',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpClicks',\n          type: 'int',\n          name: 'DFP - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpCTR',\n          type: 'percent',\n          name: 'DFP - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpCoverage',\n          type: 'percent',\n          name: 'DFP - Coverage',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpMonetizedPageviews',\n          type: 'int',\n          name: 'DFP - Monetized pageviews',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpECPM',\n          type: 'currency',\n          name: 'DFP - Effective cost per thousand page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpRevenue',\n          type: 'currency',\n          name: 'DFP - Revenue',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpRevenuePer1000Sessions',\n          type: 'currency',\n          name: 'DFP - Revenue per thousand sessions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dfpViewableImpressionsPercent',\n          type: 'percent',\n          name: 'DFP - Viewable impression rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillImpressions',\n          type: 'int',\n          name: 'DFP Backfill - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillImpressionsPerSession',\n          type: 'float',\n          name: 'DFP Backfill - Impressions per session',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillClicks',\n          type: 'int',\n          name: 'DFP Backfill - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillCTR',\n          type: 'percent',\n          name: 'DFP Backfill - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillCoverage',\n          type: 'percent',\n          name: 'DFP Backfill - Coverage',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillMonetizedPageviews',\n          type: 'int',\n          name: 'DFP Backfill - Monetized Pageviews',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillECPM',\n          type: 'currency',\n          name: 'DFP Backfill - Effective cost per thousand page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillRevenue',\n          type: 'currency',\n          name: 'DFP Backfill - Revenue',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillRevenuePer1000Sessions',\n          type: 'currency',\n          name: 'DFP Backfill - Revenue per thousand sessions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.backfillViewableImpressionsPercent',\n          type: 'percent',\n          name: 'DFP Backfill - Viewable impression rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick for Publishers',\n        },\n        {\n          key: 'metric.dbmCPA',\n          type: 'currency',\n          name: 'DBM - Effective cost per action',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmCPC',\n          type: 'currency',\n          name: 'DBM - Effective cost per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmCPM',\n          type: 'currency',\n          name: 'DBM - Effective cost per thousand page impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmCTR',\n          type: 'percent',\n          name: 'DBM - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmClicks',\n          type: 'int',\n          name: 'DBM - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmConversions',\n          type: 'int',\n          name: 'DBM - Conversions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmCost',\n          type: 'currency',\n          name: 'DBM - Cost',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmImpressions',\n          type: 'int',\n          name: 'DBM - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dbmROAS',\n          type: 'percent',\n          name: 'DBM - Return on ad spend',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'metric.dsImpressions',\n          type: 'int',\n          name: 'DS - Impressions',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsClicks',\n          type: 'int',\n          name: 'DS - Clicks',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsCTR',\n          type: 'percent',\n          name: 'DS - Click through rate',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsCPC',\n          type: 'currency',\n          name: 'DS - Cost per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsRevenuePerClick',\n          type: 'currency',\n          name: 'DS - Revenue per click',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsCost',\n          type: 'currency',\n          name: 'DS - Cost',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsProfit',\n          type: 'currency',\n          name: 'DS - Profit',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'metric.dsReturnOnAdSpend',\n          type: 'percent',\n          name: 'DS - Return on ad spend',\n          aggregated: true,\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.pagePath',\n          type: 'string',\n          name: 'Page path',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pagePath'],\n          formatValue: value => value['dimension.pagePath'],\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pageTitle',\n          type: 'string',\n          name: 'Page title',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pageTitle'],\n          formatValue: value => value['dimension.pageTitle'],\n          category: 'Page',\n        },\n        {\n          key: 'dimension.landingPagePath',\n          type: 'string',\n          name: 'Landing page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.landingPagePath'],\n          formatValue: value => value['dimension.landingPagePath'],\n          category: 'Page',\n        },\n        {\n          key: 'dimension.exitPagePath',\n          type: 'string',\n          name: 'Exit page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.exitPagePath'],\n          formatValue: value => value['dimension.exitPagePath'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.hostname',\n          type: 'string',\n          name: 'Hostname',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.hostname'],\n          formatValue: value => value['dimension.hostname'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pageDepth',\n          type: 'string',\n          name: 'Page depth',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pageDepth'],\n          formatValue: value => value['dimension.pageDepth'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pagePathLevel1',\n          type: 'string',\n          name: 'Page path level 1',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pagePathLevel1'],\n          formatValue: value => value['dimension.pagePathLevel1'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pagePathLevel2',\n          type: 'string',\n          name: 'Page path level 2',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pagePathLevel2'],\n          formatValue: value => value['dimension.pagePathLevel2'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pagePathLevel3',\n          type: 'string',\n          name: 'Page path level 3',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pagePathLevel3'],\n          formatValue: value => value['dimension.pagePathLevel3'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.pagePathLevel4',\n          type: 'string',\n          name: 'Page path level 4',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.pagePathLevel4'],\n          formatValue: value => value['dimension.pagePathLevel4'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.previousPagePath',\n          type: 'string',\n          name: 'Previous page path',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.previousPagePath'],\n          formatValue: value => value['dimension.previousPagePath'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.secondPagePath',\n          type: 'string',\n          name: 'Second page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.secondPagePath'],\n          formatValue: value => value['dimension.secondPagePath'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.channelGrouping',\n          type: 'string',\n          name: 'Channel grouping',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.channelGrouping'],\n          formatValue: value => value['dimension.channelGrouping'],\n          show_expanded: true,\n          category: 'Page',\n        },\n        {\n          key: 'dimension.userType',\n          type: 'string',\n          name: 'User type',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userType'],\n          formatValue: value => value['dimension.userType'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.userAgeBracket',\n          type: 'string',\n          name: 'Age',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userAgeBracket'],\n          formatValue: value => value['dimension.userAgeBracket'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.userGender',\n          type: 'string',\n          name: 'Gender',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userGender'],\n          formatValue: value => value['dimension.userGender'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.city',\n          type: 'string',\n          name: 'City',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.city'],\n          formatValue: value => value['dimension.city'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.country',\n          type: 'string',\n          name: 'Country',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.country'],\n          formatValue: value => value['dimension.country'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.continent',\n          type: 'string',\n          name: 'Continent',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.continent'],\n          formatValue: value => value['dimension.continent'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.subContinent',\n          type: 'string',\n          name: 'Sub continent',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.subContinent'],\n          formatValue: value => value['dimension.subContinent'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.region',\n          type: 'string',\n          name: 'Region',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.region'],\n          formatValue: value => value['dimension.region'],\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.metro',\n          type: 'string',\n          name: 'Designated market area',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.metro'],\n          formatValue: value => value['dimension.metro'],\n          show_expanded: true,\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.interestAffinityCategory',\n          type: 'string',\n          name: 'Interests (general affinity)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.interestAffinityCategory'],\n          formatValue: value => value['dimension.interestAffinityCategory'],\n          show_expanded: true,\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.interestInMarketCategory',\n          type: 'string',\n          name: 'Interests (actively in market)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.interestInMarketCategory'],\n          formatValue: value => value['dimension.interestInMarketCategory'],\n          show_expanded: true,\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.interestOtherCategory',\n          type: 'string',\n          name: 'Interests (other)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.interestOtherCategory'],\n          formatValue: value => value['dimension.interestOtherCategory'],\n          show_expanded: true,\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.userDefinedValue',\n          type: 'string',\n          name: 'User defined value',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userDefinedValue'],\n          formatValue: value => value['dimension.userDefinedValue'],\n          show_expanded: true,\n          category: 'Audience',\n        },\n        {\n          key: 'dimension.deviceCategory',\n          type: 'string',\n          name: 'Device',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.deviceCategory'],\n          formatValue: value => value['dimension.deviceCategory'],\n          category: 'Device',\n        },\n        {\n          key: 'dimension.operatingSystem',\n          type: 'string',\n          name: 'Operating system',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.operatingSystem'],\n          formatValue: value => value['dimension.operatingSystem'],\n          category: 'Device',\n        },\n        {\n          key: 'dimension.browser',\n          type: 'string',\n          name: 'Browser',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.browser'],\n          formatValue: value => value['dimension.browser'],\n          category: 'Device',\n        },\n        {\n          key: 'dimension.language',\n          type: 'string',\n          name: 'Language',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.language'],\n          formatValue: value => value['dimension.language'],\n          category: 'Device',\n        },\n        {\n          key: 'dimension.dataSource',\n          type: 'string',\n          name: 'Data source',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dataSource'],\n          formatValue: value => value['dimension.dataSource'],\n          show_expanded: true,\n          category: 'Device',\n        },\n        {\n          key: 'dimension.mobileDeviceBranding',\n          type: 'string',\n          name: 'Brand of mobile device',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.mobileDeviceBranding'],\n          formatValue: value => value['dimension.mobileDeviceBranding'],\n          show_expanded: true,\n          category: 'Device',\n        },\n        {\n          key: 'dimension.mobileDeviceInfo',\n          type: 'string',\n          name: 'Mobile device infomation',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.mobileDeviceInfo'],\n          formatValue: value => value['dimension.mobileDeviceInfo'],\n          show_expanded: true,\n          category: 'Device',\n        },\n        {\n          key: 'dimension.mobileDeviceMarketingName',\n          type: 'string',\n          name: 'Mobile device marketing name',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.mobileDeviceMarketingName'],\n          formatValue: value => value['dimension.mobileDeviceMarketingName'],\n          show_expanded: true,\n          category: 'Device',\n        },\n        {\n          key: 'dimension.mobileDeviceModel',\n          type: 'string',\n          name: 'Mobile device model',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.mobileDeviceModel'],\n          formatValue: value => value['dimension.mobileDeviceModel'],\n          show_expanded: true,\n          category: 'Device',\n        },\n        {\n          key: 'dimension.campaign',\n          type: 'string',\n          name: 'Campaign',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.campaign'],\n          formatValue: value => value['dimension.campaign'],\n          category: 'Traffic source',\n        },\n        {\n          key: 'dimension.medium',\n          type: 'string',\n          name: 'Medium',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.medium'],\n          formatValue: value => value['dimension.medium'],\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.source',\n          type: 'string',\n          name: 'Source',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.source'],\n          formatValue: value => value['dimension.source'],\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.sourceMedium',\n          type: 'string',\n          name: 'Source and medium',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.sourceMedium'],\n          formatValue: value => value['dimension.sourceMedium'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.adContent',\n          type: 'string',\n          name: 'Ad content',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adContent'],\n          formatValue: value => value['dimension.adContent'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.fullReferrer',\n          type: 'string',\n          name: 'Full referrer',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.fullReferrer'],\n          formatValue: value => value['dimension.fullReferrer'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.hasSocialSourceReferral',\n          type: 'string',\n          name: 'Social source referral',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.hasSocialSourceReferral'],\n          formatValue: value => value['dimension.hasSocialSourceReferral'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.keyword',\n          type: 'string',\n          name: 'Keyword',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.keyword'],\n          formatValue: value => value['dimension.keyword'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.referralPath',\n          type: 'string',\n          name: 'Referral path',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.referralPath'],\n          formatValue: value => value['dimension.referralPath'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.socialNetwork',\n          type: 'string',\n          name: 'Social network',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.socialNetwork'],\n          formatValue: value => value['dimension.socialNetwork'],\n          show_expanded: true,\n          category: 'Traffic',\n        },\n        {\n          key: 'dimension.acquisitionCampaign',\n          type: 'string',\n          name: 'Acquisition campaign',\n          aggregated: true,\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.acquisitionCampaign'],\n          formatValue: value => value['dimension.acquisitionCampaign'],\n          show_expanded: true,\n          category: 'Acquisition',\n        },\n        {\n          key: 'dimension.acquisitionTrafficChannel',\n          type: 'string',\n          name: 'Acquisition channel',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.acquisitionTrafficChannel'],\n          formatValue: value => value['dimension.acquisitionTrafficChannel'],\n          show_expanded: true,\n          category: 'Acquisition',\n        },\n        {\n          key: 'dimension.acquisitionMedium',\n          type: 'string',\n          name: 'Acquisition medium',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.acquisitionMedium'],\n          formatValue: value => value['dimension.acquisitionMedium'],\n          show_expanded: true,\n          category: 'Acquisition',\n        },\n        {\n          key: 'dimension.acquisitionSource',\n          type: 'string',\n          name: 'Acquisition source',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.acquisitionSource'],\n          formatValue: value => value['dimension.acquisitionSource'],\n          show_expanded: true,\n          category: 'Acquisition',\n        },\n        {\n          key: 'dimension.acquisitionSourceMedium',\n          type: 'string',\n          name: 'Acquisition source and medium',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.acquisitionSourceMedium'],\n          formatValue: value => value['dimension.acquisitionSourceMedium'],\n          show_expanded: true,\n          category: 'Acquisition',\n        },\n        {\n          key: 'dimension.cohort',\n          type: 'string',\n          name: 'Cohort',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.cohort'],\n          formatValue: value => value['dimension.cohort'],\n          show_expanded: true,\n          category: 'Cohort',\n        },\n        {\n          key: 'dimension.productName',\n          type: 'string',\n          name: 'Product',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.productName'],\n          formatValue: value => value['dimension.productName'],\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productSku',\n          type: 'string',\n          name: 'Product SKU',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.productSku'],\n          formatValue: value => value['dimension.productSku'],\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productCategory',\n          type: 'string',\n          name: 'Product category',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.productCategory'],\n          formatValue: value => value['dimension.productCategory'],\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productCategoryHierarchy',\n          type: 'string',\n          name: 'Product category (enhanced ecommerce)',\n          supports_contains_operators: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productBrand',\n          type: 'string',\n          name: 'Product brand',\n          supports_contains_operators: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.affiliation',\n          type: 'string',\n          name: 'Affiliation',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.affiliation'],\n          formatValue: value => value['dimension.affiliation'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.checkoutOptions',\n          type: 'string',\n          name: 'Checkout options',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.checkoutOptions'],\n          formatValue: value => value['dimension.checkoutOptions'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.currencyCode',\n          type: 'string',\n          name: 'Currency code',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.currencyCode'],\n          formatValue: value => value['dimension.currencyCode'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.daysToTransaction',\n          type: 'string',\n          name: 'Days to transaction',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.daysToTransaction'],\n          formatValue: value => value['dimension.daysToTransaction'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.internalPromotionCreative',\n          type: 'string',\n          name: 'Internal promotion creative',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.internalPromotionCreative'],\n          formatValue: value => value['dimension.internalPromotionCreative'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.internalPromotionName',\n          type: 'string',\n          name: 'Internal Promotion Name',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.internalPromotionName'],\n          formatValue: value => value['dimension.internalPromotionName'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.internalPromotionPosition',\n          type: 'string',\n          name: 'Internal promotion position',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.internalPromotionPosition'],\n          formatValue: value => value['dimension.internalPromotionPosition'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.orderCouponCode',\n          type: 'string',\n          name: 'Order coupon code',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.orderCouponCode'],\n          formatValue: value => value['dimension.orderCouponCode'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productCouponCode',\n          type: 'string',\n          name: 'Product coupon code',\n          supports_contains_operators: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productListName',\n          type: 'string',\n          name: 'Product List Name',\n          supports_contains_operators: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productListPosition',\n          type: 'string',\n          name: 'Product list position',\n          supports_contains_operators: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.productVariant',\n          type: 'string',\n          name: 'Product variant',\n          supports_contains_operators: true,\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.sessionsToTransaction',\n          type: 'string',\n          name: 'Sessions to transaction',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.sessionsToTransaction'],\n          formatValue: value => value['dimension.sessionsToTransaction'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.shoppingStage',\n          type: 'string',\n          name: 'Shopping stage',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.shoppingStage'],\n          formatValue: value => value['dimension.shoppingStage'],\n          show_expanded: true,\n          category: 'Ecommerce',\n        },\n        {\n          key: 'dimension.goalCompletionLocation',\n          type: 'string',\n          name: 'Goal completion location',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.goalCompletionLocation'],\n          formatValue: value => value['dimension.goalCompletionLocation'],\n          show_expanded: true,\n          category: 'Goals',\n        },\n        {\n          key: 'dimension.goalPreviousStep1',\n          type: 'string',\n          name: 'Goal previous step - 1',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.goalPreviousStep1'],\n          formatValue: value => value['dimension.goalPreviousStep1'],\n          show_expanded: true,\n          category: 'Goals',\n        },\n        {\n          key: 'dimension.goalPreviousStep2',\n          type: 'string',\n          name: 'Goal previous step - 2',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.goalPreviousStep2'],\n          formatValue: value => value['dimension.goalPreviousStep2'],\n          show_expanded: true,\n          category: 'Goals',\n        },\n        {\n          key: 'dimension.goalPreviousStep3',\n          type: 'string',\n          name: 'Goal previous step - 3',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.goalPreviousStep3'],\n          formatValue: value => value['dimension.goalPreviousStep3'],\n          show_expanded: true,\n          category: 'Goals',\n        },\n        {\n          key: 'dimension.eventAction',\n          type: 'string',\n          name: 'Event action',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.eventAction'],\n          formatValue: value => value['dimension.eventAction'],\n          category: 'Events',\n        },\n        {\n          key: 'dimension.eventCategory',\n          type: 'string',\n          name: 'Event category',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.eventCategory'],\n          formatValue: value => value['dimension.eventCategory'],\n          category: 'Events',\n        },\n        {\n          key: 'dimension.eventLabel',\n          type: 'string',\n          name: 'Event label',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.eventLabel'],\n          formatValue: value => value['dimension.eventLabel'],\n          category: 'Events',\n        },\n        {\n          key: 'dimension.appName',\n          type: 'string',\n          name: 'App Name',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.appName'],\n          formatValue: value => value['dimension.appName'],\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.appVersion',\n          type: 'string',\n          name: 'App version',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.appVersion'],\n          formatValue: value => value['dimension.appVersion'],\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.screenName',\n          type: 'string',\n          name: 'Screen Name',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.screenName'],\n          formatValue: value => value['dimension.screenName'],\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.exitScreenName',\n          type: 'string',\n          name: 'Exit Screen',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.exitScreenName'],\n          formatValue: value => value['dimension.exitScreenName'],\n          show_expanded: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.landingScreenName',\n          type: 'string',\n          name: 'Landing Screen',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.landingScreenName'],\n          formatValue: value => value['dimension.landingScreenName'],\n          show_expanded: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.screenDepth',\n          type: 'string',\n          name: 'Screen depth',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.screenDepth'],\n          formatValue: value => value['dimension.screenDepth'],\n          show_expanded: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.appInstallerId',\n          type: 'string',\n          name: 'App installer ID',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.appInstallerId'],\n          formatValue: value => value['dimension.appInstallerId'],\n          show_expanded: true,\n          category: 'App tracking',\n        },\n        {\n          key: 'dimension.exceptionDescription',\n          type: 'string',\n          name: 'Exception description',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.exceptionDescription'],\n          formatValue: value => value['dimension.exceptionDescription'],\n          show_expanded: true,\n          category: 'Exceptions',\n        },\n        {\n          key: 'dimension.userTimingCategory',\n          type: 'string',\n          name: 'User timing category',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userTimingCategory'],\n          formatValue: value => value['dimension.userTimingCategory'],\n          show_expanded: true,\n          category: 'User timings',\n        },\n        {\n          key: 'dimension.userTimingLabel',\n          type: 'string',\n          name: 'User timing label',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userTimingLabel'],\n          formatValue: value => value['dimension.userTimingLabel'],\n          show_expanded: true,\n          category: 'User timings',\n        },\n        {\n          key: 'dimension.userTimingVariable',\n          type: 'string',\n          name: 'User timing variable',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.userTimingVariable'],\n          formatValue: value => value['dimension.userTimingVariable'],\n          show_expanded: true,\n          category: 'User timings',\n        },\n        {\n          key: 'dimension.searchUsed',\n          type: 'string',\n          name: 'Site search used',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchUsed'],\n          formatValue: value => value['dimension.searchUsed'],\n          show_expanded: true,\n          category: 'Internal',\n        },\n        {\n          key: 'dimension.searchKeyword',\n          type: 'string',\n          name: 'Site search keyword',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchKeyword'],\n          formatValue: value => value['dimension.searchKeyword'],\n          show_expanded: true,\n          category: 'Internal',\n        },\n        {\n          key: 'dimension.searchDestinationPage',\n          type: 'string',\n          name: 'Site search destination page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchDestinationPage'],\n          formatValue: value => value['dimension.searchDestinationPage'],\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'dimension.searchCategory',\n          type: 'string',\n          name: 'Site search category',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchCategory'],\n          formatValue: value => value['dimension.searchCategory'],\n          show_expanded: true,\n          category: 'Search site',\n        },\n        {\n          key: 'dimension.searchStartPage',\n          type: 'string',\n          name: 'Site search start page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchStartPage'],\n          formatValue: value => value['dimension.searchStartPage'],\n          show_expanded: true,\n          category: 'Internal',\n        },\n        {\n          key: 'dimension.searchAfterDestinationPage',\n          type: 'string',\n          name: 'Site search after destination page',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchAfterDestinationPage'],\n          formatValue: value => value['dimension.searchAfterDestinationPage'],\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'dimension.searchKeywordRefinement',\n          type: 'string',\n          name: 'Site search keyword refinment',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.searchKeywordRefinement'],\n          formatValue: value => value['dimension.searchKeywordRefinement'],\n          show_expanded: true,\n          category: 'Site search',\n        },\n        {\n          key: 'dimension.adDestinationUrl',\n          type: 'string',\n          name: 'Destination URL',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adDestinationUrl'],\n          formatValue: value => value['dimension.adDestinationUrl'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adDisplayUrl',\n          type: 'string',\n          name: 'Display URL',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adDisplayUrl'],\n          formatValue: value => value['dimension.adDisplayUrl'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adDistributionNetwork',\n          type: 'string',\n          name: 'Ad Distribution Network',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adDistributionNetwork'],\n          formatValue: value => value['dimension.adDistributionNetwork'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adFormat',\n          type: 'string',\n          name: 'Ad Format',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adFormat'],\n          formatValue: value => value['dimension.adFormat'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adGroup',\n          type: 'string',\n          name: 'AdWords Ad Group',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adGroup'],\n          formatValue: value => value['dimension.adGroup'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adKeywordMatchType',\n          type: 'string',\n          name: 'Keyword Match Type',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adKeywordMatchType'],\n          formatValue: value => value['dimension.adKeywordMatchType'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adMatchType',\n          type: 'string',\n          name: 'Query Match Type',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adMatchType'],\n          formatValue: value => value['dimension.adMatchType'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adMatchedQuery',\n          type: 'string',\n          name: 'Search Query',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adMatchedQuery'],\n          formatValue: value => value['dimension.adMatchedQuery'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adPlacementDomain',\n          type: 'string',\n          name: 'Placement Domain',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adPlacementDomain'],\n          formatValue: value => value['dimension.adPlacementDomain'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adPlacementUrl',\n          type: 'string',\n          name: 'Placement URL',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adPlacementUrl'],\n          formatValue: value => value['dimension.adPlacementUrl'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adQueryWordCount',\n          type: 'string',\n          name: 'Query Word Count',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adQueryWordCount'],\n          formatValue: value => value['dimension.adQueryWordCount'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adSlot',\n          type: 'string',\n          name: 'AdWords Ad Slot',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adSlot'],\n          formatValue: value => value['dimension.adSlot'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adTargetingOption',\n          type: 'string',\n          name: 'Placement Type',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adTargetingOption'],\n          formatValue: value => value['dimension.adTargetingOption'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.adTargetingType',\n          type: 'string',\n          name: 'Targeting Type',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.adTargetingType'],\n          formatValue: value => value['dimension.adTargetingType'],\n          show_expanded: true,\n          category: 'Adwords',\n        },\n        {\n          key: 'dimension.dbmClickAdvertiser',\n          type: 'string',\n          name: 'DBM Advertiser (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmClickAdvertiser'],\n          formatValue: value => value['dimension.dbmClickAdvertiser'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmClickExchange',\n          type: 'string',\n          name: 'DBM Exchange (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmClickExchange'],\n          formatValue: value => value['dimension.dbmClickExchange'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmClickInsertionOrder',\n          type: 'string',\n          name: 'DBM Insertion Order (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmClickInsertionOrder'],\n          formatValue: value => value['dimension.dbmClickInsertionOrder'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmClickLineItem',\n          type: 'string',\n          name: 'DBM Line Item NAME (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmClickLineItem'],\n          formatValue: value => value['dimension.dbmClickLineItem'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmClickSite',\n          type: 'string',\n          name: 'DBM Site (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmClickSite'],\n          formatValue: value => value['dimension.dbmClickSite'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmLastEventAdvertiser',\n          type: 'string',\n          name: 'DBM Advertiser (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmLastEventAdvertiser'],\n          formatValue: value => value['dimension.dbmLastEventAdvertiser'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmLastEventExchange',\n          type: 'string',\n          name: 'DBM Exchange (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmLastEventExchange'],\n          formatValue: value => value['dimension.dbmLastEventExchange'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmLastEventInsertionOrder',\n          type: 'string',\n          name: 'DBM Insertion Order (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmLastEventInsertionOrder'],\n          formatValue: value => value['dimension.dbmLastEventInsertionOrder'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmLastEventLineItem',\n          type: 'string',\n          name: 'DBM Line Item (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmLastEventLineItem'],\n          formatValue: value => value['dimension.dbmLastEventLineItem'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dbmLastEventSite',\n          type: 'string',\n          name: 'DBM Site (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dbmLastEventSite'],\n          formatValue: value => value['dimension.dbmLastEventSite'],\n          show_expanded: true,\n          category: 'DoubleClick Bid Manager',\n        },\n        {\n          key: 'dimension.dcmClickAd',\n          type: 'string',\n          name: 'DCM Ad (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickAd'],\n          formatValue: value => value['dimension.dcmClickAd'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickAdType',\n          type: 'string',\n          name: 'DCM Ad Type (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickAdType'],\n          formatValue: value => value['dimension.dcmClickAdType'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickAdvertiser',\n          type: 'string',\n          name: 'DCM Advertiser (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickAdvertiser'],\n          formatValue: value => value['dimension.dcmClickAdvertiser'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickCampaign',\n          type: 'string',\n          name: 'DCM Campaign (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickCampaign'],\n          formatValue: value => value['dimension.dcmClickCampaign'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickCreative',\n          type: 'string',\n          name: 'DCM Creative (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickCreative'],\n          formatValue: value => value['dimension.dcmClickCreative'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickCreativeType',\n          type: 'string',\n          name: 'DCM Creative Type (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickCreativeType'],\n          formatValue: value => value['dimension.dcmClickCreativeType'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickCreativeVersion',\n          type: 'string',\n          name: 'DCM Creative Version (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickCreativeVersion'],\n          formatValue: value => value['dimension.dcmClickCreativeVersion'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickSite',\n          type: 'string',\n          name: 'DCM Site (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickSite'],\n          formatValue: value => value['dimension.dcmClickSite'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmClickSitePlacement',\n          type: 'string',\n          name: 'DCM Placement (GA Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmClickSitePlacement'],\n          formatValue: value => value['dimension.dcmClickSitePlacement'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmFloodlightActivity',\n          type: 'string',\n          name: 'DCM Activity',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmFloodlightActivity'],\n          formatValue: value => value['dimension.dcmFloodlightActivity'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmFloodlightActivityAndGroup',\n          type: 'string',\n          name: 'DCM Activity and Group',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmFloodlightActivityAndGroup'],\n          formatValue: value =>\n            value['dimension.dcmFloodlightActivityAndGroup'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmFloodlightActivityGroup',\n          type: 'string',\n          name: 'DCM Activity Group',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmFloodlightActivityGroup'],\n          formatValue: value => value['dimension.dcmFloodlightActivityGroup'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventAd',\n          type: 'string',\n          name: 'DCM Ad',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventAd'],\n          formatValue: value => value['dimension.dcmLastEventAd'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventAdType',\n          type: 'string',\n          name: 'DCM Ad Type (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventAdType'],\n          formatValue: value => value['dimension.dcmLastEventAdType'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventAdvertiser',\n          type: 'string',\n          name: 'DCM Advertiser (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventAdvertiser'],\n          formatValue: value => value['dimension.dcmLastEventAdvertiser'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventAttributionType',\n          type: 'string',\n          name: 'DCM Attribution Type (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventAttributionType'],\n          formatValue: value => value['dimension.dcmLastEventAttributionType'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventCampaign',\n          type: 'string',\n          name: 'DCM Campaign (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventCampaign'],\n          formatValue: value => value['dimension.dcmLastEventCampaign'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventCreative',\n          type: 'string',\n          name: 'DCM Creative (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventCreative'],\n          formatValue: value => value['dimension.dcmLastEventCreative'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventCreativeType',\n          type: 'string',\n          name: 'DCM Creative Type (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventCreativeType'],\n          formatValue: value => value['dimension.dcmLastEventCreativeType'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventCreativeVersion',\n          type: 'string',\n          name: 'DCM Creative Version (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventCreativeVersion'],\n          formatValue: value => value['dimension.dcmLastEventCreativeVersion'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventSite',\n          type: 'string',\n          name: 'DCM Site (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventSite'],\n          formatValue: value => value['dimension.dcmLastEventSite'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dcmLastEventSitePlacement',\n          type: 'string',\n          name: 'DCM Placement (DCM Model)',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dcmLastEventSitePlacement'],\n          formatValue: value => value['dimension.dcmLastEventSitePlacement'],\n          show_expanded: true,\n          category: 'DoubleClick Campaign Manager',\n        },\n        {\n          key: 'dimension.dsAdGroup',\n          type: 'string',\n          name: 'DS Ad Group',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsAdGroup'],\n          formatValue: value => value['dimension.dsAdGroup'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.dsAdvertiser',\n          type: 'string',\n          name: 'DS Advertiser',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsAdvertiser'],\n          formatValue: value => value['dimension.dsAdvertiser'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.dsAgency',\n          type: 'string',\n          name: 'DS Agency',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsAgency'],\n          formatValue: value => value['dimension.dsAgency'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.dsCampaign',\n          type: 'string',\n          name: 'DS Campaign',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsCampaign'],\n          formatValue: value => value['dimension.dsCampaign'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.dsEngineAccount',\n          type: 'string',\n          name: 'DS Engine Account',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsEngineAccount'],\n          formatValue: value => value['dimension.dsEngineAccount'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n        {\n          key: 'dimension.dsKeyword',\n          type: 'string',\n          name: 'DS Keyword',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['dimension.dsKeyword'],\n          formatValue: value => value['dimension.dsKeyword'],\n          show_expanded: true,\n          category: 'DoubleClick Search',\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              { path: 'id', resource: 'goals' },\n              { path: 'name', resource: 'goals' },\n            ],\n            filter: [\n              {\n                path: 'active',\n                resource: 'goals',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'custom_metric.goal<%= id %>Starts',\n              name: 'Goal starts (Goal <%= id %>: <%= name %>)',\n              type: 'int',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.goal<%= id %>Completions',\n              name: 'Goal completions (Goal <%= id %>: <%= name %>)',\n              type: 'int',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.goal<%= id %>ConversionRate',\n              name: 'Goal conversion rate (Goal <%= id %>: <%= name %>)',\n              type: 'percent',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.goal<%= id %>Abandons',\n              name: 'Goal abandons (Goal <%= id %>: <%= name %>)',\n              type: 'int',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.goal<%= id %>AbandonRate',\n              name: 'Goal abandonment rate (Goal <%= id %>: <%= name %>)',\n              type: 'percent',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.goal<%= id %>Value',\n              name: 'Goal value (Goal <%= id %>: <%= name %>)',\n              type: 'currency',\n              aggregated: true,\n              category: 'Goals',\n            },\n            {\n              key: 'custom_metric.searchGoal<%= id %>ConversionRate',\n              name: 'Search goal conversion rate (Goal <%= id %>: <%= name %>)',\n              type: 'percent',\n              aggregated: true,\n              category: 'Goals',\n            },\n          ],\n        },\n        {\n          query: {\n            select: [\n              { path: 'id', resource: 'customMetrics' },\n              { path: 'name', resource: 'customMetrics' },\n            ],\n            filter: [\n              {\n                path: 'active',\n                resource: 'customMetrics',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'custom_metric.metric<%= id %>',\n              name: 'Custom metric <%= name %> value',\n              type: 'int',\n              category: 'custom_metrics',\n            },\n            {\n              key: 'custom_metric.contentGroupUniqueViews<%= id %>',\n              name: 'Unique Views <%= name %>',\n              type: 'int',\n              category: 'custom_metrics',\n            },\n          ],\n        },\n        {\n          query: {\n            select: [\n              { path: 'id', resource: 'customDimensions' },\n              { path: 'name', resource: 'customDimensions' },\n            ],\n            filter: [\n              {\n                path: 'active',\n                resource: 'customDimensions',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'custom_dimension.contentGroup<%= id %>',\n              name: 'Page Group <%= name %>',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.customVarName<%= id %>',\n              name: 'Custom Variable (Key <%= name %>)',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.customVarValue<%= id %>',\n              name: 'Custom Variable (Value <%= name %>)',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.dimension<%= id %>',\n              name: 'Custom Dimension <%= name %>',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.landingContentGroup<%= id %>',\n              name: 'Landing Page Group <%= name %>',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.previousContentGroup<%= id %>',\n              name: 'Previous Page Group <%= name %>',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n            {\n              key: 'custom_dimension.productCategoryLevel<%= id %>',\n              name: 'Product Category Level <%= name %>',\n              type: 'string',\n              supports_contains_operators: true,\n              category: 'Custom dimensions',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'accountSummaries',\n      primary_key: 'viewId',\n      fields: [\n        {\n          key: 'accountId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'accountId',\n            goals: 'accountId',\n            customMetrics: 'accountId',\n            customDimensions: 'accountId',\n          },\n        },\n      ],\n    },\n    {\n      name: 'accounts',\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'properties',\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'id',\n          type: 'string',\n        },\n        {\n          key: 'name',\n          type: 'string',\n        },\n      ],\n    },\n    {\n      name: 'views',\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'id',\n          type: 'string',\n          equivalents: {\n            reports: 'viewId',\n            goals: 'viewId',\n          },\n        },\n        {\n          key: 'name',\n          type: 'string',\n        },\n        {\n          key: 'accountId',\n          type: 'string',\n          equivalents: {\n            reports: 'accountId',\n            accountSummaries: 'accountId',\n            goals: 'accountId',\n            customMetrics: 'accountId',\n            customDimensions: 'accountId',\n          },\n        },\n        {\n          key: 'propertyId',\n          type: 'string',\n          equivalents: {\n            reports: 'propertyId',\n            goals: 'propertyId',\n            customMetrics: 'propertyId',\n            customDimensions: 'propertyId',\n          },\n        },\n      ],\n    },\n    {\n      name: 'segments',\n      private: true,\n      primary_key: 'segmentId',\n      fields: [{ key: 'name', name: 'Segment name', type: 'string' }],\n    },\n    {\n      name: 'goals',\n      fields: [\n        {\n          key: 'accountId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'accountId',\n            accountSummaries: 'accountId',\n            customMetrics: 'accountId',\n            customDimensions: 'accountId',\n          },\n        },\n        {\n          key: 'viewId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'viewId',\n            views: 'id',\n          },\n        },\n        {\n          key: 'propertyId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'propertyId',\n            customMetrics: 'propertyId',\n            customDimensions: 'propertyId',\n          },\n        },\n      ],\n    },\n    {\n      name: 'customMetrics',\n      fields: [\n        {\n          key: 'accountId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'accountId',\n            accountSummaries: 'accountId',\n            goals: 'accountId',\n            customDimensions: 'accountId',\n          },\n        },\n        {\n          key: 'propertyId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'propertyId',\n            goals: 'propertyId',\n            customDimensions: 'propertyId',\n          },\n        },\n      ],\n    },\n    {\n      name: 'customDimensions',\n      fields: [\n        {\n          key: 'accountId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'accountId',\n            accountSummaries: 'accountId',\n            goals: 'accountId',\n            customMetrics: 'accountId',\n          },\n        },\n        {\n          key: 'propertyId',\n          type: 'string',\n          hidden: true,\n          equivalents: {\n            reports: 'propertyId',\n            goals: 'propertyId',\n            customMetrics: 'propertyId',\n          },\n        },\n      ],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'reports',\n            path: 'metric.sessions',\n          },\n        ],\n        filter: [\n          {\n            resource: 'reports',\n            path: 'accountId',\n            operator: 'in',\n          },\n          {\n            resource: 'reports',\n            path: 'viewId',\n            operator: 'in',\n          },\n          {\n            resource: 'reports',\n            path: 'propertyId',\n            operator: 'in',\n          },\n          {\n            resource: 'reports',\n            path: 'date',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n      },\n    },\n  },\n  options: [\n    {\n      keys: ['currency', 'account_timezone'],\n      query: {\n        select: [\n          {\n            resource: 'views',\n            path: 'currency',\n          },\n          {\n            resource: 'views',\n            path: 'timezone',\n          },\n        ],\n      },\n    },\n  ],\n  prerequisites: {\n    service_account_filters: [\n      {\n        resource: 'reports',\n        path: 'accountId',\n        exclude_from_query: true,\n      },\n      {\n        resource: 'reports',\n        path: 'propertyId',\n        exclude_from_query: true,\n      },\n      {\n        resource: 'reports',\n        path: 'viewId',\n      },\n    ],\n    build_prerequisite_options: serviceAccounts => {\n      const prerequisites = map(serviceAccounts, sa => {\n        const { accountSummaries = [] } = sa.values;\n\n        let accounts = chain(accountSummaries)\n          .uniqBy(summ => summ.accountId)\n          .map(o => {\n            return {\n              id: o.accountId,\n              name: o.accountName,\n            };\n          })\n          .value();\n\n        accounts = map(accounts, account => {\n          // Move all of the properties under accounts\n          account.children = chain(accountSummaries)\n            .filter(summ => summ.accountId === account.id)\n            .uniqBy(summ => summ.propertyId)\n            .map(o => {\n              return { id: o.propertyId, name: o.propertyName };\n            })\n            .value();\n\n          // Move all of the views under properties\n          account.children = map(account.children, property => {\n            property.children = chain(accountSummaries)\n              .filter(summ => summ.propertyId === property.id)\n              .map(o => {\n                return { id: o.viewId, name: o.viewName };\n              })\n              .value();\n\n            return property;\n          });\n\n          return account;\n        });\n\n        return {\n          id: sa.id,\n          name: sa.name,\n          children: accounts,\n        };\n      });\n\n      return prerequisites;\n    },\n  },\n};\n","const CONTACT_PROPERTY_VALUES_QUERY_TEMPLATE = `{ \"select\": [ { \"resource\": \"contact_property_values\", \"path\": \"label\" }, { \"resource\": \"contact_property_values\", \"path\": \"value\" } ], \n     \"filter\": [ { \"resource\": \"contact_property_values\", \"path\": \"name\", \"operator\": \"in\", \"operands\": [\"<%= key %>\"] } ],\n     \"limit\": 20 }`;\nconst DEAL_PROPERTY_VALUES_QUERY_TEMPLATE = `{ \"select\": [ { \"resource\": \"deal_property_values\", \"path\": \"label\" }, { \"resource\": \"deal_property_values\", \"path\": \"value\" } ],\n     \"filter\": [ { \"resource\": \"deal_property_values\", \"path\": \"name\", \"operator\": \"in\", \"operands\": [\"<%= key %>\"] } ],\n     \"limit\": 20 }`;\nconst COMPANY_PROPERTY_VALUES_QUERY_TEMPLATE = `{ \"select\": [ { \"resource\": \"company_property_values\", \"path\": \"label\" }, { \"resource\": \"company_property_values\", \"path\": \"value\" } ],\n     \"filter\": [ { \"resource\": \"company_property_values\", \"path\": \"name\", \"operator\": \"in\", \"operands\": [\"<%= key %>\"] } ],\n     \"limit\": 20 }`;\n\nexport default {\n  resources: [\n    {\n      name: 'owners',\n      private: true,\n      primary_key: 'ownerId',\n      fields: [{ key: 'fullName', name: 'Owners', type: 'string' }],\n    },\n    {\n      name: 'deals',\n      human_readable_name: 'deals',\n      rel: [\n        {\n          res: 'pipelines',\n          name: 'deal_pipeline',\n        },\n        {\n          res: 'stages',\n          name: 'stage',\n        },\n      ],\n      countable: true,\n      fields: [\n        {\n          custom: 'all_deals',\n          name: 'All deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_deals',\n          name: 'Created deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'deals', key: 'properties.createdate.value' },\n            ],\n          },\n        },\n        {\n          custom: 'closed_deals',\n          name: 'Closed deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'deals', key: 'properties.closedate.value' },\n            ],\n          },\n        },\n        {\n          key: 'stage',\n          name: 'Stage',\n          category: 'Deal properties',\n          type: 'string',\n          resource: 'stages',\n          foreign_key: 'properties.dealstage.value',\n          target_key: 'label',\n        },\n        {\n          key: 'deal_pipeline',\n          name: 'Pipeline',\n          type: 'string',\n          category: 'Deal properties',\n          resource: 'pipelines',\n          foreign_key: 'properties.pipeline.value',\n          target_key: 'label',\n        },\n        {\n          key: 'owner',\n          name: 'Owner',\n          type: 'string',\n          category: 'Deal properties',\n          resource: 'owners',\n          foreign_key: 'properties.hubspot_owner_id.value',\n          target_key: 'fullName',\n        },\n        {\n          key: 'properties.amount.value',\n          type: 'currency',\n        },\n        {\n          custom: 'value_all_deals',\n          name: 'Value of all deals',\n          base: { resource: 'deals', path: 'properties.amount.value' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'value_started_deals',\n          name: 'Value of created deals',\n          base: { resource: 'deals', path: 'properties.amount.value' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'deals', key: 'properties.createdate.value' },\n            ],\n          },\n        },\n        {\n          custom: 'value_close_deals',\n          name: 'Value of closed deals',\n          base: { resource: 'deals', path: 'properties.amount.value' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'deals', key: 'properties.closedate.value' },\n            ],\n          },\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'label',\n                resource: 'deal_properties',\n              },\n              {\n                path: 'name',\n                resource: 'deal_properties',\n              },\n              {\n                path: 'type',\n                resource: 'deal_properties',\n              },\n            ],\n            filter: [\n              {\n                resource: 'deal_properties',\n                path: 'showInQueryEditor',\n                operator: '=',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'properties.<%= name %>.value',\n              name: '<%= label %>',\n              type: '<%= type %>',\n              category: 'Deal properties',\n              exclude_from_metrics: true,\n              query_template_for_values: DEAL_PROPERTY_VALUES_QUERY_TEMPLATE,\n              formatKey: value => value.value,\n              formatValue: value => value.label,\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'contacts',\n      human_readable_name: 'contacts',\n      countable: true,\n      fields: [\n        {\n          custom: 'all_contacts',\n          name: 'All contacts',\n          base: { resource: 'contacts' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_contacts',\n          name: 'Created contacts',\n          base: { resource: 'contacts' },\n          rules: {\n            time_fields: [{ primary_resource: 'contacts', key: 'addedAt' }],\n          },\n        },\n        {\n          key: 'addedAt',\n          name: 'Create Date',\n          type: 'datetime',\n          category: 'Contact properties',\n        },\n        {\n          key: 'owner',\n          name: 'Owner',\n          type: 'string',\n          category: 'Contact properties',\n          resource: 'owners',\n          foreign_key: 'properties.hubspot_owner_id.value',\n          target_key: 'fullName',\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'label',\n                resource: 'contact_properties',\n              },\n              {\n                path: 'name',\n                resource: 'contact_properties',\n              },\n              {\n                path: 'type',\n                resource: 'contact_properties',\n              },\n            ],\n            filter: [\n              {\n                resource: 'contact_properties',\n                path: 'showInQueryEditor',\n                operator: '=',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'properties.<%= name %>.value',\n              name: '<%= label %>',\n              type: '<%= type %>',\n              category: 'Contact properties',\n              exclude_from_metrics: true,\n              query_template_for_values: CONTACT_PROPERTY_VALUES_QUERY_TEMPLATE,\n              formatKey: value => value.value,\n              formatValue: value => value.label,\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'companies',\n      human_readable_name: 'companies',\n      countable: true,\n      fields: [\n        {\n          custom: 'all_companies',\n          name: 'All companies',\n          base: { resource: 'companies' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_companies',\n          name: 'Created companies',\n          base: { resource: 'companies' },\n          rules: {\n            time_fields: [\n              {\n                primary_resource: 'companies',\n                key: 'properties.createdate.value',\n              },\n            ],\n          },\n        },\n        {\n          custom: 'closed_companies',\n          name: 'Closed companies',\n          base: { resource: 'companies' },\n          rules: {\n            time_fields: [\n              {\n                primary_resource: 'companies',\n                key: 'properties.closedate.value',\n              },\n            ],\n          },\n        },\n        {\n          key: 'owner',\n          name: 'Owner',\n          type: 'string',\n          category: 'Company properties',\n          resource: 'owners',\n          foreign_key: 'properties.hubspot_owner_id.value',\n          target_key: 'fullName',\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'label',\n                resource: 'company_properties',\n              },\n              {\n                path: 'name',\n                resource: 'company_properties',\n              },\n              {\n                path: 'type',\n                resource: 'company_properties',\n              },\n            ],\n            filter: [\n              {\n                resource: 'company_properties',\n                path: 'showInQueryEditor',\n                operator: '=',\n                operands: [true],\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: 'properties.<%= name %>.value',\n              name: '<%= label %>',\n              type: '<%= type %>',\n              category: 'Company properties',\n              exclude_from_metrics: true,\n              query_template_for_values: COMPANY_PROPERTY_VALUES_QUERY_TEMPLATE,\n              formatKey: value => value.value,\n              formatValue: value => value.label,\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'calls',\n      human_readable_name: 'calls',\n      countable: true,\n      fields: [\n        {\n          custom: 'all_calls',\n          name: 'All calls',\n          base: { resource: 'calls' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_calls',\n          name: 'Created calls',\n          base: { resource: 'calls' },\n          rules: {\n            time_fields: [{ primary_resource: 'calls', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'timestamp',\n          name: 'Date',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'meetings',\n      human_readable_name: 'meetings',\n      countable: true,\n      fields: [\n        {\n          custom: 'all_meetings',\n          name: 'All meetings',\n          base: { resource: 'meetings' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_meetings',\n          name: 'Created meetings',\n          base: { resource: 'meetings' },\n          rules: {\n            time_fields: [{ primary_resource: 'meetings', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'timestamp',\n          name: 'Date',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'stages',\n      human_readable_name: 'stages',\n      primary_key: 'stageId',\n      fields: [\n        {\n          key: 'label',\n          name: 'Label',\n          type: 'string',\n          hidden: true,\n        },\n        {\n          key: 'closedWon',\n          name: 'Won',\n          category: 'Deal properties',\n          type: 'boolean',\n        },\n      ],\n    },\n    {\n      name: 'pipelines',\n      human_readable_name: 'pipelines',\n      primary_key: 'pipelineId',\n      fields: [\n        {\n          key: 'label',\n          name: 'Label',\n          type: 'string',\n          hidden: true,\n        },\n      ],\n    },\n    {\n      name: 'account',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'contact_properties',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'contact_property_values',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'deal_properties',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'deal_property_values',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'company_properties',\n      private: true,\n      fields: [],\n    },\n\n    {\n      name: 'company_property_values',\n      private: true,\n      fields: [],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'deals',\n            aggregate: 'count',\n            custom: 'all_deals',\n          },\n        ],\n      },\n    },\n  },\n  options: [\n    {\n      keys: ['currency', 'account_timezone'],\n      query: {\n        select: [\n          {\n            resource: 'account',\n            path: 'currency',\n          },\n          {\n            resource: 'account',\n            path: 'timeZone',\n          },\n        ],\n      },\n    },\n  ],\n};\n","export default {\n  api: {\n    max_time_period: 1209600000,\n  },\n  resources: [\n    {\n      name: 'companies',\n      human_readable_name: 'companies',\n      countable: true,\n      primary_key: 'id',\n      fields: [\n        {\n          custom: 'current_companies',\n          name: 'Number of companies',\n          base: { resource: 'companies' },\n          category: 'count_metrics',\n          type: 'count',\n          rules: {\n            time_fields: [null],\n          },\n          additional_info: {\n            content: 'The number of companies on this account.',\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'segments.id',\n          name: 'Segment',\n          type: 'string',\n          resource: 'company_segments',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          query_custom_values: {\n            select: [\n              {\n                resource: 'segments',\n                path: 'id',\n              },\n              {\n                resource: 'segments',\n                path: 'name',\n              },\n            ],\n            filter: [\n              {\n                resource: 'segments',\n                path: 'type',\n                operator: '=',\n                operands: ['company'],\n              },\n            ],\n          },\n        },\n        {\n          key: 'tags',\n          name: 'Tag',\n          type: 'string',\n          resource: 'tags',\n          foreign_key: 'tags.id',\n          target_key: 'name',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          equivalents: {\n            leads: 'tags',\n            users: 'tags',\n          },\n        },\n      ],\n    },\n    {\n      name: 'leads',\n      human_readable_name: 'leads',\n      countable: true,\n      fields: [\n        {\n          custom: 'number_of_leads',\n          name: 'Number of leads',\n          base: { resource: 'leads' },\n          category: 'count_metrics',\n          type: 'count',\n          rules: {\n            time_fields: [null],\n          },\n          additional_info: {\n            content:\n              'The number of people who started a conversation or replied to an auto message.',\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'segments',\n          name: 'Segment',\n          type: 'string',\n          resource: 'segments',\n          foreign_key: 'segments.id',\n          target_key: 'name',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          equivalents: {\n            users: 'segments',\n          },\n        },\n        {\n          key: 'tags',\n          name: 'Tag',\n          type: 'string',\n          resource: 'tags',\n          foreign_key: 'tags.id',\n          target_key: 'name',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          equivalents: {\n            companies: 'tags',\n            users: 'tags',\n          },\n        },\n      ],\n    },\n    {\n      name: 'users',\n      human_readable_name: 'users',\n      countable: true,\n      fields: [\n        {\n          custom: 'current_users',\n          name: 'Number of users',\n          base: { resource: 'users' },\n          category: 'count_metrics',\n          type: 'count',\n          rules: {\n            time_fields: [null],\n          },\n          additional_info: {\n            content:\n              'The number of people who signed up for your product or logged into an existing account after starting a conversation.',\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'segments',\n          name: 'Segment',\n          type: 'string',\n          resource: 'segments',\n          foreign_key: 'segments.id',\n          target_key: 'name',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          equivalents: {\n            leads: 'segments',\n          },\n        },\n        {\n          key: 'tags',\n          name: 'Tag',\n          type: 'string',\n          resource: 'tags',\n          foreign_key: 'tags.id',\n          target_key: 'name',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          equivalents: {\n            companies: 'tags',\n            leads: 'tags',\n          },\n        },\n      ],\n    },\n    {\n      name: 'segments',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Segment', type: 'string' }],\n    },\n    {\n      name: 'tags',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Tag', type: 'string' }],\n    },\n    {\n      name: 'admins',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Assignee', type: 'string' }],\n    },\n    {\n      name: 'conversations',\n      human_readable_name: 'conversations',\n      countable: true,\n      fields: [\n        {\n          custom: 'created_conversations',\n          name: 'New conversations',\n          base: { resource: 'conversations' },\n          category: 'timeseries_metrics',\n          type: 'count',\n          rules: {\n            time_fields: [\n              { primary_resource: 'conversations', key: 'created_at' },\n            ],\n            filters: [\n              {\n                primary_resource: 'conversations',\n                key: 'inbound',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n          additional_info: {\n            content:\n              'The number of new conversations started by an inbound message.',\n          },\n          reverse_comparison: true,\n        },\n        {\n          custom: 'closed_conversations',\n          name: 'Closed conversations',\n          base: { resource: 'conversations' },\n          category: 'timeseries_metrics',\n          type: 'count',\n          rules: {\n            time_fields: [\n              { primary_resource: 'conversations', key: 'last_closed_at' },\n            ],\n            filters: [\n              {\n                primary_resource: 'conversations',\n                key: 'state',\n                operator: 'in',\n                operands: ['closed'],\n              },\n            ],\n          },\n          additional_info: {\n            content: 'The number of conversations that are currently closed.',\n          },\n        },\n        {\n          key: 'assignee',\n          name: 'Assignee',\n          type: 'string',\n          resource: 'admins',\n          foreign_key: 'assignee_id',\n          target_key: 'name',\n          supports_null_values: true,\n        },\n        {\n          key: 'time_to_close',\n          name: 'Time to close',\n          default_aggregation: 'median',\n          type: 'duration',\n          unit: 'seconds',\n          rules: {\n            time_fields: [\n              { primary_resource: 'conversations', key: 'first_action_at' },\n            ],\n            filters: [\n              {\n                primary_resource: 'conversations',\n                key: 'state',\n                operator: 'in',\n                operands: ['closed'],\n              },\n            ],\n          },\n          additional_info: {\n            content:\n              \"The duration of any inbound or outbound conversation, calculated from the date of the first customer message or reply to the date it was closed. This metric doesn't discount the hours during which your office was closed as this information isn't currently made available to us by Intercom.\",\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'first_response_time',\n          name: 'First response time',\n          default_aggregation: 'median',\n          type: 'duration',\n          unit: 'seconds',\n          rules: {\n            time_fields: [\n              { primary_resource: 'conversations', key: 'created_at' },\n            ],\n            filters: [\n              {\n                primary_resource: 'conversations',\n                key: 'inbound',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n          additional_info: {\n            content:\n              \"The time it takes to reply to the first incoming message in a conversation. This metric doesn't discount the hours during which your office was closed as this information isn't currently made available to us by Intercom.\",\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'updated_at',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n        {\n          key: 'last_closed_at',\n          name: 'Last closed at',\n          type: 'datetime',\n        },\n        {\n          key: 'first_action_at',\n          name: 'First action at',\n          type: 'datetime',\n        },\n        {\n          key: 'state',\n          name: 'State',\n          type: 'enum',\n          values: [\n            { key: 'open', value: 'Open' },\n            { key: 'closed', value: 'Closed' },\n          ],\n        },\n        {\n          key: 'inbound',\n          name: 'Inbound',\n          type: 'boolean',\n        },\n      ],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'companies',\n            aggregate: 'count',\n            custom: 'current_companies',\n          },\n        ],\n      },\n    },\n  },\n};\n","export default {\n  resources: [\n    {\n      name: 'deals',\n      human_readable_name: 'deals',\n      countable: true,\n      primary_key: 'id',\n      fields: [\n        {\n          custom: 'all_deals',\n          name: 'All deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_deals',\n          name: 'Started deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'add_time' }],\n          },\n        },\n        {\n          custom: 'won_deals',\n          name: 'Won deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'won_time' }],\n          },\n        },\n        {\n          custom: 'lost_deals',\n          name: 'Lost deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'lost_time' }],\n          },\n        },\n        {\n          custom: 'close_deals',\n          name: 'Closed deals',\n          base: { resource: 'deals' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'close_time' }],\n          },\n        },\n        {\n          key: 'value',\n          type: 'currency',\n        },\n        {\n          custom: 'value_all_deals',\n          name: 'Value of all deals',\n          base: { resource: 'deals', path: 'value' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'value_started_deals',\n          name: 'Value of started deals',\n          base: { resource: 'deals', path: 'value' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'add_time' }],\n          },\n        },\n        {\n          custom: 'value_won_deals',\n          name: 'Value of won deals',\n          base: { resource: 'deals', path: 'value' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'won_time' }],\n          },\n        },\n        {\n          custom: 'value_lost_deals',\n          name: 'Value of lost deals',\n          base: { resource: 'deals', path: 'value' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'lost_time' }],\n          },\n        },\n        {\n          custom: 'value_close_deals',\n          name: 'Value of closed deals',\n          base: { resource: 'deals', path: 'value' },\n          rules: {\n            time_fields: [{ primary_resource: 'deals', key: 'close_time' }],\n          },\n        },\n        {\n          key: 'status',\n          name: 'Status',\n          type: 'enum',\n          values: [\n            { key: 'open', value: 'Open' },\n            { key: 'won', value: 'Won' },\n            { key: 'lost', value: 'Lost' },\n            { key: 'deleted', value: 'Deleted' },\n            { key: 'all_not_deleted', value: 'All not deleted' },\n          ],\n        },\n        {\n          key: 'user',\n          name: 'Owner',\n          type: 'string',\n          resource: 'users',\n          foreign_key: 'user_id.value',\n          target_key: 'name',\n          equivalents: {\n            activities: 'user',\n          },\n        },\n        {\n          key: 'pipeline',\n          name: 'Pipeline',\n          type: 'string',\n          resource: 'pipelines',\n          foreign_key: 'pipeline_id',\n          target_key: 'name',\n          is_vip: true,\n        },\n        {\n          key: 'person',\n          name: 'Contact',\n          type: 'string',\n          resource: 'persons',\n          foreign_key: 'person_id.value',\n          target_key: 'name',\n          equivalents: {\n            activities: 'person',\n          },\n        },\n        {\n          key: 'stage',\n          name: 'Stage',\n          type: 'string',\n          resource: 'stages',\n          foreign_key: 'stage_id',\n          target_key: 'name',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n        {\n          key: 'won_time',\n          name: 'Won at',\n          type: 'datetime',\n        },\n        {\n          key: 'lost_time',\n          name: 'Lost at',\n          type: 'datetime',\n        },\n        {\n          key: 'close_time',\n          name: 'Closed at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'pipelines',\n      human_readable_name: 'pipelines',\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'users',\n      human_readable_name: 'users',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n        {\n          key: 'created',\n          name: 'Created',\n          type: 'datetime',\n        },\n        {\n          key: 'modified',\n          name: 'Modified',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'persons',\n      human_readable_name: 'persons',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'stages',\n      human_readable_name: 'stages',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'activities',\n      human_readable_name: 'activities',\n      rel: [\n        {\n          res: 'deals',\n          name: 'deal',\n        },\n      ],\n      countable: true,\n      primary_key: 'id',\n      fields: [\n        {\n          custom: 'all_activities',\n          name: 'All activities',\n          base: { resource: 'activities' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          custom: 'created_activities',\n          name: 'Added activities',\n          base: { resource: 'activities' },\n          rules: {\n            time_fields: [{ primary_resource: 'activities', key: 'add_time' }],\n          },\n        },\n        {\n          custom: 'completed_activities',\n          name: 'Completed activities',\n          base: { resource: 'activities' },\n          rules: {\n            time_fields: [\n              { primary_resource: 'activities', key: 'marked_as_done_time' },\n            ],\n          },\n        },\n        {\n          key: 'done',\n          name: 'Done',\n          type: 'boolean',\n        },\n        {\n          key: 'type',\n          name: 'Type',\n          type: 'string',\n          resource: 'activity_types',\n          foreign_key: 'type',\n          target_key: 'name',\n        },\n        {\n          key: 'user',\n          name: 'Owner (Activities)',\n          type: 'string',\n          resource: 'users',\n          foreign_key: 'user_id',\n          target_key: 'name',\n          equivalents: {\n            deals: 'user',\n          },\n        },\n        {\n          key: 'person',\n          name: 'Person',\n          type: 'string',\n          resource: 'persons',\n          foreign_key: 'person_id',\n          target_key: 'name',\n          equivalents: {\n            deals: 'person',\n          },\n        },\n        {\n          key: 'deal',\n          name: 'Deal',\n          type: 'string',\n          resource: 'deals',\n          foreign_key: 'deal_id',\n          target_key: 'title',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at (Activities)',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at (Activities)',\n          type: 'datetime',\n        },\n        {\n          key: 'marked_as_done_time',\n          name: 'Completed at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'activity_types',\n      human_readable_name: 'activity types',\n      primary_key: 'key_string',\n      fields: [\n        {\n          key: 'name',\n          name: 'Name',\n          type: 'string',\n        },\n        {\n          key: 'add_time',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'update_time',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'user_settings',\n      fields: [],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'deals',\n            aggregate: 'count',\n            custom: 'all_deals',\n          },\n        ],\n      },\n    },\n  },\n  options: [\n    {\n      keys: ['currency'],\n      query: {\n        select: [\n          {\n            resource: 'user_settings',\n            path: 'default_currency',\n          },\n        ],\n      },\n    },\n  ],\n};\n","const VALUES_QUERY_TEMPLATE =\n  '{\"select\": [ { \"resource\": \"orders\", \"path\": \"<%= key %>\" } ], \"filter\": [ { \"resource\": \"orders\", \"path\": \"order_time\", \"operator\": \"timespan\", \"operands\": [7, \"day\"] } ], \"group_by\": [ { \"resource\": \"orders\", \"path\": \"<%= key %>\", \"order\": \"desc\" } ], \"limit\": 20 }';\n\nexport default {\n  api: {\n    max_time_period: 10368000000,\n  },\n  resources: [\n    {\n      name: 'orders',\n      human_readable_name: 'orders',\n      countable: true, // Number of orders\n      primary_key: 'id', // Primary key used by other resource\n      rel: [\n        {\n          res: 'order_metrics',\n          name: 'metric_set',\n        },\n      ],\n      details: {\n        name: 'Order details',\n        default_columns: [\n          {\n            primary_resource: 'orders',\n            key: 'id',\n          },\n          {\n            primary_resource: 'orders',\n            key: 'comment',\n          },\n          {\n            primary_resource: 'orders',\n            key: 'order_time',\n          },\n        ],\n        aggregated: true,\n        supported_visualisations: ['table'],\n        rules: {\n          time_fields: [null],\n          optimisation_order: [\n            {\n              primary_resource: 'orders',\n              key: 'order_time',\n            },\n          ],\n        },\n      },\n      fields: [\n        {\n          key: 'id',\n          name: 'Order ID',\n          type: 'string',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n        },\n        {\n          custom: 'all_orders',\n          name: 'All orders',\n          base: { resource: 'orders' }, // Extra field extending base resource\n          // Set of rules\n          rules: {\n            time_fields: [null], // Null here mean this metric support no timespan\n          },\n          supported_visualisations: ['number', 'geckometer'], // Limit available visualisation\n        },\n        {\n          custom: 'created_orders',\n          name: 'Created orders',\n          base: { resource: 'orders' },\n          rules: {\n            // Use the orders order_time as the default time selection\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n        {\n          key: 'revenue_usd',\n          name: 'Revenue',\n          type: 'currency',\n          category: 'finance',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'shipping_date' }],\n          },\n          additional_info: {\n            content:\n              'Space Cargo income from the sale of goods and services to customer.',\n          },\n        },\n        {\n          key: 'cost_usd',\n          name: 'Cost',\n          type: 'currency',\n          category: 'finance',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n        {\n          key: 'gross_margin_usd',\n          name: 'Gross margin',\n          type: 'currency',\n          category: 'finance',\n          show_expanded: true,\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n        {\n          key: 'profit_margin_percentage',\n          name: 'Profit margin',\n          type: 'percent',\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n        {\n          key: 'category',\n          name: 'Category',\n          type: 'enum',\n          values: [\n            { key: 'biological', value: 'Biological' },\n            { key: 'mineral', value: 'Mineral' },\n            { key: 'equipment', value: 'Equipment' },\n          ],\n        },\n        {\n          key: 'coupon',\n          name: 'Coupon',\n          type: 'enum',\n          supports_null_values: true, // Enum where null values are possible\n          values: [\n            { key: '10OFF', value: '10% off' },\n            { key: '20OFF', value: '20% off' },\n            { key: '30OFF', value: '30% off' },\n            { key: 'FREE_DELIVERY', value: 'Free delivery' },\n          ],\n        },\n        {\n          key: 'size.package',\n          type: 'string',\n          name: 'Package size',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['size.package'],\n          formatValue: value => value['size.package'],\n          category: 'Size',\n        },\n        {\n          key: 'size.product',\n          type: 'string',\n          name: 'Product size',\n          supports_contains_operators: true,\n          allow_free_form: true,\n          query_template_for_values: VALUES_QUERY_TEMPLATE,\n          formatKey: value => value['size.product'],\n          formatValue: value => value['size.product'],\n          category: 'Size',\n        },\n        {\n          key: 'destination',\n          name: 'Destination',\n          type: 'enum',\n          resource: 'destinations',\n          foreign_key: 'destination_id',\n          target_key: 'name',\n        },\n        {\n          key: 'container',\n          name: 'Container',\n          type: 'enum',\n          resource: 'containers',\n          foreign_key: 'container_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          exclude_from_groupby: true,\n        },\n        {\n          key: 'factory',\n          name: 'Factory',\n          type: 'enum',\n          resource: 'factories',\n          foreign_key: 'factory_id',\n          target_key: 'name',\n          is_vip: true,\n        },\n        {\n          key: 'segment_id',\n          name: 'Segment',\n          type: 'string',\n          restrict_single_value: true,\n          filter_exclusion_groups: ['group'],\n          query_custom_values: {\n            select: [\n              {\n                resource: 'segments',\n                path: 'id',\n              },\n              {\n                resource: 'segments',\n                path: 'name',\n              },\n            ],\n            filter: [\n              {\n                resource: 'segments',\n                path: 'type',\n                operator: '=',\n                operands: ['company'],\n              },\n            ],\n          },\n        },\n        {\n          key: 'product',\n          name: 'Product',\n          type: 'enum',\n          resource: 'products',\n          foreign_key: 'product_id',\n          target_key: 'name',\n          filter_exclusion_groups: ['group'],\n        },\n        {\n          key: 'customer',\n          name: 'Customer',\n          type: 'enum',\n          resource: 'customers',\n          foreign_key: 'customer_id',\n          target_key: 'name',\n        },\n        {\n          key: 'is_cancelled',\n          name: 'Cancelled Order',\n          type: 'boolean',\n        },\n        {\n          key: 'order_time',\n          name: 'Order time',\n          type: 'datetime',\n          equivalents: {\n            audit: 'created_at',\n          },\n        },\n        {\n          key: 'shipping_date',\n          name: 'Shipping date',\n          type: 'datetime',\n          equivalents: {\n            audit: 'updated_at',\n          },\n          rules: {\n            optimisation_order: [\n              {\n                primary_resource: 'orders',\n                key: 'order_time',\n              },\n            ],\n          },\n        },\n        {\n          key: 'comment',\n          name: 'Comment',\n          type: 'string',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            select: [\n              {\n                path: 'id',\n                resource: 'order_fields',\n              },\n              {\n                path: 'name',\n                resource: 'order_fields',\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: '<%= id %>',\n              name: '<%= name %>',\n              formatKey: ({ value }) => value,\n              query_template_for_values:\n                '{\"select\": [ { \"path\": \"name\", \"resource\": \"order_field_options\" }, { \"path\": \"value\", \"resource\": \"order_field_options\" } ]} ',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'order_metrics',\n      human_readable_name: 'order metrics',\n      rel: [\n        {\n          res: 'orders',\n          name: 'order',\n        },\n      ],\n      fields: [\n        {\n          key: 'order_metric_a',\n          name: 'Order metric A',\n          type: 'duration',\n          unit: 'minutes',\n          reverse_comparison: true,\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n        {\n          key: 'order_metric_b',\n          name: 'Order metric B',\n          type: 'int',\n          reverse_comparison: true,\n          rules: {\n            time_fields: [{ primary_resource: 'orders', key: 'order_time' }],\n          },\n        },\n      ],\n    },\n    {\n      name: 'customers',\n      human_readable_name: 'customers',\n      countable: true,\n      primary_key: 'id',\n      fields: [\n        {\n          // This custom one removes the default No of customers\n          // we need it because customers doesn't have a timespan\n          // so are limited to number only viz\n          custom: 'all_customers',\n          name: 'All customers',\n          base: { resource: 'customers' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'name',\n          name: 'Customer name',\n          type: 'string',\n          hidden: true, // Hides this field from UI\n        },\n      ],\n    },\n    {\n      name: 'destinations',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'containers',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'factories',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Name', type: 'string' }],\n    },\n    {\n      name: 'segments',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Segment', type: 'string' }],\n    },\n    {\n      name: 'products',\n      human_readable_name: 'products',\n      countable: true,\n      primary_key: 'id',\n      fields: [\n        {\n          custom: 'all_products',\n          name: 'All products',\n          base: { resource: 'products' },\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'name',\n          name: 'Product name',\n          type: 'string',\n          hidden: true,\n        },\n        {\n          key: 'tags',\n          name: 'Tags',\n          type: 'string',\n          // The values are from tags but doesn't need to join to that model\n          // this allows filters to fetch values from a specific endpoint\n          values_from: { resource: 'tags', key: 'value' },\n        },\n      ],\n    },\n    {\n      name: 'tags',\n      fields: [\n        {\n          key: 'value',\n          name: 'Value',\n          type: 'string',\n        },\n      ],\n    },\n    {\n      name: 'audit',\n      primary_key: 'id',\n      fields: [\n        {\n          key: 'created_at',\n          name: 'Order time',\n          type: 'string',\n          equivalents: {\n            // Audit created_at is equivalent to the orders order_time timestamp\n            orders: 'order_time',\n          },\n        },\n        {\n          key: 'updated_at',\n          name: 'Shipping date',\n          type: 'string',\n          enable_for_performance: true,\n          equivalents: {\n            // Audit updated_at is equivalent to the orders shipping_date timestamp\n            orders: 'shipping_date',\n          },\n        },\n        {\n          key: 'created_to_packaged',\n          name: 'Created to Packaged',\n          type: 'duration',\n          unit: 'minutes',\n          rules: {\n            time_fields: [{ primary_resource: 'audit', key: 'created_at' }],\n          },\n        },\n        {\n          key: 'created_to_shipped',\n          name: 'Created to Shipped',\n          type: 'duration',\n          unit: 'minutes',\n          rules: {\n            time_fields: [\n              // Use the audit updated_at field for the default time selection\n              { primary_resource: 'audit', key: 'updated_at' },\n            ],\n          },\n          reverse_comparison: true, // Longer created_to_shipped times are better in this case\n        },\n        {\n          key: 'performance_change',\n          name: 'Performance',\n          type: 'percent',\n          aggregated: true,\n          rules: {\n            time_fields: [{ primary_resource: 'audit', key: 'updated_at' }],\n          },\n          filter_associated_fields: node => node.enable_for_performance,\n        },\n      ],\n    },\n    {\n      name: 'user_settings',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'order_fields',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'order_field_options',\n      private: true,\n      fields: [],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'orders',\n            aggregate: 'count',\n            custom: 'all_orders',\n          },\n        ],\n      },\n    },\n  },\n  options: [\n    {\n      keys: ['currency'],\n      query: {\n        select: [\n          {\n            resource: 'user_settings',\n            path: 'default_currency',\n          },\n        ],\n      },\n    },\n  ],\n};\n","export default {\n  api: {\n    max_time_period: 10368000000,\n  },\n  resources: [\n    {\n      name: 'tickets',\n      human_readable_name: 'tickets',\n      rel: [\n        {\n          res: 'ticket_metrics',\n          name: 'metric_set',\n        },\n      ],\n      countable: true,\n      details: {\n        name: 'Ticket details',\n        category: 'Tickets',\n        default_columns: [\n          {\n            primary_resource: 'tickets',\n            key: 'id',\n          },\n          {\n            primary_resource: 'tickets',\n            key: 'subject',\n          },\n          {\n            primary_resource: 'tickets',\n            key: 'created_at',\n          },\n        ],\n        aggregated: true,\n        supported_visualisations: ['table'],\n        rules: {\n          time_fields: [null],\n          optimisation_order: [\n            {\n              primary_resource: 'tickets',\n              key: 'created_at',\n            },\n          ],\n        },\n      },\n      fields: [\n        {\n          custom: 'current_tickets',\n          name: 'All tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'All tickets is the number of unarchived tickets currently in your Zendesk account',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'new_tickets',\n          name: 'New tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'in',\n                operands: ['new'],\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'New tickets is the number of tickets currently in your Zendesk account where status is new',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'created_tickets',\n          name: 'Received tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'created_at' }],\n          },\n          additional_info: {\n            content:\n              \"Received tickets is the number of tickets created, excluding those that have been deleted. This may differ from how it’s shown in Zendesk’s reporting tab, which doesn’t exclude deleted tickets.<br/><br/>You can learn more in this <a href='https://support.zendesk.com/hc/en-us/articles/230623107-Discrepancies-between-Insights-and-Reporting-Overview-' target='_blank'>Zendesk Support Article</a>.\",\n          },\n          reverse_comparison: true,\n        },\n        {\n          custom: 'solved_tickets',\n          name: 'Solved tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [\n              { primary_resource: 'ticket_metrics', key: 'solved_at' },\n            ],\n          },\n        },\n        {\n          custom: 'open_tickets',\n          name: 'Open tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'in',\n                operands: ['open'],\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'Open tickets is the number of tickets currently in your Zendesk account where status is open',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'pending_tickets',\n          name: 'Pending tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'in',\n                operands: ['pending'],\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'Pending tickets is the number of tickets currently in your Zendesk account where status is pending',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'hold_tickets',\n          name: 'On-hold tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'in',\n                operands: ['hold'],\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'On-hold tickets is the number of tickets currently in your Zendesk account where status is hold',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'unsolved_tickets',\n          name: 'Unsolved tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'not_in',\n                operands: ['solved', 'closed'],\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'Unsolved tickets is the number of tickets currently in your Zendesk account where status is not closed or solved',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          custom: 'unassigned_tickets',\n          name: 'Unassigned tickets',\n          base: { resource: 'tickets' },\n          category: 'Tickets',\n          rules: {\n            time_fields: [null],\n            filters: [\n              {\n                primary_resource: 'tickets',\n                key: 'status',\n                operator: 'not_in',\n                operands: ['solved', 'closed'],\n              },\n              {\n                primary_resource: 'tickets',\n                key: 'assignee',\n                operator: 'is_null',\n              },\n            ],\n          },\n          type: 'count',\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'bar',\n            // 'column', // TODO: enable columns when FDGC supports split-by\n            'leaderboard',\n          ],\n          additional_info: {\n            content:\n              'Unassigned tickets is the number of tickets currently in your Zendesk account that have no assignee and where status is not closed or solved',\n          },\n          filter_associated_fields: node =>\n            node.primary_resource === 'tickets' && node.is_first_class,\n        },\n        {\n          key: 'type',\n          name: 'Type',\n          type: 'enum',\n          category: 'ticket_fields',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n          values: [\n            { key: 'problem', value: 'Problem' },\n            { key: 'incident', value: 'Incident' },\n            { key: 'question', value: 'Question' },\n            { key: 'task', value: 'Task' },\n          ],\n        },\n        {\n          key: 'priority',\n          name: 'Priority',\n          type: 'enum',\n          category: 'ticket_fields',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n          values: [\n            { key: 'low', value: 'Low' },\n            { key: 'normal', value: 'Normal' },\n            { key: 'high', value: 'High' },\n            { key: 'urgent', value: 'Urgent' },\n          ],\n        },\n        {\n          key: 'status',\n          name: 'Status',\n          type: 'enum',\n          category: 'ticket_fields',\n          is_first_class: true, // Zendesk metadata only\n          values: [\n            { key: 'new', value: 'New' },\n            { key: 'open', value: 'Open' },\n            { key: 'pending', value: 'Pending' },\n            { key: 'hold', value: 'Hold' },\n            { key: 'solved', value: 'Solved' },\n            { key: 'closed', value: 'Closed' },\n          ],\n        },\n        {\n          key: 'assignee',\n          name: 'Assignee',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'agents',\n          foreign_key: 'assignee_id',\n          target_key: 'name',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n          equivalents: {\n            satisfaction_ratings: 'assignee',\n          },\n        },\n        {\n          key: 'group',\n          name: 'Group',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'groups',\n          foreign_key: 'group_id',\n          target_key: 'name',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n          equivalents: {\n            satisfaction_ratings: 'group',\n          },\n        },\n        {\n          key: 'brand',\n          name: 'Brand',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'brands',\n          foreign_key: 'brand_id',\n          target_key: 'name',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n        },\n        {\n          key: 'organization',\n          name: 'Organization',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'organizations',\n          foreign_key: 'organization_id',\n          target_key: 'name',\n          supports_null_values: true,\n        },\n        {\n          key: 'tags',\n          name: 'Tag',\n          type: 'string',\n          category: 'ticket_fields',\n          values_from: { resource: 'tags', key: 'name' },\n          supports_null_values: true,\n        },\n        {\n          key: 'created_at',\n          name: 'Created at',\n          type: 'datetime',\n        },\n        {\n          key: 'updated_at',\n          name: 'Updated at',\n          type: 'datetime',\n        },\n        {\n          key: 'via.channel',\n          name: 'Channel',\n          type: 'enum',\n          category: 'ticket_fields',\n          supports_null_values: true,\n          is_first_class: true, // Zendesk metadata only\n          values: [\n            { key: 'api', value: 'API' },\n            { key: 'any_channel', value: 'Channel framework' },\n            { key: 'chat', value: 'Chat' },\n            { key: 'email', value: 'Email' },\n            { key: 'facebook', value: 'Facebook' },\n            { key: 'get_satisfaction', value: 'Get Satisfaction' },\n            { key: 'mobile_sdk', value: 'Mobile SDK' },\n            { key: 'phone', value: 'Phone' },\n            { key: 'sms', value: 'SMS' },\n            { key: 'twitter', value: 'Twitter' },\n            { key: 'web', value: 'Web' },\n          ],\n        },\n        {\n          key: 'id',\n          name: 'Ticket ID',\n          type: 'string', // an int is actually returned but we want to display result as string\n          category: 'ticket_fields',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n          equivalents: {\n            satisfaction_ratings: 'ticket_id',\n          },\n        },\n        {\n          key: 'subject',\n          name: 'Subject',\n          type: 'string',\n          category: 'ticket_fields',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n        },\n      ],\n      custom_fields_queries: [\n        {\n          query: {\n            filter: [\n              {\n                operands: ['tagger'],\n                operator: '=',\n                path: 'type',\n                resource: 'ticket_fields',\n              },\n              {\n                operands: [true],\n                operator: '=',\n                path: 'active',\n                resource: 'ticket_fields',\n              },\n            ],\n            order_by: [\n              {\n                order: 'asc',\n                path: 'position',\n                resource: 'ticket_fields',\n              },\n            ],\n            select: [\n              {\n                path: 'id',\n                resource: 'ticket_fields',\n              },\n              {\n                path: 'title',\n                resource: 'ticket_fields',\n              },\n            ],\n          },\n          field_templates: [\n            {\n              key: '<%= id %>',\n              name: '<%= title %>',\n              formatKey: ({ value }) => value,\n              query_template_for_values:\n                '{\"filter\": [ { \"operands\": [ \"<%= key %>\" ], \"operator\": \"=\", \"path\": \"id\", \"resource\": \"ticket_field_options\" } ], \"order_by\": [ { \"order\": \"asc\", \"path\": \"position\", \"resource\": \"ticket_field_options\" } ], \"select\": [ { \"path\": \"name\", \"resource\": \"ticket_field_options\" }, { \"path\": \"value\", \"resource\": \"ticket_field_options\" } ]} ',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'ticket_metrics',\n      human_readable_name: 'ticket metrics',\n      rel: [\n        {\n          res: 'tickets',\n          name: 'ticket',\n        },\n      ],\n      fields: [\n        {\n          key: 'first_resolution_time_in_minutes.calendar',\n          name: 'First resolution time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [\n              { primary_resource: 'ticket_metrics', key: 'solved_at' },\n            ],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'first_resolution_time_in_minutes.business',\n          name: 'First resolution time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [\n              { primary_resource: 'ticket_metrics', key: 'solved_at' },\n            ],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'full_resolution_time_in_minutes.calendar',\n          name: 'Full resolution time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [\n              { primary_resource: 'ticket_metrics', key: 'solved_at' },\n            ],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'full_resolution_time_in_minutes.business',\n          name: 'Full resolution time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [\n              { primary_resource: 'ticket_metrics', key: 'solved_at' },\n            ],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'reply_time_in_minutes.calendar',\n          name: 'First reply time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'created_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'reply_time_in_minutes.business',\n          name: 'First reply time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'created_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'on_hold_time_in_minutes.calendar',\n          name: 'On hold time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'on_hold_time_in_minutes.business',\n          name: 'On hold time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'agent_wait_time_in_minutes.calendar',\n          name: 'Agent waiting time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'agent_wait_time_in_minutes.business',\n          name: 'Agent waiting time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'requester_wait_time_in_minutes.calendar',\n          name: 'Requester waiting time (calendar)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'requester_wait_time_in_minutes.business',\n          name: 'Requester waiting time (business)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'minutes',\n          default_aggregation: 'avg',\n          rules: {\n            time_fields: [{ primary_resource: 'tickets', key: 'updated_at' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'solved_at',\n          name: 'Solved at',\n          type: 'datetime',\n          rules: {\n            optimisation_order: [\n              {\n                primary_resource: 'ticket_metrics',\n                key: 'updated_at',\n              },\n            ],\n          },\n          exclude_from_details: true,\n        },\n        {\n          key: 'updated_at',\n          name: 'Updated at',\n          type: 'datetime',\n          hidden: true,\n        },\n      ],\n    },\n    {\n      name: 'satisfaction_ratings',\n      human_readable_name: 'satisfaction ratings',\n      primary_key: 'id',\n      rel: [\n        {\n          res: 'tickets',\n          name: 'ticket',\n        },\n      ],\n      details: {\n        name: 'Satisfaction comments',\n        category: 'Satisfaction',\n        default_columns: [\n          {\n            primary_resource: 'satisfaction_ratings',\n            key: 'comment',\n          },\n          {\n            primary_resource: 'satisfaction_ratings',\n            key: 'score',\n          },\n          {\n            primary_resource: 'satisfaction_ratings',\n            key: 'created_at',\n          },\n        ],\n        aggregated: true,\n        supported_visualisations: ['feed'],\n        rules: {\n          time_fields: [null],\n          optimisation_order: [\n            {\n              primary_resource: 'satisfaction_ratings',\n              key: 'created_at',\n            },\n          ],\n        },\n      },\n      fields: [\n        {\n          key: 'sat_score',\n          name: 'Satisfaction rating (CSAT)',\n          category: 'Satisfaction',\n          type: 'percent',\n          aggregated: true,\n          rules: {\n            time_fields: [\n              { primary_resource: 'satisfaction_ratings', key: 'created_at' },\n            ],\n          },\n        },\n        {\n          key: 'comment',\n          name: 'Satisfaction comment',\n          type: 'string',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n        },\n        {\n          key: 'score',\n          name: 'Rating',\n          type: 'enum',\n          exclude_from_groupby: true,\n          restrict_single_value: true,\n          iconSuffix: '.svg',\n          values: [\n            { key: 'good', value: 'Good' },\n            { key: 'bad', value: 'Bad' },\n          ],\n        },\n        {\n          key: 'ticket_id',\n          name: 'Ticket ID',\n          type: 'string',\n          category: 'ticket_fields',\n          exclude_from_filters: true,\n          exclude_from_groupby: true,\n          equivalents: {\n            tickets: 'id',\n          },\n        },\n        {\n          key: 'created_at',\n          name: 'Created at (Sat Ratings)',\n          type: 'datetime',\n        },\n        {\n          key: 'assignee',\n          name: 'Assignee',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'agents',\n          foreign_key: 'assignee_id',\n          target_key: 'name',\n          supports_null_values: true,\n          equivalents: {\n            tickets: 'assignee',\n          },\n        },\n        {\n          key: 'group',\n          name: 'Group',\n          type: 'string',\n          category: 'ticket_fields',\n          resource: 'groups',\n          foreign_key: 'group_id',\n          target_key: 'name',\n          supports_null_values: true,\n          equivalents: {\n            tickets: 'group',\n          },\n        },\n      ],\n    },\n    {\n      name: 'ticket_slas',\n      human_readable_name: 'ticket slas',\n      fields: [\n        {\n          key: 'breached',\n          name: 'Number of SLAs breached',\n          category: 'SLAs',\n          type: 'int',\n          aggregated: true,\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'line',\n            'column',\n            'bar',\n          ],\n          rules: {\n            time_fields: [{ primary_resource: 'ticket_slas', key: 'time' }],\n          },\n          reverse_comparison: true,\n        },\n        {\n          key: 'achieved',\n          name: 'Number of SLAs achieved',\n          category: 'SLAs',\n          type: 'int',\n          aggregated: true,\n          supported_visualisations: [\n            'number',\n            'geckometer',\n            'line',\n            'column',\n            'bar',\n          ],\n          rules: {\n            time_fields: [{ primary_resource: 'ticket_slas', key: 'time' }],\n          },\n        },\n        {\n          key: 'time',\n          name: 'Time',\n          type: 'datetime',\n        },\n      ],\n    },\n    {\n      name: 'agents',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Assignee', type: 'string' }],\n    },\n    {\n      name: 'groups',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Group', type: 'string' }],\n    },\n    {\n      name: 'brands',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Brand', type: 'string' }],\n    },\n    {\n      name: 'organizations',\n      private: true,\n      primary_key: 'id',\n      fields: [{ key: 'name', name: 'Organization', type: 'string' }],\n    },\n    {\n      name: 'tags',\n      fields: [{ key: 'name', name: 'Tag', type: 'string' }],\n    },\n    {\n      name: 'views',\n      private: true,\n      fields: [{ key: 'title', name: 'Title', type: 'string' }],\n    },\n    {\n      name: 'ticket_fields',\n      private: true,\n      fields: [],\n    },\n    {\n      name: 'ticket_field_options',\n      private: true,\n      fields: [],\n    },\n  ],\n  equivalent_fields: {\n    satisfaction_ratings: {\n      tickets: { group: 'group', assignee: 'assignee', id: 'ticket_id' },\n    },\n  },\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'tickets',\n            aggregate: 'count',\n            custom: 'created_tickets',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n      },\n    },\n  },\n};\n","export default {\n  api: {\n    max_time_period: 10368000000,\n  },\n  metricCategories: [\n    'count',\n    'chat_time',\n    'satisfaction',\n    'messages',\n    'waiting_time',\n    'real_time_response',\n    'real_time_agents',\n  ],\n  resources: [\n    {\n      name: 'chats',\n      human_readable_name: 'chats',\n      countable: true,\n      fields: [\n        {\n          custom: 'created_chats',\n          name: 'Number of chats',\n          category: 'Chats',\n          base: { resource: 'chats' },\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          custom: 'missed_chats',\n          name: 'Number of missed chats',\n          category: 'Chats',\n          base: { resource: 'chats' },\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n            filters: [\n              {\n                primary_resource: 'chats',\n                key: 'missed',\n                operator: 'in',\n                operands: [true],\n              },\n            ],\n          },\n        },\n        {\n          key: 'count.total',\n          name: 'Number of messages (all)',\n          category: 'Chats',\n          type: 'int',\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'count.agent',\n          name: 'Number of messages (sent by agent)',\n          category: 'Chats',\n          type: 'int',\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'count.visitor',\n          name: 'Number of messages (sent by visitor)',\n          category: 'Chats',\n          type: 'int',\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'response_time.first',\n          name: 'First response time',\n          default_aggregation: 'avg',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          reverse_comparison: true,\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'duration',\n          name: 'Chat duration',\n          default_aggregation: 'avg',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          reverse_comparison: true,\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'sat_score',\n          name: 'Satisfaction rating',\n          category: 'Satisfaction',\n          type: 'percent',\n          aggregated: true,\n          rules: {\n            time_fields: [{ primary_resource: 'chats', key: 'timestamp' }],\n          },\n        },\n        {\n          key: 'timestamp',\n          name: 'Started at',\n          type: 'datetime',\n        },\n        {\n          key: 'end_timestamp',\n          name: 'Ended at',\n          type: 'datetime',\n        },\n        {\n          key: 'started_by',\n          name: 'Started by',\n          type: 'enum',\n          values: [\n            { key: 'agent', value: 'Agent' },\n            { key: 'visitor', value: 'Visitor' },\n            { key: 'trigger', value: 'Trigger' },\n          ],\n        },\n        {\n          key: 'type',\n          name: 'Type',\n          type: 'enum',\n          values: [\n            { key: 'chat', value: 'Chat' },\n            { key: 'offline_msg', value: 'Offline message' },\n          ],\n        },\n        {\n          key: 'rating',\n          name: 'Rating',\n          type: 'enum',\n          supports_null_values: true,\n          values: [\n            { key: 'good', value: 'Good' },\n            { key: 'bad', value: 'Bad' },\n          ],\n        },\n        {\n          key: 'agents',\n          name: 'Agent',\n          type: 'string',\n          resource: 'agents',\n          foreign_key: 'agents.id',\n          target_key: 'display_name',\n        },\n        {\n          key: 'departments',\n          name: 'Department',\n          type: 'string',\n          resource: 'departments',\n          foreign_key: 'department_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          equivalents: {\n            real_time_chats: 'departments',\n            real_time_agents: 'departments',\n          },\n        },\n        {\n          key: 'tags',\n          name: 'Tag',\n          type: 'string',\n          exclude_from_filters: true,\n        },\n        {\n          key: 'triggered',\n          name: 'Triggered',\n          type: 'boolean',\n        },\n        {\n          key: 'triggered_response',\n          name: 'Triggered response',\n          type: 'boolean',\n        },\n        {\n          key: 'unread',\n          name: 'Unread',\n          type: 'boolean',\n        },\n        {\n          key: 'missed',\n          name: 'Missed',\n          type: 'boolean',\n        },\n      ],\n    },\n    {\n      name: 'agents',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        { key: 'display_name', name: 'Name', type: 'string' },\n        { key: 'enabled', name: 'Agent enabled', type: 'boolean' },\n      ],\n    },\n    {\n      name: 'departments',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        { key: 'name', name: 'Name', type: 'string' },\n        { key: 'enabled', name: 'Department enabled', type: 'boolean' },\n      ],\n    },\n    {\n      name: 'roles',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        { key: 'name', name: 'Role name', type: 'string' },\n        { key: 'enabled', name: 'Role enabled', type: 'boolean' },\n      ],\n    },\n    {\n      name: 'skills',\n      private: true,\n      primary_key: 'id',\n      fields: [\n        { key: 'name', name: 'Skill  name', type: 'string' },\n        { key: 'description', name: 'Description', type: 'string' },\n        { key: 'enabled', name: 'Skill enabled', type: 'boolean' },\n      ],\n    },\n    {\n      name: 'real_time_chats',\n      fields: [\n        {\n          key: 'incoming_chats',\n          name: 'Current queue size (unassigned)',\n          category: 'Efficiency',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'assigned_chats',\n          name: 'Current queue size (assigned)',\n          category: 'Efficiency',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'queue',\n          name: 'Current queue size (all)',\n          category: 'Efficiency',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'active_chats',\n          name: 'Currently being served',\n          category: 'Efficiency',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'waiting_time_avg',\n          name: 'Current wait time (average)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'waiting_time_max',\n          name: 'Current wait time (longest)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'response_time_avg',\n          name: 'Current response time (average)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'response_time_max',\n          name: 'Current response time (longest)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'chat_duration_avg',\n          name: 'Current chat duration (average)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'chat_duration_max',\n          name: 'Current chat duration (longest)',\n          category: 'Efficiency',\n          type: 'duration',\n          unit: 'seconds',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'departments',\n          name: 'Department',\n          type: 'string',\n          resource: 'departments',\n          foreign_key: 'department_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          equivalents: {\n            chats: 'departments',\n            real_time_agents: 'departments',\n          },\n        },\n      ],\n    },\n    {\n      name: 'real_time_agents',\n      fields: [\n        {\n          key: 'agents_online',\n          name: 'Agents currently online',\n          category: 'Agent activity',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'agents_away',\n          name: 'Agents currently away',\n          category: 'Agent activity',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'agents_invisible',\n          category: 'Agent activity',\n          name: 'Agents currently invisible',\n          type: 'int',\n          aggregated: true,\n          rules: {\n            time_fields: [null],\n          },\n          supported_visualisations: ['number', 'geckometer'],\n        },\n        {\n          key: 'departments',\n          name: 'Department',\n          type: 'string',\n          resource: 'departments',\n          foreign_key: 'department_id',\n          target_key: 'name',\n          restrict_single_value: true,\n          equivalents: {\n            chats: 'departments',\n            real_time_chats: 'departments',\n          },\n        },\n      ],\n    },\n  ],\n  initialQueries: {\n    number: {\n      query: {\n        select: [\n          {\n            resource: 'chats',\n            custom: 'created_chats',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'chats',\n            path: 'timestamp',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n      },\n    },\n  },\n};\n","export default [\n  {\n    id: 'ae2f6e5a-9ef5-46a6-879e-6c7138b3ea59',\n    title: 'Reach on Instagram',\n    description:\n      'Number of people who saw your ads on Instagram at least once.',\n    category: 'Performance',\n    type: 'geckometer',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'reach',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'publisher_platform',\n            operator: 'in',\n            operands: ['instagram'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '2f4d376d-b8ec-496e-8d8f-f060fa46a7c6',\n    title: 'Reach on Facebook',\n    description: 'Number of people who saw your ads on Facebook at least once.',\n    category: 'Performance',\n    type: 'geckometer',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'reach',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'publisher_platform',\n            operator: 'in',\n            operands: ['facebook'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '534308e6-7ea0-41a1-837c-c407065cc327',\n    title: 'Unique clicks (all)',\n    description: 'Number of people who performed a click (all).',\n    category: 'Performance',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'unique_clicks',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [1, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '580b2184-e9f2-49bc-b001-02cc78c017b0',\n    title: 'Unique CTR (all)',\n    description:\n      'Percentage of times people saw your ad and performed a click (all).',\n    category: 'Performance',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'unique_ctr',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [1, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'e9912cd3-3cf4-4a14-89fd-b5ba1ff4905d',\n    title: 'Amount spent in last 7 days',\n    description: \"Estimated total amount of money you've spent.\",\n    category: 'Costs',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'spend',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '4d9a5e29-ee6f-45ff-a1e3-e305bcc6f281',\n    title: 'CPC on Instagram',\n    description: 'Average cost for each click (all) on Instagram.',\n    category: 'Costs',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'cpc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'publisher_platform',\n            operator: 'in',\n            operands: ['instagram'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ff40939e-5df6-40f9-89c6-17925ca511b0',\n    title: 'CPC on Facebook',\n    description: 'Average cost for each click (all) on Facebook.',\n    category: 'Costs',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'cpc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'publisher_platform',\n            operator: 'in',\n            operands: ['facebook'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ba7dfd71-5435-479b-a820-a465a8b27d77',\n    title: 'Cost per lead',\n    description: 'Average cost of a lead.',\n    category: 'Costs',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'cost_per_lead',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'b9977809-119b-435b-91de-97ce81df9a94',\n    title: 'Number of completed registrations',\n    description: 'Completed registrations that are attributed to your ads. ',\n    category: 'Conversions',\n    type: 'geckometer',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_complete_registration',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '9bb4e371-0dcd-4df8-8fc1-8b50274efc47',\n    title: 'Number of purchases',\n    description: 'Purchases that are attributed to your ads.',\n    category: 'Conversions',\n    type: 'geckometer',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_purchase',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '32336990-a7fd-448e-8c8e-bc84aa8fe791',\n    title: 'Number of leads',\n    description: 'Leads that are attributed to your ads.',\n    category: 'Conversions',\n    type: 'geckometer',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_lead',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '983e8fe4-00a3-469d-997e-81a0574a2b24',\n    title: 'Value of completed registrations',\n    description: 'Value of all completed registrations attributed to your ads.',\n    category: 'Conversions',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'action_values_complete_registration',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '9e7658e4-dd73-4aff-9293-ac7152d78b74',\n    title: 'Value of purchases',\n    description: 'Value of all purchases attributed to your ads.',\n    category: 'Conversions',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'action_values_purchase',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'c00a5639-66d8-4781-94d2-f1debf35b8f8',\n    title: 'Value of leads',\n    description: 'Value of all leads attributed to your ads.',\n    category: 'Conversions',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'action_values_lead',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '4f89d498-63c8-4282-8412-b501fdb414ff',\n    title: 'Number of app installs',\n    description: 'Mobile app installs attributed to your ads.',\n    category: 'Campaign results',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_mobile_app_install',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '12ab05f7-521b-4470-86fb-a71940abd096',\n    title: 'Number of leads from a lead form',\n    description: 'Leads collected through lead form ads/',\n    category: 'Campaign results',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_leadgen_other',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '1f359c00-407e-4372-8ddf-d5328a071718',\n    title: 'Number of 3-second video views',\n    description: 'Times your video ads were watched for at least 3 seconds.',\n    category: 'Campaign results',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'insights',\n            path: 'actions_video_view',\n            aggregate: 'sum',\n          },\n        ],\n        filter: [\n          {\n            resource: 'insights',\n            path: 'date_start',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'insights',\n            path: 'account_id',\n            operator: 'in',\n          },\n        ],\n      },\n    ],\n  },\n];\n","export default [\n  {\n    id: '579b4e7f-39f7-413c-a39f-e38d14c9afc5',\n    title: 'First response time',\n    description: 'Time customers are waiting until they receive a response.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '52m',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'tickets',\n            path: 'first_reply_time',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '8f0ceb94-d8bc-4a95-ad20-34dc8efc4af5',\n    title: 'Resolution time',\n    description: 'Time it takes to solve a support ticket.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '18h',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'tickets',\n            path: 'resolution_time',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'stats.resolved_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        orderBy: [\n          {\n            resource: 'ticket_metrics',\n            path: 'updated_at',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'd7715d8f-77d4-44bb-927c-399b28a6fd0c',\n    title: 'Ticket volume',\n    description: 'Number of support tickets coming in each day.',\n    category: 'Volume',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'created_at' },\n          {\n            resource: 'tickets',\n            custom: 'created_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [28, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [\n          { resource: 'tickets', path: 'created_at', bucket_by: 'day' },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ecf4279f-a9d5-47cf-8d5b-0d02ca38905f',\n    title: 'Unassigned tickets',\n    description: 'Number of support tickets yet to be assigned',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'tickets',\n            custom: 'created_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [30, 'day'],\n            operator: 'timespan',\n          },\n          { resource: 'tickets', path: 'responder_id', operator: 'is_null' },\n        ],\n      },\n    ],\n  },\n  {\n    id: '860a74c0-4531-4e9f-aa40-d9a7023303fd',\n    title: 'Customer satisfaction',\n    description: 'Percentage of good customer satisfaction ratings.',\n    category: 'Quality',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '94%',\n    },\n    queries: [\n      {\n        select: [{ resource: 'satisfaction_ratings', path: 'sat_score' }],\n        filter: [\n          {\n            resource: 'satisfaction_ratings',\n            path: 'created_at',\n            operands: [28, 'day'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'cb1cc06d-86d0-4176-978a-7eabc5a58569',\n    title: 'Tickets by category',\n    description:\n      'Number of tickets split by status, priority, or other category.',\n    category: 'Topics',\n    type: 'bar',\n    icon: {\n      type: 'icon',\n      value: 'bar',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'status' },\n          {\n            resource: 'tickets',\n            custom: 'created_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [{ resource: 'tickets', path: 'status' }],\n        order_by: [{ resource: 'tickets', path: 'status', order: 'asc' }],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: '7ae5071d-21b4-4ed2-a8fc-f79422b26050',\n    title: 'Top ticket solvers',\n    description: 'Who is solving the most tickets.',\n    category: 'People',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'responder.contact.name' },\n          {\n            resource: 'tickets',\n            custom: 'resolved_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'stats.resolved_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [{ resource: 'tickets', path: 'responder_id' }],\n        order_by: [\n          { resource: 'tickets', custom: 'resolved_tickets', order: 'desc' },\n        ],\n      },\n    ],\n  },\n];\n","export default [\n  {\n    id: '0b239587-f60f-4e53-9c68-2204aa7fbf65',\n    title: 'Sessions',\n    description: 'Number of visitors to your website.',\n    category: 'Traffic',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        group_by: [\n          {\n            bucket_by: 'day',\n            path: 'date',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            multi_index: 0,\n            path: 'metric.sessions',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '8c7fd15a-bb59-4c51-927a-3c1a3e9a5cad',\n    title: 'Users',\n    description: 'Number of visitors to your website.',\n    category: 'Traffic',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        group_by: [\n          {\n            bucket_by: 'day',\n            path: 'date',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            multi_index: 0,\n            path: 'metric.users',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '78317450-f8bf-4640-81f8-8e7bd9bb5974',\n    title: 'Page views',\n    description: 'Number of pages people visit on your website.',\n    category: 'Traffic',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        group_by: [\n          {\n            bucket_by: 'day',\n            path: 'date',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            multi_index: 0,\n            path: 'metric.pageviews',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '4d4d5e1b-47d2-4cdb-9913-db940a5a4c45',\n    title: 'Bounce rate',\n    description:\n      'Percentage of visitors who leave after viewing only one page.',\n    category: 'Engagement',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '2%',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [30, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            multi_index: 0,\n            path: 'metric.bounceRate',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'edbddc57-fc96-4fe1-8c9a-591079d6d00d',\n    title: 'Session duration',\n    description: 'Average length of sessions.',\n    category: 'Engagement',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '52m',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [30, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'metric.avgSessionDuration',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '01f97489-b5ea-4689-a4b4-21c6d834d3de',\n    title: 'Pages per session',\n    description:\n      'Average number of pages viewed during a session on your website.',\n    category: 'Engagement',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '42',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [30, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            multi_index: 0,\n            path: 'metric.pageviewsPerSession',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'b3689527-ac5d-4031-ba6b-642eaea61e6b',\n    title: 'New sessions',\n    description: 'Percentage of first-time visitors on your website.',\n    category: 'Engagement',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '87%',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [30, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            multi_index: 0,\n            path: 'metric.percentNewSessions',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '94140f3b-4649-4c50-8ceb-0d37caa02182',\n    title: 'Goal completions',\n    description: 'Number of times visitors complete a goal on your website.',\n    category: 'Goals',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        group_by: [\n          {\n            bucket_by: 'day',\n            path: 'date',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            multi_index: 0,\n            path: 'metric.goalCompletionsAll',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'b9c30633-abfc-41ef-9d09-5bce87218084',\n    title: 'Goal conversion rate',\n    description: 'Percentage of sessions which result in a goal completion.',\n    category: 'Goals',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '89%',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            multi_index: 0,\n            path: 'metric.goalConversionRateAll',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ee0a8b99-71d1-4f3b-96f2-8556455abc2a',\n    title: 'Revenue',\n    description: 'The total revenue from web ecommerce or in-app transactions.',\n    category: 'Ecommerce',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '$100',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            multi_index: 0,\n            path: 'metric.transactionRevenue',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '23bd5af7-a2f5-42e8-b954-73f3ef364191',\n    title: 'Conversion rate',\n    description: 'Percentage of users who take a desired ecommerce action.',\n    category: 'Ecommerce',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '34%',\n    },\n    queries: [\n      {\n        filter: [\n          {\n            operands: [7, 'day'],\n            operator: 'timespan',\n            path: 'date',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'accountId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'viewId',\n            resource: 'reports',\n          },\n          {\n            operator: 'in',\n            path: 'propertyId',\n            resource: 'reports',\n          },\n        ],\n        select: [\n          {\n            path: 'metric.transactionsPerSession',\n            resource: 'reports',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ebf5e7e9-7eba-43df-a394-c4343c65d3b9',\n    heirloom: true,\n    title: 'Current visitor gauge',\n    description: 'Display the current real-time visitor count.',\n    category: 'Current visitors',\n    icon: {\n      type: 'icon',\n      value: 'geckometer',\n    },\n    service_name: 'ga2',\n    widget_type: 'b838661347fa301e03fd66296ba252b4',\n  },\n  {\n    id: 'abaeb56c-761e-4ed4-bd06-3d49a26fd144',\n    heirloom: true,\n    title: 'Current visitor map',\n    description: 'Display the location of current visitors.',\n    category: 'Current visitors',\n    icon: {\n      type: 'icon',\n      value: 'map',\n    },\n    service_name: 'ga2',\n    widget_type: '351835db3bc8b3bc64d3c7e3250572ea',\n  },\n];\n","export default [\n  {\n    id: '566a1fa9-7bd8-4a3e-bfc8-eca34a7029ae',\n    title: 'Created deals',\n    description: 'The number of deals created recently.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'deals', custom: 'created_deals', aggregate: 'count' },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'properties.createdate.value',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        source: { integration: 'hubspot3' },\n      },\n    ],\n  },\n  {\n    id: 'c86297bc-0514-4332-bfde-87e9cf9ee0cf',\n    title: 'Value of created deals',\n    description: 'The monetary value of the deals created recently.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'properties.amount.value',\n            custom: 'value_started_deals',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'properties.createdate.value',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        source: { integration: 'hubspot3' },\n      },\n    ],\n  },\n  {\n    id: '384eeaca-4aca-47ad-b8f8-803804ea2d92',\n    title: 'Value of closed won deals',\n    description: 'The monetary value of recently closed won deals',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'properties.amount.value',\n            custom: 'value_close_deals',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'properties.closedate.value',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'deals',\n            path: 'stage.closedWon',\n            operator: '=',\n            operands: [true],\n          },\n        ],\n        source: { integration: 'hubspot3' },\n      },\n    ],\n  },\n  {\n    id: '00635304-868c-41ca-9aef-7feca5279f10',\n    title: 'Value of closed lost deals',\n    description: 'The monetary value of recently closed lost deals',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'properties.amount.value',\n            custom: 'value_close_deals',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'properties.closedate.value',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n          {\n            resource: 'deals',\n            path: 'stage.closedWon',\n            operator: '=',\n            operands: [false],\n          },\n        ],\n        source: { integration: 'hubspot3' },\n      },\n    ],\n  },\n  {\n    id: '1258848d-37e6-4a52-a86d-ce270aa08fef',\n    title: 'Created contacts',\n    description: 'The number of contacts added recently.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'contacts',\n            custom: 'created_contacts',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'contacts',\n            path: 'addedAt',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        source: { integration: 'hubspot3' },\n      },\n    ],\n  },\n];\n","export default [\n  {\n    id: '6201e4ca-62ba-4e33-ac90-31bc8989304b',\n    title: 'Value won',\n    description: 'Value of deals won.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '$100',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'value',\n            aggregate: 'sum',\n            custom: 'value_won_deals',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'won_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'c2d456bc-a734-4776-8d74-becea4d8f094',\n    title: 'Value lost',\n    description: 'Value of deals lost.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '$100',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'value',\n            aggregate: 'sum',\n            custom: 'value_lost_deals',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'lost_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'c7eeb0d7-d525-437e-9005-3c6729b53614',\n    title: 'Deals won',\n    description: 'Number of deals won.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '40',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            aggregate: 'count',\n            custom: 'won_deals',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'won_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '74fcfa0c-68f1-4cd1-8e34-533a228719a5',\n    title: 'Deals lost',\n    description: 'Number of deals lost.',\n    category: 'Deals',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '10',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            aggregate: 'count',\n            custom: 'lost_deals',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'lost_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'ca927708-ce35-4757-b1a1-e9582d42ec53',\n    title: 'Activities added',\n    description: 'Number of activities added by type.',\n    category: 'Activities',\n    type: 'bar',\n    icon: {\n      type: 'icon',\n      value: 'bar',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'activities',\n            path: 'type.name',\n          },\n          {\n            resource: 'activities',\n            aggregate: 'count',\n            custom: 'created_activities',\n          },\n        ],\n        group_by: [\n          {\n            resource: 'activities',\n            path: 'type',\n          },\n        ],\n        order_by: [\n          {\n            resource: 'activities',\n            path: 'type.name',\n            order: 'asc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'activities',\n            path: 'add_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: '45b2c6a6-7609-493f-a73d-2fbeb57c15ab',\n    title: 'Activities completed',\n    description: 'Number of activities completed by type.',\n    category: 'Activities',\n    type: 'bar',\n    icon: {\n      type: 'icon',\n      value: 'bar',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'activities',\n            path: 'type.name',\n          },\n          {\n            resource: 'activities',\n            aggregate: 'count',\n            custom: 'completed_activities',\n          },\n        ],\n        group_by: [\n          {\n            resource: 'activities',\n            path: 'type',\n          },\n        ],\n        order_by: [\n          {\n            resource: 'activities',\n            path: 'type.name',\n            order: 'asc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'activities',\n            path: 'marked_as_done_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: 'cf2d90c8-43ea-44a7-b26e-7b830db34842',\n    title: 'Top creators',\n    description: 'Who is opening the most deals.',\n    category: 'Team',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'user.name',\n          },\n          {\n            resource: 'deals',\n            aggregate: 'count',\n            custom: 'created_deals',\n          },\n        ],\n        group_by: [\n          {\n            resource: 'deals',\n            path: 'user_id.value',\n          },\n        ],\n        order_by: [\n          {\n            resource: 'deals',\n            custom: 'created_deals',\n            order: 'desc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'add_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '0c8851a5-a31e-48cd-a4a5-43049dfd8c02',\n    title: 'Top closers',\n    description: 'Who is closing the most deals.',\n    category: 'Team',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'deals',\n            path: 'user.name',\n          },\n          {\n            resource: 'deals',\n            path: 'value',\n            aggregate: 'avg',\n            custom: 'value_won_deals',\n          },\n        ],\n        group_by: [\n          {\n            resource: 'deals',\n            path: 'user_id.value',\n          },\n        ],\n        order_by: [\n          {\n            resource: 'deals',\n            path: 'value',\n            custom: 'value_won_deals',\n            order: 'desc',\n          },\n        ],\n        filter: [\n          {\n            resource: 'deals',\n            path: 'won_time',\n            operands: [1, 'month'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n];\n","export default [];\n","export default [\n  {\n    id: '8740be69-6092-45bc-996a-2797ad07689d',\n    title: 'First reply time',\n    description: 'Time customers are waiting until they receive a response.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '52m',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'ticket_metrics',\n            path: 'reply_time_in_minutes.calendar',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'ticket_metrics',\n            path: 'ticket.created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'bc16ec21-7d6d-4765-a8a8-05a9dd972332',\n    title: 'Full resolution time',\n    description: 'Time it takes to solve a support ticket.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '18h',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'ticket_metrics',\n            path: 'full_resolution_time_in_minutes.calendar',\n            aggregate: 'avg',\n          },\n        ],\n        filter: [\n          {\n            resource: 'ticket_metrics',\n            path: 'solved_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        orderBy: [\n          {\n            resource: 'ticket_metrics',\n            path: 'updated_at',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'e63ef5b5-8078-4790-8b61-a59750af212f',\n    title: 'Ticket volume',\n    description: 'Number of support tickets coming in each day.',\n    category: 'Volume',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'created_at' },\n          {\n            resource: 'tickets',\n            custom: 'created_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [28, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [\n          { resource: 'tickets', path: 'created_at', bucket_by: 'day' },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'b9e6c647-b9be-468a-b0bd-e481d7cf4f2c',\n    title: 'Unsolved tickets',\n    description: 'Number of support tickets yet to be dealt with.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'tickets',\n            custom: 'unsolved_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'status',\n            operands: ['solved', 'closed'],\n            operator: 'not_in',\n            bound_to_metric: true,\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'e1a76b62-e497-4023-817a-87e781968b2e',\n    title: 'Tickets requiring attention',\n    description: 'A list of new or open tickets, oldest first.',\n    category: 'Ticket details',\n    type: 'table',\n    icon: {\n      type: 'icon',\n      value: 'table',\n    },\n    config: {\n      detailsMetricResource: 'tickets',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'id' },\n          { resource: 'tickets', path: 'subject' },\n          { resource: 'tickets', path: 'created_at' },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'status',\n            operator: 'in',\n            operands: ['new', 'open'],\n          },\n        ],\n        order_by: [{ resource: 'tickets', path: 'created_at', order: 'asc' }],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: '77e420f9-457d-48b4-8699-23e5fe421f24',\n    title: 'Unassigned tickets',\n    description: 'A list of tickets waiting for an agent to pick them up.',\n    category: 'Ticket details',\n    type: 'table',\n    icon: {\n      type: 'icon',\n      value: 'table',\n    },\n    config: {\n      detailsMetricResource: 'tickets',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'id' },\n          { resource: 'tickets', path: 'subject' },\n          { resource: 'tickets', path: 'created_at' },\n        ],\n        filter: [\n          { resource: 'tickets', path: 'assignee_id', operator: 'is_null' },\n          {\n            resource: 'tickets',\n            path: 'status',\n            operator: 'not_in',\n            operands: ['closed', 'solved'],\n          },\n        ],\n        order_by: [{ resource: 'tickets', path: 'created_at', order: 'asc' }],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: 'f23ede7c-7f65-49ff-bfc8-f3e49660811b',\n    title: 'Customer satisfaction rating',\n    description: 'Percentage of good customer satisfaction ratings.',\n    category: 'Customer satisfaction',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '94%',\n    },\n    queries: [\n      {\n        select: [{ resource: 'satisfaction_ratings', path: 'sat_score' }],\n        filter: [\n          {\n            resource: 'satisfaction_ratings',\n            path: 'created_at',\n            operands: [28, 'day'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '94337fff-375b-4d4c-b96d-c0540b8bffb4',\n    title: 'Customer feedback',\n    description:\n      'A list of recent comments from Customer Satisfaction surveys.',\n    category: 'Customer satisfaction',\n    type: 'feed',\n    icon: {\n      type: 'text',\n      value: '',\n    },\n    config: {\n      detailsMetricResource: 'satisfaction_ratings',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'satisfaction_ratings', path: 'comment' },\n          { resource: 'satisfaction_ratings', path: 'score' },\n          { resource: 'satisfaction_ratings', path: 'created_at' },\n        ],\n        filter: [],\n        order_by: [\n          {\n            resource: 'satisfaction_ratings',\n            path: 'created_at',\n            order: 'desc',\n          },\n        ],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: '8b7d3a23-dde1-4c3b-84de-ec5436bacdaf',\n    title: 'Tickets by tag',\n    description: 'Number of tickets split by tag.',\n    category: 'Topics',\n    type: 'bar',\n    icon: {\n      type: 'icon',\n      value: 'bar',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'status' },\n          {\n            resource: 'tickets',\n            custom: 'created_tickets',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [{ resource: 'tickets', path: 'tags' }],\n        order_by: [{ resource: 'tickets', path: 'tags', order: 'asc' }],\n        limit: 20,\n      },\n    ],\n  },\n  {\n    id: 'bc15585c-9aaa-4541-84d8-3bf26c802f65',\n    title: 'Top ticket solvers',\n    description: 'Who is solving the most tickets.',\n    category: 'People',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'tickets', path: 'assignee.name' },\n          { resource: 'tickets', custom: 'solved_tickets', aggregate: 'count' },\n        ],\n        filter: [\n          {\n            resource: 'tickets',\n            path: 'metric_set.solved_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n        group_by: [{ resource: 'tickets', path: 'assignee_id' }],\n        order_by: [\n          { resource: 'tickets', custom: 'solved_tickets', order: 'desc' },\n        ],\n      },\n    ],\n  },\n];\n","export default [\n  {\n    id: '2fb0cabe-55d4-4d2c-8c64-5cd2cc7011b1',\n    title: 'Chat volume',\n    description: 'Number of chats started each day.',\n    category: 'Volume',\n    type: 'line',\n    icon: {\n      type: 'icon',\n      value: 'line',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'chats', path: 'timestamp' },\n          { resource: 'chats', custom: 'created_chats', aggregate: 'count' },\n        ],\n        filter: [\n          {\n            resource: 'chats',\n            path: 'timestamp',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        group_by: [{ resource: 'chats', path: 'timestamp', bucket_by: 'day' }],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: '60307a8e-55bc-46e6-9245-6b7fa2623edf',\n    title: 'Missed chats today',\n    description:\n      'Number of chats where the visitor left before receiving an answer.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'chats', custom: 'missed_chats', aggregate: 'count' },\n        ],\n        filter: [\n          {\n            resource: 'chats',\n            path: 'timestamp',\n            operator: 'timespan',\n            operands: [1, 'day'],\n          },\n          {\n            resource: 'chats',\n            path: 'missed',\n            operator: 'in',\n            operands: [true],\n            bound_to_metric: true,\n          },\n        ],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: '2636f6a2-576d-4697-9365-5f199079e2e0',\n    title: 'Satisfaction rating',\n    description: 'Percentage of good satisfaction ratings.',\n    category: 'Customer satisfaction',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [{ resource: 'chats', path: 'sat_score' }],\n        filter: [\n          {\n            resource: 'chats',\n            path: 'timestamp',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: '423a6568-bb46-49ab-8e00-a23a9d418546',\n    title: 'Chats by tag',\n    description: 'The most frequent tags.',\n    category: 'Topics',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          { resource: 'chats', path: 'tags' },\n          { resource: 'chats', custom: 'created_chats', aggregate: 'count' },\n        ],\n        filter: [\n          {\n            resource: 'chats',\n            path: 'timestamp',\n            operator: 'timespan',\n            operands: [7, 'day'],\n          },\n        ],\n        group_by: [{ resource: 'chats', path: 'tags' }],\n        order_by: [\n          { resource: 'chats', custom: 'created_chats', order: 'desc' },\n        ],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: '19fc4425-42a8-439f-b17c-37d26d93b93f',\n    title: 'Current queue',\n    description: 'The number of visitors currently waiting to start a chat.',\n    category: 'Real time (requires Chat Enterprise)',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [{ resource: 'real_time_chats', path: 'queue' }],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: '12f2595e-4d6c-4dcc-9a5e-0ad2b97d47c7',\n    title: 'Average wait time',\n    description: 'The time visitors wait for a chat to start.',\n    category: 'Real time (requires Chat Enterprise)',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '1m20s',\n    },\n    queries: [\n      {\n        select: [{ resource: 'real_time_chats', path: 'waiting_time_avg' }],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n  {\n    id: 'f7e55d0e-991a-44e6-995f-9314cdffafa0',\n    title: 'Currently served',\n    description: 'The number of chats currently in progress.',\n    category: 'Real time (requires Chat Enterprise)',\n    type: 'number',\n    icon: {\n      type: 'icon',\n      value: 'number',\n    },\n    queries: [\n      {\n        select: [{ resource: 'real_time_chats', path: 'active_chats' }],\n        source: { integration: 'zendeskchat' },\n      },\n    ],\n  },\n];\n","export default [\n  {\n    id: 'a169a5ea-8e18-4361-8d37-bc27e4437dea',\n    title: 'Median first response time',\n    description:\n      'The median time that customers are waiting until they receive a response.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '60s',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'conversations',\n            path: 'first_response_time',\n            aggregate: 'median',\n          },\n        ],\n        filter: [\n          {\n            resource: 'conversations',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n          {\n            resource: 'conversations',\n            path: 'inbound',\n            operator: 'in',\n            operands: [true],\n            bound_to_metric: true,\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '3e38a063-3ac5-45dc-8d6a-88da871bd8a8',\n    title: 'Median time to close',\n    description:\n      'The median time that it takes for a conversation to be closed.',\n    category: 'Time',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '60s',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'conversations',\n            path: 'time_to_close',\n            aggregate: 'median',\n          },\n        ],\n        filter: [\n          {\n            resource: 'conversations',\n            path: 'first_action_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '4e4d73dd-af08-4d1a-99ee-2b129e42c6e0',\n    title: 'Top ticket solvers',\n    description: 'Who is solving the most tickets.',\n    category: 'Volume',\n    type: 'leaderboard',\n    icon: {\n      type: 'icon',\n      value: 'leaderboard',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'conversations',\n            path: 'assignee.name',\n          },\n          {\n            resource: 'conversations',\n            custom: 'closed_conversations',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'conversations',\n            path: 'last_closed_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n          {\n            resource: 'conversations',\n            path: 'state',\n            operator: 'in',\n            operands: ['closed'],\n            bound_to_metric: true,\n          },\n        ],\n        group_by: [{ resource: 'conversations', path: 'assignee_id' }],\n        order_by: [\n          {\n            resource: 'conversations',\n            custom: 'closed_conversations',\n            order: 'desc',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '2c87a7fa-e816-4713-bb0b-93b122c334f8',\n    title: 'New conversations',\n    description: 'The number of conversations added within the last 7 days.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '123',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'conversations',\n            custom: 'created_conversations',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'conversations',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n          {\n            resource: 'conversations',\n            path: 'inbound',\n            operator: 'in',\n            operands: [true],\n            bound_to_metric: true,\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '9a92c6de-dfe1-48fb-bb48-5c54f8f144c3',\n    title: 'Unassigned conversations',\n    description:\n      'Number of conversations waiting for an agent to pick them up.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '123',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'conversations',\n            custom: 'created_conversations',\n            aggregate: 'count',\n          },\n        ],\n        filter: [\n          {\n            resource: 'conversations',\n            path: 'created_at',\n            operands: [7, 'day'],\n            operator: 'timespan',\n          },\n          {\n            resource: 'conversations',\n            path: 'assignee_id',\n            operator: 'is_null',\n          },\n          {\n            resource: 'conversations',\n            path: 'inbound',\n            operator: 'in',\n            operands: [true],\n            bound_to_metric: true,\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: '09846f84-fdf8-4f71-ac0b-6a8503d7f13f',\n    title: 'Number of users',\n    description: 'The total number of users on this account.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '123',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'users',\n            custom: 'current_users',\n            aggregate: 'count',\n          },\n        ],\n      },\n    ],\n  },\n  {\n    id: 'cb7065d1-443e-42f6-8558-42fa80de47f5',\n    title: 'Number of companies',\n    description: 'The total number of companies on this account.',\n    category: 'Volume',\n    type: 'number',\n    icon: {\n      type: 'text',\n      value: '123',\n    },\n    queries: [\n      {\n        select: [\n          {\n            resource: 'companies',\n            custom: 'current_companies',\n            aggregate: 'count',\n          },\n        ],\n      },\n    ],\n  },\n];\n","import { find } from 'lodash';\nimport * as metadataIntegrations from './metadata';\nimport * as presetIntegrations from './presets';\nimport { fetchJSONWithCredentials, fetchAllWithCredentials } from '../fetch';\nimport config from '../config';\nimport { mergeQueryResults } from '../lib/queries-universal';\nimport extendableBuiltinGen from '../lib/extendable-builtin-gen';\nimport { mapSubQueryResult } from '../query-helpers';\n\nexport const DEFAULT_DELIVERY = {\n  mode: 'sync',\n};\nexport const DISABLED_CACHE = {\n  enabled: false,\n};\nlet universalService;\n\nclass InquisitorError extends extendableBuiltinGen(Error) {\n  constructor({ message, type, ...other }) {\n    super(message);\n\n    Object.assign(this, other);\n    this.name = 'InquisitorError';\n    this.message = message;\n    this.type = type || 'uncategorized';\n  }\n}\n\nfunction fetchMetadata(integration) {\n  const metadata = metadataIntegrations[integration];\n\n  return Promise.resolve(metadata);\n}\n\nfunction fetchPresets(integration, allPresets = presetIntegrations) {\n  const presets = allPresets[integration] || [];\n  return Promise.resolve(presets);\n}\n\nfunction fetchPreset(integration, uid, allPresets = presetIntegrations) {\n  const presets = allPresets[integration];\n  return Promise.resolve(find(presets, { id: uid }));\n}\n\nfunction runQuery(\n  query,\n  delivery,\n  cache,\n  timezone = '',\n  queryOptions = {},\n  requestHeaders,\n) {\n  const { InquisitorBaseURL } = config.get();\n\n  const URL = `${InquisitorBaseURL}/query`;\n  const headers = {\n    Accept: 'application/json',\n    'Content-Type': 'application/json',\n    ...requestHeaders,\n  };\n\n  const options = {\n    timezone,\n    ...queryOptions,\n  };\n\n  return fetchAllWithCredentials(URL, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify({ query, delivery, cache, options }),\n  })\n    .then(res => res.json())\n    .then(json => {\n      // Inquisitor stream payload and therefore can append an error on an\n      // along a data body. Error takes priority\n      if (json.error) {\n        throw new InquisitorError(json.error);\n      }\n      return json.data || json;\n    });\n}\n\nfunction cancelQuery(queryId, destination, reason) {\n  const { InquisitorBaseURL } = config.get();\n\n  const URL = `${InquisitorBaseURL}/query`;\n  const headers = {\n    Accept: 'application/json',\n    'Content-Type': 'application/json',\n  };\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n    headers,\n    body: JSON.stringify({ query_id: queryId, destination, reason }),\n  });\n}\n\nfunction refresh() {\n  // Passthrough\n  return Promise.resolve(null);\n}\n\nfunction get(\n  {\n    config: { queries, type, queryOptions = {} },\n    dashboard: { timezone },\n    service_account: { id: saId },\n  },\n  requestHeaders,\n) {\n  return Promise.all(\n    queries.map(q => {\n      const query = {\n        ...q,\n        source: { ...q.source, service_account_id: `${saId}` },\n      };\n      return universalService.runQuery(\n        query,\n        DEFAULT_DELIVERY,\n        DISABLED_CACHE,\n        timezone,\n        queryOptions,\n        requestHeaders,\n      );\n    }),\n  ).then(qr => mergeQueryResults(queries, qr, type));\n}\n\nfunction getConfig(\n  { config: cfg, dashboard: { timezone }, service_account: { id: saId } },\n  requestHeaders,\n) {\n  const { queryMetas = [], queryOptions = {} } = cfg;\n\n  // Fetch values for dynamic enums\n  return Promise.all(\n    queryMetas.map(queryMeta => {\n      const { select = [] } = queryMeta;\n      return Promise.all(\n        select.map(selectMeta => {\n          const { query_custom_values: customQuery } = selectMeta;\n          if (customQuery) {\n            const query = {\n              ...customQuery,\n              source: {\n                ...customQuery.source,\n                service_account_id: `${saId}`,\n              },\n            };\n            return universalService\n              .runQuery(\n                query,\n                DEFAULT_DELIVERY,\n                DISABLED_CACHE,\n                timezone,\n                queryOptions,\n                requestHeaders,\n              )\n              .then(result => {\n                return mapSubQueryResult(query, result);\n              })\n              .then(values => {\n                return values.map(value => ({\n                  key: value.value || value.id,\n                  value: value.name,\n                }));\n              });\n          }\n          return null;\n        }),\n      );\n    }),\n  ).then(transformedValues => {\n    return {\n      ...cfg,\n      queryMetas: cfg.queryMetas.map((queryMeta, i) => {\n        const { select = [] } = queryMeta;\n\n        return {\n          ...queryMeta,\n          select: select.map((selectMeta, j) => {\n            const values = transformedValues[i][j] || selectMeta.values;\n            return values\n              ? {\n                  ...selectMeta,\n                  values,\n                }\n              : selectMeta;\n          }),\n        };\n      }),\n    };\n  });\n}\n\nuniversalService = {\n  fetchMetadata,\n  fetchPresets,\n  fetchPreset,\n  runQuery,\n  refresh,\n  get,\n  getConfig,\n  cancelQuery,\n  InquisitorError,\n};\nexport default universalService;\n","module.exports = (__webpack_require__(28))(1115);","import React, { Children } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport styles from './button-group.scss';\n\nconst THEMES = {\n  DEFAULT: 'default',\n  DARK: 'dark',\n  GRAY: 'gray',\n  LIGHT: 'light',\n};\n\nconst ButtonGroup = ({ children, spaced, stretched, theme }) => {\n  return (\n    <div\n      className={classnames(styles.ButtonGroup, styles[theme], {\n        [styles.spaced]: spaced,\n        [styles.notSpaced]: !spaced,\n        [styles.stretched]: stretched,\n      })}\n    >\n      {Children.toArray(children)\n        .filter(child => child !== null)\n        .map((child, i, all) => (\n          <span\n            key={i}\n            className={classnames(styles.item, {\n              [styles.first]: i === 0,\n              [styles.last]: i + 1 === all.length,\n              [styles.checked]: child.props.checked,\n            })}\n          >\n            {child}\n          </span>\n        ))}\n    </div>\n  );\n};\n\nButtonGroup.THEMES = THEMES;\n\nButtonGroup.defaultProps = {\n  theme: THEMES.DEFAULT,\n};\n\nButtonGroup.propTypes = {\n  children: PropTypes.node,\n  spaced: PropTypes.bool,\n  stretched: PropTypes.bool,\n  theme: PropTypes.oneOf([\n    THEMES.DEFAULT,\n    THEMES.DARK,\n    THEMES.GRAY,\n    THEMES.LIGHT,\n  ]),\n};\n\nexport default ButtonGroup;\n","import ButtonGroup from './button-group';\nexport default ButtonGroup;\n","import { getWindow } from '../lib/global';\nimport { GRAPHQL_DASHBOARDS_WITH_LAYOUT_KEY } from './dashboard-constants';\nimport { find, chain } from 'lodash';\nimport gql from 'graphql-tag';\nimport apolloClient from '../services/concierge-service/apollo-client';\n\n// Maps graphql dashboards to a unified format, and stores them in the\n// session storage, so that we can access them on the config pages.\nexport const saveDashboardsToStorage = graphQLDashboards => {\n  const mappedDashboards = graphQLDashboards.map(\n    ({ id, legacyId, layoutType }) => ({\n      id,\n      legacyId,\n      layoutType,\n    }),\n  );\n\n  getWindow().sessionStorage.setItem(\n    GRAPHQL_DASHBOARDS_WITH_LAYOUT_KEY,\n    JSON.stringify(mappedDashboards),\n  );\n};\n\n// Accepts a legacy dashboard id and finds the graphql dashboard\n// in the session storage.\nexport const getDashboardFromStorage = legacyDashboardId => {\n  const dashboardsFromStore = getWindow().sessionStorage.getItem(\n    GRAPHQL_DASHBOARDS_WITH_LAYOUT_KEY,\n  );\n  const dashboardList = JSON.parse(dashboardsFromStore) || {};\n\n  const dashboard =\n    find(dashboardList, {\n      legacyId: legacyDashboardId,\n    }) || {};\n\n  return dashboard;\n};\n\nexport const isContainerLayout = graphqlDashboard => {\n  const { layoutType = {} } = graphqlDashboard;\n  return layoutType.__typename === 'ContainerLayout';\n};\n\nconst INSTRUMENT_QUERY = gql`\n  query Dashboard($id: ID!) {\n    dashboard(id: $id) {\n      containers {\n        frames {\n          instrument {\n            id\n            doNotUseLegacyWidgetKey\n          }\n        }\n      }\n    }\n  }\n`;\n\n// Accepts a grapqhlDashboardId and the legacy widget key and returns the\n// corresponding instrument id\nexport const getInstrumentIdFromWidgetKey = async (\n  graphQLDashboardId,\n  widgetKey,\n) => {\n  const client = apolloClient.create();\n  const response = await client.query({\n    query: INSTRUMENT_QUERY,\n    variables: { id: graphQLDashboardId },\n  });\n\n  const { containers } = response.data.dashboard;\n  // Flatten all the instruments so that we have an array of instruments\n  const instruments = chain(containers)\n    .map(container => container.frames.map(frame => frame.instrument))\n    .flattenDeep()\n    .value();\n\n  const instrument = find(instruments, { doNotUseLegacyWidgetKey: widgetKey });\n  return instrument && instrument.id;\n};\n","export const LAYOUT_TYPES = {\n  ClassicLayout: 'ClassicLayout',\n  FixedLayout: 'FixedLayout',\n  ContainerLayout: 'ContainerLayout',\n};\n\nexport const GRAPHQL_LAYOUT_TYPES_TRACKING = {\n  ContainerLayout: 'container',\n  FixedLayout: 'wonderwall',\n};\n","import {\n  getDetailsNode,\n  getNodeFromSubquery,\n  buildBaseSubquery,\n  getChildrenFromEntry,\n} from '../../graph';\nimport {\n  chain,\n  clone,\n  compact,\n  every,\n  find,\n  filter as lodashFilter,\n  first,\n  flatten,\n  isEmpty,\n  isNil,\n  isNull,\n  isUndefined,\n  map,\n  last,\n  omit,\n  omitBy,\n  reduce,\n  times,\n  xor,\n  includes,\n  some,\n} from 'lodash';\nimport { getMetricsOrder } from '../../../universal/lib/queries-universal';\nimport { isDetailsMetricSelected } from '../../universal-config-helpers';\nimport { TIMESPAN_OPERATORS } from '../../ui-field-options';\n\nconst getExtra = subquery =>\n  omit(subquery, 'path', 'resource', 'custom', 'multi_index');\n\nexport const DEFAULT_TIMESPAN_OPERANDS = [7, 'day'];\n\nexport const getBucket = operands => {\n  switch (operands.toString()) {\n    case '1,hour':\n      return 'minute';\n    case '1,day':\n      return 'hour';\n    case '1,week':\n    case '1,month':\n      return 'day';\n    case '1,year':\n      return 'month';\n    default:\n      return operands[1];\n  }\n};\n\nexport const getQueryMetas = (state, subQueryResults) => {\n  const { metrics = [], groupBy, splitBy } = state;\n\n  let metricMeta;\n  if (isDetailsMetricSelected(state)) {\n    const { detailsColumns = [] } = state;\n    metricMeta = detailsColumns.map(columnNode =>\n      omitBy(\n        {\n          type: columnNode.node.type,\n          unit: columnNode.node.unit,\n          name: columnNode.node.name,\n          values: columnNode.node.getValues(subQueryResults),\n          iconSuffix: columnNode.node.iconSuffix,\n          primary_resource: columnNode.node.primary_resource,\n          key: columnNode.node.key,\n        },\n        isNil,\n      ),\n    );\n  } else {\n    metricMeta = metrics.map(metric => ({\n      type: metric.node.type,\n      unit: metric.node.unit,\n      name: metric.node.name,\n      aggregate: metric.extra && metric.extra.aggregate,\n      hasReverseComparison: !!metric.node.reverse_comparison,\n    }));\n  }\n  const groupByMeta =\n    groupBy &&\n    groupBy.length &&\n    groupBy[0].node &&\n    omitBy(\n      {\n        type: groupBy[0].node.type,\n        name: groupBy[0].node.name,\n        values:\n          groupBy[0].node.type === 'enum'\n            ? groupBy[0].node.getValues(subQueryResults)\n            : undefined,\n        query_custom_values:\n          groupBy[0].node.type === 'enum'\n            ? groupBy[0].node.query_custom_values\n            : undefined,\n      },\n      isUndefined,\n    );\n  const splitByMeta =\n    splitBy &&\n    splitBy.length &&\n    omitBy(\n      {\n        type: splitBy[0].node.type,\n        values:\n          splitBy[0].node.type === 'enum'\n            ? splitBy[0].node.getValues(subQueryResults)\n            : undefined,\n        query_custom_values:\n          splitBy[0].node.type === 'enum'\n            ? splitBy[0].node.query_custom_values\n            : undefined,\n      },\n      isUndefined,\n    );\n\n  // TODO: multi - Store meta for all queries if required\n  return [{ select: compact([groupByMeta, splitByMeta, ...metricMeta]) }];\n};\n\nexport const resolveNodesCrossResource = (\n  state,\n  mainGraph,\n  entryResource,\n  keepExisting = true,\n) => {\n  const nodes = getChildrenFromEntry(mainGraph, entryResource);\n  const uiQuery = { ...state };\n  [\n    'groupBy',\n    'orderBy',\n    'timespans',\n    'filters',\n    'splitBy',\n    'globalFilters',\n    'vipFilters',\n    'prerequisites',\n  ].forEach(key => {\n    const value = uiQuery[key];\n    if (!value) {\n      return;\n    }\n    const newValue = value.map(uiSubQuery => {\n      if (!uiSubQuery || !uiSubQuery.node) {\n        return uiSubQuery;\n      }\n      let node = nodes.find(field => field.isEqualTo(uiSubQuery.node));\n\n      if (!node) {\n        if (keepExisting) {\n          node = uiSubQuery.node;\n        } else {\n          return null;\n        }\n      }\n\n      return {\n        ...uiSubQuery,\n        node,\n      };\n    });\n\n    if (keepExisting) {\n      uiQuery[key] = newValue;\n    } else {\n      uiQuery[key] = compact(newValue);\n    }\n  });\n\n  return uiQuery;\n};\n\nexport const groupIndices = data => {\n  const {\n    indices,\n    state: { timespans, boundToMetricFilters = [] },\n  } = data;\n\n  // An \"index\" in this context represents a query that will be generated\n  // Sometimes, if these queries share bound filters and timespans, they can\n  // just be grouped into a single query\n\n  // When we build up our index groupings, we create a \"key\" that's an array\n  // of all the relevant timespan nodes and filter nodes. For each index, we\n  // check if another index already exists with that collection of nodes.\n  const hasKey = (key, keyToCompare) => {\n    return isEmpty(xor(key, keyToCompare));\n  };\n\n  const tmp = [];\n  indices.forEach(i => {\n    const timespan = timespans[i].node;\n    const filters = map(boundToMetricFilters[i], f => f.node);\n    const key = [timespan, ...filters];\n\n    // If we don't already have an index with this collection of nodes, create it\n    if (!find(tmp, item => hasKey(item.key, key))) {\n      tmp.push({\n        key,\n        indices: [],\n      });\n    }\n\n    // Push the index into the relevant grouping\n    const group = find(tmp, item => hasKey(item.key, key));\n    group.indices.push(i);\n  });\n\n  // Push the grouped indices into an array to return\n  // eg. [[0, 1], [2], [3, 4]]\n  return map(tmp, v => v.indices);\n};\n\nexport const getFilterQueryFromUiQuery = (mainGraph, mainEntry, filters) => {\n  return chain(filters)\n    .filter(filter =>\n      // this will check that both node and extra are present and not empty\n      every(['node', 'extra'], key => !isEmpty(filter[key])),\n    )\n    .map(filter => ({\n      ...buildBaseSubquery(mainGraph, mainEntry, filter.node, true),\n      ...filter.extra,\n    }))\n    .value();\n};\n\nconst buildQueryForDetailsTable = (state, graph, entry) => {\n  const {\n    filters = [],\n    vipFilters: vipFilters = [],\n    globalFilters = [],\n    detailsColumns,\n    limit,\n    orderBy,\n  } = state;\n\n  if (\n    !isDetailsMetricSelected(state) ||\n    !detailsColumns ||\n    !detailsColumns.length\n  ) {\n    return [];\n  }\n\n  const mainIndex = 0;\n  const orderByQ = orderBy &&\n    orderBy[mainIndex] && {\n      ...buildBaseSubquery(graph, entry, orderBy[mainIndex].node),\n      ...orderBy[mainIndex].extra,\n    };\n  const select = detailsColumns.map(c => ({\n    ...buildBaseSubquery(graph, entry, c.node),\n  }));\n\n  const filterQ = getFilterQueryFromUiQuery(graph, entry, [\n    ...filters,\n    ...vipFilters,\n    ...globalFilters,\n  ]);\n\n  return [\n    omitBy(\n      {\n        select,\n        order_by: [orderByQ],\n        filter: filterQ,\n        limit,\n      },\n      isUndefined,\n    ),\n  ];\n};\n\nconst LARGER_UNIT = {\n  day: 'week',\n  week: 'month',\n  month: 'year',\n  quarter: 'year',\n  year: null,\n};\n\nconst addTimespanComparison = (\n  state,\n  entries,\n  mainEntry,\n  timespanComparison,\n) => {\n  const _state = { ...state }; // Let's try to avoid mutating the original just so it's not confusing\n  let _entries = [...entries];\n\n  const applyComparison = !isUndefined(timespanComparison);\n\n  const { metrics, timespans, groupBy, orderBy } = state;\n\n  // We add the comparison query here to avoid syncing all part of our ui state\n  // on all actions..\n  if (applyComparison) {\n    // Duplicate the main entry, as we're comparing to a previous timescale for\n    // the same metric\n    _entries = [mainEntry, mainEntry];\n    const { operator: timespanOperator } = timespanComparison;\n    let timespanOperands = [...timespans[0].extra.operands];\n\n    // if we have a \"same time last xxx\" comparison we need to\n    // use a unit that's a step larger for the comparison query.\n    // However, because of \"quarter\", we need to map a list of unit against\n    // larger ones (LARGER_UNITS)\n    if (timespanOperator === TIMESPAN_OPERATORS.PREV_SAME_TIMESPAN) {\n      const quantity = timespanOperands.shift();\n      const unit = timespanOperands.pop();\n      timespanOperands = [quantity, LARGER_UNIT[unit]];\n    }\n\n    // Comparisons only have a single metric, so we duplicate it for the comparison\n    _state.metrics = [metrics[0], metrics[0]];\n    // Duplicate the first timespan, using the comparison timespan operator for\n    // the second timespan node\n    _state.timespans = [\n      timespans[0],\n      {\n        node: timespans[0].node,\n        extra: {\n          ...timespans[0].extra,\n          operands: timespanOperands,\n          operator: timespanOperator,\n        },\n      },\n    ];\n\n    // Duplicate the groupBy as well, using the timeshift from the timespan operator\n    _state.groupBy = groupBy && [\n      groupBy[0],\n      {\n        ...groupBy[0],\n        extra: { ...groupBy[0].extra, timeshift: timespanOperands },\n      },\n    ];\n\n    // Duplicate the orderBy\n    _state.orderBy = orderBy && [orderBy[0], orderBy[0]];\n  }\n\n  return { state: _state, entries: _entries };\n};\n\nconst groupEntries = (state, graph, entries, mainEntry, applyComparison) => {\n  const { splitBy } = state;\n\n  const store = new Map();\n  entries.forEach((e, i) => {\n    // If the entry isn't already in the store, we set an object against the entry\n    if (!store.has(e)) {\n      // If it's the main entry, use the normal state, otherwise we resolve any nodes\n      // we need to to make sure we have all the relevant nodes available in state\n      const newState =\n        mainEntry === e ? state : resolveNodesCrossResource(state, graph, e);\n\n      // Pull all of the filters out of the new state\n      const {\n        filters = [],\n        vipFilters: vipFilters = [],\n        globalFilters = [],\n        prerequisites = [],\n      } = newState;\n\n      const prerequisiteKeys = map(\n        prerequisites,\n        prerequisite => prerequisite.node.key,\n      );\n\n      // Remove any matching filters from saFilters and globalFilters if they appear in prerequisites\n      // The reason for this is that prerequisites is replacing all of the functionality provided by saFilters,\n      // and some of the functionality provided by global filters. For now, we want to do this, to make sure\n      // we can temporarily run both in parallel without breaking anything\n      const stripPrerequisitesFromFilters = filtersToStrip =>\n        lodashFilter(\n          filtersToStrip,\n          filter => !includes(prerequisiteKeys, filter.node.key),\n        );\n\n      // Nodes are sometimes marked as `is_sa_filter`, `is_global` or `is_combined` in queries, but for prerequisites,\n      // we want to strip this out as we won't need it here in the future\n      const stripObsoleteProperties = prerequisitesToStrip => {\n        return map(prerequisitesToStrip, prerequisite => {\n          return {\n            ...prerequisite,\n            extra: {\n              ...omit(prerequisite.extra, [\n                'is_global',\n                'is_sa_filter',\n                'is_combined',\n              ]),\n            },\n          };\n        });\n      };\n\n      // And build the filter query\n      const filterQ = getFilterQueryFromUiQuery(graph, e, [\n        ...filters,\n        ...vipFilters,\n        ...stripPrerequisitesFromFilters(globalFilters),\n        ...stripObsoleteProperties(prerequisites),\n      ]);\n\n      // Build a collection of entries, with associated state (for cross resource nodes),\n      // filter queries, and split by / split by select\n      store.set(e, {\n        state: newState,\n        indices: [],\n        boundFilterQs: [],\n        query: {\n          filterQ: filterQ.length ? filterQ : undefined,\n          splitByQ: splitBy &&\n            newState.splitBy.length && {\n              ...buildBaseSubquery(graph, e, newState.splitBy[0].node, true),\n            },\n          splitBySelectQ: splitBy &&\n            newState.splitBy.length && {\n              ...buildBaseSubquery(graph, e, newState.splitBy[0].node),\n            },\n        },\n      });\n    }\n\n    // We need to keep track of the bound filters that we'll need to apply for each query\n    const value = store.get(e);\n    const { boundToMetricFilters = [] } = value.state;\n\n    const boundFilterQs = map(boundToMetricFilters[i], filter => {\n      return getFilterQueryFromUiQuery(graph, e, [filter]);\n    });\n\n    value.boundFilterQs.push(boundFilterQs);\n\n    // We also keep track of if there are more entries that share the same resource\n    // via the indices\n    value.indices.push(i);\n  });\n\n  // Group queries sharing same timespan for each entries\n  store.forEach(value => {\n    // When applying comparison we split in two queries even if they've got the\n    // same timespan node. Otherwise, we group indices if we can.\n    value.indices = applyComparison ? [[0], [1]] : groupIndices(value);\n  });\n\n  return store;\n};\n\nconst constructQueries = (store, graph, mainEntry) => {\n  // Build the queries from the store\n  const hasMultiQueries =\n    store.size > 1 || store.get(mainEntry).indices.length > 1;\n  const queries = [];\n\n  store.forEach((value, entry) => {\n    value.indices.forEach(qIndices => {\n      // Select first index as a main. We can rely on all the others metrics to\n      // share same groupBy, sortBy, and timespan for now.\n      const [mainIndex] = qIndices;\n      const { metrics, timespans, groupBy, orderBy, limit } = value.state;\n      const { filterQ, splitByQ, splitBySelectQ } = value.query;\n\n      // Map all metrics\n      const currentMetricsQ = qIndices.map(i => {\n        const select = {\n          ...buildBaseSubquery(graph, entry, metrics[i].node),\n          ...metrics[i].extra,\n        };\n\n        // Keep index of each metric in case of multiqueries to restore correct\n        // order when editing widget\n        if (hasMultiQueries) {\n          select.multi_index = i;\n        }\n\n        return select;\n      });\n\n      const groupByQ = groupBy && {\n        ...buildBaseSubquery(graph, entry, groupBy[mainIndex].node, true),\n        ...groupBy[mainIndex].extra,\n      };\n      const xaxisQ = groupBy && {\n        ...buildBaseSubquery(graph, entry, groupBy[mainIndex].node),\n      };\n      const timespanQ = timespans &&\n        timespans[mainIndex].node && {\n          ...buildBaseSubquery(graph, entry, timespans[mainIndex].node),\n          ...timespans[mainIndex].extra,\n        };\n\n      const orderByQ = orderBy &&\n        orderBy[mainIndex] && {\n          ...buildBaseSubquery(graph, entry, orderBy[mainIndex].node),\n          ...orderBy[mainIndex].extra,\n        };\n      const select = groupByQ\n        ? compact([xaxisQ, splitBySelectQ, ...currentMetricsQ])\n        : currentMetricsQ;\n      let filter = filterQ;\n      if (timespanQ) {\n        filter = filterQ ? [timespanQ, ...filterQ] : [timespanQ];\n      }\n\n      if (!isEmpty(value.boundFilterQs[mainIndex])) {\n        // Apply `bound_to_metric` filters as appropriate to query\n        filter = filter || [];\n\n        filter = flatten([...filter, ...value.boundFilterQs[mainIndex]]);\n      }\n\n      queries.push(\n        omitBy(\n          {\n            select,\n            filter,\n            group_by: groupByQ && compact([groupByQ, splitByQ]),\n            order_by: orderByQ && [orderByQ],\n            limit,\n          },\n          isUndefined,\n        ),\n      );\n    });\n  });\n\n  return queries;\n};\n\n// _state : the current UI Query state\n// graph : the main graph\n// _entries : all of the relevant root nodes for the selected metrics etc.\n// timespanComparison : an object { operator, type }, defining a\n//                      possible comparison with a previous timespan\nexport const getQueriesFromUiQuery = (\n  _state,\n  graph,\n  _entries,\n  timespanComparison,\n) => {\n  let entries = _entries;\n  let state = { ..._state };\n  const applyComparison = !isUndefined(timespanComparison);\n\n  // The \"entry\" is which node we are choosing as our \"entry\" point into the graph, ie.\n  // the root node. When we resolve nodes across resource (via joins), we need to choose a\n  // starting point (eg. we start at \"user\", and join it with \"organization\" to also get\n  // fields from that resource, so we go user.organization.name). Here, we just pick the\n  // first resource in the list of resources as our \"main entry point\".\n  const mainEntry = entries[0];\n\n  // \"Details metric\" functionality is specific to the table widget, so we can just handle\n  // that separately here\n  if (isDetailsMetricSelected(state)) {\n    return buildQueryForDetailsTable(state, graph, mainEntry);\n  }\n\n  // Handle any comparison with a previous time period, if it needs to be handled\n  ({ state, entries } = addTimespanComparison(\n    state,\n    entries,\n    mainEntry,\n    timespanComparison,\n  ));\n\n  // Work out how many queries we need to create, by grouping entries by timespan\n  // We create a store here with all the state / information needed for each entry to\n  // build the queries\n  const store = groupEntries(state, graph, entries, mainEntry, applyComparison);\n\n  // Build the queries, using the store as the basis\n  return constructQueries(store, graph, mainEntry);\n};\n\n// When we edit a widget, we want to pull the values for the prerequisites out of the queries\n// used to create the widget, and set them into state.\nexport const getPrerequisitesFromQueries = (\n  graph,\n  queries,\n  serviceAccountFilters,\n) => {\n  // Extract global filters from first query (sample)\n  const { filter = [] } = queries[0];\n  const prerequisitesSubQ = [];\n\n  if (isEmpty(filter)) {\n    return null;\n  }\n\n  serviceAccountFilters.forEach(sa => {\n    prerequisitesSubQ.push(\n      find(filter, f => sa.resource === f.resource && sa.path === f.path),\n    );\n  });\n\n  return prerequisitesSubQ.map(filterSubQ => ({\n    node: getNodeFromSubquery(graph, filterSubQ, true),\n    extra: getExtra(filterSubQ),\n  }));\n};\n\nexport const getFilterNodesFromQueries = (graph, queries) => {\n  // Extract global filters from first query (sample)\n  const { filter = [] } = queries[0];\n  const globalFiltersSubQ = [];\n\n  filter.forEach(f => {\n    if (f.is_global) {\n      globalFiltersSubQ.push(f);\n    }\n  });\n\n  // Extract bound to metric filters from queries (as they are per query)\n  const filterSets = map(queries, q => q.filter || []);\n  const boundToMetricFiltersSubQ = [];\n\n  filterSets.forEach(filters => {\n    const filtersSubQ = [];\n\n    filters.forEach(f => {\n      if (f.bound_to_metric) {\n        filtersSubQ.push(f);\n      }\n    });\n\n    boundToMetricFiltersSubQ.push(filtersSubQ);\n  });\n\n  return {\n    globalFilters: globalFiltersSubQ.map(filterSubQ => ({\n      node: getNodeFromSubquery(graph, filterSubQ, true),\n      extra: getExtra(filterSubQ),\n    })),\n\n    boundToMetricFilters: boundToMetricFiltersSubQ.map(filterSetSubQ =>\n      map(filterSetSubQ, filterSubQ => ({\n        node: getNodeFromSubquery(graph, filterSubQ, true),\n        extra: getExtra(filterSubQ),\n      })),\n    ),\n  };\n};\n\nexport const getNodesFromQueries = (\n  graph,\n  _queries,\n  uiOptions,\n  applyComparison,\n  detailsMetricResource,\n  prerequisites,\n) => {\n  let sharedState;\n  let queries;\n\n  // When using comparison style, we don't want to populate our state with\n  // a second query. buildQueriesFromUi will take care of that when saving\n  if (applyComparison) {\n    queries = [_queries[0]];\n  } else {\n    queries = _queries;\n  }\n\n  const isPrerequisite = filter => {\n    return some(\n      prerequisites,\n      prerequisite =>\n        prerequisite.node.primary_resource === filter.resource &&\n        prerequisite.node.key === filter.path,\n    );\n  };\n\n  const queriesState = reduce(\n    queries,\n    (multiQueryState, query, index) => {\n      const {\n        select = [],\n        filter: _filter = [],\n        group_by: [groupBySubQ, splitBySubQ] = [],\n        order_by: [orderBySubQ] = [],\n        limit,\n      } = query;\n\n      const vipFiltersSubQ = [];\n      const filter = [];\n\n      _filter.forEach(f => {\n        if (f.is_vip) {\n          vipFiltersSubQ.push(f);\n          // Exclude sa, global, prerequisites and bound_to_metric filters as they are parsed in\n          // getFilterNodesFromQueries\n        } else if (!f.is_global && !f.bound_to_metric && !isPrerequisite(f)) {\n          filter.push(f);\n        }\n      });\n\n      let metrics = [];\n      let detailsColumns = [];\n\n      if (detailsMetricResource) {\n        // On details table, map select queries to columns\n        metrics = [{ node: getDetailsNode(graph, detailsMetricResource) }];\n        detailsColumns = select.map(selectSubQ => ({\n          node: getNodeFromSubquery(graph, selectSubQ),\n        }));\n      } else {\n        // Map select queries to metrics\n        let metricsSubQ = [first(select)];\n        if (select.length > 1) {\n          [, ...metricsSubQ] = select;\n        }\n        if (splitBySubQ) {\n          metricsSubQ = [last(select)];\n        }\n\n        metrics = metricsSubQ.map(metricSubQ => ({\n          node: getNodeFromSubquery(graph, metricSubQ),\n          extra: getExtra(metricSubQ),\n        }));\n      }\n\n      const nbOfMetrics = metrics.length;\n\n      let timespanSubQ;\n      let filtersSubQ;\n      let timespans;\n      // time_fields rules set to null means no timespan for that query.\n      const [{ node: mainMetricNode } = {}] = metrics;\n      if (\n        mainMetricNode.rules &&\n        mainMetricNode.rules.time_fields &&\n        isNull(mainMetricNode.rules.time_fields[0])\n      ) {\n        [...filtersSubQ] = filter;\n        timespans = [\n          {\n            extra: {\n              operator: 'timespan',\n              operands: DEFAULT_TIMESPAN_OPERANDS,\n            },\n          },\n        ];\n      } else {\n        [timespanSubQ, ...filtersSubQ] = filter;\n        // We compute the baseTimespans once\n        const baseTimespans = {\n          node: getNodeFromSubquery(graph, timespanSubQ),\n          extra: getExtra(timespanSubQ),\n        };\n        // We fill timespans with the number of metrics available but make sure to\n        // clone the object. We cannot use Array.fill here.\n        timespans = times(nbOfMetrics, () => clone(baseTimespans));\n      }\n\n      const filters = filtersSubQ.map(filterSubQ => ({\n        node: getNodeFromSubquery(graph, filterSubQ, true),\n        extra: getExtra(filterSubQ),\n      }));\n\n      const vipFilters = vipFiltersSubQ.map(filterSubQ => ({\n        node: getNodeFromSubquery(graph, filterSubQ, true),\n        extra: getExtra(filterSubQ),\n      }));\n\n      let groupBy = [];\n      if (groupBySubQ) {\n        const groupByBase = {\n          node: getNodeFromSubquery(graph, groupBySubQ, true),\n          extra: getExtra(groupBySubQ),\n        };\n        groupBy = times(nbOfMetrics, () => clone(groupByBase));\n      }\n      let orderBy = [];\n      if (orderBySubQ) {\n        const orderByBase = {\n          node: getNodeFromSubquery(graph, orderBySubQ),\n          extra: getExtra(orderBySubQ),\n        };\n        orderBy = times(nbOfMetrics, () => clone(orderByBase));\n      }\n\n      const splitBy = splitBySubQ && [\n        {\n          node: getNodeFromSubquery(graph, splitBySubQ, true),\n        },\n      ];\n\n      if (index === 0) {\n        sharedState = {\n          filters,\n          vipFilters,\n          limit,\n          splitBy,\n          bucket: getBucket(timespans[0].extra.operands),\n        };\n      }\n\n      return {\n        metrics: [...multiQueryState.metrics, ...metrics],\n        timespans: [...multiQueryState.timespans, ...timespans],\n        groupBy: [...multiQueryState.groupBy, ...groupBy],\n        orderBy: [...multiQueryState.orderBy, ...orderBy],\n        detailsColumns,\n      };\n    },\n    {\n      metrics: [],\n      timespans: [],\n      groupBy: [],\n      orderBy: [],\n    },\n  );\n\n  // Keep retro-compatible with old queries generated from forced entryResource\n  // We need to find the actual matching metric from the primary_resource\n  const allMetrics = flatten(uiOptions.metrics.map(g => g.options));\n  queriesState.metrics = queriesState.metrics.map(m => {\n    let node = find(allMetrics, n => m.node === n || n.isEqualTo(m.node));\n    // TODO Remove this nasty hardcoded fallback for retro compatiblity on some\n    // widgets created during first weeks of our alpha integration. ..\n    // the change of graph introduced here:\n    // https://github.com/geckoboard/polecat/pull/2643\n    // We need to refactor the entry logic in our main reducer to be more retro\n    // compatible instead of hitting that code to fallback..\n    if (!node) {\n      node = find(graph, { root: 'tickets' });\n    }\n    return { ...m, node };\n  });\n\n  if (queries.length > 1) {\n    // restore metrics' order for metrics, timespans, groupBy and orderBy\n    const metricsOrder = chain(getMetricsOrder(queries))\n      .flatten()\n      .uniq()\n      .value();\n\n    // We need to use a tmp array here to sort based on indices collected with\n    // all metrics\n    ['metrics', 'timespans', 'groupBy', 'orderBy'].forEach(key => {\n      const queryState = queriesState[key];\n      if (queryState.length > 0) {\n        const sorted = new Array(queryState);\n        queryState.forEach((val, i) => {\n          sorted[metricsOrder[i + 1] - 1] = val;\n        });\n        queriesState[key] = sorted;\n      }\n    });\n  }\n\n  return {\n    ...sharedState,\n    ...omitBy(queriesState, q => q.length === 0),\n  };\n};\n\nexport const getGlobalFilters = filters =>\n  lodashFilter(filters, f => f.is_global);\n\nexport const resetGlobalFilters = (queries, filterTypes = []) => {\n  return queries.map(q => {\n    if (!q.filter) return q;\n    const { filter } = q;\n    const updatedFilter = filter.map(f => {\n      if (filterTypes.includes('globalFilters') && f.is_global) {\n        return omit(f, ['operator', 'operands']);\n      }\n      return f;\n    });\n\n    return { ...q, filter: updatedFilter };\n  });\n};\n","module.exports = (__webpack_require__(28))(1122);","export default {\n  NEW_SIGNUP: 'new_signup',\n  SIGNUP_TRACKED: 'signup_tracked',\n  CREATED_FIRST_DASHBOARD: 'created_first_dashboard',\n  WELCOME_MODAL: 'welcome_modal',\n};\n","import Cookie from 'js-cookie';\nimport { getWindow } from '../../lib/global';\n\n// Duplicate of gecko-js function\n// https://github.com/geckoboard/gecko-js/blob/master/src/base/tracking_id.js#L3-L10\nconst getRandomTrackingId = () => {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n};\n\n// Duplicate of gecko-js function\n// https://github.com/geckoboard/gecko-js/blob/master/src/base/tracker.js#L20-L23\nexport const isTrackingEnabled = () => {\n  // on dev or while impersonating, we are disabling external trackers\n  return !!getWindow().TRACKING_ENABLED;\n};\n\nexport const getDistinctId = () => {\n  // TODO: When doing edit mode the distinct id comes from the\n  // user's tracking_id, see tracking_id.js in gecko-js.\n  let cookieName = 'gb_mixpanel';\n  const env = getWindow().GB_ENV;\n  if (env && env !== 'production') {\n    cookieName = `gb_mixpanel_${env}`;\n  }\n\n  const idFromCookie = Cookie.get(cookieName);\n  if (idFromCookie) {\n    return idFromCookie;\n  }\n\n  const newId = getRandomTrackingId();\n  Cookie.set(cookieName, newId);\n  return newId;\n};\n","/**\n * SessionTracker was created when moving away from gecko-js.\n * It's re-implementing the functionality from session-tracker.js\n * in gecko-js.\n *\n * When we introduced Snowplow we kept our legacy\n * mixpanel tracking around because there is still a lot of\n * work to be done around organising the Snowplow data to make\n * useful to everyone.\n */\nimport Cookies from 'js-cookie';\nimport { getNavigator, getWindow } from '../../lib/global';\nimport { fetchJSONWithoutCSRF } from '../../universal/fetch';\nimport { getDistinctId, isTrackingEnabled } from './tracker-helpers';\n\nclass SessionTracker {\n  constructor(sessionType, trackingProperties = {}) {\n    this.sessionType = sessionType;\n    this.trackingProperties = trackingProperties;\n    this.sessionId = Cookies.get(\n      `${SessionTracker.COOKIE_PREFIX}${this.sessionType}`,\n    );\n  }\n\n  getCookieName() {\n    return `${SessionTracker.COOKIE_PREFIX}${this.sessionType}`;\n  }\n\n  start() {\n    if (!isTrackingEnabled()) {\n      return;\n    }\n\n    this.startSnowplowTracking();\n    this.startLegacyTracking();\n  }\n\n  startSnowplowTracking() {\n    const snowplowFn = getWindow().snowplow;\n    if (snowplowFn) {\n      snowplowFn(\n        'enableActivityTracking',\n        SessionTracker.SNOWPLOW_INTERVAL,\n        SessionTracker.SNOWPLOW_INTERVAL,\n      );\n      snowplowFn('trackPageView');\n\n      // Start manual timer to trigger activity no matter what. Useful if we are\n      // on a TV dashboard\n      setInterval(() => {\n        snowplowFn('updatePageActivity');\n      }, SessionTracker.SNOWPLOW_INTERVAL * 1e3);\n    }\n  }\n\n  startLegacyTracking(forceStart) {\n    if (this.sessionId && !forceStart) {\n      this.updateSession();\n      return;\n    }\n\n    const cookieName = this.getCookieName();\n\n    fetchJSONWithoutCSRF(`${getWindow().TRACKING_HOST}/session`, {\n      method: 'POST',\n      body: JSON.stringify({\n        ...this.trackingProperties,\n        cookie_enabled: getNavigator().cookieEnabled,\n        distinct_id: getDistinctId(),\n        session_type: this.sessionType,\n      }),\n    }).then(({ session_id: sessionId }) => {\n      this.sessionId = sessionId;\n      Cookies.set(cookieName, sessionId);\n      this.startUpdateTimer();\n    });\n  }\n\n  updateSession() {\n    fetchJSONWithoutCSRF(\n      `${getWindow().TRACKING_HOST}/sessions/${this.sessionId}`,\n    )\n      .then(() => {\n        this.startUpdateTimer();\n      })\n      .catch(({ status }) => {\n        if (status === 404) {\n          this.startLegacyTracking(true);\n        } else {\n          this.startUpdateTimer();\n        }\n      });\n  }\n\n  startUpdateTimer() {\n    setTimeout(() => {\n      this.updateSession();\n    }, SessionTracker.LEGACY_INTERVAL);\n  }\n}\n\nSessionTracker.LEGACY_INTERVAL = 15 * 1e3;\nSessionTracker.SNOWPLOW_INTERVAL = 10 * 60;\nSessionTracker.COOKIE_PREFIX = 'gb_tracking_graphq_';\n\nexport default SessionTracker;\n","import SessionTracker from './session-tracker';\nexport default SessionTracker;\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport * as managementService from '../../services/management-service';\nimport * as permissionService from '../../services/permission-service';\nimport * as toastActions from '../../toast/actions';\nimport * as tvPageActions from '../../tv-page/actions/tv-page-actions';\nimport { fetchJSONWithCredentials } from '../../universal/fetch';\nimport { hasCheckpoint } from '../../lib/user';\nimport { getUserDashboards } from '../../services/dashboard-service';\nimport { GRAPHQL_LAYOUT_TYPES_TRACKING } from '../../dashboard/dashboard-layout/constants';\nimport config from '../../universal/config';\nimport checkpoints from '../../checkpoints';\nimport AuthStrategy from '../../lib/auth-strategy';\nimport SessionTracker from '../../tracking/session-tracker';\nimport SegmentTracker from '../../tracking/segment-tracker';\n\nexport const setUserGroups = createAction('User:SET_USER_GROUPS');\nexport const setUserOrganization = createAction('User:SET_USER_ORGANIZATION');\n\nexport const getCurrentUserSuccess = createAction(\n  'User:GET_CURRENT_USER_SUCCESS',\n);\nexport const getCurrentUserFailed = createErrorAction(\n  'User:GET_CURRENT_USER_FAILED',\n);\n\nexport const getUserOrganizationSuccess = createAction(\n  'User:GET_USER_ORGANIZATION_SUCCESS',\n);\nexport const getUserOrganizationFailed = createErrorAction(\n  'User:GET_USER_ORGANIZATION_FAILED',\n);\n\nexport const setCheckpointStart = createAction('User:SET_CHECKPOINT_START');\nexport const setCheckpointSuccess = createAction('User:SET_CHECKPOINT_SUCCESS');\nexport const setCheckpointFailed = createErrorAction(\n  'User:SET_CHECKPOINT_FAILED',\n);\n\nexport const getDashboardsStart = createAction('User:GET_DASHBOARDS_START');\nexport const getDashboardsSuccess = createAction('User:GET_DASHBOARDS_SUCCESS');\nexport const getDashboardsFailed = createErrorAction(\n  'User:GET_DASHBOARDS_FAILED',\n);\n\nexport const updateUsersDashboardsPermissionsSuccessful = createAction(\n  'User:UPDATE_USERS_DASHBOARDS_PERMISSIONS_SUCCESSFUL',\n);\n\n// This is an EXPERIMENT for marketing. If we want to proceed with them we\n// should probably refactor this code and store keys in app config.\n// Also it seems that the script return just a commented line. We should be able\n// to perform a GET request on that end-point instead.\n// Injecting script from action is a terrible idea ... Should we use\n// componentDidMount of the root component for that?\nconst trackMarketingCampaignCapterra = () => {\n  const CAPTERRA_VID = '2107646';\n  const CAPTERRA_VKEY = '4032b6508663d406d8da7b300528d723';\n  const { CapterraBaseURL } = config.get();\n  const tag = document.createElement('script');\n  tag.type = 'text/javascript';\n  tag.async = true;\n  tag.src = `${CapterraBaseURL}/capterra_tracker.js?vid=${CAPTERRA_VID}&key=${CAPTERRA_VKEY}`;\n  const s = document.getElementsByTagName('script')[0];\n  s.parentNode.insertBefore(tag, s);\n};\n\nconst isInitialSignup = user => {\n  return (\n    hasCheckpoint(user, checkpoints.NEW_SIGNUP) &&\n    !hasCheckpoint(user, checkpoints.SIGNUP_TRACKED)\n  );\n};\n\n// TODO move that somewhere else. It should not belongs to actions\nconst handleInitialSignup = async user => {\n  const response = await managementService.setCheckpoint(\n    checkpoints.SIGNUP_TRACKED,\n  );\n\n  SegmentTracker.getInstance().track('signup');\n  trackMarketingCampaignCapterra();\n  return { ...user, checkpoints: response.checkpoints };\n};\n\nexport const initialiseNonGraphQLPage = () => async dispatch => {\n  try {\n    const user = await managementService.getUser();\n    const organization = await managementService.getOrganization(\n      user.organization_id,\n    );\n\n    SegmentTracker.getInstance().init(user, organization);\n\n    dispatch(getUserOrganizationSuccess(organization));\n    dispatch(getCurrentUserSuccess(user));\n  } catch (e) {\n    dispatch(getCurrentUserFailed(e));\n  }\n};\n\nexport const initialiseSharedGraphQLDashboard = (\n  sharingHash,\n  layoutType,\n) => async dispatch => {\n  const data = await fetchJSONWithCredentials(\n    `/dashboards/${sharingHash}/inception.json`,\n  );\n  const { currentOrganization: organization, currentUser: user } = data;\n\n  dispatch(getCurrentUserSuccess(user));\n  dispatch(setUserOrganization(organization));\n\n  new SessionTracker('sharing', {\n    dashboardType: GRAPHQL_LAYOUT_TYPES_TRACKING[layoutType],\n    day_in_lifetime: organization.day_in_lifetime,\n    gb_user_id: user.id,\n    master_account_name: organization.account,\n    organization_id: organization.id,\n    trial_days_remaining: organization.trial_days_remaining,\n    trial_end: user.trial_end,\n  }).start();\n};\n\nexport const initialiseScreenGraphQLDashboard = screenId => async dispatch => {\n  const data = await fetchJSONWithCredentials(`/tv/${screenId}/inception.json`);\n  const {\n    currentOrganization: organization,\n    currentUser: user,\n    config: {\n      device: { pusher_channel: pusherChannel, token },\n    },\n  } = data;\n\n  AuthStrategy.getInstance().set({\n    strategy: 'device_token',\n    value: token,\n  });\n\n  dispatch(getCurrentUserSuccess(user));\n  dispatch(setUserOrganization(organization));\n  dispatch(tvPageActions.setDevice({ pusherChannel, token }));\n\n  new SessionTracker('tv', {\n    dashboardType: GRAPHQL_LAYOUT_TYPES_TRACKING.ContainerLayout,\n    day_in_lifetime: organization.day_in_lifetime,\n    gb_user_id: user.id,\n    master_account_name: organization.account,\n    organization_id: organization.id,\n    trial_days_remaining: organization.trial_days_remaining,\n    trial_end: user.trial_end,\n  }).start();\n};\n\nexport const initialiseGraphQLEditPage = layoutType => async dispatch => {\n  const user = await managementService.getUser();\n  const organization = await managementService.getOrganization(\n    user.organization_id,\n  );\n  let signedUpUser;\n\n  SegmentTracker.getInstance().init(user, organization, {\n    dashboardType: GRAPHQL_LAYOUT_TYPES_TRACKING[layoutType],\n  });\n\n  dispatch(getUserOrganizationSuccess(organization));\n  const shouldTrackSignup = isInitialSignup(user);\n  if (shouldTrackSignup) {\n    signedUpUser = await handleInitialSignup(user);\n    dispatch(getCurrentUserSuccess(signedUpUser));\n  } else {\n    dispatch(getCurrentUserSuccess(user));\n  }\n\n  new SessionTracker('admin', {\n    dashboardType: GRAPHQL_LAYOUT_TYPES_TRACKING.ContainerLayout,\n    day_in_lifetime: organization.day_in_lifetime,\n    gb_user_id: user.id,\n    master_account_name: organization.account,\n    organization_id: organization.id,\n    trial_days_remaining: organization.trial_days_remaining,\n    trial_end: user.trial_end,\n  }).start();\n};\n\nexport const updateCheckpoint = checkpoint => async dispatch => {\n  dispatch(setCheckpointStart(checkpoint));\n\n  try {\n    const response = await managementService.setCheckpoint(checkpoint);\n    dispatch(setCheckpointSuccess(response.checkpoints));\n  } catch (e) {\n    dispatch(setCheckpointFailed(e));\n  }\n};\n\nexport const getDashboards = userId => async dispatch => {\n  dispatch(getDashboardsStart(userId));\n\n  try {\n    const dashboards = await getUserDashboards(userId);\n\n    dispatch(getDashboardsSuccess(dashboards));\n  } catch (error) {\n    dispatch(getDashboardsFailed(error, userId));\n  }\n};\n\nexport const updateUsersDashboardsPermissions = (\n  groupId,\n  usersDashboardsPermissions,\n) => async dispatch => {\n  try {\n    await permissionService.updateUsersDashboardsPermissions(\n      groupId,\n      usersDashboardsPermissions,\n    );\n\n    dispatch(\n      updateUsersDashboardsPermissionsSuccessful({\n        groupId,\n        usersDashboardsPermissions,\n      }),\n    );\n  } catch (err) {\n    dispatch(toastActions.showGenericErrorToast());\n\n    // Rethrow the error as this thunk is composed by\n    // user-permissions-modal-actions (modalUpdate)\n    throw err;\n  }\n};\n","class Serializer {\n  serialize() {\n    return {};\n  }\n\n  deserialize() {\n    return {};\n  }\n}\n\nexport default Serializer;\n","/* eslint camelcase:0 */\nimport { pick } from 'lodash';\nimport Serializer from './default';\nimport { isValidSelection } from '../../spreadsheet-helpers';\n\nfunction mapIndices(indices) {\n  const { max_column = 0, max_row = 0, min_column = 0, min_row = 0 } = indices;\n  return [\n    [min_column - 1, min_row - 1],\n    [max_column - 1, max_row - 1],\n  ];\n}\n\nclass LineChartSerializer extends Serializer {\n  serialize(state) {\n    const defaults = super.serialize(state);\n    const configValues = pick(state, this.constructor.configKeys);\n    let config;\n    let { series } = configValues;\n\n    // Remove empty selections from our series\n    series = series.filter(isValidSelection);\n\n    config = { ...this.constructor.configDefaults, ...configValues, series };\n\n    return { ...defaults, config };\n  }\n\n  deserialize(json) {\n    const defaults = super.deserialize(json);\n    const { config } = json;\n    const payloadValues = pick(config, this.constructor.configKeys);\n    const type = this.constructor.configDefaults.template.type;\n\n    let { selection, x_axis, xAxis, series, hasHeader, has_header } = config;\n\n    if (selection) {\n      xAxis = selection[0];\n      series = selection.slice(1);\n    }\n\n    if (x_axis) {\n      xAxis = mapIndices(x_axis);\n      series = series.map(s => s.selection).map(mapIndices);\n      hasHeader = has_header;\n    }\n\n    return {\n      ...defaults,\n      ...payloadValues,\n      type,\n      series,\n      xAxis,\n      hasHeader,\n    };\n  }\n}\n\nLineChartSerializer.configDefaults = {\n  template: {\n    type: 'line',\n    version: 2,\n  },\n};\n\nLineChartSerializer.configKeys = [\n  'hasHeader',\n  'title',\n  'xAxis',\n  'series',\n  'goal',\n  'reverseGoalDirection',\n  'legends',\n  'minYAxis',\n  'maxYAxis',\n  'numberFormat',\n];\n\nexport default LineChartSerializer;\n","import LineChartSerializer from './line-chart';\n\nclass ColumnChartSerializer extends LineChartSerializer {}\n\nColumnChartSerializer.configDefaults = {\n  template: {\n    type: 'column',\n    version: 1,\n  },\n};\n\nColumnChartSerializer.configKeys = [\n  'hasHeader',\n  'title',\n  'xAxis',\n  'series',\n  'goal',\n  'reverseGoalDirection',\n  'legends',\n  'numberFormat',\n];\n\nexport default ColumnChartSerializer;\n","import LineChartSerializer from './line-chart';\n\nclass BarChartSerializer extends LineChartSerializer {}\n\nBarChartSerializer.configDefaults = {\n  template: {\n    type: 'bar',\n    version: 1,\n  },\n};\n\nBarChartSerializer.configKeys = [\n  'hasHeader',\n  'title',\n  'xAxis',\n  'series',\n  'goal',\n  'reverseGoalDirection',\n  'legends',\n  'numberFormat',\n];\n\nexport default BarChartSerializer;\n","import Serializer from './default';\n\nclass NumberSerializer extends Serializer {\n  serialize(state) {\n    const defaults = super.serialize(state);\n    const { value, title, goal, comparison, numberFormat, indicators } = state;\n\n    return {\n      ...defaults,\n      config: {\n        template: {\n          type: 'number',\n          version: 2,\n        },\n        title,\n        value,\n        goal,\n        comparison,\n        numberFormat,\n        indicators,\n      },\n    };\n  }\n\n  deserialize(json) {\n    const defaults = super.deserialize(json);\n    const {\n      title,\n      value,\n      goal,\n      comparison = {},\n      numberFormat = {},\n      indicators = {},\n      progressIndicator,\n      statusIndicator,\n    } = json.config;\n\n    return {\n      ...defaults,\n      type: 'number',\n      value,\n      title,\n      goal,\n      comparison,\n      numberFormat,\n      indicators,\n      progressIndicator,\n      statusIndicator,\n    };\n  }\n}\n\nexport default NumberSerializer;\n","import Serializer from './default';\n\nclass LeaderboardSerializer extends Serializer {\n  serialize(state) {\n    const {\n      values,\n      labels,\n      hasHeader,\n      reverseSort,\n      title,\n      numberFormat,\n    } = state;\n\n    return {\n      ...super.serialize(state),\n      config: {\n        template: {\n          type: 'leaderboard',\n          version: 1,\n        },\n        title,\n        values,\n        labels,\n        hasHeader,\n        reverseSort,\n        numberFormat,\n      },\n    };\n  }\n\n  deserialize(json) {\n    const defaults = super.deserialize(json);\n\n    const {\n      title,\n      values,\n      labels,\n      hasHeader,\n      reverseSort,\n      numberFormat,\n    } = json.config;\n\n    return {\n      type: 'leaderboard',\n      ...defaults,\n      title,\n      values,\n      labels,\n      hasHeader,\n      reverseSort,\n      numberFormat,\n    };\n  }\n}\n\nexport default LeaderboardSerializer;\n","import Serializer from './default';\n\nclass GeckometerSerializer extends Serializer {\n  serialize(state) {\n    const defaults = super.serialize(state);\n\n    const {\n      value,\n      title,\n      goal,\n      min,\n      max,\n      numberFormat,\n      reverseGoalDirection,\n      indicators,\n    } = state;\n\n    return {\n      ...defaults,\n      config: {\n        template: {\n          type: 'geckometer',\n          version: 1,\n        },\n        title,\n        value,\n        goal,\n        min,\n        max,\n        numberFormat,\n        reverseGoalDirection,\n        indicators,\n      },\n    };\n  }\n\n  deserialize(json) {\n    const defaults = super.deserialize(json);\n\n    const {\n      title,\n      value,\n      goal,\n      min,\n      max,\n      numberFormat,\n      reverseGoalDirection,\n      indicators,\n    } = json.config;\n\n    return {\n      ...defaults,\n      type: 'geckometer',\n      value,\n      title,\n      goal,\n      min,\n      max,\n      numberFormat,\n      reverseGoalDirection,\n      indicators,\n    };\n  }\n}\n\nexport default GeckometerSerializer;\n","import Serializer from './default';\n\nclass TextSerializer extends Serializer {\n  serialize(state) {\n    const defaults = super.serialize(state);\n    const { value, hasHeader, title, isLoop } = state;\n\n    return {\n      ...defaults,\n      config: {\n        template: {\n          type: 'text',\n          version: 2,\n        },\n        title,\n        hasHeader,\n        value,\n        isLoop,\n      },\n    };\n  }\n\n  deserialize(json) {\n    const defaults = super.deserialize(json);\n    const { title, hasHeader, value, isLoop } = json.config;\n\n    return {\n      ...defaults,\n      type: 'text',\n      value,\n      hasHeader,\n      title,\n      isLoop,\n    };\n  }\n}\n\nexport default TextSerializer;\n","import Serializer from './default';\n\nclass TableSerializer extends Serializer {\n  serialize(state) {\n    const { columns, hasHeader, title, numberFormat } = state;\n\n    return {\n      config: {\n        template: {\n          type: 'table',\n          version: 1,\n        },\n        title,\n        hasHeader,\n        columns,\n        numberFormat,\n      },\n    };\n  }\n\n  deserialize(json) {\n    const { columns, title, hasHeader, numberFormat } = json.config;\n\n    return {\n      type: 'table',\n      columns,\n      hasHeader,\n      title,\n      numberFormat,\n    };\n  }\n}\n\nexport default TableSerializer;\n","import LineChartSerializer from './line-chart';\nimport ColumnChartSerializer from './column-chart';\nimport BarChartSerializer from './bar-chart';\nimport NumberSerializer from './number-serializer';\nimport LeaderboardSerializer from './leaderboard-serializer';\nimport GeckometerSerializer from './geckometer-serializer';\nimport TextSerializer from './text-serializer';\nimport TableSerializer from './table-serializer';\n\nexport default function getSerializer(visualisation) {\n  switch (visualisation) {\n    case 'column':\n      return new ColumnChartSerializer();\n    case 'bar':\n      return new BarChartSerializer();\n    case 'line':\n      return new LineChartSerializer();\n    case 'number':\n      return new NumberSerializer();\n    case 'leaderboard':\n      return new LeaderboardSerializer();\n    case 'geckometer':\n      return new GeckometerSerializer();\n    case 'text':\n      return new TextSerializer();\n    case 'table':\n      return new TableSerializer();\n    default:\n      throw new Error(`No serializer for the visualisation \"${visualisation}\"`);\n  }\n}\n","import { merge } from 'lodash';\nimport getVisualisationSerializer from './visualisations';\nimport getServiceSerializer from './services';\n\nfunction serialize(service, visualisation, config) {\n  const serviceSerializer = getServiceSerializer(service);\n\n  if (service === 'salesforce') {\n    return serviceSerializer.serialize(config);\n  }\n\n  const visualisationSerializer = getVisualisationSerializer(visualisation);\n\n  return merge(\n    serviceSerializer.serialize(config),\n    visualisationSerializer.serialize(config),\n  );\n}\n\nfunction deserialize(service, visualisation = 'line', json) {\n  const serviceSerializer = getServiceSerializer(service);\n\n  if (['salesforce', 'datasets', 'universal'].indexOf(service) !== -1) {\n    return serviceSerializer.deserialize(json);\n  }\n\n  const visualisationSerializer = getVisualisationSerializer(visualisation);\n\n  return merge(\n    serviceSerializer.deserialize(json),\n    visualisationSerializer.deserialize(json),\n  );\n}\n\nexport { serialize, deserialize };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\n\nimport style from './input-style.scss';\n\nclass InputComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleChange', 'handleBlur', 'focusTextInput');\n  }\n\n  handleChange(e) {\n    const { onChange } = this.props;\n    const value = e.target.value;\n\n    if (onChange) {\n      onChange({ value });\n    }\n  }\n\n  handleBlur(e) {\n    const { onBlur } = this.props;\n    const value = e.target.value;\n\n    if (onBlur) {\n      onBlur({ value });\n    }\n  }\n\n  render() {\n    const {\n      id,\n      name,\n      value,\n      hasError,\n      placeholder,\n      disabled,\n      isSmall,\n      isUppercase,\n      maxLength,\n      autoFocus,\n      onFocus,\n      tabIndex,\n      type,\n    } = this.props;\n\n    const classes = classNames(style.input, {\n      [style.disabled]: disabled,\n      [style.small]: isSmall,\n      [style.error]: hasError,\n      [style.uppercase]: isUppercase,\n    });\n\n    return (\n      <input\n        type={type}\n        id={id}\n        name={name}\n        value={value || ''}\n        placeholder={placeholder}\n        disabled={disabled}\n        maxLength={maxLength}\n        className={classes}\n        onChange={this.handleChange}\n        onBlur={this.handleBlur}\n        onFocus={onFocus}\n        autoFocus={autoFocus}\n        tabIndex={tabIndex}\n        ref={input => {\n          this.textInput = input;\n        }}\n      />\n    );\n  }\n\n  focusTextInput() {\n    this.textInput.focus();\n    const len = this.textInput.value.length;\n    this.textInput.setSelectionRange(len, len);\n  }\n}\nInputComponent.defaultProps = {\n  type: 'text',\n};\n\nInputComponent.propTypes = {\n  name: PropTypes.string.isRequired,\n  autoFocus: PropTypes.bool,\n  disabled: PropTypes.bool,\n  hasError: PropTypes.bool,\n  id: PropTypes.string,\n  isSmall: PropTypes.bool,\n  isUppercase: PropTypes.bool,\n  maxLength: PropTypes.number,\n  placeholder: PropTypes.string,\n  tabIndex: PropTypes.number,\n  type: PropTypes.string,\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  onBlur: PropTypes.func,\n  onChange: PropTypes.func,\n  onFocus: PropTypes.func,\n};\n\nexport default InputComponent;\n","import Input from './input-component';\nexport default Input;\n","import { Tab, Tabs, TabList, TabPanel } from './tabs-component';\nexport { Tab, Tabs, TabList, TabPanel };\n","import { MAP_TYPES } from './map-constants';\nimport mapData from './map-data';\nimport load from 'little-loader';\nimport fetchJSON from '../../universal/fetch';\nimport { map as _map } from 'lodash';\n\nconst BASE_POINT_SIZE = 3;\nconst CDN_BASE_URL = 'https://d1iac3m7xufrx4.cloudfront.net/vendor/maps/';\n\nconst loadMap = (url, AmChart) =>\n  new Promise((resolve, reject) => {\n    load(url, err => {\n      if (err) {\n        reject(err);\n        return;\n      }\n\n      resolve(AmChart);\n    });\n  });\n\nconst importMap = async map => {\n  const AmChart = await import(\n    /* webpackChunkName: \"ammap\" */ 'vendors/ammap/ammap'\n  );\n  return loadMap(`${CDN_BASE_URL}${map}.js`, AmChart);\n};\n\nconst importTopoJson = map => {\n  return Promise.all([\n    import(/* webpackChunkName: \"topojson\" */ `vendors/topojson`),\n    fetchJSON(`${CDN_BASE_URL}${map}.json`),\n  ]);\n};\n\nconst formatMapObject = data => ({\n  ammapsId: data.file,\n  displayName: data.name,\n  projection: data.projection,\n});\n\nconst getMapData = (mapType, value) => {\n  if (mapType === MAP_TYPES.WORLD) {\n    return formatMapObject(mapData.world);\n  }\n\n  if (mapType === MAP_TYPES.CONTINENT && !!mapData.continents[value]) {\n    return formatMapObject(mapData.continents[value]);\n  }\n\n  if (mapType === MAP_TYPES.COUNTRY && mapData.countries[value]) {\n    return formatMapObject(mapData.countries[value]);\n  }\n\n  if (mapType === MAP_TYPES.REGION && mapData.regions[value]) {\n    return formatMapObject(mapData.regions[value]);\n  }\n\n  throw new Error('You have tried to fetch a map that we dont support');\n};\n\nconst sanitizeAndScalePoints = points => {\n  return _map(points, point => {\n    const { latitude, longitude, size = 3, color } = point;\n    // Change dot sizes to scale based on area rather than radius.\n    const radius = Math.sqrt(BASE_POINT_SIZE * size);\n    const diameter = 2 * radius;\n    // scale all dots by 1.5 round width up to 2 decimal places\n    const width = Math.round(diameter * 1.5 * 100) / 100;\n\n    let normalizedColor;\n\n    if (color) {\n      normalizedColor = color.charAt(0) === '#' ? color : `#${color}`;\n    }\n\n    return {\n      type: 'circle',\n      latitude,\n      longitude,\n      width,\n      color: normalizedColor,\n    };\n  });\n};\n\nexport { getMapData, importMap, importTopoJson, sanitizeAndScalePoints };\n","import {\n  importMap,\n  importTopoJson,\n  getMapData,\n  sanitizeAndScalePoints,\n} from './maps';\nimport { CONTINENTS, MAP_TYPES, PROJECTIONS } from './map-constants';\n\nexport {\n  importMap,\n  importTopoJson,\n  getMapData,\n  sanitizeAndScalePoints,\n  CONTINENTS,\n  MAP_TYPES,\n  PROJECTIONS,\n};\n","import ApolloClient, {\n  InMemoryCache,\n  IntrospectionFragmentMatcher,\n} from 'apollo-boost';\nimport { once } from 'lodash';\nimport { getCSRFToken } from '../../universal/lib/csrf';\nimport AuthStrategy from '../../lib/auth-strategy';\nimport introspectionQueryResultData from './fragmentTypes.json';\n\nconst create = once(() => {\n  const cache = new InMemoryCache({\n    fragmentMatcher: new IntrospectionFragmentMatcher({\n      introspectionQueryResultData,\n    }),\n    dataIdFromObject: object => object.id || null,\n    cacheRedirects: {\n      Query: {\n        instrument: (_, args, { getCacheKey }) => getCacheKey({ id: args.id }),\n      },\n    },\n  });\n\n  return new ApolloClient({\n    cache,\n    credentials: 'include',\n    request: operation => {\n      const token = getCSRFToken();\n      if (token) {\n        operation.setContext({\n          headers: { 'X-CSRF-Token': token },\n        });\n      }\n\n      let uri = window.GRAPHQL_ENDPOINT;\n      const authQueryString = AuthStrategy.getInstance().getQueryParam();\n      if (authQueryString) {\n        uri += `?${authQueryString}`;\n      }\n      operation.setContext({ uri });\n    },\n  });\n});\n\nexport default {\n  create,\n};\n","import fetchJSON, { FetchError, pollJSON } from '../fetch';\nimport config from '../config';\nimport { isFinite, partial, mapKeys, snakeCase } from 'lodash';\n\nconst POLLING_OPTS = {\n  defaultPollInterval: 10000,\n  maxNumberOfPolls: 30,\n};\n\nclass SpreadsheetError extends FetchError {}\n\nfunction fetchList(serviceName, { serviceAccountId = '', query = '' } = {}) {\n  const { SpreadsheetsBaseURL } = config.get();\n\n  return fetchJSON(\n    `${SpreadsheetsBaseURL}/services/${serviceName}/files?title=${query}&service_account_id=${serviceAccountId}`,\n    {\n      method: 'GET',\n      credentials: 'include',\n      headers: {\n        Accept: 'application/json',\n      },\n    },\n  );\n}\n\nfunction refreshSpreadsheet(fileId, maxAge = 3600, requestHeaders = {}) {\n  const { SpreadsheetsBaseURL } = config.get();\n  const headers = { ...requestHeaders, Accept: 'application/json' };\n\n  return fetchJSON(\n    `${SpreadsheetsBaseURL}/files/${fileId}/refresh?max_age=${maxAge}`,\n    {\n      method: 'POST',\n      credentials: 'include',\n      headers,\n    },\n  );\n}\n\nfunction getSpreadsheet(fileId, maxAge = Infinity) {\n  const { SpreadsheetsBaseURL } = config.get();\n\n  if (isFinite(maxAge)) {\n    return refreshSpreadsheet(fileId, maxAge).then(\n      partial(getSpreadsheet, fileId),\n    );\n  }\n\n  return pollJSON(\n    `${SpreadsheetsBaseURL}/files/${fileId}`,\n    undefined,\n    POLLING_OPTS,\n  ).then(json => json.data);\n}\n\nfunction getWorksheet(fileId, worksheetId, requestHeaders = {}) {\n  const { SpreadsheetsBaseURL } = config.get();\n\n  return pollJSON(\n    `${SpreadsheetsBaseURL}/files/${fileId}/worksheets/${worksheetId}`,\n    { headers: requestHeaders },\n    POLLING_OPTS,\n  ).then(json => json.data);\n}\n\nfunction obtainUUID(serviceName, fileOptions) {\n  const { SpreadsheetsBaseURL } = config.get();\n  const { id } = fileOptions;\n  const options = { ...fileOptions, spreadsheetId: id };\n  const body = mapKeys(options, (_, key) => snakeCase(key));\n\n  return fetchJSON(`${SpreadsheetsBaseURL}/services/${serviceName}/files`, {\n    method: 'POST',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n}\n\nfunction get(cfg, requestHeaders) {\n  const {\n    config: { worksheet_id: worksheetId, file_id: fileId },\n  } = cfg;\n\n  return getWorksheet(fileId, worksheetId, requestHeaders).catch(\n    ({ message, type, status }) => {\n      throw new SpreadsheetError(message, status, type);\n    },\n  );\n}\n\nfunction getConfig({ config: cfg }) {\n  return Promise.resolve(cfg);\n}\n\nfunction refresh(cfg, requestHeaders) {\n  const {\n    widget: { refresh_interval: refreshInterval },\n    config: { file_id: fileId },\n  } = cfg;\n\n  return refreshSpreadsheet(fileId, refreshInterval, requestHeaders).catch(\n    ({ message, type, status }) => {\n      throw new SpreadsheetError(message, status, type);\n    },\n  );\n}\n\nexport {\n  fetchList,\n  refreshSpreadsheet,\n  getSpreadsheet,\n  getWorksheet,\n  obtainUUID,\n  get,\n  getConfig,\n  refresh,\n  POLLING_OPTS,\n};\n","import {\n  fetchJSONWithCredentials,\n  fetchAllWithCredentials,\n} from '../universal/fetch';\nimport config from '../universal/config';\n\nfunction inviteUsersToGroup(groupId, users) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/members`;\n\n  return fetchAllWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(users),\n  });\n}\n\nfunction inviteReadOnlyUsers(dashboardId, users) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/permissions`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(users),\n  });\n}\n\nfunction getUsers() {\n  const URL = `${config.get().ManagementBaseURL}/users`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'GET',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction getUsersByGroup(groupId) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/users`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'GET',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction removeUserFromGroup(groupId, userId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/members/${userId}`;\n\n  return fetchAllWithCredentials(URL, {\n    method: 'DELETE',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\n// TODO: Refactor this to not require a groupId\n// https://app.clubhouse.io/geckoboard/story/9355/new-endpoint-for-to-support-removing-users\nfunction deleteUser(groupId, userId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/users/${userId}`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction grantPermissions(groupId, permissions) {\n  const URL = `${config.get().ManagementBaseURL}/groups/${groupId}/permissions`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(permissions),\n  });\n}\n\nfunction setRole(groupId, userId, role) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/members/${userId}`;\n\n  return fetchAllWithCredentials(URL, {\n    method: 'PATCH',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ role }),\n  });\n}\n\nfunction makeAccountOwner(userId) {\n  const URL = `${config.get().ManagementBaseURL}/owners`;\n\n  return fetchAllWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ user_id: userId }),\n  });\n}\n\nfunction revokeAccountOwner(userId, demoteToGroupId = null) {\n  let url = `${config.get().ManagementBaseURL}/owners/${userId}`;\n\n  if (demoteToGroupId !== null) {\n    url = `${url}?demote_to_group_id=${demoteToGroupId}`;\n  }\n\n  return fetchAllWithCredentials(url, {\n    method: 'DELETE',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n  });\n}\n\nfunction promoteToMember(email, groupId) {\n  const users = [{ type: 'user', role: 'read_only', email }];\n  return inviteUsersToGroup(groupId, users);\n}\n\nfunction grantDashboardViewAccess(dashboardId, userId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/permissions`;\n  const permission = { entity_id: userId, type: 'user', role: 'read' };\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify([permission]),\n  });\n}\n\nfunction revokeDashboardViewAccess(dashboardId, userId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/permissions?entity_id=${userId}&type=user`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'DELETE',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction updateUsersDashboardsPermissions(groupId, usersDashboardsPermissions) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/dashboards/bulk_permissions`;\n\n  const data = {\n    data: usersDashboardsPermissions.map(({ userId, dashboardId, role }) => {\n      return { user_id: userId, dashboard_id: dashboardId, role };\n    }),\n  };\n\n  return fetchAllWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(data),\n  });\n}\n\nfunction resendInvite(groupId, userId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/users/${userId}/regenerate_invite`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n  });\n}\n\nfunction bulkUpdateGroupMemberships(groups, users) {\n  const URL = `${config.get().ManagementBaseURL}/groups/bulk_memberships`;\n\n  return fetchAllWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ groups, users }),\n  });\n}\n\nexport {\n  inviteUsersToGroup,\n  inviteReadOnlyUsers,\n  getUsers,\n  getUsersByGroup,\n  removeUserFromGroup,\n  deleteUser,\n  grantPermissions,\n  setRole,\n  revokeAccountOwner,\n  makeAccountOwner,\n  promoteToMember,\n  grantDashboardViewAccess,\n  revokeDashboardViewAccess,\n  updateUsersDashboardsPermissions,\n  resendInvite,\n  bulkUpdateGroupMemberships,\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropItem\":\"dropItem---1ffDT\",\"small\":\"small---rBMHV\",\"innerWrapper\":\"innerWrapper---rck1A\",\"hasLeftIcon\":\"hasLeftIcon---2HTSy\",\"iconLeftWrapper\":\"iconLeftWrapper---3C3lX\",\"content\":\"content---26ol6\",\"selected\":\"selected---maZdj\",\"unpadded\":\"unpadded---2HgTs\",\"dividerTop\":\"dividerTop---2jhXX\",\"dividerBottom\":\"dividerBottom---3y6ZN\",\"pointer\":\"pointer---2IDxn\",\"hint\":\"hint---15PBV\"};","export const INVITED_TAB_INDEX = 1;\nexport const MAX_TITLE_LENGTH = 50;\nexport const WIDGET_POSITION_KEY = 'added-widget-position';\nexport const CONTAINER_AREA_KEY = 'added-container-area';\nexport const STORAGE_IMPORTING_SERVICE = 'importing-service';\nexport const GRAPHQL_DASHBOARDS_WITH_LAYOUT_KEY =\n  'graphql-dashboards-with-layout';\n","import PropTypes from 'prop-types';\n\nexport const layoutType = PropTypes.shape({\n  left: PropTypes.number,\n  order: PropTypes.number,\n  pixel_height: PropTypes.number,\n  pixel_width: PropTypes.number,\n  pixels: PropTypes.shape({\n    height: PropTypes.number,\n    width: PropTypes.number,\n  }),\n  top: PropTypes.number,\n});\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport {\n  getFormattedNumberSegments,\n  getDurationSegments,\n} from '../../lib/humanise-number';\nimport { dropRightWhile } from 'lodash';\n\nimport style from './framed-formatted-number-style.scss';\n\n// When in svg mode we need to apply spacing using the `dx` attribute\n// as svg doesn't have the concept of a margin style.\nconst SPACING = 0.05;\nconst DURATION_UNIT = {\n  years: 'y',\n  days: 'd',\n  hours: 'h',\n  minutes: 'm',\n  seconds: 's',\n  milliseconds: 'ms',\n};\n\n/**\n * Takes a number (e.g. 123.34) and some number formatting options.\n * Returns a formatted number where each part of the number is wrapped with a span\n * (to be able to apply some styling).\n * e.g. <span>$</span><span>123.34</span>\n */\nclass FramedFormattedNumberComponent extends Component {\n  renderNegative(TagName, negative) {\n    if (!negative) return null;\n    return (\n      <TagName\n        className={style.negative}\n        style={{ fontSize: this.props.mainFontSize }}\n      >\n        {negative}\n      </TagName>\n    );\n  }\n\n  renderPrefix(TagName, prefix) {\n    if (!prefix) return null;\n    return (\n      <TagName\n        className={style.prefix}\n        dx={this.props.isSvg && `${SPACING}em`}\n        style={{ fontSize: this.props.secondaryFontSize }}\n      >\n        {prefix}\n      </TagName>\n    );\n  }\n\n  renderNumberValue(TagName, numberValue) {\n    if (!numberValue) return null;\n\n    return (\n      <TagName\n        className={style.number}\n        dx={this.props.isSvg && `${SPACING}em`}\n        style={{ fontSize: this.props.mainFontSize }}\n      >\n        {numberValue}\n      </TagName>\n    );\n  }\n\n  renderAbbreviation(TagName, abbreviation) {\n    if (!abbreviation) return null;\n    return (\n      <TagName\n        className={style.abbreviation}\n        dx={this.props.isSvg && `${SPACING}em`}\n        style={{ fontSize: this.props.secondaryFontSize }}\n      >\n        {abbreviation}\n      </TagName>\n    );\n  }\n\n  renderSuffix(TagName, suffix) {\n    if (!suffix) return null;\n    return (\n      <TagName\n        className={style.suffix}\n        dx={this.props.isSvg && `${SPACING * 2}em`}\n        style={{ fontSize: this.props.secondaryFontSize }}\n      >\n        {suffix}\n      </TagName>\n    );\n  }\n\n  renderDurationUnit(TagName, unit) {\n    return (\n      <TagName\n        className={style.suffix}\n        dx={this.props.isSvg && `${SPACING * 2}em`}\n        style={{ fontSize: this.props.secondaryFontSize }}\n      >\n        {DURATION_UNIT[unit]}\n      </TagName>\n    );\n  }\n\n  renderDuration(TagName) {\n    const { value, options } = this.props;\n    const { unit } = options;\n    const parts = getDurationSegments(value, unit);\n    // Strip trailing 0 segments when using automatic formatting\n    const durationParts = dropRightWhile(parts, ([val]) => val === 0);\n\n    if (!durationParts.length) {\n      return <TagName>0{DURATION_UNIT[unit]}</TagName>;\n    }\n\n    return (\n      <TagName>\n        {durationParts.map(([val, segUnit]) => {\n          const stringValue = `${val}`;\n          return (\n            <TagName key={segUnit}>\n              {this.renderNumberValue(TagName, stringValue)}\n              {this.renderDurationUnit(TagName, segUnit)}\n            </TagName>\n          );\n        })}\n      </TagName>\n    );\n  }\n\n  renderNumber(TagName) {\n    const { options, value } = this.props;\n    const { format } = options;\n\n    if (!isFinite(value)) {\n      return null;\n    }\n\n    if (format === 'duration') {\n      return this.renderDuration(TagName);\n    }\n\n    const {\n      negative,\n      prefix,\n      numberValue,\n      abbreviation,\n      suffix,\n    } = getFormattedNumberSegments(value, options);\n\n    return (\n      <TagName>\n        {this.renderNegative(TagName, negative)}\n        {this.renderPrefix(TagName, prefix)}\n        {this.renderNumberValue(TagName, numberValue)}\n        {this.renderAbbreviation(TagName, abbreviation)}\n        {this.renderSuffix(TagName, suffix)}\n      </TagName>\n    );\n  }\n\n  render() {\n    const { value, layoutClassName, layoutStyle, isSvg } = this.props;\n\n    if (isNaN(value)) {\n      return null;\n    }\n\n    if (isSvg) {\n      return this.renderNumber('tspan');\n    }\n\n    return (\n      <div className={layoutClassName} style={layoutStyle}>\n        {this.renderNumber('span')}\n      </div>\n    );\n  }\n}\n\nFramedFormattedNumberComponent.defaultProps = {\n  options: {},\n};\n\nFramedFormattedNumberComponent.propTypes = {\n  isSvg: PropTypes.bool,\n  layoutClassName: PropTypes.string,\n  layoutStyle: PropTypes.object,\n  mainFontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  options: PropTypes.object,\n  secondaryFontSize: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  value: PropTypes.number,\n};\n\nexport default FramedFormattedNumberComponent;\n","import FramedFormattedNumber from './framed-formatted-number-component';\nexport default FramedFormattedNumber;\n","import { set, get } from 'lodash';\n\nfunction _toSavedPath(path) {\n  return `_saved[${path}]`;\n}\n\nfunction getStateToSave(config, paths) {\n  const updates = {};\n  paths.forEach(path => {\n    set(updates, path, undefined);\n    set(updates, _toSavedPath(path), get(config, path));\n  });\n  return updates;\n}\n\nfunction getStateToRestore(config, paths, defaults) {\n  const updates = {};\n  paths.forEach(path => {\n    set(updates, _toSavedPath(path), undefined);\n    set(updates, path, get(config, _toSavedPath(path), get(defaults, path)));\n  });\n  return updates;\n}\n\nexport { getStateToSave, getStateToRestore };\n","module.exports = (__webpack_require__(28))(1107);","export const UPLOAD_LOGO_STATE_STARTED = 'Customize:UPLOAD_LOGO_STATE_STARTED';\nexport const UPLOAD_LOGO_STATE_SUCCEEDED =\n  'Customize:UPLOAD_LOGO_STATE_SUCCEEDED';\nexport const UPLOAD_LOGO_STATE_FAILED = 'Customize:UPLOAD_LOGO_STATE_FAILED';\n\nexport const UPLOAD_CUSTOM_CSS_STATE_STARTED =\n  'Customize:UPLOAD_CUSTOM_CSS_STATE_STARTED';\nexport const UPLOAD_CUSTOM_CSS_STATE_SUCCEEDED =\n  'Customize:UPLOAD_CUSTOM_CSS_STATE_SUCCEEDED';\nexport const UPLOAD_CUSTOM_CSS_STATE_FAILED =\n  'Customize:UPLOAD_CUSTOM_CSS_STATE_FAILED';\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"card---1-LYK\",\"header\":\"header---20Cl2\",\"body\":\"body---2hUIo\",\"bodyOnly\":\"bodyOnly---1qkMX\",\"slim\":\"slim---1KRsD\",\"superSlim\":\"superSlim---3CM6d\",\"canClick\":\"canClick---3ieGo\",\"default\":\"default---2lRSc\",\"lighter\":\"lighter---2k7NA\",\"lightest\":\"lightest---1pqHJ\",\"headerContent\":\"headerContent---1D6GK\",\"disabled\":\"disabled---3N07l\",\"group\":\"group---1uazZ\",\"toggleButton\":\"toggleButton---2sgSq\"};","/*\n Rag component used by instruments.\n Instruments use the same visualisationType for both\n Rag and RagColumn, this component decides which\n one of them to render.\n*/\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport Rag from '../rag';\nimport RagColumn from '../ragcolumn';\n\nconst RagVisualisationComponent = ({ ragType, ...props }) => {\n  const Component = ragType === 'NUMBERS' ? Rag : RagColumn;\n  return <Component {...props} />;\n};\n\nRagVisualisationComponent.defaultProps = {\n  ragType: 'NUMBERS',\n};\n\nRagVisualisationComponent.propTypes = {\n  ragType: PropTypes.oneOf(['NUMBERS', 'COLUMNS']),\n};\n\nexport default RagVisualisationComponent;\n","import RagVisualisation from './rag-instrument-visualisation-component';\n\nexport default RagVisualisation;\n","import React from 'react';\nimport Table from './';\n\n// render regular text component but with fixedPadding prop set\nexport default props => <Table {...props} fixedPadding />;\n","import React from 'react';\nimport TextPicker from './';\n\n// render regular text component but with noHeading prop set\nexport default props => <TextPicker {...props} noHeading />;\n","import {\n  isEmpty,\n  isNil,\n  last,\n  omitBy,\n  some,\n  isUndefined,\n  isArray,\n} from 'lodash';\nimport BarComponent from '../../visualisation/bar-chart';\nimport BulletComponent from '../../visualisation/bullet';\nimport ClockComponent from '../../visualisation/clock';\nimport ColumnChartComponent from '../../visualisation/column-chart';\nimport FeedComponent from '../../visualisation/feed';\nimport FunnelComponent from '../../visualisation/funnel';\nimport HighchartOrLineChart from '../../visualisation/highchart-or-line-chart';\nimport GeckometerComponent from '../../visualisation/geckometer';\nimport ImageComponent from '../../visualisation/image';\nimport LeaderboardComponent from '../../visualisation/leaderboard';\nimport LineComponent from '../../visualisation/line-chart';\nimport ListComponent from '../../visualisation/list';\nimport MapComponent from '../../visualisation/map';\nimport MonitoringComponent from '../../visualisation/monitoring';\nimport NumberComponent from '../../visualisation/number';\nimport PieComponent from '../../visualisation/pie-chart';\nimport RagComponent from '../../visualisation/rag-instrument-visualisation';\nimport TableComponent from '../../visualisation/table';\nimport TableFixedPadding from '../../visualisation/table/table-fixed-padding';\nimport TextComponent from '../../visualisation/text/';\nimport NoHeadingTextComponent from '../../visualisation/text/no-heading-text-component';\nimport { transformFormStateToThresholds } from '../../universal-config/components/status-indicators-form';\nimport { csrfFetch } from '../../universal/fetch';\nimport { CONTINENTS } from '../../lib/maps';\nimport { LAYOUT_TYPES } from '../../dashboard/dashboard-layout/constants';\nimport AuthStrategy from '../../lib/auth-strategy';\n\nconst NUMBER_COMPARISON_TYPES = {\n  SparklineComparison: 'sparkline',\n  PercentageComparison: 'percentage',\n  NumberComparison: 'number',\n};\n\nconst VISUALISATIONS = {\n  Bar: BarComponent,\n  Bullet: BulletComponent,\n  Clock: ClockComponent,\n  Column: ColumnChartComponent,\n  Feed: FeedComponent,\n  Funnel: FunnelComponent,\n  Geckometer: GeckometerComponent,\n  Highcharts: HighchartOrLineChart,\n  Image: ImageComponent,\n  Label: NoHeadingTextComponent, // text component with no heading support\n  Leaderboard: LeaderboardComponent,\n  LegacyLine: LineComponent,\n  Line: LineComponent,\n  List: ListComponent,\n  Map: MapComponent,\n  Monitoring: MonitoringComponent,\n  Number: NumberComponent,\n  PieChart: PieComponent,\n  Rag: RagComponent,\n  Table: TableFixedPadding,\n  Text: NoHeadingTextComponent, // text component with no heading support\n};\n\nconst LEGACY_DASHBOARD_TYPES_VISUALISATIONS = {\n  ...VISUALISATIONS,\n  Text: TextComponent,\n  Label: TextComponent,\n  Table: TableComponent,\n};\n\nexport const VIEWING_CONTEXT_TYPES = {\n  EDIT: 'edit',\n  SHARE: 'share',\n  CUSTOMIZE: 'customize',\n};\n\nexport const getVisualisationComponent = (\n  visualisationType,\n  dashboardLayoutType,\n) => {\n  if (\n    dashboardLayoutType === LAYOUT_TYPES.FixedLayout ||\n    dashboardLayoutType === LAYOUT_TYPES.ClassicLayout\n  ) {\n    if (!LEGACY_DASHBOARD_TYPES_VISUALISATIONS[visualisationType]) {\n      console.warn(`No component found for visualisation ${visualisationType}`);\n      return null;\n    }\n\n    return LEGACY_DASHBOARD_TYPES_VISUALISATIONS[visualisationType];\n  }\n  if (!VISUALISATIONS[visualisationType]) {\n    console.warn(`No component found for visualisation ${visualisationType}`);\n    return null;\n  }\n\n  return VISUALISATIONS[visualisationType];\n};\n\nexport const getVisualisationPadding = (visualisationType, useLargeFont) => {\n  const padding = {\n    paddingTop: 0,\n    paddingRight: 0,\n    paddingBottom: 0,\n    paddingLeft: 0,\n  };\n\n  switch (visualisationType) {\n    case 'Bullet':\n      // Padding was originally set with global CSS:\n      // https://github.com/geckoboard/polecat/blob/master/style/dashboard/widgets/_bullet.scss#L1\n      padding.paddingRight = useLargeFont ? 26 : 14;\n      padding.paddingBottom = useLargeFont ? 18 : 14;\n      padding.paddingLeft = useLargeFont ? 18 : 14;\n      break;\n    case 'Highcharts':\n    case 'List':\n    case 'Monitoring':\n    case 'PieChart':\n      padding.paddingTop = 16;\n      padding.paddingBottom = 16;\n\n      // Matching CSS variable --widget-side-padding\n      padding.paddingRight = useLargeFont ? 18 : 16;\n      padding.paddingLeft = useLargeFont ? 18 : 16;\n      break;\n    default:\n      break;\n  }\n\n  return padding;\n};\n\nexport const getTitleHeight = (hasTitle, fontSize) => {\n  if (!hasTitle) {\n    return 0;\n  }\n\n  return fontSize === 'LARGE' ? 52 : 41;\n};\n\nexport const getVisualisationSize = (\n  width,\n  height,\n  padding,\n  titleHeight = 0,\n) => {\n  const w = width - padding.paddingLeft - padding.paddingRight;\n  const h = height - padding.paddingTop - padding.paddingBottom - titleHeight;\n\n  return { width: w, height: h };\n};\n\nconst transformMapConfig = graphQlConfig => {\n  if (graphQlConfig.mapType === 'COUNTRY') {\n    return {\n      mapType: 'country',\n      value: graphQlConfig.mapFocus,\n    };\n  }\n\n  if (graphQlConfig.mapFocus === 'WORLD') {\n    return { mapType: 'world' };\n  }\n\n  if (CONTINENTS[graphQlConfig.mapFocus]) {\n    return {\n      mapType: 'continent',\n      value: CONTINENTS[graphQlConfig.mapFocus],\n    };\n  }\n\n  return {\n    mapType: 'region',\n    value: `REGION:${graphQlConfig.mapFocus}`,\n  };\n};\n\nconst transformNumberComparison = (comparison, integrationSlug) => {\n  if (!comparison) {\n    return {};\n  }\n\n  const { __typename, positiveDirection, label } = comparison;\n  const mappedComparison = { type: NUMBER_COMPARISON_TYPES[__typename] };\n\n  if (positiveDirection) {\n    mappedComparison.reversed = positiveDirection !== 'UP';\n  }\n\n  if (label) {\n    mappedComparison.label = label;\n  }\n\n  if (\n    (__typename === 'NumberComparison' ||\n      __typename === 'PercentageComparison') &&\n    (integrationSlug === 'salesforce' || integrationSlug === 'datasets')\n  ) {\n    // Before we moved to GraphQL, `valueOption` was set in the widget config.\n    // It was always set to 'previousValue' so we hard code it here rather than\n    // adding it to the schema. If this value becomes dynamic in the future we have\n    // to add it to Roadie and Concierge and read it from the GraphQL config instead.\n    mappedComparison.valueOption = 'previousValue';\n  }\n\n  return {\n    comparison: mappedComparison,\n  };\n};\n\nconst isSpreadsheetCellReference = configValue =>\n  !!configValue && configValue.__typename === 'SpreadsheetCellReference';\n\nconst getConfigValue = configValue => {\n  if (!configValue) return null;\n\n  switch (configValue.__typename) {\n    case 'FloatValue':\n      return configValue.value;\n    case 'SpreadsheetCellReference':\n    default:\n      return null;\n  }\n};\n\n// Map statusIndicator to old style more than/less than goals\nconst statusIndicatorToGoal = statusIndicator => {\n  const { lowerThreshold, upperThreshold, positiveDirection } = statusIndicator;\n\n  const reverseGoalDirection = positiveDirection === 'DOWN';\n  const threshold = reverseGoalDirection ? lowerThreshold : upperThreshold;\n\n  return omitBy(\n    {\n      threshold: getConfigValue(threshold),\n      reverseGoalDirection,\n    },\n    isNil,\n  );\n};\n\nexport const statusIndicatorToLegacyFormat = statusIndicator => {\n  const { lowerThreshold, upperThreshold, positiveDirection } = statusIndicator;\n\n  const positiveIsUp = positiveDirection === 'UP';\n  const _currentUpperState = positiveIsUp ? 'positive' : 'warning';\n\n  // When either lower or upper threshold is a cell reference\n  // we use thresholds from data instead of config.\n  if (some({ lowerThreshold, upperThreshold }, isSpreadsheetCellReference)) {\n    return {\n      indicators: {\n        _currentUpperState,\n      },\n    };\n  }\n\n  const lowerValue = lowerThreshold ? lowerThreshold.value : null;\n  const upperValue = upperThreshold ? upperThreshold.value : null;\n\n  const lowerState = positiveIsUp ? 'warning' : 'positive';\n  const upperState = positiveIsUp ? 'positive' : 'warning';\n  const thresholds = transformFormStateToThresholds({\n    lowerState,\n    lowerValue,\n    upperState,\n    upperValue,\n  });\n\n  return {\n    indicators: {\n      thresholds,\n      _currentUpperState,\n    },\n  };\n};\n\nconst labelAndTitleToNumberVizLabel = (\n  label,\n  title,\n  canUseResponsiveNumberViz,\n) => {\n  if (canUseResponsiveNumberViz) {\n    if (!label && title) {\n      return { label: title };\n    }\n    if (label && title) {\n      return { label: `${title} - ${label}` };\n    }\n  }\n  if (label) {\n    return { label };\n  }\n  return {};\n};\n\nconst progressIndicatorToComparison = (\n  progressIndicator,\n  canUseResponsiveNumberViz,\n) => {\n  if (!progressIndicator) {\n    return {};\n  }\n\n  const { startingValue, targetValue } = progressIndicator;\n\n  // When either starting or target value is a cell reference\n  // we use progress indicators from data instead of config.\n  if (some({ startingValue, targetValue }, isSpreadsheetCellReference)) {\n    return {};\n  }\n\n  if (canUseResponsiveNumberViz) {\n    return {\n      progressIndicator: {\n        startingValue: getConfigValue(startingValue),\n        targetValue: getConfigValue(targetValue),\n      },\n    };\n  }\n\n  return {\n    comparison: {\n      startingValue: getConfigValue(startingValue) || 0,\n      type: 'goal',\n    },\n    threshold: getConfigValue(targetValue),\n  };\n};\n\nexport const graphQLToLegacyNumberFormat = numberFormat => {\n  const {\n    abbreviation,\n    decimalPlacesPrecision,\n    decimalPlacesStyle,\n    unitPlacement,\n    unitValue,\n  } = numberFormat;\n  const mappedNumberFormat = {};\n\n  if (abbreviation !== 'AUTO') {\n    mappedNumberFormat.abbreviation =\n      abbreviation === 'NONE' ? 'none' : abbreviation;\n  }\n\n  if (decimalPlacesStyle === 'FIXED') {\n    mappedNumberFormat.precision = decimalPlacesPrecision;\n  }\n\n  if (unitPlacement === 'PREFIX') {\n    mappedNumberFormat.prefix = unitValue;\n  } else if (unitPlacement === 'SUFFIX') {\n    mappedNumberFormat.suffix = unitValue;\n  }\n\n  return mappedNumberFormat;\n};\n\nconst getLayout = size => ({\n  pixels: {\n    width: size.width,\n    height: size.height,\n  },\n});\n\n// Map GraphQL config to a format the responsive number visualisation understands\nexport const getStatusIndicatorValues = (\n  configStatusIndicator,\n  dataStatusIndicator,\n) => {\n  const {\n    lowerThreshold,\n    upperThreshold,\n    positiveDirection,\n  } = configStatusIndicator;\n\n  // When either lower or upper threshold is a cell reference\n  // we use status indicator from data instead of config.\n  if (some({ lowerThreshold, upperThreshold }, isSpreadsheetCellReference)) {\n    if (dataStatusIndicator) {\n      return {\n        upperThreshold: dataStatusIndicator.upperThreshold,\n        lowerThreshold: dataStatusIndicator.lowerThreshold,\n        positiveDirection: dataStatusIndicator.positiveDirection,\n      };\n    }\n    return null;\n  }\n\n  return {\n    upperThreshold: getConfigValue(upperThreshold),\n    lowerThreshold: getConfigValue(lowerThreshold),\n    positiveDirection,\n  };\n};\n\nconst statusIndicatorToValues = statusIndicator => {\n  const statusIndicatorValues = getStatusIndicatorValues(statusIndicator);\n  return statusIndicatorValues\n    ? { statusIndicator: statusIndicatorValues }\n    : {};\n};\n\nconst mapStatusIndicator = (\n  visualisationType,\n  statusIndicator,\n  config,\n  canUseResponsiveNumberViz,\n) => {\n  switch (visualisationType) {\n    case 'Bar':\n    case 'Column':\n    case 'Line':\n      return {\n        ...config,\n        ...statusIndicatorToGoal(statusIndicator),\n      };\n    case 'Number':\n      if (canUseResponsiveNumberViz && statusIndicator) {\n        return {\n          ...config,\n          ...statusIndicatorToValues(statusIndicator),\n        };\n      }\n      return {\n        ...config,\n        ...statusIndicatorToLegacyFormat(statusIndicator),\n      };\n    case 'Geckometer':\n      return {\n        ...config,\n        ...statusIndicatorToLegacyFormat(statusIndicator),\n      };\n    default:\n      return { ...config, statusIndicator };\n  }\n};\n\nconst transformSharedConfig = (\n  visualisationType,\n  graphQLConfig,\n  canUseResponsiveNumberViz,\n) => {\n  const { numberFormat, numberFormats, size, statusIndicator } = graphQLConfig;\n  let config = {};\n\n  if (numberFormat) {\n    config.numberFormat = graphQLToLegacyNumberFormat(numberFormat);\n  } else if (numberFormats) {\n    // Tables can have different number formats for each\n    // column and so uses an array.\n    config.numberFormat = numberFormats.map(nf =>\n      graphQLToLegacyNumberFormat(nf),\n    );\n  }\n\n  if (size) {\n    config.layout = getLayout(size);\n  }\n\n  if (statusIndicator) {\n    config = mapStatusIndicator(\n      visualisationType,\n      statusIndicator,\n      config,\n      canUseResponsiveNumberViz,\n    );\n  }\n\n  return config;\n};\n\nexport const transformConfig = (\n  visualisationType,\n  graphQLConfig,\n  canUseResponsiveNumberViz,\n  title,\n  integrationSlug,\n) => {\n  const sharedConfig = transformSharedConfig(\n    visualisationType,\n    graphQLConfig,\n    canUseResponsiveNumberViz,\n  );\n  switch (visualisationType) {\n    case 'Clock':\n      return {\n        ...sharedConfig,\n        configuration: {\n          timezone_offset: graphQLConfig.timezone.offset,\n          fullhour: graphQLConfig.format === 'TWELVE_HOURS' ? '0' : '1',\n        },\n      };\n    case 'Image':\n      return {\n        ...sharedConfig,\n        configuration: {\n          path: graphQLConfig.source,\n          reload: `${graphQLConfig.reloadIntervalSeconds}`,\n        },\n      };\n    case 'Label':\n      const LABEL_TYPES = {\n        TEXT: 0,\n        ALERT: 1,\n        INFO: 2,\n      };\n      const getAlertType = type => LABEL_TYPES[type];\n      return {\n        ...sharedConfig,\n        configuration: graphQLConfig.messages.reduce(\n          (acc, message) => ({\n            text: [...acc.text, message.text],\n            type: [...acc.type, getAlertType(message.type)],\n          }),\n          { text: [], type: [] },\n        ),\n      };\n    case 'LegacyLine':\n      return {\n        ...sharedConfig,\n        visualisation: {\n          type: 'line',\n          version: 1,\n        },\n      };\n    case 'Line':\n      return omitBy(\n        {\n          ...sharedConfig,\n          minYAxis: getConfigValue(graphQLConfig.min),\n          maxYAxis: getConfigValue(graphQLConfig.max),\n        },\n        isNil,\n      );\n    case 'Map':\n      return {\n        ...sharedConfig,\n        ...transformMapConfig(graphQLConfig),\n      };\n    case 'Number':\n      return {\n        ...sharedConfig,\n        ...progressIndicatorToComparison(\n          graphQLConfig.progressIndicator,\n          canUseResponsiveNumberViz,\n        ),\n        ...transformNumberComparison(graphQLConfig.comparison, integrationSlug),\n        ...labelAndTitleToNumberVizLabel(\n          graphQLConfig.label,\n          title,\n          canUseResponsiveNumberViz,\n        ),\n      };\n    case 'Rag':\n      return {\n        ...sharedConfig,\n        ragType: graphQLConfig.ragType,\n      };\n    default:\n      return sharedConfig;\n  }\n};\n\nexport const transformData = (visualisationType, data) => {\n  switch (visualisationType) {\n    case 'Map':\n      if (!data) {\n        return null;\n      }\n      const { points: { point: points = [] } = {} } = data;\n      return {\n        ...data,\n        points,\n      };\n    case 'Bullet':\n    case 'Highcharts':\n    case 'List':\n    case 'Monitoring':\n    case 'Rag':\n      return { data };\n    default:\n      return data;\n  }\n};\n\nexport const mergeConfigAndData = (config, data) => {\n  return omitBy(\n    {\n      ...data,\n      ...config,\n      minYAxis: data.minYAxis || config.minYAxis,\n      maxYAxis: data.maxYAxis || config.maxYAxis,\n      progressIndicator: data.progressIndicator || config.progressIndicator,\n      threshold: data.threshold || config.threshold,\n      comparison:\n        config.comparison || data.comparison\n          ? {\n              ...config.comparison,\n              ...data.comparison,\n            }\n          : null,\n      indicators:\n        config.indicators || data.indicators\n          ? { ...config.indicators, ...data.indicators }\n          : null,\n    },\n    isNil,\n  );\n};\n\nconst addQueryParam = (url, paramString) => {\n  const separator = url.indexOf('?') === -1 ? '?' : '&';\n  return `${url}${separator}${paramString}`;\n};\n\nexport const getVisualisationData = dataUrl => {\n  let url = dataUrl;\n  const authQueryParam = AuthStrategy.getInstance().getQueryParam();\n  if (authQueryParam) {\n    url = addQueryParam(url, authQueryParam);\n  }\n\n  return csrfFetch(url, { credentials: 'include' }).then(res => {\n    const { status } = res;\n    switch (status) {\n      case 200:\n        return res.text().then(data => ({ data, status }));\n      case 520:\n        return res.json().then(({ error }) => {\n          throw error;\n        });\n      default:\n        return { status };\n    }\n  });\n};\n\n/**\n * INSTRUMENT_STATES:\n * backgroundLoading: Happens when a widget is displaying cached data and\n * is fetching new data. This shows as a green line above the visualisation.\n * foregroundLoading: When we want to show the loading animation.\n * This is when fetching and there is no current data to show.\n * error: Show the red line on top of instrument\n * warning: Show the yellow line on top of instrument\n * ready: We've got data and don't want to show any other states\n * importing: We're waiting for data to imported\n */\nexport const INSTRUMENT_STATES = {\n  backgroundLoading: 'backgroundLoading',\n  error: 'error',\n  foregroundLoading: 'foregroundLoading',\n  importing: 'importing',\n  outdated: 'outdated',\n  partial: 'partial',\n  ready: 'ready',\n  stale: 'stale',\n  warning: 'warning',\n};\n\nexport const ERROR_INSTRUMENT_STATES = {\n  ErrNoData: INSTRUMENT_STATES.ready,\n  ErrNoDataPushed: INSTRUMENT_STATES.warning,\n  ErrOAuthTokenExpiredOrInvalid: INSTRUMENT_STATES.error,\n  ErrServiceAccountNotFound: INSTRUMENT_STATES.error,\n  ErrTimeout: INSTRUMENT_STATES.error,\n  ErrImportPending: INSTRUMENT_STATES.importing,\n};\n\n/**\n * Display state for instrument. Helps instrument pick which\n * class to use to hide/show the yellow/red/green lines\n * and if to render loader.\n */\nexport const getInstrumentDisplayState = ({\n  data,\n  error,\n  isDataFromCache,\n  isPartial,\n  dataUpdatedAt,\n  isLoading,\n}) => {\n  const hasData = !isEmpty(data);\n  const hasError = !isEmpty(error);\n\n  if (isPartial) return INSTRUMENT_STATES.partial;\n\n  if (hasData) {\n    if (dataUpdatedAt) {\n      if (dataUpdatedAt < new Date() - 24 * 60 * 60 * 1000) {\n        return INSTRUMENT_STATES.outdated;\n      }\n    }\n    if (hasError) {\n      if (error.type === 'ErrTimeout') {\n        return INSTRUMENT_STATES.stale;\n      }\n\n      console.warn(\n        \"getInstrumentDisplayState: Instrument has received both an error and data, this should't happen. Check InstrumentDataManager and InstrumentDataProvider to see why both were passed down.\",\n      );\n      return INSTRUMENT_STATES.ready;\n    }\n\n    if (isDataFromCache && isLoading) {\n      return INSTRUMENT_STATES.backgroundLoading;\n    }\n\n    return INSTRUMENT_STATES.ready;\n  }\n\n  if (hasError) {\n    if (error.type === 'ErrImportPending') {\n      return INSTRUMENT_STATES.importing;\n    }\n    return ERROR_INSTRUMENT_STATES[error.type] || INSTRUMENT_STATES.error;\n  }\n\n  if (isLoading) {\n    return INSTRUMENT_STATES.foregroundLoading;\n  }\n\n  return null;\n};\n\nexport const formatLastUpdatedText = updatedAt => {\n  const milliseconds = new Date() - new Date(updatedAt);\n  const seconds = milliseconds / 1e3;\n  const minutes = seconds / 60;\n  const hours = minutes / 60;\n\n  if (seconds < 45) {\n    return `${Math.round(seconds)}s`;\n  }\n\n  if (minutes < 45) {\n    return `${Math.round(minutes)}m`;\n  }\n\n  return `${Math.round(hours)}h`;\n};\n\n// Support legacy and new number instrument data format\nconst getNumberInstrumentValue = data => {\n  if (data.item && data.item[0]) {\n    // Legacy number widgets\n    return data.item[0].value;\n  } else if (data.value) {\n    // New number widgets\n    return last(data.value);\n  }\n\n  return null;\n};\n\nexport const shouldTriggerCelebration = (previousData, newData, config) => {\n  if (!config.progressIndicator || !!config.statusIndicator) {\n    return false;\n  }\n\n  const previousValue = getNumberInstrumentValue(previousData);\n  const newValue = getNumberInstrumentValue(newData);\n  if (!previousValue || !newValue) {\n    return false;\n  }\n\n  const {\n    progressIndicator: {\n      targetValue: { value: targetValue },\n    },\n  } = config;\n  return newValue >= targetValue && previousValue < targetValue;\n};\n\nexport const transformLegacyConfigToGraphQL = legacyConfig => {\n  const { comparison: { type, startingValue } = {}, goal } = legacyConfig;\n\n  if (type === 'goal') {\n    return {\n      progressIndicator: {\n        targetValue: { __typename: 'FloatValue', value: parseFloat(goal) },\n        startingValue: { __typename: 'FloatValue', value: startingValue || 0 },\n      },\n    };\n  }\n\n  return {};\n};\n\nconst DEFAULT_GRAPHQL_NUMBER_FORMAT = {\n  __typename: 'NumberFormat',\n  abbreviation: 'AUTO',\n  decimalPlacesPrecision: 0,\n  decimalPlacesStyle: 'AUTO',\n  unitPlacement: 'AUTO',\n  unitValue: '$',\n};\n\nexport const legacyToGraphQLNumberFormat = legacyNumberFormat => {\n  // When the legacy number format is `null`, we're converting it to\n  // a default number format in the graphql shape.\n  if (!legacyNumberFormat) {\n    return DEFAULT_GRAPHQL_NUMBER_FORMAT;\n  }\n\n  const ABBREVIATIONS = {\n    none: 'NONE',\n    auto: 'AUTO',\n  };\n  const { abbreviation, precision, prefix, suffix } = legacyNumberFormat;\n\n  return {\n    ...DEFAULT_GRAPHQL_NUMBER_FORMAT,\n    ...(abbreviation && {\n      abbreviation: ABBREVIATIONS[abbreviation] || abbreviation,\n    }),\n    ...(!isUndefined(precision) && {\n      decimalPlacesStyle: 'FIXED',\n      decimalPlacesPrecision: precision,\n    }),\n    ...(!isUndefined(prefix) && { unitPlacement: 'PREFIX', unitValue: prefix }),\n    ...(!isUndefined(suffix) && { unitPlacement: 'SUFFIX', unitValue: suffix }),\n  };\n};\n\nexport const legacyToGraphQLNumberFormatShape = (\n  legacyNumberFormat,\n  visualisationType,\n) => {\n  if (visualisationType === 'Table') {\n    if (!isArray(legacyNumberFormat)) {\n      return null;\n    }\n\n    return {\n      numberFormats: legacyNumberFormat.map(legacyToGraphQLNumberFormat),\n    };\n  }\n\n  return { numberFormat: legacyToGraphQLNumberFormat(legacyNumberFormat) };\n};\n\nexport const legacyToGraphQLStatusIndicatorsFormat = legacyStatusIndicatorsFormat => {\n  const { _currentUpperState, thresholds } = legacyStatusIndicatorsFormat;\n  const positiveDirection = _currentUpperState === 'positive' ? 'UP' : 'DOWN';\n\n  // The legacy format for thresholds can look like this:\n  // Example 1: ['neutral', 5, 'warning']\n  // Example 2: ['positive', 10, 'neutral', 8, 'warning']\n  // Example 3: ['positive', 9, 'neutral']\n  // The lower threshold is always before the 'neutral' string entry\n  // The upper threshold is always after the 'neutral' string entry\n  const lowerThresholdIndex = thresholds.indexOf('neutral') - 1;\n  const upperThresholdIndex = thresholds.indexOf('neutral') + 1;\n\n  const lowerThreshold = thresholds[lowerThresholdIndex]\n    ? { __typename: 'FloatValue', value: thresholds[lowerThresholdIndex] }\n    : null;\n\n  const upperThreshold = thresholds[upperThresholdIndex]\n    ? { __typename: 'FloatValue', value: thresholds[upperThresholdIndex] }\n    : null;\n\n  return {\n    __typename: 'StatusIndicator',\n    positiveDirection,\n    lowerThreshold,\n    upperThreshold,\n  };\n};\n","import { some, get, flatten } from 'lodash';\nimport { UNIVERSAL_SERVICES } from '../data-sources/data-sources-helpers';\n\n// Return if any value from attributes match query in a service object\n// (e.g Search service in integration page)\nconst matches = (attributes, query) => service => {\n  const q = query.toLowerCase();\n\n  return some(attributes, attribute => {\n    const values = get(service, attribute);\n    if (!values) {\n      return false;\n    }\n\n    return some(flatten([values]), value => {\n      return (\n        String(value)\n          .toLowerCase()\n          .indexOf(q) !== -1\n      );\n    });\n  });\n};\n\nconst usesOAuth = service => ['oauth', 'oauth2'].includes(service.auth_type);\n\nconst isUniversal = serviceName =>\n  [...UNIVERSAL_SERVICES, 'inquisitor'].includes(serviceName);\n\nexport { matches, usesOAuth, isUniversal };\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport styles from './list-style.scss';\n\nconst List = ({ children, 'data-acc-id': dataAccId }) => (\n  <ol className={styles.list} data-acc-id={dataAccId}>\n    {children}\n  </ol>\n);\n\nList.defaultProps = {\n  'data-acc-id': 'list',\n};\n\nList.propTypes = {\n  children: PropTypes.node,\n  'data-acc-id': PropTypes.string,\n};\n\nexport default List;\n","import List from './list-component';\nexport default List;\n","import localForage from 'localforage/dist/localforage.nopromises';\n\nconst HOURS_24 = 3.6e6 * 24;\n\nfunction setItem(key, value) {\n  const updatedAt = `${new Date()}`;\n  return localForage\n    .setItem(key, JSON.stringify({ value, updatedAt }))\n    .then(JSON.parse)\n    .catch(e => {\n      if (\n        e.name === 'QuotaExceededError' ||\n        e.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n      ) {\n        localForage.clear();\n      }\n      throw e;\n    });\n}\n\nfunction getItem(key) {\n  return localForage\n    .getItem(key)\n    .then(JSON.parse)\n    .then(data => {\n      if (data === null) {\n        return null;\n      }\n\n      if (new Date(data.updatedAt) < Date.now() - HOURS_24) {\n        localForage.removeItem(key);\n        return null;\n      }\n\n      return data;\n    });\n}\n\nfunction removeItem(key) {\n  return localForage.removeItem(key);\n}\n\nexport default { getItem, setItem, removeItem };\n","import { isUndefined, find } from 'lodash';\n\n// We currently have multiple ways of representing a user on the client side,\n// depending on which end point we use to get the user/users.\n// So we need to check for permissions in multiple ways!\n\nconst isAccountOwner = user => {\n  if (isUndefined(user)) {\n    return false;\n  }\n\n  if (!isUndefined(user.owner)) {\n    return user.owner;\n  }\n\n  return !!user.is_admin;\n};\n\nconst isGroupAdmin = user => {\n  if (isUndefined(user)) {\n    return false;\n  }\n\n  if (!isUndefined(user.group_memberships)) {\n    return !!find(user.group_memberships, ({ role }) => role === 'admin');\n  }\n\n  if (!isUndefined(user.is_admin)) {\n    return user.permission === 'power_user';\n  }\n\n  return user.permission === 'admin';\n};\n\nconst isGroupViewer = user => {\n  if (isUndefined(user)) {\n    return false;\n  }\n\n  if (!isUndefined(user.group_memberships)) {\n    return !!find(user.group_memberships, ({ role }) => role === 'read_only');\n  }\n\n  return user.permission === 'read_only';\n};\n\nconst isDashboardViewOnly = user => {\n  if (isUndefined(user)) {\n    return false;\n  }\n\n  return !(isAccountOwner(user) || isGroupAdmin(user) || isGroupViewer(user));\n};\n\nexport { isAccountOwner, isGroupAdmin, isGroupViewer, isDashboardViewOnly };\n","module.exports = (__webpack_require__(28))(1117);","import { capitalize, isNil, omitBy, values } from 'lodash';\nimport { matchPath } from 'react-router';\nimport { router } from '../../../router';\nimport SchemaTypes from '@Tracking/schema-types';\nimport {\n  TrackingPropsQuery,\n  TrackingPropsLegacyIdQuery,\n} from '../../../services/concierge-service/graphql/dashboard-tracking-props-query.graphql';\n\nexport const TRACKING_LAYOUT_TYPES = {\n  ClassicLayout: 'Classic',\n  FixedLayout: 'Fixed',\n  ContainerLayout: 'Container',\n};\n\nconst DASHBOARD_ROUTES = [\n  '/edit/dashboards/:dashboardId',\n  '/v4/dashboards/:dashboardId',\n];\n\nconst getDashboardId = () => {\n  const {\n    location: { pathname: currentPath },\n  } = router.getHistory();\n\n  let match;\n  for (let i = 0; i < DASHBOARD_ROUTES.length; i++) {\n    match = matchPath(currentPath, {\n      path: DASHBOARD_ROUTES[i],\n    });\n\n    if (match) {\n      break;\n    }\n  }\n\n  if (match) {\n    return match.params.dashboardId;\n  }\n  return null;\n};\n\nconst dashboardContext = {\n  schema: {\n    'Dashboard ID': SchemaTypes.string.isRequired,\n    'Legacy dashboard ID': SchemaTypes.string.isRequired,\n    'Dashboard type': SchemaTypes.oneOf(values(TRACKING_LAYOUT_TYPES))\n      .isRequired,\n    'Classicboard column count': SchemaTypes.number,\n    'Fixieboard grid size': SchemaTypes.oneOf(['Dense', 'Standard']),\n  },\n  resolve: ({ apolloClient }) => {\n    const dashboardId = getDashboardId();\n\n    if (!dashboardId) {\n      return {};\n    }\n\n    const isLegacyId = !dashboardId.startsWith('dash_');\n    let query = TrackingPropsQuery;\n    let variables = { id: dashboardId };\n\n    if (isLegacyId) {\n      query = TrackingPropsLegacyIdQuery;\n      variables = { legacyId: dashboardId };\n    }\n\n    try {\n      const { dashboard } = apolloClient.readQuery({\n        query,\n        variables,\n      });\n\n      if (!dashboard) {\n        throw new Error('No dashboard returned from Apollo');\n      }\n\n      return {\n        'Dashboard ID': dashboard.id,\n        'Legacy dashboard ID': `${dashboard.legacyId}`,\n        'Dashboard type':\n          TRACKING_LAYOUT_TYPES[dashboard.layoutType.__typename],\n        ...omitBy(\n          {\n            'Classicboard column count': dashboard.layoutType.columnCount,\n            'Fixieboard grid size':\n              dashboard.layoutType.grid &&\n              capitalize(dashboard.layoutType.grid),\n          },\n          isNil,\n        ),\n      };\n    } catch (e) {\n      if (isLegacyId) {\n        return { 'Legacy dashboard ID': `${dashboardId}` };\n      }\n      return { 'Dashboard ID': dashboardId };\n    }\n  },\n};\n\nexport default dashboardContext;\n","import DashboardContext, { TRACKING_LAYOUT_TYPES } from './dashboard-context';\n\nexport { TRACKING_LAYOUT_TYPES };\nexport default DashboardContext;\n","import { getWindow } from '../global';\n\nfunction send(error, opts = {}) {\n  const _window = getWindow();\n  const { metaData = {} } = opts;\n\n  // TODO: remove this when we figure out why bugsnag is receiving weird error values it can't handle\n  metaData['error debugging'] = {\n    'raw error': error,\n    typeof: typeof error,\n    keys: typeof error === 'object' ? Object.keys(error) : [],\n  };\n\n  opts.metaData = metaData;\n\n  if (_window.bugsnagClient) {\n    _window.bugsnagClient.notify(error, opts);\n  } else if (_window.console) {\n    _window.console.error(error);\n  }\n}\n\nexport default { send };\n","import bugsnag from './bugsnag';\n\nexport default bugsnag;\n","import React from 'react';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { getLoopURL } from '../../lib/loop';\nimport * as toastActions from '../../toast/actions';\nimport * as toastConstants from '../../toast/toast-constants';\nimport FormattedMessage from '../../lib/i18n';\nimport { router } from '../../router';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport {\n  getGroupLoops,\n  updateLoop as updateLoopService,\n  deleteLoop as deleteLoopService,\n  createLoop as createLoopService,\n} from '../../services/management-service';\nimport { refreshSharingLoop } from '../../services/app-service';\nimport { trackEvent } from '@Tracking';\nimport { dashboardLoopCreated, dashboardLoopDeleted } from '@Tracking/events';\n\nexport const getLoopsStart = createAction('Loops:GET_LOOPS_START');\nexport const getLoopsSuccess = createAction('Loops:GET_LOOPS_SUCCESS');\nexport const getLoopsFailure = createErrorAction('Loops:GET_LOOPS_FAILURE');\n\nexport const createLoopStart = createAction('Loops:CREATE_LOOP_START');\nexport const createLoopSuccess = createAction('Loops:CREATE_LOOP_SUCCESS');\nexport const createLoopFailure = createAction('Loops:CREATE_LOOP_FAILURE');\n\nexport const updateLoopStart = createAction('Loops:UPDATE_LOOP_START');\nexport const updateLoopSuccess = createAction('Loops:UPDATE_LOOP_SUCCESS');\nexport const updateLoopFailure = createErrorAction('Loops:UPDATE_LOOP_FAILURE');\n\nexport const deleteLoopStart = createAction('Loops:DELETE_LOOP_START');\nexport const deleteLoopSuccess = createAction('Loops:DELETE_LOOP_SUCCESS');\nexport const deleteLoopFailure = createErrorAction('Loops:DELETE_LOOP_FAILURE');\n\nexport const getLoops = groupId => async dispatch => {\n  dispatch(getLoopsStart(groupId));\n\n  try {\n    const loops = await getGroupLoops(groupId);\n    dispatch(getLoopsSuccess({ groupId, loops }));\n  } catch (error) {\n    dispatch(getLoopsFailure(error));\n  }\n};\n\nexport const createLoop = loop => async (dispatch, getState) => {\n  dispatch(createLoopStart());\n  try {\n    const {\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    } = getState();\n    track('Loops - Click save', {\n      properties: {\n        numberOfBoards: loop.dashboard_ids.length,\n      },\n    });\n\n    const newLoop = await createLoopService(loop);\n    trackSnowplow('loop_save', '1-0-1', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      loop_id: `${newLoop.id}`,\n      nb_of_boards: loop.dashboard_ids.length,\n    });\n\n    trackEvent(dashboardLoopCreated({ 'Dashboard loop ID': `${newLoop.id}` }));\n\n    const link = getLoopURL(newLoop.code);\n\n    dispatch(createLoopSuccess(newLoop));\n    dispatch(\n      toastActions.showToast({\n        type: toastConstants.CREATED_LOOP,\n        link,\n        loopId: newLoop.id,\n      }),\n    );\n    router.removeQueryParam('addLoop');\n  } catch (error) {\n    dispatch(createLoopFailure(error));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const updateLoop = (groupId, loopId, loop) => async dispatch => {\n  dispatch(updateLoopStart(loopId));\n\n  try {\n    await updateLoopService(loopId, loop);\n    await refreshSharingLoop(loop.code);\n\n    dispatch(updateLoopSuccess({ loopId, loop }));\n    dispatch(\n      toastActions.showSuccessToast(\n        <FormattedMessage id=\"loops.updateSuccessful\" />,\n      ),\n    );\n\n    router.navigate(`/admin/groups/${groupId}/loops`);\n  } catch (error) {\n    dispatch(updateLoopFailure(error, loopId));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const deleteLoop = loopId => async dispatch => {\n  dispatch(deleteLoopStart(loopId));\n\n  try {\n    await deleteLoopService(loopId);\n    dispatch(deleteLoopSuccess(loopId));\n    dispatch(\n      toastActions.showSuccessToast(\n        <FormattedMessage id=\"loops.deleteSuccessful\" />,\n      ),\n    );\n\n    trackEvent(dashboardLoopDeleted({ 'Dashboard loop ID': `${loopId}` }));\n  } catch (error) {\n    dispatch(deleteLoopFailure(error, loopId));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport style from './table-style.scss';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport moment from 'moment-timezone';\nimport { isFinite } from 'lodash';\n\nclass TableComponent extends Component {\n  render() {\n    return <table className={style.table}>{this.props.children}</table>;\n  }\n}\n\nTableComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nclass HeaderCell extends Component {\n  renderDescription() {\n    if (!this.props.description) return null;\n\n    return <i className={style.description}>{this.props.description}</i>;\n  }\n\n  render() {\n    return (\n      <th>\n        {this.props.children}\n        {this.renderDescription()}\n      </th>\n    );\n  }\n}\n\nHeaderCell.propTypes = {\n  children: PropTypes.node,\n  description: PropTypes.string,\n};\n\nconst NUMERIC_TYPES = ['number', 'percentage', 'money'];\nconst DATE_TYPES = ['date', 'datetime'];\n\nclass Cell extends Component {\n  getFormatOptions() {\n    switch (this.props.type) {\n      case 'percentage':\n        return { format: 'percent', precision: 'none' };\n      case 'money':\n        return { format: 'currency', unit: this.props.unit, precision: 'none' };\n      case 'number':\n      default:\n        return { format: 'decimal', precision: 'none' };\n    }\n  }\n\n  getDatetimeFormat() {\n    switch (this.props.type) {\n      case 'datetime':\n        return 'D MMM YYYY HH:mm';\n      case 'date':\n      default:\n        return 'D MMM YYYY';\n    }\n  }\n\n  renderValue() {\n    if (DATE_TYPES.includes(this.props.type)) {\n      return moment(this.props.value).format(this.getDatetimeFormat());\n    }\n\n    if (!isFinite(this.props.value)) {\n      return this.props.value;\n    }\n\n    return humaniseNumber(this.props.value, this.getFormatOptions());\n  }\n\n  render() {\n    const className = classNames({\n      [style.numeric]: NUMERIC_TYPES.includes(this.props.type),\n    });\n\n    return (\n      <td className={className}>\n        {this.renderValue()}\n        {this.props.children}\n      </td>\n    );\n  }\n}\n\nCell.propTypes = {\n  children: PropTypes.node,\n  type: PropTypes.string,\n  unit: PropTypes.string,\n  value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n};\n\nexport { TableComponent as default, HeaderCell, Cell };\n","import Table, { HeaderCell, Cell } from './table-component';\nexport { Table as default, HeaderCell, Cell };\n","import { fetchJSONWithCredentials } from '../universal/fetch';\nimport config from '../universal/config';\nimport { pick } from 'lodash';\n\nconst UPDATEABLE_PROPS = [\n  'title',\n  'timezone',\n  'columns',\n  'public',\n  'sharing',\n  'css',\n  'theme',\n  'country',\n  'scale_when_fullscreen',\n  'tv_mode',\n  'devices',\n  'toggles',\n  'customization',\n];\n\nfunction updateDashboard(dashboardId, props) {\n  const URL = `${config.get().ManagementBaseURL}/dashboards/${dashboardId}`;\n  const body = pick(props, UPDATEABLE_PROPS);\n\n  // Coerce `sharing: \"n\"` to `sharing: false`\n  // ----------\n  // There is a bug in gecko-models with how `sharing` is handled\n  // and this is a temporary fix on the front-end so that we can\n  // ship Customization\n  const sharing = body.sharing && body.sharing !== 'n';\n  const bodyWithCoercedSharing = { ...body, sharing };\n  // ----------\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PUT',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(bodyWithCoercedSharing), // Remove when `sharing` bug is fixed\n  });\n}\n\n// Only devices, timezone, country and sharing are supported by this endpoint at present.\nfunction patchDashboard(dashboardId, { devices, timezone, country, sharing }) {\n  const URL = `${config.get().ManagementBaseURL}/dashboards/${dashboardId}`;\n  const body = { devices, timezone, country, sharing };\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'PATCH',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n}\n\nfunction updateDashboardTitle(dashboardId, title) {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/dashboards/${dashboardId}/update_title`,\n    {\n      method: 'PUT',\n      headers: {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ title }),\n    },\n  );\n}\n\nfunction regenerateSharingLink(dashboardId) {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/dashboards/${dashboardId}/regenerate_sharing`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction getUserDashboards(userId) {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/users/${userId}/dashboards`,\n  );\n}\n\nconst getViewOnlyUsers = dashboardId => {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/dashboards/${dashboardId}/permissions`,\n  );\n};\n\nconst deleteDashboard = dashboardId => {\n  return fetchJSONWithCredentials(\n    `${config.get().ManagementBaseURL}/dashboards/${dashboardId}`,\n    {\n      method: 'DELETE',\n      headers: {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n      },\n    },\n  );\n};\n\nfunction copyDashboard(groupId, dashboard) {\n  const { id: dashboardId, title: dashboardName } = dashboard;\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/groups/${groupId}/dashboards/${dashboardId}/copy`;\n  const body = JSON.stringify({\n    title: `${dashboardName} copy`,\n    group_id: groupId,\n  });\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    body,\n  });\n}\n\nexport {\n  updateDashboard,\n  updateDashboardTitle,\n  patchDashboard,\n  deleteDashboard,\n  copyDashboard,\n  regenerateSharingLink,\n  getUserDashboards,\n  getViewOnlyUsers,\n};\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport Layout from '../layout';\n\nimport style from './card-style.scss';\n\nconst CardComponent = ({\n  header,\n  children,\n  isDisabled,\n  isSlim,\n  isSuperSlim,\n  onClick,\n  type,\n}) => {\n  const bodyClasses = classNames(style.body, {\n    [style.bodyOnly]: !header,\n    [style.slim]: isSlim,\n    [style.superSlim]: isSuperSlim,\n    [style.disabled]: isDisabled,\n  });\n  const classes = classNames(style.card, style[type], {\n    [style.canClick]: onClick,\n  });\n\n  return (\n    <div className={classes} onClick={onClick}>\n      {header && <div className={style.header}>{header}</div>}\n      {children && <div className={bodyClasses}>{children}</div>}\n    </div>\n  );\n};\n\nCardComponent.defaultProps = {\n  isDisabled: false,\n  type: 'default',\n};\n\nCardComponent.propTypes = {\n  children: PropTypes.node,\n  header: PropTypes.node,\n  isDisabled: PropTypes.bool,\n  isSlim: PropTypes.bool,\n  isSuperSlim: PropTypes.bool,\n  type: PropTypes.oneOf(['default', 'lighter', 'lightest']),\n  onClick: PropTypes.func,\n};\n\nconst CardGroup = props => <Layout {...props} className={style.group} />;\n\nexport { CardComponent as default, CardGroup };\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport Card from './card-component';\nimport FormattedMessage from '../../lib/i18n';\nimport { Row, Column } from '../layout';\n\nimport styles from './card-style.scss';\n\nclass TogglableCardComponent extends PureComponent {\n  constructor() {\n    super();\n    this.state = { visible: false };\n  }\n\n  handleToggle() {\n    this.setState({ visible: !this.state.visible });\n  }\n\n  render() {\n    const { visible } = this.state;\n\n    return (\n      <Card\n        header={\n          <Row>\n            <Column className={styles.headerContent} flexAuto>\n              {this.props.header}\n            </Column>\n            <Column>\n              <button\n                className={styles.toggleButton}\n                onClick={() => this.handleToggle()}\n              >\n                <FormattedMessage\n                  id={visible ? 'button.hide' : 'button.show'}\n                />\n              </button>\n            </Column>\n          </Row>\n        }\n      >\n        {visible && this.props.children}\n      </Card>\n    );\n  }\n}\nTogglableCardComponent.propTypes = {\n  children: PropTypes.node,\n  header: PropTypes.node,\n};\n\nexport default TogglableCardComponent;\n","import Card, { CardGroup } from './card-component.js';\nimport TogglableCard from './togglable-card-component';\nexport { Card as default, CardGroup, TogglableCard };\n","import { isUndefined } from 'lodash';\nimport { roundToPowerOfTen } from '../universal/lib/round-to-power-of-ten';\nimport { parseNumberBasedOnFormat } from '../universal/lib/parse-number';\nimport { getPlaceholder } from './placeholder';\n\nconst getGeckometerDefaultMinMax = (value, format) => {\n  const minDefault = '0';\n  let maxDefault;\n  if (format === 'percent') {\n    maxDefault = '100';\n  } else if (value > 1) {\n    maxDefault = roundToPowerOfTen(value).toString();\n  } else {\n    maxDefault = '10';\n  }\n\n  return {\n    _minDefault: getPlaceholder(minDefault, format),\n    _maxDefault: getPlaceholder(maxDefault, format),\n  };\n};\n\nconst setExtremum = (key, { _default, _typed }) => {\n  // Value is overriden by user\n  if (!isUndefined(parseNumberBasedOnFormat(_typed))) {\n    return { [`${key}`]: _typed };\n  }\n\n  return { [`${key}`]: _default };\n};\n\nconst setTypedExtremum = (key, extremum) => {\n  if (extremum) {\n    return { [`_${key}Typed`]: extremum };\n  }\n  return { [`_${key}Typed`]: undefined };\n};\n\nexport { getGeckometerDefaultMinMax, setExtremum, setTypedExtremum };\n","import createAction from '../../lib/redux/create-action';\n\nexport const openMenu = createAction('InstrumentMenu:OPEN_MENU');\nexport const closeMenu = createAction('InstrumentMenu:CLOSE_MENU');\n\nexport const openUniversalConfig = createAction(\n  'InstrumentMenu:OPEN_UNIVERSAL_CONFIG',\n);\nexport const openDeleteModal = createAction('InstrumentMenu:OPEN_DELETE_MODAL');\nexport const closeDeleteModal = createAction(\n  'InstrumentMenu:CLOSE_DELETE_MODAL',\n);\n\nexport const openInstrumentStatusIndicator = createAction(\n  'InstrumentMenu:OPEN_INSTRUMENT_STATUS_INDICATOR',\n);\nexport const setStatusIndicators = createAction(\n  'InstrumentMenu:SET_STATUS_INDICATORS',\n);\nexport const openInstrumentNumberFormatting = createAction(\n  'InstrumentMenu:OPEN_INSTRUMENT_NUMBER_FORMATTING',\n);\nexport const setNumberFormat = createAction('InstrumentMenu:SET_NUMBER_FORMAT');\nexport const updateNumberFormat = createAction(\n  'InstrumentMenu:UPDATE_NUMBER_FORMAT',\n);\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tableWrapper\":\"tableWrapper---3irum\",\"previewLayout\":\"previewLayout---IrTN9\",\"table\":\"table---Vvwi7\",\"th\":\"th---3m0yi\",\"fixedPadding\":\"fixedPadding---1UOIG\",\"heading\":\"heading---1C2nl\",\"rightAligned\":\"rightAligned---1ryLp\",\"td\":\"td---2XqLz\",\"tvMode\":\"tvMode---19FeV\",\"tr\":\"tr---1zrXV\",\"mixedCell\":\"mixedCell---2E2cI\",\"content\":\"content---rXSUp\",\"spacer\":\"spacer---133FZ\",\"cell\":\"cell---i8IWg\",\"hiddenContent\":\"hiddenContent---3mdjz\",\"loadingCell\":\"loadingCell---2xJT3\"};","import { useQuery } from '@apollo/react-hooks';\nimport gql from 'graphql-tag';\n\n// Exported for testing purposes only\nexport const GET_CURRENT_USER_SCOPE_QUERY = gql`\n  query CurrentUser {\n    currentUser {\n      scope\n    }\n  }\n`;\n\nconst useCanUserEdit = () => {\n  const { loading, error, data } = useQuery(GET_CURRENT_USER_SCOPE_QUERY);\n\n  if (loading || error) {\n    return false;\n  }\n\n  const { scope } = data.currentUser;\n  const isViewOnly =\n    scope === 'VIEW_ONLY' || scope === 'EXTERNAL' || scope === 'GROUPS_ONLY';\n\n  return !isViewOnly;\n};\n\nexport default useCanUserEdit;\n","import gql from 'graphql-tag';\nimport { useParams } from 'react-router-dom';\n\n/**\n * Returns correct dashboard query and variables depending on\n * the current viewing context (edit mode, sharing url or screens).\n * Pass in which graphql props to fetch using the dashboardFragment arg.\n * There are predefined dashboardFragments in\n * services/concierge-service/graphql/dashboard-query-fragments.js.\n *\n * To specify a custom dashboardFragment it has to contain these props:\n *  fragments: gql fragment containing what props to fetch on the dashboard.\n *    If the fragment to fetch references other fragments, they have to\n *    be included here too.\n *  mainFragmentName: name of the fragment in fragments object to use when\n *    when fetching the dashboard.\n */\nconst useDashboardQueryProps = dashboardFragment => {\n  let query;\n  let variables;\n\n  if (\n    !dashboardFragment ||\n    !dashboardFragment.fragments ||\n    !dashboardFragment.mainFragmentName\n  ) {\n    console.warn(\n      'useDashboardQueryProps: dashboardFragment has to contain fragments and mainFragmentName',\n    );\n    return { variables, query };\n  }\n\n  const { dashboardId, screenId, sharingHash } = useParams();\n\n  if (dashboardId) {\n    query = gql`\n      query Dashboard($id: ID!) {\n        dashboard(id: $id) {\n           ...${dashboardFragment.mainFragmentName}\n        }\n      }\n      ${dashboardFragment.fragments}\n    `;\n    variables = { id: dashboardId };\n  } else if (sharingHash) {\n    query = gql`\n      query DashboardBySharingHash($sharingHash: String!) {\n        dashboard: dashboardBySharingHash(sharingHash: $sharingHash) {\n          ...${dashboardFragment.mainFragmentName}\n        }\n      }\n      ${dashboardFragment.fragments}\n    `;\n    variables = { sharingHash };\n  } else if (screenId) {\n    query = gql`\n      query DashboardByScreenId($screenId: ID!) {\n        dashboard: screenContent(screenId: $screenId) {\n          ...on Dashboard {\n            ...${dashboardFragment.mainFragmentName}\n          }\n        }\n      }\n      ${dashboardFragment.fragments}\n    `;\n    variables = { screenId };\n  } else {\n    console.warn(\n      \"useDashboardQueryProps: Neither dashboardId, sharingHash nor screenId were defined in URL params, this means we can't create a dashboard query.\",\n    );\n  }\n\n  return { variables, query };\n};\n\nexport default useDashboardQueryProps;\n","import gql from 'graphql-tag';\nimport * as instrumentFragment from './instrument-fragment.graphql';\nimport * as numberFormatFragment from './numberFormat-fragment.graphql';\nimport * as statusIndicatorFormatFragment from './statusIndicator-fragment.graphql';\n\nexport const CustomizationDashboardFragment = {\n  mainFragmentName: 'CustomizationDashboardFragment',\n  fragments: gql`\n    fragment CustomizationDashboardFragment on Dashboard {\n      id\n      customization {\n        fontSize\n        logoSource\n        showClock\n        showFooter\n        showLogo\n        theme {\n          __typename\n          ... on BuiltInTheme {\n            themeType\n          }\n          ... on CustomTheme {\n            backgroundColor\n            frameStyle\n          }\n          ... on CustomCSSTheme {\n            fileName\n          }\n        }\n        legacyWidgetTitleSize\n      }\n      layoutType {\n        __typename\n        ... on FixedLayout {\n          grid\n        }\n        ... on ClassicLayout {\n          columnCount\n          scaleToFit\n        }\n      }\n    }\n  `,\n};\n\nexport const ContainerLayoutDashboardFragment = {\n  mainFragmentName: 'ContainerLayoutDashboardFragment',\n  fragments: gql`\n    fragment ContainerLayoutDashboardFragment on Dashboard {\n      id\n      legacyId\n      sharingHash\n      title\n      timezone {\n        name\n      }\n      ...${CustomizationDashboardFragment.mainFragmentName}\n      containers {\n        id\n        title\n        area {\n          rowStart\n          columnStart\n          rowSpan\n          columnSpan\n        }\n        frames {\n          id\n          instrument {\n            ...InstrumentFragment\n          }\n          span\n        }\n      }\n      ipRestrictions\n    }\n    ${CustomizationDashboardFragment.fragments}\n    ${instrumentFragment}\n    ${numberFormatFragment}\n    ${statusIndicatorFormatFragment}\n  `,\n};\n\nexport const NonContainerLayoutDashboardFragment = {\n  mainFragmentName: 'NonContainerLayoutDashboardFragment',\n  fragments: gql`\n    fragment NonContainerLayoutDashboardFragment on Dashboard {\n      id\n      legacyId\n      sharingHash\n      title\n      timezone {\n        name\n      }\n      ...${CustomizationDashboardFragment.mainFragmentName}\n      frames {\n        id\n        size {\n          height\n          width\n        }\n        position {\n          left\n          top\n          stackOrder\n        }\n        instrument {\n          ...InstrumentFragment\n        }\n      }\n      offCanvasInstruments {\n        ...InstrumentFragment\n      }\n    }\n    ${CustomizationDashboardFragment.fragments}\n    ${instrumentFragment}\n    ${numberFormatFragment}\n    ${statusIndicatorFormatFragment}\n  `,\n};\n","import { useQuery } from '@apollo/react-hooks';\nimport useDashboardQueryProps from './use-dashboard-query-props';\nimport { CustomizationDashboardFragment } from '../services/concierge-service/graphql/dashboard-query-fragments';\n\nconst useCurrentDashboardCustomization = () => {\n  const { query, variables } = useDashboardQueryProps(\n    CustomizationDashboardFragment,\n  );\n\n  return useQuery(query, { variables });\n};\n\nexport default useCurrentDashboardCustomization;\n","import { useQuery } from '@apollo/react-hooks';\nimport useDashboardQueryProps from './use-dashboard-query-props';\nimport useCurrentDashboardCustomization from './use-current-dashboard-customization';\nimport {\n  ContainerLayoutDashboardFragment,\n  NonContainerLayoutDashboardFragment,\n} from '../services/concierge-service/graphql/dashboard-query-fragments';\nimport { LAYOUT_TYPES } from '../dashboard/dashboard-layout/constants';\n\nconst useCurrentDashboard = () => {\n  // Get the dashboard layout type to know if we\n  // should make a query for fixed or container layout.\n  const { data, loading, error } = useCurrentDashboardCustomization();\n\n  if (loading || error || !data) {\n    return { data, loading, error };\n  }\n\n  const {\n    dashboard: {\n      layoutType: { __typename: layoutType },\n    },\n  } = data;\n\n  const fragment =\n    layoutType === LAYOUT_TYPES.ContainerLayout\n      ? ContainerLayoutDashboardFragment\n      : NonContainerLayoutDashboardFragment;\n\n  const { query, variables } = useDashboardQueryProps(fragment);\n  return useQuery(query, { variables });\n};\n\nexport default useCurrentDashboard;\n","import { useDrag } from 'react-dnd';\n\nconst useDragHelper = spec => {\n  return useDrag(spec);\n};\n\nexport default useDragHelper;\n","import { useDragLayer } from 'react-dnd';\n\nconst useDragLayerHelper = spec => {\n  return useDragLayer(spec);\n};\n\nexport default useDragLayerHelper;\n","import { useDrop } from 'react-dnd';\n\nconst useDropHelper = spec => {\n  return useDrop(spec);\n};\n\nexport default useDropHelper;\n","import { useSelector } from 'react-redux';\nimport { get } from 'lodash';\n\nconst FEATURE_FLAGS_PATH = 'user.user.features';\n\nconst useFeatureFlags = () => {\n  const flags = useSelector(state => get(state, FEATURE_FLAGS_PATH));\n  return {\n    flags: flags || [],\n    ready: !!flags,\n  };\n};\n\nexport default useFeatureFlags;\n","import { useSelector } from 'react-redux';\nimport { get } from 'lodash';\n\nconst ALLOWANCES_PATH = 'user.user.allowances';\n\nconst useAllowances = () => {\n  const allowances = useSelector(state => get(state, ALLOWANCES_PATH));\n\n  return {\n    allowances: allowances || {},\n    ready: !!allowances,\n  };\n};\n\nexport default useAllowances;\n","import { useQuery } from '@apollo/react-hooks';\nimport gql from 'graphql-tag';\nimport useDashboardQueryProps from './use-dashboard-query-props';\n\nexport const DashboardTitleFragment = {\n  mainFragmentName: 'DashboardTitleFragment',\n  fragments: gql`\n    fragment DashboardTitleFragment on Dashboard {\n      title\n    }\n  `,\n};\n\nconst useDashboardTitle = () => {\n  const { query, variables } = useDashboardQueryProps(DashboardTitleFragment);\n  const { loading, error, data } = useQuery(query, { variables });\n\n  if (loading || error) {\n    return null;\n  }\n\n  return data.dashboard.title;\n};\n\nexport default useDashboardTitle;\n","import { useQuery } from '@apollo/react-hooks';\nimport gql from 'graphql-tag';\nimport useDashboardQueryProps from './use-dashboard-query-props';\n\nexport const DashboardLayoutFragment = {\n  mainFragmentName: 'DashboardLayoutFragment',\n  fragments: gql`\n    fragment DashboardLayoutFragment on Dashboard {\n      layoutType {\n        __typename\n      }\n    }\n  `,\n};\n\n// NOTE: When used in edit mode, this hook will only reliably return a\n// layout type for the container layout, since all the other dashboards\n// don't run on GraphQL yet.\nconst useDashboardLayoutType = () => {\n  const { query, variables } = useDashboardQueryProps(DashboardLayoutFragment);\n  const { loading, error, data } = useQuery(query, { variables });\n\n  if (loading || error || !data.dashboard) {\n    return null;\n  }\n\n  return data.dashboard.layoutType.__typename;\n};\n\nexport default useDashboardLayoutType;\n","import { useEffect, useRef } from 'react';\n\n/**\n * This hooks allows us to listen for clicks outside an element.\n * Unfortunately it's not possible to fully test the usage\n * of this hook because we can't test that the ref it returns\n * is passed to the correct element. If using this hook, consider\n * rewriting it in a way that makes it testable. More about it\n * in this comment and see how it's currently tested:\n * https://github.com/geckoboard/polecat/pull/5732#discussion_r375757148\n */\n\nconst useClickOutsideListener = callback => {\n  const ref = useRef(null);\n\n  const clickHandler = event => {\n    if (ref.current && !ref.current.contains(event.target)) {\n      callback();\n    }\n  };\n\n  // This effect is run on mount and un-mount\n  useEffect(() => {\n    document.addEventListener('click', clickHandler);\n    return () => {\n      document.removeEventListener('click', clickHandler);\n    };\n  }, []);\n\n  return ref;\n};\n\nexport default useClickOutsideListener;\n","import { useState, useEffect } from 'react';\nimport { getDocumentElement } from '../lib/global';\nimport { isMobileViewport } from '../lib/mobile';\n\nconst isMobileSize = () => {\n  const documentElement = getDocumentElement();\n  return isMobileViewport(documentElement.clientWidth);\n};\n\nconst useMobileDetect = () => {\n  const [isMobile, setIsMobile] = useState(isMobileSize());\n\n  const resizeHandler = () => {\n    setIsMobile(isMobileSize());\n  };\n\n  useEffect(() => {\n    window.addEventListener('resize', resizeHandler);\n    return () => {\n      window.removeEventListener('resize', resizeHandler);\n    };\n  }, []);\n\n  return isMobile;\n};\n\nexport default useMobileDetect;\n","import { useEffect } from 'react';\nimport { noop } from 'lodash';\n\nconst isEscape = event => {\n  if ('key' in event) {\n    return event.key === 'Escape' || event.key === 'Esc';\n  }\n\n  return event.keyCode === 27;\n};\n\nconst isEnter = event => {\n  if ('key' in event) {\n    return event.key === 'Enter';\n  }\n\n  return event.keyCode === 13;\n};\n\nconst useEnterAndEscape = ({ onEnter = noop, onEscape = noop }) => {\n  const callback = event => {\n    if (isEscape(event)) {\n      onEscape(event);\n    }\n\n    if (isEnter(event)) {\n      onEnter(event);\n    }\n  };\n\n  useEffect(() => {\n    document.addEventListener('keydown', callback);\n    return () => document.removeEventListener('keydown', callback);\n  }, [onEnter, onEscape]);\n};\n\nexport default useEnterAndEscape;\n","import { useSelector } from 'react-redux';\nimport { get, includes } from 'lodash';\n\nconst ALLOWANCES_PATH = 'user.organization.allowances';\nconst FEATURE_FLAGS_PATH = 'user.user.features';\n\nconst useIsFreePlan = () => {\n  const allowances = useSelector(state => get(state, ALLOWANCES_PATH));\n  const flags = useSelector(state => get(state, FEATURE_FLAGS_PATH));\n\n  // For now, we want to treat a user as on the \"free\" plan if they have the feature flag,\n  // or if they have the relevant allowance\n  return !!allowances.is_free || includes(flags, 'ff:freemium');\n};\n\nexport default useIsFreePlan;\n","import useCanUserEdit from './use-can-user-edit';\nimport useCurrentDashboard from './use-current-dashboard';\nimport useCurrentDashboardCustomization from './use-current-dashboard-customization';\nimport useDashboardQueryProps from './use-dashboard-query-props';\nimport useDragHelper from './use-drag-helper';\nimport useDragLayerHelper from './use-drag-layer-helper';\nimport useDropHelper from './use-drop-helper';\nimport useFeatureFlags from './use-feature-flags';\nimport useAllowances from './use-allowances';\nimport useDashboardTitle from './use-dashboard-title';\nimport useDashboardLayoutType from './use-dashboard-layout-type';\nimport useClickOutsideListener from './use-click-outside-listener';\nimport useMobileDetect from './use-mobile-detect';\nimport useEnterAndEscape from './use-enter-and-escape';\nimport useIsFreePlan from './use-is-free-plan';\n\nexport {\n  useCanUserEdit,\n  useCurrentDashboard,\n  useCurrentDashboardCustomization,\n  useDashboardQueryProps,\n  useDragHelper,\n  useDragLayerHelper,\n  useDropHelper,\n  useFeatureFlags,\n  useAllowances,\n  useDashboardTitle,\n  useDashboardLayoutType,\n  useClickOutsideListener,\n  useMobileDetect,\n  useEnterAndEscape,\n  useIsFreePlan,\n};\n","import PropTypes from 'prop-types';\nimport React, { PureComponent, Children, cloneElement } from 'react';\nimport { isFunction, partial } from 'lodash';\nimport classNames from 'classnames';\nimport { getDocumentElement } from '../../../lib/global';\n\nimport style from './drop-menu-style.scss';\n\nconst MENU_MAX_HEIGHT = 256;\nconst UPWARDS_MARGIN = 1;\n\nclass DropMenuComponent extends PureComponent {\n  handleAction() {\n    const { autoClose } = this.props;\n\n    if (autoClose) {\n      this.props.onClose();\n    }\n  }\n\n  getListPosition(origin) {\n    if (!this.dropMenuButton || !this.props.open) {\n      return null;\n    }\n\n    if (origin === 'auto') {\n      const menuBoundingRect = this.dropMenuButton.getBoundingClientRect();\n      const { top: buttonTop, height: buttonHeight } = menuBoundingRect;\n\n      return this.shouldMenuRenderUpwards(buttonTop, buttonHeight)\n        ? { bottom: '100%' }\n        : { top: '100%' };\n    } else if (origin === 'top right') {\n      const { width } = this.dropMenuButton.getBoundingClientRect();\n      return { top: 0, left: width };\n    }\n\n    return null;\n  }\n\n  renderButton() {\n    const { label, hasHover } = this.props;\n    const buttonClasses = classNames(style.button, {\n      [style.noHover]: !hasHover,\n    });\n\n    if (!label) {\n      return null;\n    }\n\n    return (\n      <button\n        type=\"button\"\n        ref={dropMenuButton => (this.dropMenuButton = dropMenuButton)}\n        className={buttonClasses}\n        onClick={this.props.onToggle}\n        tabIndex={-1}\n        data-acc-id=\"drop-menu-toggle\"\n      >\n        {isFunction(label) ? label({ open: this.props.open }) : label}\n      </button>\n    );\n  }\n\n  renderChildren() {\n    const { children, onClose, open } = this.props;\n\n    // When a child function is passed we pass\n    // onClose to it to defer responsibility\n    // for closing the menu to the child.\n    if (isFunction(children)) {\n      return children({ closeMenu: onClose, open });\n    }\n\n    // Otherwise we assume that each child has an\n    // onClick prop that we can monkey patch\n    // to close the menu automatically.\n    return Children.toArray(children)\n      .filter(child => child !== null)\n      .map(child => {\n        const extendedProps = {};\n        if (isFunction(child.props.onClick)) {\n          extendedProps.onClick = partial(child.props.onClick, () => onClose());\n        }\n        return cloneElement(child, extendedProps);\n      });\n  }\n\n  render() {\n    const {\n      layoutClassName,\n      origin,\n      isAnchored,\n      open,\n      name,\n      listClassName,\n      animate,\n      renderSearchInput,\n    } = this.props;\n    const wrapperClasses = classNames(layoutClassName, style.dropMenu);\n    const listClasses = classNames(style.list, {\n      [listClassName]: listClassName,\n      [style.open]: open,\n      [style.animate]: animate,\n      [style.anchored]: isAnchored,\n      [style.topRight]: origin === 'top right',\n      [style.bottomLeft]: origin === 'bottom left',\n      [style.topLeft]: origin === 'top left',\n      [style.auto]: origin === 'auto',\n    });\n    const listPosition = this.getListPosition(origin);\n\n    return (\n      <div className={wrapperClasses}>\n        {this.renderButton()}\n        {open && renderSearchInput && renderSearchInput()}\n        <ul\n          role=\"menu\"\n          data-menu={name}\n          ref={dropMenu => (this.dropMenu = dropMenu)}\n          className={listClasses}\n          style={listPosition}\n          onFocus={this.props.onFocus}\n          onClick={() => this.handleAction()}\n        >\n          <div>{this.renderChildren()}</div>\n        </ul>\n      </div>\n    );\n  }\n\n  shouldMenuRenderUpwards(buttonTop, buttonHeight) {\n    const viewportHeight = getDocumentElement().clientHeight;\n\n    // Instead of trying to calculate the size of container\n    // simply pass it in as props. This is fine for now since\n    // this only applies to universal config where the header and\n    // footer heights are fixed.\n    const { containerPosition } = this.props;\n\n    // If menu doesn't fit below button, render it above but only if it\n    // actually fits above too. Otherwise leave it below and you just have to\n    // scroll the container to see it. This will only happen on very short screens.\n    const fitsAbove =\n      buttonTop - UPWARDS_MARGIN >= MENU_MAX_HEIGHT + containerPosition.fromTop;\n    const fitsBelow =\n      buttonTop + buttonHeight + MENU_MAX_HEIGHT <=\n      viewportHeight - containerPosition.fromBottom;\n\n    return !fitsBelow && fitsAbove;\n  }\n}\n\nDropMenuComponent.defaultProps = {\n  autoClose: true,\n  isAnchored: true,\n  hasHover: true,\n  animate: true,\n  containerPosition: {\n    fromTop: 96, // masthead height on universal config page\n    fromBottom: 68, // height of save/cancel buttons on universal config\n  },\n};\n\nDropMenuComponent.propTypes = {\n  animate: PropTypes.bool,\n  autoClose: PropTypes.bool,\n  children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n  containerPosition: PropTypes.shape({\n    fromBottom: PropTypes.number,\n    fromTop: PropTypes.number,\n  }),\n  hasHover: PropTypes.bool,\n  isAnchored: PropTypes.bool,\n  label: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\n  layoutClassName: PropTypes.string,\n  listClassName: PropTypes.string,\n  name: PropTypes.string,\n  open: PropTypes.bool,\n  origin: PropTypes.oneOf(['top right', 'bottom left', 'top left', 'auto']),\n  renderSearchInput: PropTypes.func,\n  onClose: PropTypes.func,\n  onFocus: PropTypes.func,\n  onToggle: PropTypes.func,\n};\n\nexport default DropMenuComponent;\n","import DropMenuComponent from './drop-menu-component';\nimport menu from '../../../hoc/menu';\nexport default menu(DropMenuComponent);\n","import { isUndefined, isEqual } from 'lodash';\nimport createAction from '../../../lib/redux/create-action';\nimport { update } from '../../../lib/widget-service';\nimport * as toastActions from '../../../toast/actions/toast-actions';\nimport { getIntegrationTrackingDetails } from '../../../data-sources/data-sources-helpers';\nimport { trackEvent } from '@Tracking';\nimport {\n  widgetConfigEdited,\n  widgetGoalAdded,\n  widgetGoalEdited,\n  widgetGoalRemoved,\n} from '@Tracking/events';\n\nexport const setConfig = createAction('EditWidget:SET_CONFIG');\nexport const setConfigAndData = createAction('EditWidget:SET_CONFIG_AND_DATA');\nexport const changeRefreshInterval = createAction(\n  'EditWidget:CHANGE_REFRESH_INTERVAL',\n);\n\nexport const configUpdated = createAction('EditWidget:CONFIG_UPDATED');\n\nexport const handleGoalTracking = async (\n  originalWidget,\n  newConfig,\n  integration,\n) => {\n  const {\n    goal: originalGoal,\n    comparision: originalComparision,\n  } = originalWidget.config;\n\n  const { goal: newGoal, comparision: newComparision } = newConfig;\n\n  const hasGoalValuesChanged =\n    !isEqual(originalGoal, newGoal) ||\n    !isEqual(originalComparision, newComparision);\n\n  const hasOriginalGoalValues =\n    !isUndefined(originalGoal) || !isUndefined(originalComparision);\n\n  const hasNewGoalValues =\n    !isUndefined(newGoal) || !isUndefined(newComparision);\n\n  if (hasGoalValuesChanged) {\n    const {\n      id,\n      config: { type },\n    } = originalWidget;\n\n    const trackingDetails = {\n      'Legacy widget ID': `${id}`,\n      Visualisation: type,\n      ...getIntegrationTrackingDetails(integration),\n    };\n\n    if (!hasOriginalGoalValues) {\n      await trackEvent(widgetGoalAdded(trackingDetails));\n      return;\n    }\n\n    if (hasNewGoalValues) {\n      await trackEvent(widgetGoalEdited(trackingDetails));\n      return;\n    }\n\n    await trackEvent(widgetGoalRemoved(trackingDetails));\n  }\n};\n\nexport const updateWidget = (widgetKey, dashboardId) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    config,\n    refresh_interval: refreshInterval,\n    serviceName,\n    transformedData: { data },\n  } = getState().editWidget;\n\n  dispatch(\n    configUpdated({\n      config,\n      data,\n      widgetKey,\n      refresh_interval: refreshInterval,\n    }),\n  );\n\n  try {\n    const widget = await update(widgetKey, {\n      dashboard_id: dashboardId,\n      config,\n      refresh_interval: refreshInterval,\n      service_name: serviceName,\n    });\n\n    const integration = {\n      name: widget.service.title,\n      slug: widget.service.name,\n    };\n\n    trackEvent(\n      widgetConfigEdited({\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.config.type,\n        ...getIntegrationTrackingDetails(integration),\n      }),\n    );\n\n    await handleGoalTracking(widget, config, integration);\n  } catch (e) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","import createAction from '../../lib/redux/create-action';\nimport universalService from '../../universal/services/universal-service';\nimport * as managementService from '../../services/management-service';\nimport mirageService from '../../services/mirage-service';\nimport * as mirageHelpers from './mirage-helpers';\nimport * as universalBootstrapActions from '../actions/universal-bootstrap-actions';\nimport * as universalConfigActions from '../actions/universal-config-actions';\nimport { find } from 'lodash';\n\nexport const setProxyIntegration = createAction(\n  'UniversalConfig:SET_PROXY_INTEGRATION',\n);\nexport const setActivatedIntegrations = createAction(\n  'Mirage:SET_ACTIVE_INTEGRATIONS',\n);\nexport const setMirageProxyService = createAction(\n  'Mirage:SET_MIRAGE_PROXY_SERVICE',\n);\n\nexport const initMirageServiceAccount = service => dispatch => {\n  const mirageServiceAccounts = [\n    mirageHelpers.createMirageServiceAccount(service),\n  ];\n  dispatch(universalBootstrapActions.setServiceAccounts(mirageServiceAccounts));\n  dispatch(universalBootstrapActions.setServiceAccountId('MIRAGE'));\n};\n\nexport const initMirageConfig = ({\n  serviceId,\n  dashboardId,\n  proxyIntegration,\n}) => async dispatch => {\n  dispatch(universalBootstrapActions.resetInitial());\n\n  await dispatch(\n    universalBootstrapActions.bootstrapUniversalService(dashboardId, serviceId),\n  );\n\n  dispatch(setProxyIntegration(proxyIntegration));\n\n  const metadata = await universalService.fetchMetadata(proxyIntegration.name);\n  const { initialQueries } = metadata;\n  const { query } = initialQueries.number;\n  const queries = [query];\n\n  await dispatch(universalBootstrapActions.bootstrapServiceAccounts());\n\n  dispatch(universalBootstrapActions.setRawQueries(queries));\n\n  await dispatch(universalBootstrapActions.bootstrapGraph([], [], false));\n};\n\nexport const bootstrapMirageFromConfig = config => async (\n  dispatch,\n  getState,\n) => {\n  const { integration = {} } = config;\n  const { id: mirageProxyServiceId } = integration;\n  const { dataSources: { services = [] } = {} } = getState();\n  let service;\n\n  dispatch(setProxyIntegration(integration));\n\n  if (services.length) {\n    service = find(services, { id: mirageProxyServiceId });\n  }\n\n  if (!service) {\n    service = await managementService.getService(mirageProxyServiceId);\n  }\n\n  dispatch(setMirageProxyService(service));\n};\n\nexport const runMirageQuery = () => (dispatch, getState) => {\n  const { uiQuery, queries } = getState().universal;\n  const [query] = queries; // With Mirage, we're only ever dealing with a single query at a time\n\n  const delivery = {\n    mode: 'async',\n  };\n\n  dispatch(universalConfigActions.fetchVizDataStart());\n\n  const { queryId, response } = mirageService.runQuery(\n    uiQuery,\n    query,\n    delivery,\n  );\n\n  dispatch(universalConfigActions.setQueryIds([queryId]));\n  dispatch(universalConfigActions.clearQueryResults());\n\n  // Wait a second before dispatching the \"success\", to simulate fetching real data\n  setTimeout(() => {\n    dispatch(\n      universalConfigActions.fetchVizDataSuccess({\n        data: [[response]],\n        done: true,\n        queryId,\n      }),\n    );\n  }, 1000);\n};\n","module.exports = (__webpack_require__(28))(121);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport config from '../../universal/config';\nimport Image from '@UI/image';\nimport styles from './service-icon-style.scss';\n\nconst ServiceIconComponent = ({ serviceName, size, rounded, className }) => {\n  const iconBase = `${config.get().StaticAssetBaseURL}/logos`;\n\n  return (\n    <Image\n      width={size}\n      height={size}\n      src={`${iconBase}/${serviceName}.png`}\n      className={classnames(className, { [styles.rounded]: rounded })}\n    />\n  );\n};\n\nServiceIconComponent.propTypes = {\n  serviceName: PropTypes.string.isRequired,\n  size: PropTypes.number.isRequired,\n  className: PropTypes.string,\n  rounded: PropTypes.bool,\n};\n\nexport default ServiceIconComponent;\n","import ServiceIcon from './service-icon-component';\n\nexport default ServiceIcon;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport style from './bubble-style.scss';\n\nconst BubbleComponent = ({ children, isLight, isWide }) => {\n  const className = classNames(style.bubble, {\n    [style.isLight]: isLight,\n    [style.isWide]: isWide,\n  });\n\n  return <div className={className}>{children}</div>;\n};\n\nBubbleComponent.propTypes = {\n  children: PropTypes.node,\n  isLight: PropTypes.bool,\n  isWide: PropTypes.bool,\n};\n\nexport default BubbleComponent;\n","import BubbleComponent from './bubble-component';\nexport default BubbleComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { capitalize } from 'lodash';\nimport AbsolutePositioned from '../absolute-positioned';\nimport Bubble from '../bubble';\nimport classNames from 'classnames';\nimport style from './info-bubble-style.scss';\n\nconst BUBBLE_PADDING = 10;\n\nclass InfoBubbleComponent extends Component {\n  render() {\n    const {\n      type,\n      toggleTooltip,\n      isVisible,\n      isDark,\n      isBubbleLight,\n      targetPosition,\n      isBubbleWide,\n      zIndex,\n      openingDirection,\n    } = this.props;\n    const className = classNames(style.icon, {\n      [style.help]: type === 'help',\n      [style.warning]: type === 'warning',\n      [style.info]: type === 'info',\n      [style.isDark]: isDark,\n      [style.isVisible]: isVisible,\n    });\n    const { top: tTop, left: tLeft, width, height } = targetPosition;\n    const top = tTop + height / 2;\n    let position = {};\n    let transform;\n\n    switch (openingDirection) {\n      case 'left': {\n        position = { top, left: tLeft, zIndex };\n        transform = `translate(calc(-100% - ${BUBBLE_PADDING}px), -50%)`;\n        break;\n      }\n      default: {\n        const left = tLeft + width;\n        position = { top, left, zIndex };\n        transform = `translate(${BUBBLE_PADDING}px, -50%)`;\n        break;\n      }\n    }\n\n    return (\n      <span>\n        <span\n          className={className}\n          onClick={e => toggleTooltip(!isVisible, e)}\n          title={capitalize(type)}\n        />\n        <AbsolutePositioned {...position} isVisible={isVisible} isFixed>\n          <div style={{ transform }}>\n            <Bubble isWide={isBubbleWide} isLight={isBubbleLight}>\n              {this.props.children}\n            </Bubble>\n          </div>\n        </AbsolutePositioned>\n      </span>\n    );\n  }\n}\n\nInfoBubbleComponent.defaultProps = {\n  isDark: false,\n  isBubbleLight: false,\n  isVisible: false,\n  targetPosition: {},\n  type: 'help',\n  openingDirection: 'right',\n};\n\nInfoBubbleComponent.propTypes = {\n  children: PropTypes.node,\n  isBubbleLight: PropTypes.bool,\n  isBubbleWide: PropTypes.bool,\n  isDark: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  openingDirection: PropTypes.oneOf(['left', 'right']),\n  targetPosition: PropTypes.object,\n  toggleTooltip: PropTypes.func,\n  type: PropTypes.string,\n  zIndex: PropTypes.number,\n};\n\nexport default InfoBubbleComponent;\n","import tooltip from '../../hoc/tooltip';\nimport InfoBubbleComponent from './info-bubble-component';\nexport default tooltip(InfoBubbleComponent);\n","export const GRID_WIDTH = 1910;\nexport const GRID_HEIGHT = 950;\nexport const FRAME_WIDTH = 1920;\nexport const FRAME_HEIGHT = 1080;\nexport const STABLE_TOP = 34;\nexport const STABLE_TOP_PAD = 32;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Button\":\"Button---WcG5U\",\"intent-primary\":\"intent-primary---p_IgT\",\"intent-secondary\":\"intent-secondary---1Jbf-\",\"intent-link\":\"intent-link---E1Rzc\",\"hasIcon\":\"hasIcon---crQLg\",\"intent-negative\":\"intent-negative---1sp3P\",\"stretched\":\"stretched---2sbQW\",\"size-extra-small\":\"size-extra-small---1yAhy\",\"spinner\":\"spinner---2cg_D\",\"size-small\":\"size-small---O02Cw\",\"size-medium\":\"size-medium---1dLqi\",\"size-large\":\"size-large---haEre\",\"loading\":\"loading---2ru90\",\"icon\":\"icon---2QaZO\",\"iconNoChildren\":\"iconNoChildren---2qAMB\",\"spinnerContainer\":\"spinnerContainer---2jJ3y\",\"spinnerTransition\":\"spinnerTransition---2DuVP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropMenu\":\"dropMenu---4DK-8\",\"button\":\"button---10SAL\",\"noHover\":\"noHover---1CVh3\",\"list\":\"list---2MGYI\",\"animate\":\"animate---dCD7J\",\"open\":\"open---2u1mD\",\"anchored\":\"anchored---3nM07\",\"topRight\":\"topRight---16RvG\",\"bottomLeft\":\"bottomLeft---mschC\",\"topLeft\":\"topLeft---3EcBM\",\"auto\":\"auto---2fT4B\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"warning\":\"warning---3DZOE\",\"positive\":\"positive---2lcZQ\",\"state\":\"state---1pjPD\",\"stateLabel\":\"stateLabel---3WKgo\",\"thresholdType\":\"thresholdType---8a_Bv\",\"duration\":\"duration---21FeJ\",\"value\":\"value---21JtY\",\"durationInput\":\"durationInput---2r4sU\",\"durationInputClear\":\"durationInputClear---fNMGh\",\"iconButton\":\"iconButton---3kx0E\"};","import createAction from '../../lib/redux/create-action';\nimport { omit, every, isUndefined, isEqual } from 'lodash';\nimport localForage from 'localforage/dist/localforage.nopromises';\nimport { create, update } from '../../lib/widget-service';\nimport { redirect, getWindow } from '../../lib/global';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { STORAGE_KEY_LAST_ADDED_WIDGET } from '../../widget/constants/widget-location-constants';\nimport { STORAGE_IMPORTING_SERVICE } from '../../dashboard/dashboard-constants';\nimport { TEMPLATES } from '../../universal/serializers/services';\nimport { removeKeysWithUnderscore } from '../../universal/serializers/helpers';\nimport {\n  cancelQueries,\n  initConfig,\n  universalSetError,\n} from './universal-config-actions';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport { arrangeConfig } from '../reducer/config-helpers';\nimport { setPreferences } from '../persist-config-helpers';\nimport widgetStorage from '../../lib/widget-storage';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  widgetCreated,\n  widgetConfigEdited,\n  widgetGoalAdded,\n  widgetGoalEdited,\n  widgetGoalRemoved,\n} from '@Tracking/events';\nimport { requiresImport } from '../../imports/helpers';\nimport * as pathHelpers from '../../lib/path';\nimport bugsnag from '../../lib/bugsnag';\nimport * as mirageHelpers from '../mirage/mirage-helpers';\nimport * as mirageActions from '../mirage/mirage-actions';\nimport * as grapqhlDashboardHelpers from '../../dashboard/graphql-dashboard-helpers';\n\nexport const configUpdated = createAction('UniversalConfigSave:CONFIG_UPDATED');\nexport const isSaving = createAction('UniversalSave:IS_SAVING');\n\nconst prepareWidgetData = (dashboardId, getState) => {\n  const { config, queries = [], source: rawSource = {} } = getState().universal;\n  const {\n    integration,\n    integrationMeta,\n    service_account_id: serviceAccountId,\n    isMirage,\n  } = rawSource;\n  const cleanConfig = removeKeysWithUnderscore(arrangeConfig(config));\n  const { queryMetas = [] } = cleanConfig;\n  const source = { integration };\n\n  // Remove values when field has query_custom_values and add source to query\n  const amendedMetas = queryMetas.map(meta => {\n    const { select = [] } = meta;\n    const amendedSelect = select.map(selectMeta =>\n      selectMeta.query_custom_values\n        ? omit(\n            {\n              ...selectMeta,\n              query_custom_values: {\n                ...selectMeta.query_custom_values,\n                source,\n              },\n            },\n            'values',\n          )\n        : selectMeta,\n    );\n    return {\n      ...meta,\n      select: amendedSelect,\n    };\n  });\n\n  // Inject source into all queries\n  const beQueries = queries.map(query => ({ ...query, source }));\n\n  const data = {\n    dashboard_id: dashboardId,\n    config: {\n      ...cleanConfig,\n      queries: beQueries,\n      template: TEMPLATES[config.type],\n      queryMetas: amendedMetas,\n    },\n    service_name: integration,\n    service_account_id: serviceAccountId,\n  };\n\n  // Mirage widgets need to be handled slightly differently in terms of config setup\n  const preparedData = isMirage\n    ? mirageHelpers.prepareMirageWidget(data, {\n        id: integrationMeta.serviceId,\n        name: integration,\n      })\n    : data;\n\n  return preparedData;\n};\n\nconst saveUserPreferences = async getState => {\n  const { universal } = getState();\n  try {\n    await setPreferences(universal);\n  } catch (e) {\n    // silently fails it's a nice to have\n  }\n  return Promise.resolve();\n};\n\nconst createAndTrack = async (\n  dashboardId,\n  widgetData,\n  user,\n  type,\n  fromCompact = false,\n) => {\n  const { id: userId, organization_id: orgId } = user;\n  const { service_name: serviceName } = widgetData;\n\n  const widget = await create(widgetData);\n  const properties = {\n    widget_id: widget.id,\n    service_name: serviceName,\n    visualisation: type,\n    is_universal: true,\n    from_compact: fromCompact,\n  };\n\n  track('Widget added', { properties });\n  // Duplicated event for Intercom purpose only...\n  track(`${serviceName} - Widget added`, { properties }); // eslint-disable-line camelcase\n\n  trackEvent(\n    widgetCreated({\n      'Integration name': widget.services[0].name,\n      'Integration slug': serviceName,\n      'Legacy widget ID': `${widget.id}`,\n      Visualisation: type,\n      'Widget type ID': `${widget.widget_type_id}`,\n    }),\n  );\n\n  trackSnowplow('widget_add', '1-0-0', {\n    user_id: `${userId}`,\n    org_id: `${orgId}`,\n    widget_id: `${widget.id}`,\n    dashboard_id: `${dashboardId}`,\n    service_id: `${widget.services[0].id}`,\n    service_name: widget.services[0].name,\n    visualisation_type: type,\n  });\n\n  return widget;\n};\n\nexport const createWidget = dashboardId => async (dispatch, getState) => {\n  try {\n    const {\n      universal: {\n        config: { type },\n        preset: {\n          id: presetId,\n          title: presetName,\n          queries: presetQueries,\n        } = {},\n        queries,\n        queriesFetchDone,\n        transformedData,\n      },\n      user: { user = {} } = {},\n    } = getState();\n    const { id: userId, organization_id: orgId } = user;\n    const widgetData = prepareWidgetData(dashboardId, getState);\n    const { service_name: serviceName } = widgetData;\n    await saveUserPreferences(getState);\n\n    const presetTrackingData = {\n      title: widgetData.config.title,\n    };\n\n    if (presetId) {\n      presetTrackingData.preset_id = presetId;\n      presetTrackingData.preset_name = presetName;\n      presetTrackingData.preset_was_changed =\n        JSON.stringify(presetQueries) !== JSON.stringify(queries);\n\n      // We are passing the presetId into the widget config, so we are able to track\n      // which widgets were created from which presets in the DB\n      widgetData.config.from_preset = presetId;\n    }\n\n    track('Universal config - Click Add to Dashboard', {\n      properties: {\n        visualisation: type,\n        service_name: serviceName,\n        ...presetTrackingData,\n      },\n    });\n    // TODO allow preset tracking props\n    trackSnowplow('universal-config-add-to-dashboard_click', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      service_name: serviceName,\n      visualisation_type: type,\n      widget_title: widgetData.config.title,\n    });\n\n    dispatch(isSaving(true));\n    dispatch(cancelQueries('saved widget', true));\n\n    const widget = await createAndTrack(dashboardId, widgetData, user, type);\n\n    if (every(queriesFetchDone)) {\n      widgetStorage.setItem(\n        `widgetData:${widget.data_id}`,\n        JSON.stringify(transformedData),\n      );\n    }\n\n    redirect(\n      pathHelpers.getDashboardPath(dashboardId.toString(), widget.id),\n      300,\n    );\n  } catch (error) {\n    dispatch(isSaving(false));\n    dispatch(universalSetError(error));\n  }\n};\n\nexport const updateWidget = (widgetKey, dashboardId, instrumentId) => async (\n  dispatch,\n  getState,\n) => {\n  let originalWidgetData;\n  try {\n    const {\n      universal: {\n        queriesFetchDone,\n        transformedData,\n        source,\n        config: { type },\n        queries,\n        error,\n        service,\n      },\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n      widgetData = {},\n    } = getState();\n\n    const graphqlDashboard =\n      grapqhlDashboardHelpers.getDashboardFromStorage(dashboardId) || {};\n    const isContainerLayout = grapqhlDashboardHelpers.isContainerLayout(\n      graphqlDashboard,\n    );\n\n    // If we're saving from the dashboard we don't want to save\n    // if there is an error in the config or if the initial\n    // config bootstrap hsan't finished yet\n    if (error || !queries || !queries.length) {\n      return;\n    }\n\n    // Preview fully loaded. We've got the full data payload\n    const widgetDataReady = every(queriesFetchDone);\n    const newWidgetData = prepareWidgetData(dashboardId, getState);\n\n    originalWidgetData = widgetData[widgetKey];\n    // We are optimistic! Saving the widget will succeed so we can replace the\n    // content of your widget already\n\n    if (!widgetDataReady) {\n      // Force loading state for the widget\n      dispatchToGeckoJS(\n        'widget:waiting_initial_server_side_refresh',\n        widgetKey,\n      );\n    }\n    // TODO: Handle no data to visualize state\n\n    const newWidgetContext = {\n      config: newWidgetData.config,\n      data: widgetDataReady ? transformedData : undefined,\n      service_account_id: source.service_account_id,\n      widgetKey,\n      ...(instrumentId ? { instrumentId } : {}),\n    };\n\n    // For Mirage widgets, we save the data into the widget config itself, to be hydrated later\n    if (mirageHelpers.isMirageWidget(newWidgetContext)) {\n      newWidgetContext.config.mirageConfig.data = transformedData;\n    }\n\n    dispatch(configUpdated(newWidgetContext));\n    dispatchToGeckoJS('widget:title:change', {\n      widgetKey,\n      title: newWidgetContext.config.title,\n    });\n\n    await saveUserPreferences(getState);\n    dispatch(isSaving(true));\n    dispatch(cancelQueries('saved widget', true));\n\n    const widget = await update(widgetKey, newWidgetData);\n\n    const properties = {\n      widget_id: widget.id,\n      service_name: widget.service.title,\n      visualisation: type,\n      is_universal: true,\n      from_compact: true,\n    };\n    if (!isContainerLayout) {\n      track('Widget updated', { properties });\n      trackSnowplow('widget_update', '1-0-0', {\n        user_id: `${userId}`,\n        org_id: `${orgId}`,\n        widget_id: `${widget.id}`,\n        dashboard_id: `${dashboardId}`,\n        service_id: `${widget.service.id}`,\n        service_name: widget.service.title,\n        visualisation_type: type,\n      });\n    }\n    trackEvent(\n      widgetConfigEdited({\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n      }),\n    );\n    if (isContainerLayout && instrumentId) {\n      widgetStorage.removeItem(`instrumentData:${instrumentId}`);\n    } else {\n      widgetStorage.removeItem(`widgetData:${widgetKey}`);\n    }\n\n    const {\n      goal: originalGoal,\n      comparision: originalComparision,\n    } = widget.config;\n\n    const {\n      goal: newGoal,\n      comparision: newComparision,\n    } = newWidgetContext.config;\n\n    const hasGoalValuesChanged =\n      !isEqual(originalGoal, newGoal) ||\n      !isEqual(originalComparision, newComparision);\n\n    const hasOriginalGoalValues =\n      !isUndefined(originalGoal) || !isUndefined(originalComparision);\n\n    const hasNewGoalValues =\n      !isUndefined(newGoal) || !isUndefined(newComparision);\n\n    if (hasGoalValuesChanged) {\n      if (!hasOriginalGoalValues) {\n        trackEvent(\n          widgetGoalAdded({\n            'Legacy widget ID': `${widget.id}`,\n            Visualisation: type,\n            'Integration name': service.title,\n            'Integration slug': service.name,\n          }),\n        );\n      } else if (hasNewGoalValues) {\n        trackEvent(\n          widgetGoalEdited({\n            'Legacy widget ID': `${widget.id}`,\n            Visualisation: type,\n            'Integration name': service.title,\n            'Integration slug': service.name,\n          }),\n        );\n      } else {\n        trackEvent(\n          widgetGoalRemoved({\n            'Legacy widget ID': `${widget.id}`,\n            Visualisation: type,\n            'Integration name': service.title,\n            'Integration slug': service.name,\n          }),\n        );\n      }\n    }\n  } catch (error) {\n    dispatch(isSaving(false));\n    dispatch(universalSetError(error));\n    if (originalWidgetData) {\n      // Restore widget state before opening the config and alert user\n      dispatch(configUpdated(originalWidgetData));\n      dispatchToGeckoJS('widget:title:change', {\n        widgetKey,\n        title: originalWidgetData.config.title,\n      });\n      dispatch(toastActions.showGenericErrorToast());\n    }\n  }\n};\n\nexport const addStraightToDashboard = (\n  service,\n  dashboardId,\n  presetId,\n  proxyService, // For Mirage widgets, this is the service it's pretending to be\n) => async (dispatch, getState) => {\n  if (mirageHelpers.isMirageService(service)) {\n    await dispatch(\n      mirageActions.initMirageConfig({\n        serviceId: service.id,\n        dashboardId,\n        proxyIntegration: proxyService,\n      }),\n    );\n  } else {\n    await dispatch(initConfig(service.id, dashboardId, presetId, false));\n  }\n\n  try {\n    const {\n      universal: {\n        config: { type },\n      },\n      user: { user = {} } = {},\n      dataSourceConnector: { serviceName: connectedServiceName } = {},\n    } = getState();\n    const widgetData = prepareWidgetData(dashboardId, getState);\n\n    dispatch(isSaving(true));\n    dispatch(cancelQueries('saved widget', true));\n\n    const widget = await createAndTrack(\n      dashboardId,\n      widgetData,\n      user,\n      type,\n      true,\n    );\n\n    if (requiresImport(service.name, user.features)) {\n      // We are always going to show an importing modal after authenticating for now.\n      // Later we will detect if importing is necessary or not, and then either\n      // show a modal, or open the edit widget modal immediately.\n      if (isUndefined(connectedServiceName)) {\n        await getWindow().sessionStorage.setItem(\n          STORAGE_IMPORTING_SERVICE,\n          JSON.stringify({ name: service.name, title: service.title }),\n        );\n      }\n    } else {\n      try {\n        await localForage.setItem(\n          STORAGE_KEY_LAST_ADDED_WIDGET,\n          widget.data_id,\n        );\n      } catch (e) {\n        // We're swallowing errors here, as in some instances, this is throwing an exception that then\n        // freezes the Preset Panel. If this does error, it just means that the compact config won't auto-open after\n        // redirect, which I think we can live with. We'll still log it out / send it to Bugsnag though.\n        bugsnag.send(e);\n      }\n    }\n\n    redirect(\n      pathHelpers.getDashboardPath(dashboardId.toString(), widget.id),\n      300,\n    );\n  } catch (error) {\n    dispatch(isSaving(false));\n    dispatch(universalSetError(error));\n  }\n};\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\n\nexport const dataReceived = createAction('WidgetData:DATA_RECEIVED');\nexport const dataError = createErrorAction('WidgetData:DATA_ERROR');\nexport const clearData = createAction('WidgetData:CLEAR_DATA');\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Icon from '../icon';\n\nimport styles from './alert.scss';\n\nconst TYPES = {\n  ERROR: 'error',\n  INFO: 'info',\n  SUCCESS: 'success',\n  WARNING: 'warning',\n};\n\nconst mapTypeToIcon = {\n  [TYPES.ERROR]: 'times',\n  [TYPES.INFO]: 'info',\n  [TYPES.SUCCESS]: 'check',\n  [TYPES.WARNING]: 'exclamation',\n};\n\nconst Alert = ({ message, title, type }) => (\n  <div className={`${styles.alert} ${styles[type]}`}>\n    <div className={styles.alertIcon}>\n      <Icon name={mapTypeToIcon[type]} />\n    </div>\n    <div className={styles.alertContent}>\n      {title && <span className={styles.alertTitle}>{title}</span>}\n      {message}\n    </div>\n  </div>\n);\n\nAlert.TYPES = TYPES;\n\nAlert.defaultProps = {\n  type: TYPES.INFO,\n};\n\nAlert.propTypes = {\n  message: PropTypes.node.isRequired,\n  title: PropTypes.node,\n  type: PropTypes.oneOf([\n    TYPES.ERROR,\n    TYPES.INFO,\n    TYPES.SUCCESS,\n    TYPES.WARNING,\n  ]),\n};\n\nexport default Alert;\n","import Alert from './alert';\nexport default Alert;\n","module.exports = (__webpack_require__(28))(1354);","import ConfirmModal from './confirm-modal-component';\n\nexport default ConfirmModal;\n","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\n\nclass AsyncComponentLoaderComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isLoading: true,\n      component: null,\n    };\n    this.__isMounted = false;\n  }\n\n  componentDidMount() {\n    this.__isMounted = true;\n    this.loadComponent(this.props.importComponent);\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.importComponent !== this.props.importComponent) {\n      this.loadComponent(this.props.importComponent);\n    }\n  }\n\n  componentWillUnmount() {\n    this.__isMounted = false;\n  }\n\n  render() {\n    return this.props.renderComponent(this.state);\n  }\n\n  async loadComponent(importComponent) {\n    try {\n      const component = await importComponent();\n\n      if (this.__isMounted && component !== this.state.component) {\n        this.setState({ component, isLoading: false });\n      }\n    } catch (error) {\n      this.props.onError(error);\n    }\n  }\n}\n\nAsyncComponentLoaderComponent.defaultProps = {\n  onError: noop,\n};\n\nAsyncComponentLoaderComponent.propTypes = {\n  importComponent: PropTypes.func.isRequired,\n  renderComponent: PropTypes.func.isRequired,\n  onError: PropTypes.func,\n};\n\nexport default AsyncComponentLoaderComponent;\n","import { connect } from 'react-redux';\nimport AsyncComponentLoaderComponent from './async-component-loader-component';\nimport * as toastActions from '../toast/actions/toast-actions';\n\nconst mapDispatchToProps = dispatch => ({\n  onError: error => {\n    dispatch(\n      toastActions.showErrorToast(\n        'Page loading failed. Please refresh the page and try again.',\n      ),\n    );\n    throw error;\n  },\n});\n\nconst AsyncComponentLoaderConnector = connect(\n  null,\n  mapDispatchToProps,\n)(AsyncComponentLoaderComponent);\n\nexport default AsyncComponentLoaderConnector;\n","import AsyncComponentLoaderConnector from './async-component-loader-connector';\n\nexport default AsyncComponentLoaderConnector;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport { Router } from 'react-router';\nimport { history } from '../router';\nimport idempotentInitApp from '../init';\nimport { ConfiguredI18NProvider } from '../lib/i18n';\nimport HistoryProvider from '../lib/history-provider';\nimport { IntercomProvider } from '../intercom';\n\nconst passthrough = props => props;\n\nconst createReactRenderer = (\n  Component,\n  { propsTransform = passthrough } = {},\n) => {\n  return class ReactRenderer {\n    constructor(domHost) {\n      this.domHost = domHost;\n      this.Component = Component;\n      this.ctx = {};\n    }\n\n    render(ctx) {\n      const app = idempotentInitApp();\n\n      this.ctx = ctx || this.ctx;\n\n      const props = propsTransform(this.ctx);\n\n      return new Promise((resolve, reject) => {\n        try {\n          ReactDOM.render(\n            <Provider store={app.getStore()}>\n              <Router history={history}>\n                <ConfiguredI18NProvider>\n                  <HistoryProvider>\n                    <IntercomProvider>\n                      <this.Component {...props} />\n                    </IntercomProvider>\n                  </HistoryProvider>\n                </ConfiguredI18NProvider>\n              </Router>\n            </Provider>,\n            this.domHost,\n            resolve,\n          );\n        } catch (e) {\n          reject(e);\n        }\n      });\n    }\n\n    remove() {\n      ReactDOM.unmountComponentAtNode(this.domHost);\n    }\n  };\n};\n\nexport default createReactRenderer;\n","import createReactRenderer from './react-renderer';\nexport default createReactRenderer;\n","const INPUT_DEFAULT_SELECTION = [\n  [-1, -1],\n  [-1, -1],\n];\nconst MULTIPLE_INPUT_DEFAULT_SELECTION = [\n  [\n    [-1, -1],\n    [-1, -1],\n  ],\n];\n\nexport { INPUT_DEFAULT_SELECTION, MULTIPLE_INPUT_DEFAULT_SELECTION };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport AbsolutePositioned from '../absolute-positioned';\nimport classNames from 'classnames';\n\nimport style from './tooltip-style.scss';\n\nclass TooltipComponent extends Component {\n  renderTooltip() {\n    const { targetPosition, isVisible, isLight, tooltip } = this.props;\n\n    if (!tooltip) {\n      return null;\n    }\n\n    const classTooltip = classNames(style.tooltip, {\n      [style.isLight]: isLight,\n    });\n\n    return (\n      <AbsolutePositioned {...targetPosition} isVisible={isVisible} isFixed>\n        <span className={classTooltip}>{tooltip}</span>\n      </AbsolutePositioned>\n    );\n  }\n  render() {\n    const { children, className, toggleTooltip } = this.props;\n    const classes = classNames(style.tooltipWrapper, className);\n\n    return (\n      <div className={classes}>\n        {this.renderTooltip()}\n        <div\n          className={style.hoverTarget}\n          onMouseEnter={e => toggleTooltip(true, e)}\n          onMouseLeave={e => toggleTooltip(false, e)}\n        >\n          {children}\n        </div>\n      </div>\n    );\n  }\n}\n\nTooltipComponent.defaultProps = {\n  isLight: false,\n  isVisible: false,\n  targetPosition: {},\n};\n\nTooltipComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  isLight: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  targetPosition: PropTypes.object,\n  toggleTooltip: PropTypes.func,\n  tooltip: PropTypes.node,\n};\n\nexport default TooltipComponent;\n","import tooltip from '../../hoc/tooltip';\nimport Tooltip from './tooltip-component';\nexport default tooltip(Tooltip);\n","import { findIndex, includes } from 'lodash';\n\nexport const operatorRequiresValues = operator =>\n  includes(\n    ['in', 'not_in', 'matches', 'not_matches', 'contains', 'not_contains'],\n    operator,\n  );\n\nexport const isDetailsMetricSelected = uiQuery => {\n  const { metrics: [{ node: { type: metricType } = {} } = {}] = [] } = uiQuery;\n  return metricType === 'details';\n};\n\nexport const getCombinedFiltersValues = (combinedFilters, globalFilters) => {\n  return combinedFilters.map(combinedFilter => {\n    const value = {\n      operands: [combinedFilter.value],\n      operator: 'in',\n      is_global: true,\n      is_combined: true,\n    };\n    const index = findIndex(globalFilters, ({ node }) => {\n      return (\n        node.primary_resource === combinedFilter.primary_resource &&\n        node.key === combinedFilter.key\n      );\n    });\n    return { index, value };\n  });\n};\n","import { find } from 'lodash';\nimport { mapSubQueryResult } from '../universal/query-helpers';\nimport universalService, {\n  DEFAULT_DELIVERY,\n} from '../universal/services/universal-service';\nimport mirageService from '../services/mirage-service';\nimport {\n  getFilterQueryFromUiQuery,\n  resolveNodesCrossResource,\n} from './reducer/ui-query-reducer/other-ui-query-reducer-methods';\n\nexport const ENABLED_CACHE = {\n  enabled: true,\n  max_age: 600, // in seconds\n};\n\nexport const findCustomFilter = filters =>\n  find(filters, filter => !!filter.node && filter.node.type === 'custom');\n\n// Try to inject required filters when resource supports it\nexport const runQueryInContext = (query, universalState, initialLoad) => {\n  let coreQuery = query;\n  const {\n    source,\n    mainGraph,\n    uiQuery: { prerequisites, globalFilters } = {},\n  } = universalState;\n  let newUiQuery;\n\n  if (mainGraph.length) {\n    const { resource: mainEntry } = query.select[0];\n    newUiQuery = resolveNodesCrossResource(\n      { prerequisites, globalFilters },\n      mainGraph,\n      mainEntry,\n      false,\n    );\n    const {\n      prerequisites: newPrerequisites = [],\n      globalFilters: newGlobalFilters = [],\n    } = newUiQuery;\n    const filters = [...newPrerequisites, ...newGlobalFilters];\n    const filterQ = getFilterQueryFromUiQuery(mainGraph, mainEntry, filters);\n\n    if (filterQ.length) {\n      const currentFilters = coreQuery.filter || [];\n      if (!initialLoad) {\n        coreQuery = { ...coreQuery, filter: [...filterQ, ...currentFilters] };\n      }\n    }\n  }\n\n  if (source.isMirage) {\n    return mirageService.runQuery(\n      newUiQuery,\n      { source, ...coreQuery },\n      DEFAULT_DELIVERY,\n    );\n  }\n\n  return universalService.runQuery(\n    { source, ...coreQuery },\n    DEFAULT_DELIVERY,\n    ENABLED_CACHE,\n  );\n};\n\n// The `initialLoad` parameter defines whether or not this is loading prerequisites\n// If it is, it doesn't try to merge the prerequisites into the query\nexport const getSubQueryResult = async (node, universalState, initialLoad) => {\n  const query = node.getQueryForValue();\n\n  if (!query) return null;\n\n  const subQueryPayload = await runQueryInContext(\n    query,\n    universalState,\n    initialLoad,\n  );\n\n  // TODO merge existing results with new results if property is not available\n  return mapSubQueryResult(query, subQueryPayload);\n};\n\nexport const applyPreferences = (_queries, preferences) => {\n  const queries = [..._queries];\n\n  const { filter = [] } = preferences;\n  if (!filter.length) {\n    return queries;\n  }\n\n  return queries.map(q => ({\n    ...q,\n    filter: q.filter.map(f => {\n      const savedFilter = find(filter, { resource: f.resource, path: f.path });\n      if (savedFilter) {\n        return savedFilter;\n      }\n      return f;\n    }),\n  }));\n};\n","import { update } from '../../data-sources/actions/data-sources-actions';\nimport {\n  getDashboard,\n  getServices,\n  getServiceAccounts,\n} from '../../services/management-service';\nimport { isUndefined, isArray, chain, filter, result, last } from 'lodash';\nimport fetchFiles from './fetch-files-action';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { setState } from './data-source-connector-actions';\nimport { setDashboard } from '../../dashboard/actions/dashboard-actions';\n\nexport const initDataSourceStart = createAction('InitDataSource:LOADING');\nexport const initDataSourceSuccessful = createAction('InitDataSource:INIT');\nexport const initDataSourceFailed = createErrorAction(\n  'InitDataSource:INIT_ERROR',\n);\nexport const fileFetchStart = createAction('InitDataSource:INITIAL_FILE_FETCH');\n\nfunction getFreshServiceAccountId(serviceAccounts, serviceName) {\n  const serviceAccount = filter(serviceAccounts, {\n    service: { name: serviceName },\n  });\n\n  const serviceAccountId = result(last(serviceAccount), 'id');\n\n  return serviceAccountId && parseInt(serviceAccountId, 10);\n}\n\nfunction getDefaultService(filteredServices, serviceAccounts) {\n  return chain(filteredServices)\n    .map(name => {\n      const saId = getFreshServiceAccountId(serviceAccounts, name);\n      return [name, saId];\n    })\n    .find(([, id]) => !isUndefined(id))\n    .thru(res => (isArray(res) ? res : [])) // eslint-disable-line no-confusing-arrow\n    .value();\n}\n\nconst initDataSource = ({\n  dashboardId,\n  groupId: _groupId, // We only need either the dashboard ID or the group ID\n  services: filteredServices,\n  serviceId,\n  serviceType,\n}) => async dispatch => {\n  dispatch(initDataSourceStart());\n\n  if ('datasets' === serviceId) {\n    // Datasets require none of this account nonsense, unfortunately it is hard\n    // to skip it higher up since connectors do not have control of their own\n    // destiny. FIDO.\n    await fetchFiles('datasets', {})(dispatch);\n    return;\n  }\n\n  try {\n    // If the group ID is passed we can use it directly\n    // Otherwise we need to get it from the dashboard\n    let groupId = _groupId;\n    if (isUndefined(_groupId)) {\n      const dashboard = await getDashboard(dashboardId);\n      dispatch(setDashboard(dashboard));\n      groupId = dashboard.group_id;\n    }\n\n    dispatch(setState({ groupId }));\n\n    const [services, serviceAccounts] = await Promise.all([\n      getServices(),\n      getServiceAccounts(groupId, filteredServices),\n    ]);\n    // Get last service account for the first service with an account\n    const [serviceName, serviceAccountId] = getDefaultService(\n      filteredServices,\n      serviceAccounts,\n    );\n\n    dispatch(\n      initDataSourceSuccessful({\n        serviceName,\n        serviceAccounts,\n        serviceAccountId,\n      }),\n    );\n\n    dispatch(update(services));\n\n    if (serviceAccountId && serviceType !== 'universal') {\n      dispatch(fileFetchStart());\n      await fetchFiles(serviceName, { serviceAccountId })(dispatch);\n    }\n  } catch (error) {\n    dispatch(initDataSourceFailed(error, error.message));\n  }\n};\n\nexport default initDataSource;\n","/* eslint-disable func-style */\nimport fetchJSON, { pollJSON, FetchError } from '../fetch';\nimport config from '../config';\nimport 'isomorphic-fetch';\n\nclass SalesforceError extends FetchError {}\n\nconst POLLING_OPTS = {\n  defaultPollInterval: 1000,\n  maxNumberOfPolls: 60,\n};\n\nfunction fetchList(serviceName, { serviceAccountId = '' } = {}) {\n  const { PegasusBaseURL } = config.get();\n\n  return fetchJSON(\n    `${PegasusBaseURL}/reports?service_account_id=${serviceAccountId}`,\n    {\n      method: 'GET',\n      credentials: 'include',\n      headers: {\n        Accept: 'application/json',\n      },\n    },\n  );\n}\n\nfunction obtainUUID(serviceName, fileOptions) {\n  const { PegasusBaseURL } = config.get();\n  const { id, serviceAccountId } = fileOptions;\n\n  return fetchJSON(\n    `${PegasusBaseURL}/reports/${id}/import?service_account_id=${serviceAccountId}`,\n    {\n      method: 'POST',\n      credentials: 'include',\n      headers: {\n        Accept: 'application/json',\n      },\n    },\n  );\n}\n\nfunction getMeta(uuid, refreshFile) {\n  const { PegasusBaseURL } = config.get();\n  let parameters = '';\n\n  if (refreshFile === true) {\n    // the presence of the parameter makes the backend already refresh\n    parameters = '?refresh=true';\n  }\n\n  return fetchJSON(`${PegasusBaseURL}/reports/${uuid}/meta${parameters}`, {\n    method: 'GET',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n}\n\nfunction refreshReport(uuid, maxAge = 0, requestHeaders = {}) {\n  const { PegasusBaseURL } = config.get();\n  const headers = { ...requestHeaders, Accept: 'application/json' };\n\n  return fetchJSON(\n    `${PegasusBaseURL}/reports/${uuid}/refresh?max_age=${maxAge}`,\n    {\n      method: 'POST',\n      credentials: 'include',\n      headers,\n    },\n  );\n}\n\nfunction fetchData(\n  uuid,\n  { xAxis = '', yAxis = '', series = '', columns, type } = {},\n  requestHeaders = {},\n) {\n  const { PegasusBaseURL } = config.get();\n  let params;\n  const opts = {};\n\n  if (type === 'table') {\n    params = '?format=table';\n  } else {\n    params = `?x_axis=${xAxis}&y_axis=${yAxis}&series=${series}`;\n  }\n\n  // When fetching a table we have the option to limit the columns\n  // returned by making a post with the query\n  if (columns) {\n    opts.body = JSON.stringify({ columns });\n    opts.method = 'POST';\n  }\n\n  return pollJSON(\n    `${PegasusBaseURL}/reports/${uuid}/data${params}`,\n    { ...opts, headers: requestHeaders },\n    POLLING_OPTS,\n  );\n}\n\nfunction get(cfg, requestHeaders) {\n  const { config: newConfig = {} } = cfg;\n\n  return fetchData(newConfig.report_id, newConfig, requestHeaders).catch(\n    ({ message, type, status }) => {\n      throw new SalesforceError(message, status, type);\n    },\n  );\n}\n\nfunction getConfig({ config: cfg }) {\n  return Promise.resolve(cfg);\n}\n\nfunction refresh(cfg, requestHeaders) {\n  const {\n    widget: { refresh_interval: refreshInterval },\n    config: { report_id: reportId },\n  } = cfg;\n\n  return refreshReport(reportId, refreshInterval, requestHeaders).catch(\n    ({ message, type, status }) => {\n      throw new SalesforceError(message, status, type);\n    },\n  );\n}\n\nexport {\n  fetchList,\n  obtainUUID,\n  getMeta,\n  refreshReport,\n  fetchData,\n  get,\n  getConfig,\n  refresh,\n  POLLING_OPTS,\n};\n","import * as spreadsheets from './spreadsheet-service';\nimport * as salesforce from './salesforce-service';\nimport datasets from './dataset-service';\nimport universal from './universal-service';\nimport database from './database-service';\n\nexport { database, spreadsheets, salesforce, datasets, universal };\n","import fetchJSON, { fetchAllJSONWithCredentials, fetchAllJSON } from '../fetch';\nimport config from '../config';\n\nlet datasetService;\n\nfunction fetchDataSet(id, { includesData = false } = {}) {\n  const { IrisBaseURL } = config.get();\n  const params = includesData ? '?includes=data' : '';\n\n  return fetchAllJSONWithCredentials(`${IrisBaseURL}/datasets/${id}${params}`);\n}\n\nfunction queryDataSet(id, { requestHeaders = {}, query, type, timezone }) {\n  const { IrisBaseURL } = config.get();\n\n  const headers = {\n    Accept: 'application/json',\n    'Content-Type': 'application/json',\n    ...requestHeaders,\n  };\n\n  return fetchAllJSON(`${IrisBaseURL}/datasets/${id}/query/${type}`, {\n    method: 'POST',\n    credentials: 'include',\n    headers,\n    body: JSON.stringify({ ...query, timezone }),\n  });\n}\n\nfunction fetchList(dataSetID, { query = '' } = {}) {\n  const { IrisBaseURL } = config.get();\n\n  return fetchAllJSONWithCredentials(\n    `${IrisBaseURL}/datasets?query=${query}`,\n  ).then(result => {\n    return result.data.map(({ id, demo, created_at: createdAt }) => {\n      // Map the id to to the title so we can maintain compatibility\n      // with other services. ERGH.\n      return { id, title: id, demo, created_at: createdAt };\n    });\n  });\n}\n\nfunction refresh() {\n  // Passthrough\n  return Promise.resolve(null);\n}\n\nfunction get(\n  { config: { dataSetId, query, type }, dashboard: { timezone } },\n  requestHeaders,\n) {\n  return datasetService.queryDataSet(dataSetId, {\n    requestHeaders,\n    query,\n    type,\n    timezone,\n  });\n}\n\nfunction getConfig({ config: cfg }) {\n  return Promise.resolve(cfg);\n}\n\nfunction queryAutocompleteValue(datasetId, body) {\n  const { IrisBaseURL } = config.get();\n  const headers = {\n    Accept: 'application/json',\n    'Content-Type': 'application/json',\n  };\n\n  return fetchJSON(`${IrisBaseURL}/datasets/${datasetId}/autocomplete`, {\n    method: 'POST',\n    credentials: 'include',\n    headers,\n    body: JSON.stringify(body),\n  });\n}\n\n// We need to spy on queryDataset so that we can test .get. So we're exporting here\n// to ensure that it can be monkey patched\ndatasetService = {\n  fetchDataSet,\n  queryDataSet,\n  fetchList,\n  refresh,\n  get,\n  getConfig,\n  queryAutocompleteValue,\n};\n\nexport default datasetService;\n","import componentPicker from '../lib/component-picker';\nimport { spreadsheets, salesforce, datasets } from '../universal/services';\n\nconst SERVICES = {\n  gsheets: spreadsheets,\n  salesforce,\n  datasets,\n};\n\nfunction servicePicker(serviceName) {\n  return componentPicker(SERVICES, serviceName, spreadsheets);\n}\n\nexport default servicePicker;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"resizing\":\"resizing---1cZaP\",\"size\":\"size---1M7bI\",\"resizeHandle\":\"resizeHandle---YL0BE\",\"disabled\":\"disabled---3HVBm\",\"focused\":\"focused---hJA-r\",\"widgetInner\":\"widgetInner---dRV31\",\"draggable\":\"draggable---A6hYY\",\"widget\":\"widget---1S836\",\"ghostPreview\":\"ghostPreview---2_j6h\",\"transparent\":\"transparent---3FwQ6\",\"editable\":\"editable---3NazF\"};","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\nimport { isUndefined } from 'lodash';\n\nimport styles from './toast-root-style.scss';\n\nconst ToastRootComponent = ({ position, children }) => {\n  const classes = classNames({\n    [styles.default]: isUndefined(position),\n    [styles.preview]: position === 'preview',\n    [styles.right]: position === 'right',\n  });\n\n  return (\n    <div className={classes}>\n      <TransitionGroup>\n        {!!children &&\n          React.Children.map(children, child => (\n            <CSSTransition classNames=\"toast\" timeout={4e3}>\n              {child}\n            </CSSTransition>\n          ))}\n      </TransitionGroup>\n    </div>\n  );\n};\n\nToastRootComponent.propTypes = {\n  children: PropTypes.node,\n  position: PropTypes.oneOf(['preview', 'right']),\n};\n\nexport default ToastRootComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { noop } from 'lodash';\n\nimport styles from './toast-style.scss';\n\nclass ToastComponent extends Component {\n  componentDidMount() {\n    const { autoHide, delay } = this.props;\n    if (autoHide) {\n      this.startTimer(delay + 3e3);\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    const { delay, autoHide } = nextProps;\n\n    if (this.props.autoHide !== autoHide) {\n      if (autoHide) {\n        this.startTimer(delay);\n      } else {\n        this.stopTimer();\n      }\n    }\n  }\n\n  componentWillUnmount() {\n    this.stopTimer();\n  }\n\n  onMouseEnter() {\n    this.stopTimer();\n  }\n\n  onMouseLeave() {\n    const { autoHide, delay } = this.props;\n    if (autoHide) {\n      this.startTimer(delay);\n    }\n  }\n\n  render() {\n    const { children, messageType, delayed, autoWidth } = this.props;\n\n    const className = classNames(styles.toast, {\n      [styles.delayedAnimation]: delayed,\n      [styles.success]: messageType === 'success',\n      [styles.error]: messageType === 'error',\n      [styles.autoWidth]: autoWidth === true,\n    });\n\n    return (\n      <div\n        role=\"alert\"\n        className={className}\n        onMouseEnter={() => this.onMouseEnter()}\n        onMouseLeave={() => this.onMouseLeave()}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  startTimer(delay) {\n    this.stopTimer();\n    this._timer = setTimeout(() => {\n      const { onClose } = this.props;\n      onClose();\n    }, delay);\n  }\n\n  stopTimer() {\n    clearTimeout(this._timer);\n  }\n}\n\nToastComponent.defaultProps = {\n  autoHide: true,\n  autoWidth: false,\n  delay: 5e3,\n  onClose: noop,\n};\n\nToastComponent.propTypes = {\n  autoHide: PropTypes.bool,\n  autoWidth: PropTypes.bool,\n  children: PropTypes.node,\n  delay: PropTypes.number,\n  delayed: PropTypes.bool,\n  messageType: PropTypes.oneOf(['success', 'error']),\n  onClose: PropTypes.func,\n};\n\nconst ToastIcon = ({ large, children }) => {\n  const className = classNames(styles.toastIcon, {\n    [styles.toastIconLarge]: large,\n  });\n  return <span className={className}>{children}</span>;\n};\nToastIcon.propTypes = {\n  children: PropTypes.node,\n  large: PropTypes.bool,\n};\n\nexport { ToastComponent as default, ToastIcon };\n","import ToastRootComponent from './toast-root-component';\nimport ToastComponent, { ToastIcon } from './toast-component';\nimport bodyRenderer from '../../../lib/body-renderer';\nconst ToastRoot = bodyRenderer(ToastRootComponent);\n\nexport { ToastComponent as default, ToastIcon, ToastRoot };\n","import {\n  getSpreadsheet,\n  getWorksheet,\n} from '../../universal/services/spreadsheet-service';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\n\nexport const worksheetFetched = createAction('Spreadsheet:WORKSHEET_FETCHED');\nexport const worksheetFetchFailed = createErrorAction(\n  'Spreadsheet:WORKSHEET_FETCH_FAILED',\n);\nexport const setScrolls = createAction('Spreadsheet:SET_SCROLLS');\nexport const loading = createAction('Spreadsheet:LOADING');\nexport const set = createAction('Spreadsheet:SET');\n\nexport const fetchWorksheet = (fileId, worksheetId) => async dispatch => {\n  const worksheet = await getWorksheet(fileId, worksheetId);\n  dispatch(worksheetFetched({ worksheet }));\n};\n\nexport const fetchFile = (fileId, worksheetId) => async dispatch => {\n  dispatch(loading());\n\n  try {\n    const spreadsheet = await getSpreadsheet(fileId, 0);\n\n    // if there is no worksheetId take the first from the worksheets array\n    if (!worksheetId) {\n      const { worksheets } = spreadsheet;\n      const { id } = worksheets[0];\n\n      worksheetId = id;\n    }\n\n    const worksheet = await getWorksheet(fileId, worksheetId);\n\n    dispatch(\n      worksheetFetched({\n        worksheet,\n        spreadsheet,\n      }),\n    );\n  } catch (error) {\n    dispatch(worksheetFetchFailed(error));\n  }\n};\n\nexport const refreshFile = () => (dispatch, getState) => {\n  const { fileId, worksheetId } = getState().spreadsheets;\n  dispatch(fetchFile(fileId, worksheetId));\n};\n\nexport const changeFile = fileId => fetchFile(fileId);\n","import { PROJECTIONS, CONTINENTS } from './map-constants';\n\nconst world = {\n  name: 'World',\n  file: 'worldIndiaLow',\n  projection: PROJECTIONS.MILLER,\n};\n\nconst continents = {\n  [CONTINENTS.SOUTH_AMERICA]: {\n    name: 'South America',\n    file: 'southAmericaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  [CONTINENTS.NORTH_AMERICA]: {\n    name: 'North America',\n    file: 'northAmericaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  [CONTINENTS.OCEANIA]: {\n    name: 'Oceania',\n    file: 'oceaniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  [CONTINENTS.AFRICA]: {\n    name: 'Africa',\n    file: 'africaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  [CONTINENTS.EUROPE]: {\n    name: 'Europe',\n    file: 'europeHigh',\n    projection: PROJECTIONS.MILLER,\n  },\n  [CONTINENTS.ASIA]: {\n    name: 'Asia',\n    file: 'asiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n};\n\nconst regions = {\n  // SOUTH AMERICA\n  'REGION:LATIN_AMERICA': {\n    name: 'Latin America',\n    file: 'latinAmericaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  // NORTH AMERICA\n  'REGION:CARIBBEAN': {\n    name: 'Caribbean',\n    file: 'caribbeanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  'REGION:NORTH_AMERICA_WITHOUT_GREENLAND': {\n    name: 'North America without Greenland',\n    file: 'northAmericaWithoutGreenlandLow',\n    projection: PROJECTIONS.MILLER,\n  },\n  // ASIA\n  'REGION:MIDDLE_EAST': {\n    name: 'Middle East',\n    file: 'middleEastHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n};\n\nconst countries = {\n  // SOUTH_AMERICA\n  ARG: {\n    name: 'Argentina',\n    file: 'argentinaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BOL: {\n    name: 'Bolivia, Plurinational State of',\n    file: 'boliviaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BRA: {\n    name: 'Brazil',\n    file: 'brazilLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CHL: {\n    name: 'Chile',\n    file: 'chileLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  COL: {\n    name: 'Colombia',\n    file: 'colombiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ECU: {\n    name: 'Ecuador',\n    file: 'ecuadorLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  FLK: {\n    name: 'Falkland Islands (Malvinas)',\n    file: 'falklandIslandsHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GUY: {\n    name: 'Guyana',\n    file: 'guyanaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PYR: {\n    name: 'Paraguay',\n    file: 'paraguayLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PER: {\n    name: 'Peru',\n    file: 'peruLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SUR: {\n    name: 'Suriname',\n    file: 'surinameLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  URY: {\n    name: 'Uruguay',\n    file: 'uruguayLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VEN: {\n    name: 'Venezuela, Bolivarian Republic of',\n    file: 'venezuelaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n\n  // OCEANIA\n  AUS: {\n    name: 'Australia',\n    file: 'australiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NCL: {\n    name: 'New Caledonia',\n    file: 'newCaledoniaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NZL: {\n    name: 'New Zealand',\n    file: 'newZealandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PNG: {\n    name: 'Papua New Guinea',\n    file: 'papuaNewGuineaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SLB: {\n    name: 'Solomon Islands',\n    file: 'solomonIslandsLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VUT: {\n    name: 'Vanuatu',\n    file: 'vanuatuLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n\n  // AFRICA\n  DZA: {\n    name: 'Algeria',\n    file: 'algeriaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  AGO: {\n    name: 'Angola',\n    file: 'angolaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BEN: {\n    name: 'Benin',\n    file: 'beninHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BWA: {\n    name: 'Botswana',\n    file: 'botswanaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BFA: {\n    name: 'Burkina Faso',\n    file: 'burkinaFasoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BDI: {\n    name: 'Burundi',\n    file: 'burundiLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CMR: {\n    name: 'Cameroon',\n    file: 'cameroonLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CPV: {\n    name: 'Cape Verde',\n    file: 'capeVerdeLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CAF: {\n    name: 'Central African Republic',\n    file: 'centralAfricanRepublicLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TCD: {\n    name: 'Chad',\n    file: 'chadLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  COM: {\n    name: 'Comoros',\n    file: 'comorosHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  COG: {\n    name: 'Congo',\n    file: 'congoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  COD: {\n    name: 'Congo, the Democratic Republic of the',\n    file: 'congoDRLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CIV: {\n    name: \"Côte d'Ivoire\",\n    file: 'ivoryCoastHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  DJI: {\n    name: 'Djibouti',\n    file: 'djiboutiLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  EGY: {\n    name: 'Egypt',\n    file: 'egyptLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GNQ: {\n    name: 'Equatorial Guinea',\n    file: 'equatorialGuineaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ERI: {\n    name: 'Eritrea',\n    file: 'eritreaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ETH: {\n    name: 'Ethiopia',\n    file: 'ethiopiaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GAB: {\n    name: 'Gabon',\n    file: 'gabonHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GMB: {\n    name: 'Gambia',\n    file: 'gambiaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GHA: {\n    name: 'Ghana',\n    file: 'ghanaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GIN: {\n    name: 'Guinea',\n    file: 'guineaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GNB: {\n    name: 'Guinea-Bissau',\n    file: 'guineaBissauHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KEN: {\n    name: 'Kenya',\n    file: 'kenyaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LSO: {\n    name: 'Lesotho',\n    file: 'lesothoHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LBR: {\n    name: 'Liberia',\n    file: 'liberiaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LBY: {\n    name: 'Libya',\n    file: 'libyaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MDG: {\n    name: 'Madagascar',\n    file: 'madagascarHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MWI: {\n    name: 'Malawi',\n    file: 'malawiHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MLI: {\n    name: 'Mali',\n    file: 'maliLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MRT: {\n    name: 'Mauritania',\n    file: 'mauritaniaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MAR: {\n    name: 'Morocco',\n    file: 'moroccoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MOZ: {\n    name: 'Mozambique',\n    file: 'mozambiqueLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NAM: {\n    name: 'Namibia',\n    file: 'namibiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NER: {\n    name: 'Niger',\n    file: 'nigerHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NGA: {\n    name: 'Nigeria',\n    file: 'nigeriaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  RWA: {\n    name: 'Rwanda',\n    file: 'rwandaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  STP: {\n    name: 'Sao Tome and Principe',\n    file: 'saoTomePrincipeHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SEN: {\n    name: 'Senegal',\n    file: 'senegalLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SLE: {\n    name: 'Sierra Leone',\n    file: 'sierraLeoneHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SOM: {\n    name: 'Somalia',\n    file: 'somaliaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ZAF: {\n    name: 'South Africa',\n    file: 'southAfricaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SDN: {\n    name: 'Sudan',\n    file: 'sudanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SWZ: {\n    name: 'Swaziland',\n    file: 'swazilandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TZA: {\n    name: 'Tanzania, United Republic of',\n    file: 'tanzaniaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TGO: {\n    name: 'Togo',\n    file: 'togoHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TUN: {\n    name: 'Tunisia',\n    file: 'tunisiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  UGA: {\n    name: 'Uganda',\n    file: 'ugandaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ZMB: {\n    name: 'Zambia',\n    file: 'zambiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ZWE: {\n    name: 'Zimbabwe',\n    file: 'zimbabweLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n\n  // EUROPE\n  ALB: {\n    name: 'Albania',\n    file: 'albaniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  AND: {\n    name: 'Andorra',\n    file: 'andorraLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  AUT: {\n    name: 'Austria',\n    file: 'austriaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BLR: {\n    name: 'Belarus',\n    file: 'belarusLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BEL: {\n    name: 'Belgium',\n    file: 'belgiumHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BIH: {\n    name: 'Bosnia and Herzegovina',\n    file: 'bosniaHerzegovinaCantonsLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BGR: {\n    name: 'Bulgaria',\n    file: 'bulgariaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  HRV: {\n    name: 'Croatia',\n    file: 'croatiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CZE: {\n    name: 'Czech Republic',\n    file: 'czechRepublicLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  DNK: {\n    name: 'Denmark',\n    file: 'denmarkLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  EST: {\n    name: 'Estonia',\n    file: 'estoniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  FRO: {\n    name: 'Faroe Islands',\n    file: 'faroeIslandsHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  FIN: {\n    name: 'Finland',\n    file: 'finlandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  FRA: {\n    name: 'France',\n    file: 'france2016Low',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  DEU: {\n    name: 'Germany',\n    file: 'germanyLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GRC: {\n    name: 'Greece',\n    file: 'greeceLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VAT: {\n    name: 'Holy See (Vatican City State)',\n    file: 'vaticanCity',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  HUN: {\n    name: 'Hungary',\n    file: 'hungaryLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ISL: {\n    name: 'Iceland',\n    file: 'icelandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IRL: {\n    name: 'Ireland',\n    file: 'irelandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IMN: {\n    name: 'Isle of Man',\n    file: 'isleOfManHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ITA: {\n    name: 'Italy',\n    file: 'italyLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  JEY: {\n    name: 'Jersey',\n    file: 'jerseyHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LVA: {\n    name: 'Latvia',\n    file: 'latviaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LIE: {\n    name: 'Liechtenstein',\n    file: 'liechtensteinHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LTU: {\n    name: 'Lithuania',\n    file: 'lithuaniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LUX: {\n    name: 'Luxembourg',\n    file: 'luxembourgLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MKD: {\n    name: 'Macedonia, the former Yugoslav Republic of',\n    file: 'macedoniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MLT: {\n    name: 'Malta',\n    file: 'maltaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MDA: {\n    name: 'Moldova, Republic of',\n    file: 'moldovaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MCO: {\n    name: 'Monaco',\n    file: 'monacoHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MNE: {\n    name: 'Montenegro',\n    file: 'montenegroLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NLD: {\n    name: 'Netherlands',\n    file: 'netherlandsLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NOR: {\n    name: 'Norway',\n    file: 'norwayLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  POL: {\n    name: 'Poland',\n    file: 'polandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PRT: {\n    name: 'Portugal',\n    file: 'portugalLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ROU: {\n    name: 'Romania',\n    file: 'romaniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SMR: {\n    name: 'San Marino',\n    file: 'sanMarinoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SRB: {\n    name: 'Serbia',\n    file: 'serbiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SVK: {\n    name: 'Slovakia',\n    file: 'slovakiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SVN: {\n    name: 'Slovenia',\n    file: 'sloveniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ESP: {\n    name: 'Spain',\n    file: 'spain2Low',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SWE: {\n    name: 'Sweden',\n    file: 'swedenHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CHE: {\n    name: 'Switzerland',\n    file: 'switzerlandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  UKR: {\n    name: 'Ukraine',\n    file: 'ukraineLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GBR: {\n    name: 'United Kingdom',\n    file: 'unitedKingdomLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n\n  // NORTH AMERICA\n  ATG: {\n    name: 'Antigua and Barbuda',\n    file: 'antiguaBarbudaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ABW: {\n    name: 'Aruba',\n    file: 'arubaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BHS: {\n    name: 'Bahamas',\n    file: 'bahamasHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BRB: {\n    name: 'Barbados',\n    file: 'barbadosHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BLZ: {\n    name: 'Belize',\n    file: 'belizeLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BMU: {\n    name: 'Bermuda',\n    file: 'bermudaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CAN: {\n    name: 'Canada',\n    file: 'canadaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CYM: {\n    name: 'Cayman Islands',\n    file: 'caymanIslandsHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CRI: {\n    name: 'Costa Rica',\n    file: 'costaRicaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CUB: {\n    name: 'Cuba',\n    file: 'cubaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CUW: {\n    name: 'Curaçao',\n    file: 'curacaoHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  DMA: {\n    name: 'Dominica',\n    file: 'dominicaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  DOM: {\n    name: 'Dominican Republic',\n    file: 'dominicanRepublicLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SLV: {\n    name: 'El Salvador',\n    file: 'elSalvadorLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GRD: {\n    name: 'Grenada',\n    file: 'grenadaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GTM: {\n    name: 'Guatemala',\n    file: 'guatemalaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  HTI: {\n    name: 'Haiti',\n    file: 'haitiHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  HND: {\n    name: 'Honduras',\n    file: 'hondurasLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  JAM: {\n    name: 'Jamaica',\n    file: 'jamaicaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MEX: {\n    name: 'Mexico',\n    file: 'mexicoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MSR: {\n    name: 'Montserrat',\n    file: 'montserratHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NIC: {\n    name: 'Nicaragua',\n    file: 'nicaraguaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PAN: {\n    name: 'Panama',\n    file: 'panamaHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PRI: {\n    name: 'Puerto Rico',\n    file: 'puertoRicoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KNA: {\n    name: 'Saint Kitts and Nevis',\n    file: 'stKittsNevisLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LCA: {\n    name: 'Saint Lucia',\n    file: 'stLuciaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MAF: {\n    name: 'Saint Martin (French part)',\n    file: 'saintMartinHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SPM: {\n    name: 'Saint Pierre and Miquelon',\n    file: 'saintPierreMiquelonHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VCT: {\n    name: 'Saint Vincent and the Grenadines',\n    file: 'stVincentHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SXM: {\n    name: 'Sint Maarten (Dutch part)',\n    file: 'sintMaartenLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TTO: {\n    name: 'Trinidad and Tobago',\n    file: 'trinidadAndTobagoLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TCA: {\n    name: 'Turks and Caicos Islands',\n    file: 'turksCaicosIslandsLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  USA: {\n    name: 'United States',\n    file: 'usaAlbers',\n    projection: PROJECTIONS.ALBERS_USA,\n  },\n  VGB: {\n    name: 'Virgin Islands, British',\n    file: 'britishVirginIslandsHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VIR: {\n    name: 'Virgin Islands, U.S.',\n    file: 'usVirginIslandsHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n\n  // ASIA\n  AFG: {\n    name: 'Afghanistan',\n    file: 'afghanistanHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ARM: {\n    name: 'Armenia',\n    file: 'armeniaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  AZE: {\n    name: 'Azerbaijan',\n    file: 'azerbaijanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BHR: {\n    name: 'Bahrain',\n    file: 'bahrainLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BGD: {\n    name: 'Bangladesh',\n    file: 'bangladeshLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BTN: {\n    name: 'Bhutan',\n    file: 'bhutanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  BRN: {\n    name: 'Brunei Darussalam',\n    file: 'bruneiDarussalamLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KHM: {\n    name: 'Cambodia',\n    file: 'cambodiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CHN: {\n    name: 'China',\n    file: 'chinaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  CYP: {\n    name: 'Cyprus',\n    file: 'cyprusLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  GEO: {\n    name: 'Georgia',\n    file: 'georgiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  HKG: {\n    name: 'Hong Kong',\n    file: 'hongKongLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IND: {\n    name: 'India',\n    file: 'indiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IDN: {\n    name: 'Indonesia',\n    file: 'indonesiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IRN: {\n    name: 'Iran, Islamic Republic of',\n    file: 'iranHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  IRQ: {\n    name: 'Iraq',\n    file: 'iraqHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ISR: {\n    name: 'Israel',\n    file: 'israelLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  JPN: {\n    name: 'Japan',\n    file: 'japanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  JOR: {\n    name: 'Jordan',\n    file: 'jordanHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KAZ: {\n    name: 'Kazakhstan',\n    file: 'kazakhstanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PRK: {\n    name: \"Korea, Democratic People's Republic of\",\n    file: 'northKoreaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KOR: {\n    name: 'Korea, Republic of',\n    file: 'southKoreaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KWT: {\n    name: 'Kuwait',\n    file: 'kuwaitHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  KGZ: {\n    name: 'Kyrgyzstan',\n    file: 'kyrgyzstanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LAO: {\n    name: \"Lao People's Democratic Republic\",\n    file: 'laosHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LBN: {\n    name: 'Lebanon',\n    file: 'lebanonHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MAC: {\n    name: 'Macao',\n    file: 'macaoHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MYS: {\n    name: 'Malaysia',\n    file: 'malaysiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MNG: {\n    name: 'Mongolia',\n    file: 'mongoliaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  MMR: {\n    name: 'Myanmar',\n    file: 'myanmarHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  NPL: {\n    name: 'Nepal',\n    file: 'nepalLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  OMN: {\n    name: 'Oman',\n    file: 'omanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PAK: {\n    name: 'Pakistan',\n    file: 'pakistanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  PHL: {\n    name: 'Philippines',\n    file: 'philippinesLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  QAT: {\n    name: 'Qatar',\n    file: 'qatarLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  RUS: {\n    name: 'Russian Federation',\n    file: 'russiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SAU: {\n    name: 'Saudi Arabia',\n    file: 'saudiArabiaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SGP: {\n    name: 'Singapore',\n    file: 'singaporeLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  LKA: {\n    name: 'Sri Lanka',\n    file: 'sriLankaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  SYR: {\n    name: 'Syrian Arab Republic',\n    file: 'syriaLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TWN: {\n    name: 'Taiwan, Province of China',\n    file: 'taiwanHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TJK: {\n    name: 'Tajikistan',\n    file: 'tajikistanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  THA: {\n    name: 'Thailand',\n    file: 'thailandLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TLS: {\n    name: 'Timor-Leste',\n    file: 'eastTimorHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TUR: {\n    name: 'Turkey',\n    file: 'turkeyLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  TKM: {\n    name: 'Turkmenistan',\n    file: 'turkmenistanHigh',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  ARE: {\n    name: 'United Arab Emirates',\n    file: 'unitedArabEmiratesLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  UZB: {\n    name: 'Uzbekistan',\n    file: 'uzbekistanLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  VNM: {\n    name: 'Viet Nam',\n    file: 'vietnamLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n  YEM: {\n    name: 'Yemen',\n    file: 'yemenLow',\n    projection: PROJECTIONS.MERCATOR,\n  },\n};\n\nexport default {\n  countries,\n  regions,\n  continents,\n  world,\n};\n","var invariant = require('invariant');\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar splice = Array.prototype.splice;\n\nvar toString = Object.prototype.toString\nvar type = function(obj) {\n  return toString.call(obj).slice(8, -1);\n}\n\nvar assign = Object.assign || /* istanbul ignore next */ function assign(target, source) {\n  getAllKeys(source).forEach(function(key) {\n    if (hasOwnProperty.call(source, key)) {\n      target[key] = source[key];\n    }\n  });\n  return target;\n};\n\nvar getAllKeys = typeof Object.getOwnPropertySymbols === 'function' ?\n  function(obj) { return Object.keys(obj).concat(Object.getOwnPropertySymbols(obj)) } :\n  /* istanbul ignore next */ function(obj) { return Object.keys(obj) };\n\n/* istanbul ignore next */\nfunction copy(object) {\n  if (Array.isArray(object)) {\n    return assign(object.constructor(object.length), object)\n  } else if (type(object) === 'Map') {\n    return new Map(object)\n  } else if (type(object) === 'Set') {\n    return new Set(object)\n  } else if (object && typeof object === 'object') {\n    var prototype = Object.getPrototypeOf(object);\n    return assign(Object.create(prototype), object);\n  } else {\n    return object;\n  }\n}\n\nfunction newContext() {\n  var commands = assign({}, defaultCommands);\n  update.extend = function(directive, fn) {\n    commands[directive] = fn;\n  };\n  update.isEquals = function(a, b) { return a === b; };\n\n  return update;\n\n  function update(object, spec) {\n    if (typeof spec === 'function') {\n      spec = { $apply: spec };\n    }\n\n    if (!(Array.isArray(object) && Array.isArray(spec))) {\n      invariant(\n        !Array.isArray(spec),\n        'update(): You provided an invalid spec to update(). The spec may ' +\n        'not contain an array except as the value of $set, $push, $unshift, ' +\n        '$splice or any custom command allowing an array value.'\n      );\n    }\n\n    invariant(\n      typeof spec === 'object' && spec !== null,\n      'update(): You provided an invalid spec to update(). The spec and ' +\n      'every included key path must be plain objects containing one of the ' +\n      'following commands: %s.',\n      Object.keys(commands).join(', ')\n    );\n\n    var nextObject = object;\n    var index, key;\n    getAllKeys(spec).forEach(function(key) {\n      if (hasOwnProperty.call(commands, key)) {\n        var objectWasNextObject = object === nextObject;\n        nextObject = commands[key](spec[key], nextObject, spec, object);\n        if (objectWasNextObject && update.isEquals(nextObject, object)) {\n          nextObject = object;\n        }\n      } else {\n        var nextValueForKey =\n          type(object) === 'Map'\n            ? update(object.get(key), spec[key])\n            : update(object[key], spec[key]);\n        var nextObjectValue =\n          type(nextObject) === 'Map'\n              ? nextObject.get(key)\n              : nextObject[key];\n        if (!update.isEquals(nextValueForKey, nextObjectValue) || typeof nextValueForKey === 'undefined' && !hasOwnProperty.call(object, key)) {\n          if (nextObject === object) {\n            nextObject = copy(object);\n          }\n          if (type(nextObject) === 'Map') {\n            nextObject.set(key, nextValueForKey);\n          } else {\n            nextObject[key] = nextValueForKey;\n          }\n        }\n      }\n    })\n    return nextObject;\n  }\n\n}\n\nvar defaultCommands = {\n  $push: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$push');\n    return value.length ? nextObject.concat(value) : nextObject;\n  },\n  $unshift: function(value, nextObject, spec) {\n    invariantPushAndUnshift(nextObject, spec, '$unshift');\n    return value.length ? value.concat(nextObject) : nextObject;\n  },\n  $splice: function(value, nextObject, spec, originalObject) {\n    invariantSplices(nextObject, spec);\n    value.forEach(function(args) {\n      invariantSplice(args);\n      if (nextObject === originalObject && args.length) nextObject = copy(originalObject);\n      splice.apply(nextObject, args);\n    });\n    return nextObject;\n  },\n  $set: function(value, nextObject, spec) {\n    invariantSet(spec);\n    return value;\n  },\n  $toggle: function(targets, nextObject) {\n    invariantSpecArray(targets, '$toggle');\n    var nextObjectCopy = targets.length ? copy(nextObject) : nextObject;\n\n    targets.forEach(function(target) {\n      nextObjectCopy[target] = !nextObject[target];\n    });\n\n    return nextObjectCopy;\n  },\n  $unset: function(value, nextObject, spec, originalObject) {\n    invariantSpecArray(value, '$unset');\n    value.forEach(function(key) {\n      if (Object.hasOwnProperty.call(nextObject, key)) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        delete nextObject[key];\n      }\n    });\n    return nextObject;\n  },\n  $add: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$add');\n    invariantSpecArray(value, '$add');\n    if (type(nextObject) === 'Map') {\n      value.forEach(function(pair) {\n        var key = pair[0];\n        var value = pair[1];\n        if (nextObject === originalObject && nextObject.get(key) !== value) nextObject = copy(originalObject);\n        nextObject.set(key, value);\n      });\n    } else {\n      value.forEach(function(value) {\n        if (nextObject === originalObject && !nextObject.has(value)) nextObject = copy(originalObject);\n        nextObject.add(value);\n      });\n    }\n    return nextObject;\n  },\n  $remove: function(value, nextObject, spec, originalObject) {\n    invariantMapOrSet(nextObject, '$remove');\n    invariantSpecArray(value, '$remove');\n    value.forEach(function(key) {\n      if (nextObject === originalObject && nextObject.has(key)) nextObject = copy(originalObject);\n      nextObject.delete(key);\n    });\n    return nextObject;\n  },\n  $merge: function(value, nextObject, spec, originalObject) {\n    invariantMerge(nextObject, value);\n    getAllKeys(value).forEach(function(key) {\n      if (value[key] !== nextObject[key]) {\n        if (nextObject === originalObject) nextObject = copy(originalObject);\n        nextObject[key] = value[key];\n      }\n    });\n    return nextObject;\n  },\n  $apply: function(value, original) {\n    invariantApply(value);\n    return value(original);\n  }\n};\n\nvar contextForExport = newContext();\n\nmodule.exports = contextForExport;\nmodule.exports.default = contextForExport;\nmodule.exports.newContext = newContext;\n\n// invariants\n\nfunction invariantPushAndUnshift(value, spec, command) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected target of %s to be an array; got %s.',\n    command,\n    value\n  );\n  invariantSpecArray(spec[command], command)\n}\n\nfunction invariantSpecArray(spec, command) {\n  invariant(\n    Array.isArray(spec),\n    'update(): expected spec of %s to be an array; got %s. ' +\n    'Did you forget to wrap your parameter in an array?',\n    command,\n    spec\n  );\n}\n\nfunction invariantSplices(value, spec) {\n  invariant(\n    Array.isArray(value),\n    'Expected $splice target to be an array; got %s',\n    value\n  );\n  invariantSplice(spec['$splice']);\n}\n\nfunction invariantSplice(value) {\n  invariant(\n    Array.isArray(value),\n    'update(): expected spec of $splice to be an array of arrays; got %s. ' +\n    'Did you forget to wrap your parameters in an array?',\n    value\n  );\n}\n\nfunction invariantApply(fn) {\n  invariant(\n    typeof fn === 'function',\n    'update(): expected spec of $apply to be a function; got %s.',\n    fn\n  );\n}\n\nfunction invariantSet(spec) {\n  invariant(\n    Object.keys(spec).length === 1,\n    'Cannot have more than one key in an object with $set'\n  );\n}\n\nfunction invariantMerge(target, specValue) {\n  invariant(\n    specValue && typeof specValue === 'object',\n    'update(): $merge expects a spec of type \\'object\\'; got %s',\n    specValue\n  );\n  invariant(\n    target && typeof target === 'object',\n    'update(): $merge expects a target of type \\'object\\'; got %s',\n    target\n  );\n}\n\nfunction invariantMapOrSet(target, command) {\n  var typeOfTarget = type(target);\n  invariant(\n    typeOfTarget === 'Map' || typeOfTarget === 'Set',\n    'update(): %s expects a target of type Set or Map; got %s',\n    command,\n    typeOfTarget\n  );\n}\n","module.exports = (__webpack_require__(28))(242);","import d3 from 'd3';\nimport { find, some, chain } from 'lodash';\nimport moment from 'moment-timezone';\n\n/**\n * Date/time management is really specific in geckoland:\n * Rules are the following:\n * - Any input datetime containing TZ will be converted to the supplied TZ (e.g Dashboad TZ)\n * - If no TZ in input, display data as it is! No matter the dashboard TZ or browser TZ\n *\n * To simplify datetime manipulation this module take care of applying these\n rules. ALWAYS use UTC for displaying or extra manipulation\n**/\n\nconst tzRegex = /Z|[-+]/;\n\nfunction hasTZ(datetime) {\n  const [, time] = datetime.split('T');\n  return tzRegex.test(time);\n}\n\nfunction getParseFormat(datetime) {\n  const componentCount = datetime.split(/-| |:/).length;\n\n  switch (componentCount) {\n    case 1:\n      return 'YYYY';\n    case 2:\n      return 'YYYY-MM';\n    default:\n      return null;\n  }\n}\n\nfunction normalise(datetime, timezone = 'UTC') {\n  let date;\n  const parseFormat = getParseFormat(datetime);\n  if (hasTZ(datetime)) {\n    date = moment.tz(datetime, parseFormat, timezone);\n  } else {\n    date = moment(datetime, parseFormat);\n  }\n\n  return new Date(\n    Date.UTC(\n      date.year(),\n      date.month(),\n      date.date(),\n      date.hours(),\n      date.minutes(),\n      date.seconds(),\n    ),\n  );\n}\n\nfunction pickFormat(ticks) {\n  if (ticks.length === 0) {\n    return '';\n  }\n\n  const rules = [\n    ['.%L', d => d.getUTCMilliseconds()],\n    [':%S', d => d.getUTCSeconds()],\n    ['%H:%M', d => d.getUTCMinutes()],\n    ['%H:%M', d => d.getUTCHours()],\n    ['%e %b', d => d.getUTCDate() !== 1],\n    ['%b', d => d.getUTCMonth()],\n    ['%Y', () => true],\n  ];\n\n  return find(rules, ([, rule]) => some(ticks, rule))[0];\n}\n\nfunction pickBestFormatForDuration(ticks) {\n  const now = moment().utc();\n  const today = now.format('YYYYMMDD');\n  const thisYear = now.format('YYYY');\n  const [hours, days, years] = chain(ticks)\n    .map(tick => moment(tick).utc())\n    .map(m => [m.format('YYYYMMDDHH'), m.format('YYYYMMDD'), m.format('YYYY')])\n    .unzip()\n    .value();\n\n  // If all ticks are today\n  if (days.every(day => day === today)) {\n    // If all ticks are within the same hour\n    // then display hours, minutes and seconds\n    if (hours.every(hour => hour === hours[0])) {\n      return '%H:%M:%S';\n    }\n\n    // otherwise display hours and minutes\n    return '%H:%M';\n  }\n\n  // if all ticks this year just display day and month\n  if (years.every(year => year === thisYear)) {\n    return '%e %b';\n  }\n\n  // Otherwise display the day, month and year\n  return '%e %b %Y';\n}\n\nfunction pickTooltipFormat(ticks) {\n  if (ticks.length === 0) {\n    return '';\n  }\n\n  const rules = [\n    ['%H:%M:%S.%L - %e %b %Y', d => d.getUTCMilliseconds()],\n    ['%H:%M:%S - %e %b %Y', d => d.getUTCSeconds()],\n    ['%H:%M - %e %b %Y', d => d.getUTCMinutes()],\n    ['%H:%M - %e %b %Y', d => d.getUTCHours()],\n    ['%e %b %Y', d => d.getUTCDate() !== 1],\n    ['%b %Y', d => d.getUTCMonth()],\n    ['%Y', () => true],\n  ];\n\n  return find(rules, ([, rule]) => some(ticks, rule))[0];\n}\n\nfunction prettyDateFormat(dateStrings, timezone = 'UTC') {\n  const dates = dateStrings.map(str => normalise(str, timezone));\n  const format = pickFormat(dates);\n\n  return dates.map(d3.time.format.utc(format));\n}\n\nfunction prettyDateFormatForDuration(dateStrings, timezone = 'UTC') {\n  const dates = dateStrings.map(str => normalise(str, timezone));\n  const format = pickBestFormatForDuration(dates);\n\n  return dates.map(d3.time.format.utc(format));\n}\n\nexport {\n  prettyDateFormat as default,\n  normalise,\n  pickFormat,\n  pickTooltipFormat,\n  pickBestFormatForDuration,\n  prettyDateFormatForDuration,\n};\n","import { omit, some, includes, get } from 'lodash';\n\nexport const isMirageService = service => service.name === 'universal-demo';\n\nexport const isMirageWidget = widget => !!get(widget, 'config.mirageConfig');\n\nexport const findMirageService = services => services.find(isMirageService);\n\nexport const prepareMirageWidget = (widget, integration) => {\n  return omit(\n    {\n      ...widget,\n      config: {\n        ...widget.config,\n        mirageConfig: { data: [], format: 'decimal', integration },\n      },\n      service_name: 'universal-demo',\n    },\n    'service_account_id',\n  );\n};\n\nexport const createMirageServiceAccount = service => ({\n  id: 'MIRAGE',\n  service,\n  expires_at: 0,\n  expired: false,\n  about_to_expire: false,\n  version: 1,\n  name: 'Sample Data',\n});\n\nexport const shouldCreateMirageWidget = (\n  service,\n  featureFlags,\n  connections,\n  activatedMirageIntegrations,\n) => {\n  if (service.name !== 'ga2') {\n    return false;\n  }\n\n  if (!featureFlags.includes('ff:mirage')) {\n    return false;\n  }\n\n  if (some(connections, c => c.service.name === service.name)) {\n    return false;\n  }\n\n  if (activatedMirageIntegrations.includes('ga2')) {\n    return false;\n  }\n\n  return true;\n};\n\nconst SUPPORTED_MIRAGE_SERVICES = ['ga2'];\nexport const canServiceUseMirage = service =>\n  includes(SUPPORTED_MIRAGE_SERVICES, service);\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout---1ncyT\",\"wrapper\":\"wrapper---1AN72\",\"svg\":\"svg---2RFs6\",\"value\":\"value---14ULu\",\"min\":\"min---1LKSN\",\"max\":\"max---TPUiO\",\"gaugeArc\":\"gaugeArc---1rIk6\",\"gaugeNeedle\":\"gaugeNeedle---3LNuG\",\"positive\":\"positive---3PYrA\",\"warning\":\"warning---2cYW2\",\"amber\":\"amber---1UQu1\",\"outOfBoundsWarning\":\"outOfBoundsWarning---3aTSK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---3hupT\",\"button\":\"button---Tw6Lr\",\"menu\":\"menu---fgdHg\",\"toggleButton\":\"toggleButton---Fp03l\",\"panel\":\"panel---2MEfK\",\"open\":\"open---34TtF\",\"heading\":\"heading---2D9s3\",\"toggle\":\"toggle---31qRH\",\"info\":\"info---3QWhz\",\"error\":\"error---3Swgc\",\"muted\":\"muted---3UXIh\",\"wrapperTabs\":\"wrapperTabs---qhogI\",\"layoutTabList\":\"layoutTabList---gxnQn\",\"tabPanel\":\"tabPanel---3LuB-\",\"featureGate\":\"featureGate---36kaj\",\"featureGateTitle\":\"featureGateTitle---jkegs\",\"featureGateContent\":\"featureGateContent---2xrB5\",\"featureGateAction\":\"featureGateAction---hKraJ\",\"shareIllustration\":\"shareIllustration---S_ljl\",\"tabTitle\":\"tabTitle---2x7M0\",\"iconContainerLink\":\"iconContainerLink---2sOD4\",\"iconContainer\":\"iconContainer---3Tq9p\",\"shareLinkText\":\"shareLinkText---1QtJq\"};","function hasCheckpoint(user, checkpoint) {\n  const { checkpoints = [] } = user;\n  return checkpoints.indexOf(checkpoint) !== -1;\n}\n\nfunction getInitials(firstName = '', lastName = '') {\n  return [firstName, lastName]\n    .filter(name => typeof name === 'string' && name !== '')\n    .map(name => name.trim().codePointAt(0))\n    .map(initial => String.fromCodePoint(initial))\n    .join('');\n}\n\nconst EMAIL_RE = /^[^@`]+@[^@]+$/;\nconst isValidEmail = email => EMAIL_RE.test(email);\n\nexport { hasCheckpoint, getInitials, isValidEmail };\n","// Brand colors in Javascript\n// Note: These colors need to be in sync with\n// the colors in the CSS (_colors.scss file)\n\nconst GeckoboardGreen = '#0FD354';\nconst GeckoboardYellow = '#FFD339';\nconst GeckoboardBlue = '#00D1FF';\nconst GeckoboardWhite = '#E9E7F9';\nconst GeckoboardMint = '#3CD3D3';\n\nconst Positive = GeckoboardGreen;\nconst Negative = '#EC373C';\n\nconst PositiveOnDark = '#7ACD78';\nconst NegativeOnDark = '#FC5C6A';\n\nconst Black70 = '#5C5875';\nconst Black90 = '#2E294E';\nconst Black100 = '#16113A';\n\nconst BackgroundLight = '#F8F8F9';\nconst BackgroundMid = '#E6E9F1';\nconst BackgroundDark = '#DFE4EE';\n\nexport {\n  GeckoboardGreen,\n  GeckoboardYellow,\n  GeckoboardBlue,\n  GeckoboardWhite,\n  GeckoboardMint,\n  Positive,\n  Negative,\n  PositiveOnDark,\n  NegativeOnDark,\n  Black70,\n  Black90,\n  Black100,\n  BackgroundLight,\n  BackgroundMid,\n  BackgroundDark,\n};\n","import * as colors from '../../../ui/style/colors.js';\n\nconst neutralVisualisationColor = '#39393B';\n\nexport default {\n  '--background-color': '#101214',\n  '--title-color': 'rgba(255, 255, 255, 0.92)',\n  '--text-color': 'rgba(255, 255, 255, 0.86)',\n  '--secondary-text-color': 'rgba(255, 255, 255, 0.6)',\n  '--positive-threshold-color': colors.GeckoboardGreen,\n  '--widget-background-color': '#2a2a2a',\n  '--widget-active-background-color': '#303030',\n  '--chart-axis-color': 'rgba(255, 255, 255, 0.13)',\n  '--chart-axis-color-strong': 'rgba(255, 255, 255, 0.2)',\n  '--chart-neutral-color': '#3fb4f9',\n  '--widget-footer-color': 'rgba(31, 31, 31, 0.9)',\n  '--selected-widget-header-color': '#4D4F50',\n  '--selected-widget-header-text-color': '#fff',\n  '--dragger-color':\n    'rgba(255, 255, 255, 0.05)' /* This is the guide colour when dragging a widget */,\n  '--widget-loader-color':\n    'rgba(255, 255, 255, 0.05)' /* Color of the loading indicator in the visualisation */,\n  '--widget-shimmer-color': 'rgba(255, 255, 255, 0.09)',\n  '--line-chart-footer-color':\n    'rgba(31, 31, 31, 0.7)' /* No idea why this is unique */,\n  '--widget-action-menu-hover-color': '#2a2a2a',\n  '--widget-drag-blend-mode': 'screen',\n  '--widget-drag-ghost-color': 'rgba(113, 119, 121, 0.5)',\n  '--dashboard-text-color': 'rgba(255, 255, 255, 0.86)',\n  '--goal-pill-background-color': 'rgba(255, 255, 255, 0.12)',\n\n  /* Some IE9 Hackery... */\n  '--ie9-spinner': 'url(/assets/loading-spinner-ie9.gif)',\n\n  /* Old geckometers */\n  '--gauge-needle-color': '#e1e1e1',\n  '--gauge-threshold-color': 'rgba(0, 0, 0, 0.3)',\n  '--gauge-color': '#e1e1e1',\n\n  /* Geckometer */\n  '--gauge-arc-color': neutralVisualisationColor,\n  '--gauge-warning-color': colors.Negative,\n  '--gauge-positive-color': colors.Positive,\n  '--gauge-amber-color': '#edcb45',\n\n  /* Number widget */\n  /* Don't know how this is used */\n  '--number-goal-wrapper-color': '#454545',\n\n  /* Text widget */\n  '--text-slide-link-color': 'rgba(255, 255, 255, 0.13)',\n  '--text-slide-active-color': 'rgba(255, 255, 255, 0.55)',\n\n  '--chart-threshold-color': neutralVisualisationColor,\n  '--number-threshold-color': 'rgba(255, 255, 255, 0.49)',\n  '--number-threshold-text-color': '#2A2A2A',\n\n  /* Map widget */\n  '--map-subunit-color': '#4a4a4a',\n  '--map-single-point-color': '#38cdff',\n\n  /* Geckobox */\n  '--geckobox-backdrop-color': '#2a2a2a',\n  '--geckobox-grid-color': '#FFFFFF',\n\n  /* Mobile footer */\n  '--mobile-footer-background-color': '#FFFFFF',\n  '--mobile-footer-text-color': colors.Black100,\n};\n","import * as colors from '../../../ui/style/colors.js';\n\nconst neutralVisualisationColor = '#f5f5f5';\n\nexport default {\n  '--background-color': '#f0f0f0',\n  '--title-color': '#8b8b8b',\n  '--text-color': '#666666',\n  '--secondary-text-color': '#828282',\n  '--positive-threshold-color': colors.GeckoboardGreen,\n  '--widget-background-color': '#ffffff',\n  '--widget-active-background-color': '#ffffff',\n  '--chart-axis-color': 'rgba(0, 0, 0, 0.13)',\n  '--chart-axis-color-strong': 'rgba(0, 0, 0, 0.2)',\n  '--widget-footer-color': 'rgba(245, 245, 245, 0.9)',\n  '--selected-widget-header-color': '#8b9092',\n  '--selected-widget-header-text-color': '#ffffff',\n  '--dragger-color':\n    'rgba(0, 0, 0, 0.05)' /* This is the guide colour when dragging a widget */,\n  '--widget-loader-color':\n    'rgba(0, 0, 0, 0.08)' /* Color of the loading indicator in the visualisation */,\n  '--widget-shimmer-color': 'rgba(0, 0, 0, 0.09)',\n  '--line-chart-footer-color':\n    'rgba(245, 245, 245, 0.7)' /* No idea why this is unique */,\n  '--widget-action-menu-hover-color':\n    '#dcdcdc' /* Not sure why this is changed */,\n  '--widget-drag-blend-mode': 'normal',\n  '--widget-drag-ghost-color': 'rgba(113, 119, 121, 0.5)',\n  '--dashboard-text-color': 'rgba(0, 0, 0, 0.86)',\n  '--goal-pill-background-color': 'rgba(0, 0, 0, 0.12)',\n\n  /* Some IE9 Hackery... */\n  '--ie9-spinner':\n    'url(https://d2s28ygc2k7998.cloudfront.net/polecat-css-icons/loading-spinner-light-ie9.gif)',\n\n  /* Old Geckometers */\n  '--gauge-needle-color':\n    '#8b9092' /* This is also used for widget selected header */,\n  '--gauge-color': '#dfdfdf',\n\n  /* Geckometer */\n  '--gauge-arc-color': neutralVisualisationColor,\n  '--gauge-warning-color': colors.Negative,\n  '--gauge-positive-color': colors.Positive,\n  '--gauge-amber-color': '#edcb45',\n\n  /* Number widget */\n  /* Don't know how this is used */\n  '--number-goal-wrapper-color': '#c2c9cb',\n\n  /* Text widget */\n  '--text-slide-link-color': '#9f9f9f',\n  '--text-slide-active-color': '#424242',\n\n  '--chart-threshold-color': neutralVisualisationColor,\n  '--number-threshold-color': '#8b9092',\n  '--number-threshold-text-color': '#ffffff',\n\n  /* Map widget */\n  '--map-subunit-color': '#e0e0e0',\n  '--map-single-point-color': '#b940ff',\n\n  /* Geckobox */\n  '--geckobox-backdrop-color': '#ffffff',\n  '--geckobox-grid-color': '#000000',\n\n  /* Mobile footer */\n  '--mobile-footer-background-color': colors.Black100,\n  '--mobile-footer-text-color': '#FFFFFF',\n};\n","import dark from './dark';\nimport * as colors from '../../../ui/style/colors.js';\n\nconst neutralVisualisationColor = '#46476E';\nconst containerHighlightColor = '#dadada';\n\nexport default {\n  ...dark,\n  '--dashboard-background-color': colors.Black100,\n  '--container-background-color': '#272953',\n  '--container-border-color': '#4a4a4a',\n  '--container-border-focus-color': '#1F9FFF',\n  '--container-hover-color': containerHighlightColor,\n  '--dropbox-color': 'rgba(8, 119, 255, 0.2)',\n  '--dropbox-border-color': containerHighlightColor,\n  '--title-placeholder-color': '#82839D',\n  '--label-color': '#C0C9DE',\n  '--frame-resize-handle-color': containerHighlightColor,\n  '--frame-resize-handle-dragging-color': '#b7b7b7',\n  '--resize-icon-bar-color': '#ececec',\n  '--resize-icon-handle-color': '#f6f6f6',\n  '--full-container-overlay-color': 'rgba(22,17,58, 0.95)', // matches the dashboard-background-color, but increased transparency\n  '--full-container-overlay-text-container-color': 'rgb(22,17,58)', // matches the dashboard-background color\n  '--progress-bar-background-color': neutralVisualisationColor,\n  '--positive-color': colors.Positive,\n  '--negative-color': colors.Negative,\n  '--positive-indicator-fill-color': '#2F3959',\n  '--negative-indicator-fill-color': '#3C2E58',\n  '--mobile-footer-background-color': colors.BackgroundDark,\n  '--mobile-footer-text-color': colors.Black100,\n\n  // override visualisation colors\n  '--chart-threshold-color': neutralVisualisationColor,\n  '--map-subunit-color': 'rgba(255,255,255, 0.4)',\n  '--chart-neutral-color': colors.GeckoboardBlue,\n  '--gauge-arc-color': neutralVisualisationColor,\n\n  // override dark theme colors for config pages\n  '--background-color': colors.Black100,\n  '--widget-background-color': '#272953',\n};\n","import light from './light';\nimport * as colors from '../../../ui/style/colors.js';\n\nconst neutralVisualisationColor = '#ECEFF5';\nconst containerHighlightColor = '#4a4a4a';\n\nexport default {\n  ...light,\n  '--dashboard-background-color': colors.BackgroundDark,\n  '--container-background-color': '#FFFFFF',\n  '--container-border-color': '#dadada',\n  '--container-hover-color': containerHighlightColor,\n  '--container-border-focus-color': '#1571F1',\n  '--dropbox-color': 'rgba(8, 119, 255, 0.1)',\n  '--dropbox-border-color': '#0e0e0e',\n  '--title-placeholder-color': '#8b9092',\n  '--label-color': '#8b8b8b', // matches title-color - not ideal, but will suffice until we update the theme for Dashies\n  '--frame-resize-handle-color': containerHighlightColor,\n  '--frame-resize-handle-dragging-color': '#6e6e6e',\n  '--resize-icon-bar-color': containerHighlightColor,\n  '--resize-icon-handle-color': '#0e0e0e',\n  '--full-container-overlay-color': 'rgba(255, 255, 255, 0.95)', // matches the container-background-color, with increased transparency\n  '--full-container-overlay-text-container-color': 'rgb(255, 255, 255)', // matches the container-background-color\n  '--progress-bar-background-color': neutralVisualisationColor,\n  '--positive-color': colors.Positive,\n  '--negative-color': colors.Negative,\n  '--positive-indicator-fill-color': '#E8F8EE',\n  '--negative-indicator-fill-color': '#FEE9E7',\n  '--mobile-footer-background-color': colors.Black100,\n  '--mobile-footer-text-color': '#FFFFFF',\n\n  // override visualisation colors\n  '--chart-threshold-color': neutralVisualisationColor,\n  '--map-subunit-color': '#D4DAE6',\n  '--chart-neutral-color': '#00C4EF',\n  '--gauge-arc-color': neutralVisualisationColor,\n};\n","import dark from './dark';\nimport light from './light';\nimport navy from './navy';\nimport purple from './purple';\nimport dashiesDark from './dashiesDark';\nimport dashiesLight from './dashiesLight';\nimport { mapValues } from 'lodash';\n\n// Apply defaults from the dark theme\nconst themes = mapValues(\n  { light, navy, purple, dashiesDark, dashiesLight },\n  props => ({\n    ...dark,\n    ...props,\n  }),\n);\nthemes.dark = dark;\nthemes.custom = dark;\nthemes.user = dark;\n\nexport default themes;\n","export default {\n  '--background-color': '#191E30',\n  '--widget-background-color': '#2E354C',\n  '--widget-active-background-color': '#343c55',\n  '--widget-footer-color': 'rgba(35, 41, 61, 0.9)',\n  '--line-chart-footer-color':\n    'rgba(35, 41, 61, 0.9)' /* No idea why this is unique */,\n  '--widget-action-menu-hover-color': '#2E354C',\n  '--selected-widget-header-color': '#444C67',\n\n  /* Geckometers */\n  '--gauge-threshold-color': '#9598A4',\n\n  /* Number widget */\n  '--number-threshold-text-color': '#2E354C',\n\n  /* Bar chart */\n  /* this should be consolidated with the linechart one above */\n  '--chart-threshold-color': '#383F58',\n\n  /* Map widget */\n  '--map-subunit-color': '#4D5366',\n  '--map-single-point-color': '#55E46C',\n\n  /* Geckobox */\n  '--geckobox-backdrop-color': '#2E354C',\n};\n","export default {\n  '--background-color': '#2C1F33',\n  '--widget-background-color': '#3C2E47',\n  '--widget-active-background-color': '#433450',\n  '--widget-footer-color': 'rgba(53, 39, 64, 0.9)',\n  '--line-chart-footer-color':\n    'rgba(53, 39, 64, 0.9)' /* No idea why this is unique */,\n  '--widget-action-menu-hover-color': '#3C2E47',\n  '--selected-widget-header-color': '#614F6F',\n\n  /* Geckometers */\n  '--gauge-threshold-color': '#9C95A1',\n\n  /* Number widget */\n  '--number-threshold-text-color': '#3C2E47',\n\n  /* Bar chart */\n  /* this should be consolidated with the linechart one above */\n  '--chart-threshold-color': '#493B54',\n\n  /* Map widget */\n  '--map-subunit-color': '#594D62',\n  '--map-single-point-color': '#E5C653',\n\n  /* Geckobox */\n  '--geckobox-backdrop-color': '#3C2E47',\n};\n","export const VIEWS = {\n  MENU: 'MENU',\n  CLOSED: 'CLOSED',\n  EDIT: 'EDIT',\n  DELETE: 'DELETE',\n  STATUS_INDICATORS: 'STATUS_INDICATORS',\n  NUMBER_FORMATTING: 'NUMBER_FORMATTING',\n};\n","import { FRAME_WIDTH, FRAME_HEIGHT } from './box-layout-constants';\n\nexport const applyRatioToWidgetLayout = (layout = {}, ratio) => ({\n  ...layout,\n  pixel_width: (layout.pixel_width + 10) * ratio - 10,\n  pixel_height: (layout.pixel_height + 10) * ratio - 10,\n  top: layout.top * ratio,\n  left: layout.left * ratio,\n});\n\nconst applyRatioToFrameLayout = (layout = {}, ratio) => {\n  const transformedLayout = {};\n  if (layout.size) {\n    transformedLayout.size = {\n      width: (layout.size.width + 10) * ratio - 10,\n      height: (layout.size.height + 10) * ratio - 10,\n    };\n  }\n  if (layout.position) {\n    transformedLayout.position = {\n      ...layout.position,\n      top: layout.position.top * ratio,\n      left: layout.position.left * ratio,\n    };\n  }\n  return transformedLayout;\n};\n\nexport const convertFrameLayoutToGrid = (layout, columns) => {\n  const ratio = 8 / columns;\n\n  return applyRatioToFrameLayout(layout, ratio);\n};\n\nexport const convertFramePositionFromGrid = (position, columns) => {\n  const ratio = 1 / (8 / columns);\n\n  return applyRatioToFrameLayout({ position }, ratio).position;\n};\n\nexport const convertWidgetLayoutToGrid = (layout, dashboard) => {\n  const { columns, toggles = [] } = dashboard;\n\n  if (!toggles.includes('grid')) {\n    return layout;\n  }\n\n  const ratio = 8 / columns;\n\n  return applyRatioToWidgetLayout(layout, ratio);\n};\n\nexport const convertWidgetLayoutFromGrid = (layout, dashboard) => {\n  const { columns, toggles = [] } = dashboard;\n\n  if (!toggles.includes('grid')) {\n    return layout;\n  }\n\n  const ratio = 1 / (8 / columns);\n\n  return applyRatioToWidgetLayout(layout, ratio);\n};\n\nexport const isWidgetOutOfFrame = ({\n  pixel_width: width,\n  pixel_height: height,\n  top,\n  left,\n}) => {\n  return width + left > FRAME_WIDTH || height + top > FRAME_HEIGHT;\n};\n","export const FORM_TYPES = {\n  RAW: 'raw',\n  SUMMARIZED: 'summarized',\n};\n","import createAction from '../../lib/redux/create-action';\nimport { isUndefined, isNull } from 'lodash';\nimport fetchJSON, { fetchAll } from '../../universal/fetch';\nimport { formatMessage } from '../../lib/i18n';\nimport { patchUser } from '../../services/management-service';\n\nconst WHATS_NEW_ENDPOINT =\n  'https://s3.amazonaws.com/geckoboard-rss-feed/whats-new.json';\n\n// Actions\nexport const toggleModalAction = createAction('WhatsNew:TOGGLE_MODAL');\nexport const toggleNotification = createAction('WhatsNew:TOGGLE_NOTIFICATION');\nexport const markAsReadAction = createAction('WhatsNew:MARK_AS_READ');\n\nexport const fetchDataStart = createAction('WhatsNew:FETCH_DATA_START');\nexport const fetchDataSuccess = createAction('WhatsNew:FETCH_DATA_SUCCESS');\nexport const fetchDataFailed = createAction('WhatsNew:FETCH_DATA_FAILED');\n\n// Async Actions\nexport const toggleModal = visible => async (dispatch, getState) => {\n  dispatch(toggleModalAction(visible));\n\n  const { whatsNew = {} } = getState();\n  if (whatsNew.items) {\n    return;\n  }\n\n  try {\n    dispatch(fetchDataStart());\n\n    const { items } = await fetchJSON(WHATS_NEW_ENDPOINT);\n    dispatch(fetchDataSuccess({ items }));\n  } catch (e) {\n    const message = formatMessage('whatsnew.errorMessage');\n    dispatch(fetchDataFailed(message));\n  }\n};\n\nexport const markAsRead = () => async (dispatch, getState) => {\n  try {\n    const { whatsNew: { etag } = {} } = getState();\n\n    dispatch(toggleNotification(false));\n\n    const user = await patchUser({ whats_new_etag: etag });\n    dispatch(markAsReadAction(user));\n  } catch (err) {\n    // Don't worry if this fails for now\n  }\n};\n\nexport const checkForNewUpdate = userEtag => async (dispatch, getState) => {\n  if (isUndefined(userEtag)) {\n    return;\n  }\n\n  try {\n    const res = await fetchAll(WHATS_NEW_ENDPOINT);\n    const etag = res.headers.get('ETag');\n    const firstRun = isNull(userEtag);\n\n    if (!firstRun && etag !== userEtag) {\n      dispatch(toggleNotification(true));\n    }\n\n    const { items } = await res.json();\n    dispatch(fetchDataSuccess({ items, etag }));\n\n    // don't show notification for first time user\n    if (firstRun) {\n      await markAsRead()(dispatch, getState);\n    }\n  } catch (err) {\n    // Don't worry for now\n  }\n};\n","import { isArray, pick, set, get, has, times, includes } from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\n\nconst DEFAULT_AGGREGATE = 'sum';\nconst DATETIME_BUCKETING_ONLY = ['minute', 'hour'];\n\nconst getDefaultQuery = fieldGroups => {\n  const firstDatetimeField = get(fieldGroups, 'datetime[0].key');\n  const firstNumericField = get(fieldGroups, 'numeric[0].key');\n\n  if (!firstDatetimeField) {\n    throw new Error(\n      'Your dataset does not contain any date or datetime fields, which are required for a line chart.',\n    );\n  }\n\n  const metric = { aggregate: DEFAULT_AGGREGATE };\n\n  if (firstNumericField) {\n    metric.field = firstNumericField;\n  } else {\n    metric.aggregate = 'count';\n    metric._aggregate = DEFAULT_AGGREGATE;\n  }\n\n  return {\n    metrics: [metric],\n    x_axis: {\n      field: firstDatetimeField,\n      bucket_by: 'day',\n    },\n  };\n};\n\nconst ensureConfig = currentConfig => {\n  const config = pick(\n    currentConfig,\n    'title',\n    'type',\n    'dataSetId',\n    'goal',\n    '_saved',\n    'minYAxis',\n    'maxYAxis',\n    'secondaryIndex',\n    'reverseGoalDirection',\n  );\n\n  if (has(currentConfig, 'comparison.thresholdType')) {\n    config.reverseGoalDirection =\n      currentConfig.comparison.thresholdType === 'lower';\n  }\n\n  config.numberFormat = !isArray(currentConfig.numberFormat)\n    ? currentConfig.numberFormat\n    : {};\n  return config;\n};\n\nconst updateQuery = (currentQuery, path, value, fields) => {\n  const newQuery = set(currentQuery, path, value);\n  const { metrics = [] } = newQuery;\n  const numberOfMetrics = metrics.length || 1;\n  const bucketBy = get(newQuery, 'x_axis.bucket_by');\n  const xAxisField = get(newQuery, 'x_axis.field');\n\n  // When switching to a date type from a datetime - 'hour' is no longer a valid bucketing option\n  if (\n    includes(DATETIME_BUCKETING_ONLY, bucketBy) &&\n    'date' === fields[xAxisField].type\n  ) {\n    newQuery.x_axis.bucket_by = 'day';\n  }\n\n  newQuery.metrics = times(numberOfMetrics, i => {\n    const metric = get(newQuery, `metrics[${i}]`, {});\n\n    // Default aggregate to sum\n    if (!metric.aggregate) {\n      metric.aggregate = DEFAULT_AGGREGATE;\n    }\n\n    // Map the field value `aggregate:count` to the aggregate property\n    if (get(metric, 'field') === 'aggregate:count') {\n      delete metric.field;\n      metric._aggregate = metric.aggregate;\n      metric.aggregate = 'count';\n    }\n    if (metric.aggregate === metric._aggregate) {\n      delete metric._aggregate;\n    }\n\n    // When a field is applied and we're currently aggregating by count then we must revert to the original\n    // aggregate\n    if (metric.field && metric.aggregate === 'count') {\n      metric.aggregate = metric._aggregate || DEFAULT_AGGREGATE;\n      delete metric._aggregate;\n    }\n\n    // Remove split_by when we have more than 1 metric or the user has selected the none option\n    if (numberOfMetrics > 1 || 'split_by:none' === value) {\n      delete metric.split_by;\n    }\n\n    return metric;\n  });\n\n  return newQuery;\n};\n\nconst COLUMN_MAPPINGS = [\n  'metrics',\n  [\n    'x_axis',\n    (xAxis = {}, _lastXAxis, _lastQuery, types) => {\n      // Linechart only supports datetimes/dates for the X-Axis\n      if (!['datetime', 'date'].includes(types[xAxis.field])) {\n        return undefined;\n      }\n\n      return pick(xAxis, 'field', 'bucket_by');\n    },\n  ],\n  ['filters'],\n];\nconst NUMBER_AND_GECKOMETER_MAPPINGS = [\n  ['field', field => [{ field, aggregate: DEFAULT_AGGREGATE }], 'metrics'],\n  // Overide the default `aggregate` when available\n  ['aggregate', null, 'metrics[0].aggregate'],\n  ['filters'],\n];\nconst LEADERBAORD_MAPPINGS = [\n  ['metric', field => [{ field, aggregate: DEFAULT_AGGREGATE }], 'metrics'],\n  // Overide the default `aggregate` when available\n  ['aggregate', null, 'metrics[0].aggregate'],\n  ['filters'],\n];\n\nconst QUERY_MAPPING_RULES = {\n  geckometer: NUMBER_AND_GECKOMETER_MAPPINGS,\n  number: NUMBER_AND_GECKOMETER_MAPPINGS,\n  leaderboard: LEADERBAORD_MAPPINGS,\n  column: COLUMN_MAPPINGS,\n  bar: COLUMN_MAPPINGS,\n};\n\nconst mapQuery = (fromType, ...rest) =>\n  applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n};\n\nexport default visualisationHelpers;\n","import { pick, set, has, chain, omitBy, isArray, isUndefined } from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\n\nconst getDefaultQuery = fieldGroups => {\n  if (!has(fieldGroups, 'numeric[0]')) {\n    return {\n      aggregate: 'count',\n      slice: 1,\n    };\n  }\n\n  const query = {\n    field: fieldGroups.numeric[0].key,\n    slice: 20,\n  };\n\n  if (has(fieldGroups, 'datetime[0]')) {\n    query.order_by = fieldGroups.datetime[0].key;\n  }\n\n  return query;\n};\n\nconst ensureConfig = currentConfig => {\n  const config = pick(\n    currentConfig,\n    'title',\n    'type',\n    'dataSetId',\n    'comparison',\n    'goal',\n    'label',\n    'comparisonLabel',\n    'indicators',\n    '_saved',\n  );\n\n  const { comparison = {} } = config;\n\n  if (comparison.type === 'goal') {\n    // Overwrite any options that have been set on goal comparison\n    const newComparison = omitBy(\n      {\n        type: 'goal',\n        startingValue: comparison.startingValue,\n      },\n      isUndefined,\n    );\n    config.comparison = newComparison;\n  }\n\n  config.numberFormat = !isArray(currentConfig.numberFormat)\n    ? currentConfig.numberFormat\n    : {};\n\n  return config;\n};\n\nconst updateQuery = (currentQuery, path, value) => {\n  if ('filters' === path) {\n    return set(currentQuery, path, value);\n  }\n\n  if ('aggregate:count' === value) {\n    const stored = ['order_by', 'aggregate'];\n    return chain(currentQuery)\n      .mapKeys((_value, key) => {\n        return stored.includes(key) ? `_${key}` : key;\n      })\n      .omit('field', ...stored)\n      .tap(query => {\n        query.aggregate = 'count';\n        query.slice = 1;\n      })\n      .value();\n  }\n\n  return chain(currentQuery)\n    .clone()\n    .set(path, value)\n    .tap(query => {\n      // omitBy would be great lodash@4\n      // Always remove the aggregate count or latest\n      if (['count', 'latest'].includes(query.aggregate)) {\n        delete query.aggregate;\n      }\n    })\n    .mapKeys((_value, key) => {\n      return '_' === key[0] ? key.slice(1) : key;\n    })\n    .tap(query => {\n      // Insertion order means no explicit ordering\n      if (query.order_by === 'order_by:insertion') {\n        delete query.order_by;\n      }\n\n      // An aggregate cannot have an order\n      if (query.aggregate && query.order_by) {\n        query._order_by = query.order_by;\n        delete query.order_by;\n      }\n\n      query.slice = query.aggregate ? 1 : 20;\n    })\n    .value();\n};\n\nconst MAP_METRICS = [\n  ['metrics[0].field', null, 'field'],\n  ['metrics[0].aggregate', null, 'aggregate'],\n  ['filters'],\n];\n\nconst LEADERBOARD_MAPPINGS = [\n  ['metric', null, 'field'],\n  ['aggregate', null, 'aggregate'],\n  ['filters'],\n];\n\nconst QUERY_MAPPING_RULES = {\n  line: MAP_METRICS,\n  column: MAP_METRICS,\n  bar: MAP_METRICS,\n  geckometer: ['field', 'aggregate', 'filters'],\n  leaderboard: LEADERBOARD_MAPPINGS,\n};\n\nconst mapQuery = (fromType, ...rest) => {\n  const query = applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\n  // `aggregate: count` is incompatible with `field`\n  if ('count' === query.aggregate) {\n    delete query.field;\n  }\n  if (query.aggregate) {\n    query.slice = 1;\n    delete query.order_by;\n  }\n\n  return query;\n};\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n};\n\nexport default visualisationHelpers;\n","import { pick, set, has, isArray } from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\n\nconst getDefaultQuery = fieldGroups => {\n  if (!has(fieldGroups, 'numeric[0]')) {\n    throw new Error(\n      'Your dataset does not contain any numeric fields, which are required for a leaderboard.',\n    );\n  }\n\n  if (!has(fieldGroups, 'string[0]')) {\n    throw new Error(\n      'Your dataset does not contain any string fields, which are required for a leaderboard.',\n    );\n  }\n\n  return {\n    metric: fieldGroups.numeric[0].key,\n    aggregate: 'sum',\n    label: fieldGroups.string[0].key,\n    slice: 30,\n  };\n};\n\nconst ensureConfig = currentConfig => {\n  const config = pick(\n    currentConfig,\n    'title',\n    'type',\n    'dataSetId',\n    'reverseSort',\n  );\n\n  return {\n    ...config,\n    numberFormat: !isArray(currentConfig.numberFormat)\n      ? currentConfig.numberFormat\n      : {},\n  };\n};\n\nconst updateQuery = (currentQuery, path, field) => {\n  return set(currentQuery, path, field);\n};\n\nconst MULTI_METRICS_MAPPINGS = [\n  ['metrics[0].field', null, 'metric'],\n  [\n    'metrics[0].aggregate',\n    aggregate => {\n      return 'count' === aggregate ? 'sum' : aggregate;\n    },\n    'aggregate',\n  ],\n  ['filters'],\n];\n\nconst QUERY_MAPPING_RULES = {\n  geckometer: [['field', null, 'metric'], ['filters']],\n  number: [['field', null, 'metric'], ['filters']],\n  line: MULTI_METRICS_MAPPINGS,\n  column: MULTI_METRICS_MAPPINGS,\n  bar: MULTI_METRICS_MAPPINGS,\n};\n\nconst mapQuery = (fromType, ...rest) =>\n  applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n};\n\nexport default visualisationHelpers;\n","import * as transformers from '../../../universal/transformers';\nimport {\n  getGeckometerDefaultMinMax,\n  setExtremum,\n} from '../../../lib/geckometer';\nimport { pick, set, has, chain, isArray } from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\n\nconst getDefaultQuery = fieldGroups => {\n  if (!has(fieldGroups, 'numeric[0]')) {\n    return {\n      aggregate: 'count',\n    };\n  }\n\n  const query = {\n    field: fieldGroups.numeric[0].key,\n    slice: 1,\n  };\n\n  if (has(fieldGroups, 'datetime[0]')) {\n    query.order_by = fieldGroups.datetime[0].key;\n  }\n\n  return query;\n};\n\nconst ensureConfig = (currentConfig, queryResult) => {\n  let config = pick(\n    currentConfig,\n    'dataSetId',\n    'type',\n    'min',\n    'max',\n    'title',\n    'goal', // Remove goal once status indicators for geckometers have been migrated properly in the db\n    'reverseGoalDirection',\n    'indicators',\n    '_saved',\n    '_minTyped',\n    '_maxTyped',\n    'numberFormat',\n  );\n\n  const { item, format } = transformers.datasets.geckometer.transform(\n    queryResult,\n    config,\n  );\n\n  config = { ...config, ...getGeckometerDefaultMinMax(item, format) };\n\n  const { _minTyped, _minDefault, min, _maxTyped, _maxDefault, max } = config;\n\n  if (has(currentConfig, 'comparison.thresholdType')) {\n    config.reverseGoalDirection =\n      currentConfig.comparison.thresholdType === 'lower';\n  }\n\n  return {\n    ...config,\n    ...setExtremum('min', {\n      _typed: _minTyped,\n      _default: _minDefault,\n      extremum: min,\n    }),\n    ...setExtremum('max', {\n      _typed: _maxTyped,\n      _default: _maxDefault,\n      extremum: max,\n    }),\n    numberFormat: !isArray(currentConfig.numberFormat)\n      ? currentConfig.numberFormat\n      : {},\n  };\n};\n\nconst updateQuery = (currentQuery, path, value) => {\n  if ('filters' === path) {\n    return set(currentQuery, path, value);\n  }\n\n  if ('aggregate:count' === value) {\n    return chain(currentQuery)\n      .mapKeys((_value, key) => `_${key}`)\n      .pick('_order_by', '_aggregate')\n      .tap(query => {\n        query.aggregate = 'count';\n      })\n      .value();\n  }\n\n  return chain(currentQuery)\n    .clone()\n    .set(path, value)\n    .tap(query => {\n      // omitBy would be great lodash@4\n      // Always remove the aggregate count or latest\n      if (['count', 'latest'].includes(query.aggregate)) {\n        delete query.aggregate;\n      }\n    })\n    .mapKeys((_value, key) => {\n      return '_' === key[0] ? key.slice(1) : key;\n    })\n    .tap(query => {\n      // Insertion order means no explicit ordering\n      if (query.order_by === 'order_by:insertion') {\n        delete query.order_by;\n      }\n\n      // An aggregate cannot have an order\n      if (query.aggregate && query.order_by) {\n        query._order_by = query.order_by;\n        delete query.order_by;\n      }\n    })\n    .set('slice', 1)\n    .value();\n};\n\nconst MAP_METRICS = [\n  ['metrics[0].field', null, 'field'],\n  ['metrics[0].aggregate', null, 'aggregate'],\n  ['filters'],\n];\n\nconst LEADERBOARD_MAPPINGS = [\n  ['metric', null, 'field'],\n  ['aggregate', null, 'aggregate'],\n  ['filters'],\n];\n\nconst QUERY_MAPPING_RULES = {\n  line: MAP_METRICS,\n  column: MAP_METRICS,\n  bar: MAP_METRICS,\n  number: ['field', 'aggregate', 'filters'],\n  leaderboard: LEADERBOARD_MAPPINGS,\n};\n\nconst mapQuery = (fromType, ...rest) => {\n  const query = applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\n  // `aggregate: count` is incompatible with `field`\n  if ('count' === query.aggregate) {\n    delete query.field;\n  }\n  if (query.aggregate) {\n    query.slice = 1;\n    delete query.order_by;\n  }\n\n  return query;\n};\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n};\n\nexport default visualisationHelpers;\n","import { pick, set, get, has, includes, isArray } from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\n\nconst DEFAULT_AGGREGATE = 'sum';\nconst DATETIME_BUCKETING_ONLY = ['minute', 'hour'];\n\nconst ensureConfig = currentConfig => {\n  const config = pick(\n    currentConfig,\n    'title',\n    'type',\n    'dataSetId',\n    'goal',\n    '_saved',\n    'reverseGoalDirection',\n  );\n\n  if (has(currentConfig, 'comparison.thresholdType')) {\n    config.reverseGoalDirection =\n      currentConfig.comparison.thresholdType === 'lower';\n  }\n  config.numberFormat = !isArray(currentConfig.numberFormat)\n    ? currentConfig.numberFormat\n    : {};\n\n  return config;\n};\n\nconst getDefaultQuery = fieldGroups => {\n  const firstXAxis = get(fieldGroups, 'groupable[0]');\n  const firstNumericField = get(fieldGroups, 'numeric[0].key');\n\n  if (!firstXAxis) {\n    throw new Error(\n      'Your dataset does not contain any date / datetime or string fields, which are required for this visualisation.',\n    );\n  }\n\n  const { key: xAxisField, type: xAxisType } = firstXAxis;\n  const xAxis = { field: xAxisField };\n  const metric = {};\n\n  if (firstNumericField) {\n    metric.field = firstNumericField;\n    metric.aggregate = DEFAULT_AGGREGATE;\n  } else {\n    // Apply record count aggregation when there are no numeric fields\n    metric.aggregate = 'count';\n    metric._aggregate = DEFAULT_AGGREGATE;\n  }\n\n  if (xAxisType !== 'string') {\n    xAxis.bucket_by = 'day';\n  }\n\n  return { x_axis: xAxis, metrics: [metric] };\n};\n\nconst updateQuery = (currentQuery, path, value, fields) => {\n  const newQuery = set(currentQuery, path, value);\n  const xAxisField = get(newQuery, 'x_axis.field');\n  const newXAxisType = fields[xAxisField].type;\n  const switchFromStringType =\n    path === 'x_axis.field' && newXAxisType !== 'string';\n\n  let bucketBy = get(newQuery, 'x_axis.bucket_by');\n\n  // When switching to a date type from a datetime - 'hour' is no longer a valid bucketing option\n  if (includes(DATETIME_BUCKETING_ONLY, bucketBy) && 'date' === newXAxisType) {\n    newQuery.x_axis.bucket_by = 'day';\n  }\n\n  // Remove bucketing for string xAxis\n  if ('string' === newXAxisType) {\n    delete newQuery.x_axis.bucket_by;\n  }\n\n  // Swich xAxis type to date / datetime\n  if (!bucketBy && switchFromStringType) {\n    bucketBy = 'day';\n    newQuery.x_axis.bucket_by = 'day';\n  }\n\n  const metric = get(currentQuery, 'metrics[0]', {});\n\n  // Map a field value of `aggregate:count` to record count aggregation\n  if ('aggregate:count' === metric.field) {\n    delete metric.field;\n    metric._aggregate = metric.aggregate;\n    metric.aggregate = 'count';\n  }\n\n  // When a field is applied and we're currently aggregating by count then we must revert to the original\n  // aggregate\n  if (metric.field && 'count' === metric.aggregate) {\n    metric.aggregate = metric._aggregate || DEFAULT_AGGREGATE;\n    delete metric._aggregate;\n  }\n\n  newQuery.metrics = [metric];\n\n  return newQuery;\n};\n\nconst NUMBER_AND_GECKOMETER_MAPPINGS = [\n  ['field', field => [{ field, aggregate: DEFAULT_AGGREGATE }], 'metrics'],\n  // Overide the default `aggregate` when available\n  ['aggregate', null, 'metrics[0].aggregate'],\n  ['filters'],\n];\n\nconst LEADERBOARD_MAPPINGS = [\n  ['label', null, 'x_axis.field'],\n  ['metric', field => [{ field, aggregate: DEFAULT_AGGREGATE }], 'metrics'],\n  // Overide the default `aggregate` when available\n  ['aggregate', null, 'metrics[0].aggregate'],\n  ['filters'],\n];\n\nconst QUERY_MAPPING_RULES = {\n  geckometer: NUMBER_AND_GECKOMETER_MAPPINGS,\n  number: NUMBER_AND_GECKOMETER_MAPPINGS,\n  leaderboard: LEADERBOARD_MAPPINGS,\n  line: [\n    [\n      'metrics',\n      ([metric]) => [pick(metric, 'field', 'aggregate', '_aggregate')],\n    ],\n    ['x_axis'],\n    ['filters'],\n  ],\n  column: ['metrics', 'x_axis', 'filters'],\n  bar: ['metrics', 'x_axis', 'filters'],\n};\n\nconst mapQuery = (fromType, ...rest) =>\n  applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n};\n\nexport default visualisationHelpers;\n","import ColumnChartHelpers from '../column-chart-form/helpers';\n\nexport default ColumnChartHelpers;\n","import { defaultTo } from 'lodash';\nimport LineChartHelpers from './line-chart-form/helpers';\nimport NumberHelpers from './number-form/helpers';\nimport LeaderboardHelpers from './leaderboard-form/helpers';\nimport GeckometerHelpers from './geckometer-form/helpers';\nimport BarChartHelpers from './bar-chart-form/helpers';\nimport ColumnChartHelpers from './column-chart-form/helpers';\nimport TableHelpers from './table-form/helpers';\n\nconst DATA_METHODS = {\n  line: LineChartHelpers,\n  number: NumberHelpers,\n  leaderboard: LeaderboardHelpers,\n  geckometer: GeckometerHelpers,\n  bar: BarChartHelpers,\n  column: ColumnChartHelpers,\n  table: TableHelpers,\n};\n\nconst getVisualisationHelpers = visualisation =>\n  defaultTo(DATA_METHODS[visualisation], LineChartHelpers);\n\nexport default getVisualisationHelpers;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropMenu\":\"dropMenu---1pVdU\",\"menuLabel\":\"menuLabel---3Vcyd\",\"list\":\"list---20prq\",\"dropItem\":\"dropItem---3Hc6U\",\"innerWrapper\":\"innerWrapper---3mcVC\",\"innerIcon\":\"innerIcon---10x7f\",\"showMore\":\"showMore---3DqQ1\",\"noResultsMessage\":\"noResultsMessage---2ZVaO\"};","import { fetchJSONWithCredentials } from '../universal/fetch';\nimport config from '../universal/config';\n\nfunction getPusherChannel(dashboardId) {\n  const { AuthBaseURL } = config.get();\n  const url = `${AuthBaseURL}/pusher/universal/channel?dashboard_id=${dashboardId}`;\n\n  return fetchJSONWithCredentials(url);\n}\n\nexport { getPusherChannel };\n","import createAction from '../../lib/redux/create-action';\nimport PushManager from '../../lib/push-manager';\nimport * as authService from '../../services/auth-service';\nimport { runQuery, fetchVizDataSuccess } from './universal-config-actions';\nimport { setVisualisationError } from './universal-query-actions';\nimport { extendableBuiltinGen } from '../../universal';\nimport * as widgetDataActions from '../../widget-data/actions/widget-data-actions';\n\nexport const setPusherChannel = createAction(\n  'UniversalSocket:SET_PUSHER_CHANNEL',\n);\nexport const setPusherReady = createAction('UniversalSocket:SET_PUSHER_READY');\nexport const queueFetchedData = createAction(\n  'UniversalSocket:QUEUE_FETCHED_DATA',\n);\nexport const clearQueuedData = createAction(\n  'UniversalSocket:CLEAR_QUEUED_DATA',\n);\n\nexport class PusherError extends extendableBuiltinGen(Error) {\n  constructor(message) {\n    super(message); // extendablebuiltingen is buggy and does not set message\n    this.message = message;\n  }\n}\n\nconst isCurrentQuery = (getState, data) => {\n  const { queryIds } = getState().universal;\n  return queryIds.indexOf(data.query_id) !== -1;\n};\n\nconst isCancelledQuery = (getState, data) => {\n  const { cancelledQueries } = getState().universal;\n  return cancelledQueries.has(data.query_id);\n};\n\nconst getEditedWidgetKey = getState => {\n  const { widgetMenu, universal } = getState();\n  const { widgetKey } = widgetMenu;\n  const { isPreviewOpen } = universal;\n  return isPreviewOpen && widgetKey ? widgetKey : undefined;\n};\n\nconst handlePushEvent = (_, eventName, data) => (dispatch, getState) => {\n  switch (eventName) {\n    case 'pusher:subscription_succeeded':\n      dispatch(setPusherReady());\n      const { isConfigReady } = getState().universal;\n      if (isConfigReady) {\n        dispatch(runQuery());\n      }\n      return;\n    case 'query_data':\n      if (isCurrentQuery(getState, data)) {\n        dispatch(\n          fetchVizDataSuccess({\n            data: data.data,\n            done: data.done,\n            queryId: data.query_id,\n          }),\n        );\n      } else if (!isCancelledQuery(getState, data)) {\n        dispatch(\n          queueFetchedData({\n            data: data.data,\n            done: data.done,\n            queryId: data.query_id,\n          }),\n        );\n      }\n      return;\n    case 'query_error':\n      const { message, type } = data.error;\n      const err = new Error(message);\n\n      const isImporting = type === 'ErrImportPending';\n      const importingWidgetKey = isImporting && getEditedWidgetKey(getState);\n      if (importingWidgetKey) {\n        dispatch(widgetDataActions.dataError(data.error, importingWidgetKey));\n      } else if (isCurrentQuery(getState, data)) {\n        dispatch(setVisualisationError(err));\n      } else if (!isCancelledQuery(getState, data)) {\n        dispatch(\n          queueFetchedData({\n            error: err,\n            queryId: data.query_id,\n          }),\n        );\n      }\n      return;\n    default:\n      return;\n  }\n};\n\nconst _connectToPusher = (channel, dispatch) => {\n  try {\n    const pushManager = PushManager.getInstance();\n\n    pushManager.subscribe(channel, (...args) => {\n      dispatch(handlePushEvent(...args));\n    });\n  } catch (e) {\n    const { message } = e;\n    throw new PusherError(`Fetch visualization data error: ${message}`);\n  }\n};\n\nexport const startPusherChannel = dashboardId => async dispatch => {\n  // Start pusher channel\n  const { channel } = await authService.getPusherChannel(dashboardId);\n  dispatch(setPusherChannel(channel));\n  _connectToPusher(channel, dispatch);\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ButtonGroup\":\"ButtonGroup---txWxD\",\"spaced\":\"spaced---LKzLS\",\"item\":\"item---14yS0\",\"last\":\"last---1HR7g\",\"notSpaced\":\"notSpaced---y3jxp\",\"first\":\"first---25rLb\",\"stretched\":\"stretched---320Si\",\"dark\":\"dark---1NxxQ\",\"checked\":\"checked---3WH4g\",\"gray\":\"gray---2HtvL\",\"light\":\"light---y9KLe\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"popover\":\"popover---NarpS\",\"container\":\"container---1YfZu\",\"scroller\":\"scroller---3qGWA\",\"content\":\"content---27vYV\",\"flexContainer\":\"flexContainer---1AjPd\",\"closeButton\":\"closeButton---1l16u\",\"section\":\"section---147_h\",\"heading\":\"heading---YWyAK\",\"text\":\"text---3_fsf\"};","import {\n  getUsersByGroup,\n  deleteUser as deleteUserService,\n} from '../../services/permission-service';\nimport { trackEvent } from '@Tracking';\nimport { userDeleted } from '@Tracking/events';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport * as toastActions from '../../toast/actions';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { formatMessage } from '../../lib/i18n';\n\nexport const usersFetchStart = createAction('People:USERS_FETCH_START');\nexport const usersFetchSuccessful = createAction(\n  'People:USERS_FETCH_SUCCESSFUL',\n);\nexport const usersFetchFailed = createErrorAction('People:USERS_FETCH_FAILED');\nexport const deleteUserStart = createAction('People:DELETE_USER_START');\nexport const deleteUserSuccessful = createAction(\n  'People:DELETE_USER_SUCCESSFUL',\n);\nexport const deleteUserFailed = createAction('People:DELETE_USER_FAILED');\n\nexport const fetchUsers = groupId => async dispatch => {\n  dispatch(usersFetchStart(groupId));\n\n  try {\n    const users = await getUsersByGroup(groupId);\n    dispatch(usersFetchSuccessful(users));\n  } catch (e) {\n    dispatch(usersFetchFailed(e, { id: 'people.errorFetchingUsers' }));\n  }\n};\n\nexport const deleteUser = (groupId, userId, permission, source) => async (\n  dispatch,\n  getState,\n) => {\n  try {\n    const {\n      user: {\n        user: { id: currentUserId, organization_id: orgId },\n      },\n    } = getState();\n    dispatch(deleteUserStart({ userId }));\n    // groupId is required until we have a new dedicated end point.\n    await deleteUserService(groupId, userId);\n\n    dispatch(deleteUserSuccessful({ userId }));\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('people.deleteUserSuccessful'),\n      ),\n    );\n\n    track('Deleted user', {\n      properties: {\n        source,\n        target_user_permission: permission,\n      },\n    });\n    trackSnowplow('user_delete', '1-0-0', {\n      user_id: `${currentUserId}`,\n      org_id: `${orgId}`,\n      target_user_id: `${userId}`,\n      target_user_permission: permission,\n    });\n    trackEvent(userDeleted());\n  } catch (e) {\n    dispatch(deleteUserFailed({ userId }));\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"page\":\"page---1_S46\",\"table\":\"table---3Qa5N\",\"link\":\"link---3BT33\",\"logo\":\"logo---3Vdkk\",\"error\":\"error---ua-Dt\",\"content\":\"content---2tj6B\",\"descriptionTitle\":\"descriptionTitle---wYSeP\",\"descriptionText\":\"descriptionText---3ch41\",\"pinCode\":\"pinCode---3SeQA\",\"placeholderPin\":\"placeholderPin---2qYzE\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"monitoringVisualisation\":\"monitoringVisualisation---7lTcD\",\"status\":\"status---3NDr6\",\"positive\":\"positive---KpKZX\",\"negative\":\"negative---3nUfP\",\"arrow\":\"arrow---38kj0\",\"arrowUp\":\"arrowUp---2F2g9\",\"arrowDown\":\"arrowDown---1BckB\",\"unreported\":\"unreported---39y7v\",\"serverTimes\":\"serverTimes---Zij1j\",\"serverTime\":\"serverTime---2EMzv\",\"label\":\"label---2dU_K\",\"secondaryStat\":\"secondaryStat---14abd\",\"isLargeTemplate\":\"isLargeTemplate---dpJoy\"};","import getBackgroundColor from './get-background-color';\n\nexport default getBackgroundColor;\n","import { get } from 'lodash';\nimport themes from '../../';\n\nconst getBackgroundColor = themeName => {\n  const theme = get(themes, themeName, {});\n\n  return theme['--background-color'];\n};\n\nexport default getBackgroundColor;\n","import getWidgetColor from './get-widget-color';\n\nexport default getWidgetColor;\n","import { get } from 'lodash';\nimport themes from '../../';\n\nconst getWidgetColor = themeName => {\n  const theme = get(themes, themeName, {});\n\n  return theme['--widget-background-color'];\n};\n\nexport default getWidgetColor;\n","import hsluv from 'hsluv';\nimport { generateAutoWidgetColor, isLight } from '../';\nimport themes from '../../../themes';\nimport { LIGHT_WIDGET_STYLE, AUTO_WIDGET_STYLE } from '../../theme-constants';\n\nconst { dark, light } = themes;\n\nconst getActiveWidgetColor = widgetColor => {\n  const [h, s, l] = hsluv.hexToHsluv(widgetColor);\n\n  return hsluv.hsluvToHex([h, s, l + 3]);\n};\n\nconst getGeckoboxBackdropColor = backgroundColor => {\n  const [h, s, l] = hsluv.hexToHsluv(backgroundColor);\n\n  // Slightly darken / lighten the backdrop depending on the lightness of the chosen colour\n  return hsluv.hsluvToHex([h, s, l > 20 ? l - 15 : l + 15]);\n};\n\nconst getUserThemeVariables = (backgroundColor, widgetStyle) => {\n  const baseTheme = widgetStyle === LIGHT_WIDGET_STYLE ? light : dark;\n\n  let dashboardTextColor = dark['--dashboard-text-color'];\n  let draggerColor = dark['--dragger-color'];\n  let geckoboxGridColor = dark['--geckobox-grid-color'];\n  let positiveColor = dark['--positive-threshold-color'];\n\n  if (isLight(backgroundColor)) {\n    dashboardTextColor = light['--dashboard-text-color'];\n    draggerColor = light['--dragger-color'];\n    geckoboxGridColor = light['--geckobox-grid-color'];\n  }\n\n  // If widget background is light, use light theme for positive state\n  if (widgetStyle === LIGHT_WIDGET_STYLE) {\n    positiveColor = light['--positive-threshold-color'];\n  }\n\n  const customTheme = {\n    ...baseTheme,\n    '--background-color': backgroundColor,\n    '--dashboard-text-color': dashboardTextColor,\n    '--dragger-color': draggerColor,\n    '--geckobox-grid-color': geckoboxGridColor,\n    '--positive-threshold-color': positiveColor,\n    '--geckobox-backdrop-color': getGeckoboxBackdropColor(backgroundColor),\n  };\n\n  if (widgetStyle === AUTO_WIDGET_STYLE) {\n    const widgetColor = generateAutoWidgetColor(backgroundColor);\n    const [h, s, l] = hsluv.hexToHsluv(widgetColor);\n\n    customTheme['--widget-background-color'] = widgetColor;\n    customTheme['--chart-threshold-color'] = hsluv.hsluvToHex([h, s, l + 6]);\n    customTheme['--map-subunit-color'] = hsluv.hsluvToHex([h, s, l + 15]);\n    customTheme['--selected-widget-header-color'] = hsluv.hsluvToHex([\n      h,\n      s,\n      l + 15,\n    ]);\n    customTheme['--widget-active-background-color'] = getActiveWidgetColor(\n      customTheme['--widget-background-color'],\n    );\n  }\n\n  return customTheme;\n};\n\nexport default getUserThemeVariables;\n","import getUserThemeVariables from './get-user-theme-variables';\n\nexport default getUserThemeVariables;\n","import hsluv from 'hsluv';\n\nconst generateAutoWidgetColor = backgroundColor => {\n  const [hue, saturation, lightness] = hsluv.hexToHsluv(backgroundColor);\n\n  // Saturation maxes out at 70\n  const widgetSaturation = Math.min(saturation, 70);\n\n  // Widget lightness is 20 unless the background lightness is also around 20\n  let widgetLightness = 20;\n  if (lightness < 30 && lightness > 15) {\n    widgetLightness = lightness - 10;\n  }\n\n  return hsluv.hsluvToHex([hue, widgetSaturation, widgetLightness]);\n};\n\nexport default generateAutoWidgetColor;\n","import generateAutoWidgetColor from './generate-auto-widget-color';\n\nexport default generateAutoWidgetColor;\n","import isLight from './is-light';\n\nexport default isLight;\n","import hsluv from 'hsluv';\n\nconst isLight = color => {\n  const lightness = hsluv.hexToHsluv(color)[2];\n\n  return lightness >= 70;\n};\n\nexport default isLight;\n","import getBackgroundColor from './get-background-color';\nimport getWidgetColor from './get-widget-color';\nimport getUserThemeVariables from './get-user-theme-variables';\nimport generateAutoWidgetColor from './generate-auto-widget-color';\nimport isLight from './is-light';\n\nexport {\n  getBackgroundColor,\n  getWidgetColor,\n  getUserThemeVariables,\n  generateAutoWidgetColor,\n  isLight,\n};\n","import createAction from '../../lib/redux/create-action';\nimport {\n  getServices,\n  getRecentlyConnectedServices,\n} from '../../services/management-service';\nimport { isArray } from 'lodash';\nimport { sortByTitle } from '../data-sources-helpers';\n\n// Actions\nexport const set = createAction('DataSources:SET');\nexport const setFiltered = createAction('DataSources:SET_FILTERED');\nexport const setRecentlyConnected = createAction(\n  'DataSources:SET_RECENTLY_CONNECTED',\n);\nexport const update = createAction('DataSources:UPDATE');\n\nexport const fetchSources = (opts = {}, organizationCreated) => (\n  dispatch,\n  getState,\n) => {\n  const { user: { user: { features: featureFlags } = {} } = {} } = getState();\n  const { includeRecentlyConnected = false } = opts;\n  const query = `includes_recently_connected=${includeRecentlyConnected}`;\n\n  getServices(query).then(data => {\n    if (isArray(data)) {\n      dispatch(\n        set({\n          services: sortByTitle(data),\n          organizationCreated,\n          featureFlags,\n        }),\n      );\n    } else {\n      const { services, ...rest } = data;\n      dispatch(\n        set({\n          services: sortByTitle(services),\n          ...rest,\n          organizationCreated,\n          featureFlags,\n        }),\n      );\n    }\n  });\n};\n\nexport const fetchRecentlyConnected = () => dispatch => {\n  getRecentlyConnectedServices().then(services => {\n    dispatch(setRecentlyConnected(services));\n  });\n};\n","import config from './config';\nimport * as services from './services';\nimport * as serializers from './serializers';\nimport * as transformers from './transformers';\nimport extendableBuiltinGen from './lib/extendable-builtin-gen';\nimport fetchJSON, { FetchError } from './fetch';\n\nexport {\n  config,\n  services,\n  serializers,\n  transformers,\n  extendableBuiltinGen,\n  fetchJSON,\n  FetchError,\n};\n","import delay from '../../lib/delay';\n\nexport const POLL_INTERVAL = 10;\n\nconst waitForState = async (getState, predicate) => {\n  let result = predicate(getState());\n  while (!result) {\n    await delay(POLL_INTERVAL);\n    result = predicate(getState());\n  }\n};\n\nexport default waitForState;\n","import waitForState, { POLL_INTERVAL } from './wait-for-state';\nexport default waitForState;\nexport { POLL_INTERVAL };\n","import {\n  isArray,\n  isEmpty,\n  isFinite,\n  isNull,\n  isUndefined,\n  omit,\n  mapValues,\n} from 'lodash';\nimport { getGeckometerDefaultMinMax } from '../../lib/geckometer';\nimport { parseDurationInput } from '../../lib/humanise-number';\nimport {\n  isDurationInput,\n  isEmptyDurationInput,\n  getInputFromDuration,\n} from '../ui-field-options';\nimport { parseNumberBasedOnFormat } from '../../universal/lib/parse-number';\nimport { isDetailsMetricSelected } from '../universal-config-helpers';\nimport { transformData } from './other-universal-config-reducer-methods';\n\nexport const EMPTY_DURATION_INPUT = { days: '', hours: '', minutes: '' };\nexport const SUPPORTED_DURATION_INPUTS = [\n  'goal',\n  'min',\n  'max',\n  '_minDefault',\n  '_maxDefault',\n];\n\nexport const arrangeDurations = (_config, mainColumn) => {\n  const { type, unit } = mainColumn;\n  if (type !== 'duration') return _config;\n\n  let config = { ..._config };\n  SUPPORTED_DURATION_INPUTS.forEach(field => {\n    if (config[field]) {\n      if (!isEmptyDurationInput(config[field])) {\n        const duration = parseDurationInput(config[field], unit);\n        config[field] = duration.toString();\n      } else {\n        config = omit(config, [field]);\n      }\n    } else if (config[field] === '') {\n      config = omit(config, [field]);\n    }\n  });\n  return config;\n};\n\n// Set min max values from defaults\nexport const arrangeMinMax = config => {\n  const { type, min, max, _minDefault, _maxDefault } = config;\n\n  if (type !== 'geckometer') {\n    return config;\n  }\n\n  let updatedMin = min;\n  if (isUndefined(parseNumberBasedOnFormat(min))) {\n    updatedMin = _minDefault;\n  }\n\n  let updatedMax = max;\n  if (isUndefined(parseNumberBasedOnFormat(max))) {\n    updatedMax = _maxDefault;\n  }\n\n  return { ...config, min: updatedMin, max: updatedMax };\n};\n\n/**\n * ----------------------------\n * ensure helpers\n * ----------------------------\n **/\nexport const ensureNumberFormat = config => {\n  if (config.type === 'table' && !isArray(config.numberFormat)) {\n    return {\n      ...config,\n      numberFormat: [],\n    };\n  }\n  if (config.type !== 'table' && isArray(config.numberFormat)) {\n    return {\n      ...config,\n      numberFormat: {},\n    };\n  }\n  return config;\n};\n\nexport const ensureDetailsMetric = (_config, uiQuery) => {\n  let config = { ..._config };\n\n  if (isEmpty(uiQuery)) {\n    return config;\n  }\n  if (isDetailsMetricSelected(uiQuery)) {\n    const {\n      metrics: [{ node }],\n    } = uiQuery;\n    config = {\n      ...config,\n      detailsMetricResource: node.getRoot(),\n    };\n  } else if (config.detailsMetricResource) {\n    config = omit(config, 'detailsMetricResource');\n  }\n\n  return config;\n};\n\nexport const ensureDurations = (_config, mainColumn) => {\n  // TODO find a way to not go back to minutes all the time.\n  // We could store _currentDurationUnit in config to restore here\n  const { type: metricType, unit = 'minutes' } = mainColumn;\n\n  return mapValues(_config, (val, key) => {\n    if (\n      !SUPPORTED_DURATION_INPUTS.includes(key) ||\n      isNull(val) ||\n      isUndefined(val)\n    ) {\n      return val;\n    }\n\n    const isDurationInputField = isDurationInput(val);\n\n    if (metricType === 'duration' && !isDurationInputField) {\n      const parsedValue = parseFloat(val);\n      if (isFinite(parsedValue)) {\n        return getInputFromDuration(parsedValue, unit);\n      }\n      return EMPTY_DURATION_INPUT;\n    } else if (metricType !== 'duration' && isDurationInputField) {\n      if (isEmptyDurationInput(val)) {\n        return undefined;\n      }\n      return parseDurationInput(val, unit).toString();\n    }\n    return val;\n  });\n};\n\nexport const ensureMinMax = (_config, transformCtx) => {\n  const { queries, queryResults, timezone } = transformCtx;\n  const { type, min, max } = _config;\n  switch (type) {\n    case 'line':\n      // the line chart will set min and max values\n      // for the y axis but provide no field\n      // to reset them, so we remove them here\n      return omit(_config, ['min', 'max']);\n    case 'geckometer':\n      // 1st apply transformer to get main number and format\n      const { item, format } = transformData(\n        queries,\n        queryResults,\n        _config,\n        timezone,\n      );\n\n      // 2nd compute sensible defaults for min/max based on shared algo\n      const { _minDefault, _maxDefault } = getGeckometerDefaultMinMax(\n        item,\n        format,\n      );\n\n      const minDuration = format === 'duration' ? '0' : undefined;\n      return {\n        ..._config,\n        min: min && (minDuration || min),\n        max,\n        _minDefault: minDuration || _minDefault,\n        _maxDefault,\n      };\n    default:\n      return _config;\n  }\n};\n","import {\n  arrangeDurations,\n  arrangeMinMax,\n  ensureDetailsMetric,\n  ensureDurations,\n  ensureMinMax,\n  ensureNumberFormat,\n} from './ensure-config-helpers';\nimport { getMainColumnField } from '../../universal/transformers/universal/helpers';\n\n// We store and use a representation of the config in state that suits the\n// config UI but not the visualisation expectation. For example, we store an\n// object of values for a duration goal like { minutes: '134', seconds: '394' }.\n// This function \"transform\" the config into correct format for the\n// visualisation.\n// This cannot live in the transformer as transformers should receive config\n// + data to produce correct payload. It should not mutate the config. Also\n// doing these steps of serializing/deserializing here offers a flexible way to\n// map the config to the expected UI part.\nexport const arrangeConfig = _config => {\n  let config = { ..._config };\n  const mainColumn = getMainColumnField(config) || {};\n\n  config = arrangeDurations(config, mainColumn);\n  config = arrangeMinMax(config);\n\n  return config;\n};\n\n// Ensure config make sure the config stays valid whenever any part of it is\n// updated. For example switching visualisation type.\nexport const ensureConfig = (_config, transformCtx, uiQuery) => {\n  let config = { ..._config };\n  const mainColumn = getMainColumnField(config) || {};\n\n  config = ensureMinMax(_config, transformCtx);\n  config = ensureDetailsMetric(config, uiQuery);\n  config = ensureDurations(config, mainColumn);\n  config = ensureNumberFormat(config);\n\n  return config;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Layout, { Row } from '../layout';\nimport InfoBubble from '../info-bubble';\nimport classNames from 'classnames';\nimport { isUndefined } from 'lodash';\n\nimport style from './button-group-visual-style.scss';\n\nconst ButtonGroupVisual = ({ children }) => (\n  <Layout flex flexEqualWidth>\n    {children}\n  </Layout>\n);\n\nButtonGroupVisual.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n};\n\nconst ButtonVisual = ({ children, helpText, isActive, onClick }) => {\n  const classes = classNames(style.item, { [style.active]: isActive });\n\n  return (\n    <Row flexEqualWidth align=\"center\" className={classes} onClick={onClick}>\n      <Row flexAuto align=\"center\" className={style.content}>\n        {children}\n      </Row>\n      {isActive && !isUndefined(helpText) && (\n        <InfoBubble>{helpText}</InfoBubble>\n      )}\n    </Row>\n  );\n};\n\nButtonVisual.propTypes = {\n  children: PropTypes.node,\n  helpText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n  isActive: PropTypes.bool,\n  onClick: PropTypes.func,\n};\n\nexport { ButtonGroupVisual as default, ButtonVisual };\n","import ButtonGroupVisual, {\n  ButtonVisual,\n} from './button-group-visual-component';\nexport { ButtonGroupVisual as default, ButtonVisual };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout---2hEQJ\",\"textWrapper\":\"textWrapper---1jqtt\",\"variableFontSize\":\"variableFontSize---WPlPK\",\"slider\":\"slider---3oZS8\",\"slidePreview\":\"slidePreview---1oRsE\",\"slideDashboard\":\"slideDashboard---36kdy\",\"dotPreview\":\"dotPreview---28vGh\",\"paginationPreview\":\"paginationPreview---JEfJI\",\"paginationDashboard\":\"paginationDashboard---WGLAp\",\"icon\":\"icon---2BsLJ\",\"largeHeading\":\"largeHeading---XD2Cj\",\"smallHeading\":\"smallHeading---ysJcw\"};","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classnames from 'classnames';\n\nimport styles from './progress-bar.scss';\n\nconst isNil = value => value === null || value === undefined;\nconst isNumber = n => !isNaN(parseFloat(n)) && isFinite(n);\n\nconst STATUSES = {\n  ERROR: 'error',\n  IDLE: 'idle',\n  LOADING: 'loading',\n  SUCCESS: 'success',\n};\n\nconst ProgressBar = ({ status, progress }) => {\n  const containerClasses = classnames(styles.progressBar, {\n    [styles.error]: status === STATUSES.ERROR,\n    [styles.success]: status === STATUSES.SUCCESS,\n  });\n\n  return (\n    <div className={containerClasses}>\n      {status === STATUSES.LOADING && isNil(progress) && (\n        <div className={styles.indeterminate} />\n      )}\n      {status === STATUSES.LOADING && isNumber(progress) && (\n        <div className={styles.determinate} style={{ width: `${progress}%` }} />\n      )}\n    </div>\n  );\n};\n\nProgressBar.STATUSES = STATUSES;\n\nProgressBar.defaultProps = {\n  status: STATUSES.IDLE,\n};\n\nProgressBar.propTypes = {\n  progress: PropTypes.number,\n  status: PropTypes.oneOf([\n    STATUSES.ERROR,\n    STATUSES.IDLE,\n    STATUSES.LOADING,\n    STATUSES.SUCCESS,\n  ]),\n};\n\nexport default ProgressBar;\n","import ProgressBar from './progress-bar';\nexport default ProgressBar;\n","import React from 'react';\nimport Icon from '@UI/icon';\nimport styles from './menu-label-style.scss';\n\nconst MenuLabel = () => (\n  <span className={styles.iconContainer}>\n    <Icon name=\"ellipsis-v\" fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR} />\n  </span>\n);\n\nexport default MenuLabel;\n","import MenuLabel from './menu-label-component';\nexport default MenuLabel;\n","export const GRID_ROWS = 12;\nexport const GRID_COLUMNS = 12;\n\nexport const MIN_CONTAINER_ROW_SPAN = 1;\nexport const MIN_CONTAINER_ROW_START = 1;\nexport const MIN_CONTAINER_COLUMN_SPAN = 1;\nexport const MIN_CONTAINER_COLUMN_START = 1;\n\nexport const CONTAINER_GRID_CELLS = 12;\n\nexport const DASHBOARD_GRID_GAP = 16;\n\n// Drag & Drop\nexport const DRAG_TYPES = {\n  CONTAINER: 'container',\n  FRAME: 'frame',\n  SINGLE_FRAME_CONTAINER: 'singleFrameContainer',\n};\n","module.exports = (__webpack_require__(28))(315);","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\n\nimport style from './toggle-input-style.scss';\n\nclass ToggleInputComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { active: false };\n\n    bindAll(this, 'handleFocus', 'handleBlur', 'handleChange');\n  }\n\n  handleFocus() {\n    this.setState({ active: true });\n  }\n\n  handleBlur() {\n    this.setState({ active: false });\n  }\n\n  handleChange(e) {\n    const { onToggle } = this.props;\n    onToggle(e.target.checked);\n  }\n\n  render() {\n    const active = this.state.active;\n    const { checked, hasText, title, name, disabled } = this.props;\n\n    const toggleClasses = classNames(style.toggleInput, {\n      checked,\n      disabled,\n      active,\n      [style.text]: hasText,\n    });\n\n    const labelClasses = classNames(style.label, {\n      checked,\n      disabled,\n    });\n\n    const classesKnob = classNames(style.knob, { checked });\n\n    return (\n      <label className={labelClasses}>\n        <span className={style.title}>{title}</span>\n        <div\n          className={toggleClasses}\n          onFocus={this.handleFocus}\n          onBlur={this.handleBlur}\n        >\n          <input\n            name={name}\n            type=\"checkbox\"\n            onChange={this.handleChange}\n            checked={checked}\n            tabIndex={0}\n            disabled={disabled}\n          />\n          <i className={classesKnob} />\n        </div>\n      </label>\n    );\n  }\n}\n\nToggleInputComponent.defaultProps = {\n  disabled: false,\n};\n\nToggleInputComponent.propTypes = {\n  checked: PropTypes.bool,\n  disabled: PropTypes.bool,\n  hasText: PropTypes.bool,\n  name: PropTypes.string,\n  title: PropTypes.node,\n  onToggle: PropTypes.func,\n};\n\nexport default ToggleInputComponent;\n","import ToggleInput from './toggle-input-component';\nexport default ToggleInput;\n","module.exports = (__webpack_require__(28))(1327);","/* eslint camelcase:0 */\nclass SpreadsheetsSerializer {\n  serialize(state) {\n    const {\n      fileId: file_id,\n      worksheetId: worksheet_id,\n      service,\n      warning,\n      label,\n      comparisonLabel,\n    } = state;\n\n    return {\n      config: { file_id, worksheet_id, warning, label, comparisonLabel },\n      service_name: service,\n    };\n  }\n\n  deserialize(json) {\n    const {\n      file_id,\n      worksheet_id,\n      warning,\n      label,\n      comparisonLabel,\n    } = json.config;\n\n    return {\n      fileId: file_id,\n      worksheetId: worksheet_id,\n      warning,\n      label,\n      comparisonLabel,\n    };\n  }\n}\n\nexport default SpreadsheetsSerializer;\n","import { omit, isUndefined } from 'lodash';\nimport { TEMPLATES } from './';\nimport { removeKeysWithUnderscore } from '../helpers';\n\nconst setOrientation = config => {\n  if (config.type === 'bar') {\n    return { ...config, orientation: 'horizontal' };\n  }\n\n  return config;\n};\n\n// TODO: Introduced on 23/02/2016\n// to update number widgets without comparison type\n// To be removed when script update DB entries\nconst updateOldNumberWidget = config => {\n  if (\n    config.type === 'number' &&\n    !isUndefined(config.goal) &&\n    isUndefined(config.comparison)\n  ) {\n    return { comparison: { type: 'goal' }, ...config };\n  }\n\n  return config;\n};\n\nclass SalesforceSerializer {\n  serialize(state) {\n    const {\n      uuid: report_id, // eslint-disable-line camelcase\n      config: salesforceConfig,\n      refreshInterval,\n    } = state;\n\n    const { ...restConfig } = salesforceConfig;\n    const newConfig = setOrientation(removeKeysWithUnderscore(restConfig));\n\n    const config = {\n      ...newConfig,\n      report_id,\n      template: TEMPLATES[newConfig.type],\n    };\n\n    return {\n      config,\n      service_name: 'salesforce',\n      refresh_interval: refreshInterval,\n    };\n  }\n\n  deserialize(json) {\n    const { refresh_interval: refreshInterval } = json;\n    const config = json.config;\n    const { report_id: reportId } = config;\n    const updatedConfig = updateOldNumberWidget(config);\n    const widgetConfig = omit(updatedConfig, ['report_id', 'orientation']);\n\n    return { uuid: reportId, config: widgetConfig, refreshInterval };\n  }\n}\n\nexport default SalesforceSerializer;\n","class DatasetsSerializer {\n  deserialize(json) {\n    return json.config;\n  }\n}\n\nexport default DatasetsSerializer;\n","class DatabaseSerializer {\n  deserialize(json) {\n    return json.config;\n  }\n}\n\nexport default DatabaseSerializer;\n","class UniversalSerializer {\n  deserialize(json) {\n    return json.config;\n  }\n}\n\nexport default UniversalSerializer;\n","import SpreadsheetsSerializer from './spreadsheets';\nimport SalesforceSerializer from './salesforce';\nimport DatasetsSerializer from './datasets';\nimport DatabaseSerializer from './database';\nimport UniversalSerializer from './universal';\n\nexport const TEMPLATES = {\n  line: {\n    type: 'line',\n    version: 2,\n  },\n  column: {\n    type: 'column',\n    version: 1,\n  },\n  bar: {\n    type: 'bar',\n    version: 1,\n  },\n  geckometer: {\n    type: 'geckometer',\n    version: 1,\n  },\n  number: {\n    type: 'number',\n    version: 2,\n  },\n  leaderboard: {\n    type: 'leaderboard',\n    version: 1,\n  },\n  table: {\n    type: 'table',\n    version: 1,\n  },\n  feed: {\n    type: 'feed',\n    version: 1,\n  },\n};\n\nexport default function getSerializer(service) {\n  switch (service) {\n    case 'spreadsheets':\n      return new SpreadsheetsSerializer();\n    case 'salesforce':\n      return new SalesforceSerializer();\n    case 'datasets':\n      return new DatasetsSerializer();\n    case 'database':\n      return new DatabaseSerializer();\n    case 'universal':\n      return new UniversalSerializer();\n    default:\n      throw new Error(`No serializer for the service \"${service}\"`);\n  }\n}\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './promo-card-style.scss';\n\nconst PromoCard = ({ children }) => {\n  return <div className={style.promoCard}>{children}</div>;\n};\n\nPromoCard.propTypes = {\n  children: PropTypes.node,\n};\n\nconst PromoCardHeader = ({ children }) => {\n  return <div className={style.promoCardHeader}>{children}</div>;\n};\n\nPromoCardHeader.propTypes = {\n  children: PropTypes.node,\n};\n\nconst PromoCardFooter = ({ children }) => {\n  return <div className={style.promoCardFooter}>{children}</div>;\n};\n\nPromoCardFooter.propTypes = {\n  children: PropTypes.node,\n};\n\nconst PromoCardLink = props => {\n  return (\n    <a {...props} className={style.link}>\n      {props.label}\n    </a>\n  );\n};\n\nPromoCardLink.propTypes = {\n  label: PropTypes.node,\n};\n\nexport default PromoCard;\nexport { PromoCardHeader, PromoCardFooter, PromoCardLink };\n","import { chain, isUndefined, pickBy } from 'lodash';\nimport DebouncePromise from '../../lib/debounce-promise';\nimport getVisualisationHelpers from '../components/get-visualisation-helpers';\n\nexport function ensureQuery(type, fieldGroups, config) {\n  return getVisualisationHelpers(type).getDefaultQuery(fieldGroups, config);\n}\n\nexport function getFieldTypes(fieldGroups) {\n  return chain(fieldGroups)\n    .values()\n    .flatten()\n    .transform((m, { key, type }) => {\n      m[key] = type;\n    }, {})\n    .value();\n}\n\nconst getOrderByColumn = (groupBy, columnIndex, columns) => {\n  // if we're using group by field then the column index in the viz\n  // and the query won't correlate, so we need to do this calculation instead\n  if (!isUndefined(groupBy)) {\n    if (columnIndex === 0) {\n      return groupBy;\n    }\n    return columns[columnIndex - 1];\n  }\n  return columns[columnIndex];\n};\n\nexport const updateSortTableQuery = (query, columnIndex) => {\n  const {\n    columns,\n    order_by: {\n      field: prevField,\n      aggregate: prevAggregate,\n      direction: prevDirection,\n    } = {},\n  } = query;\n  const { field, aggregate } = getOrderByColumn(\n    query.group_by,\n    columnIndex,\n    columns,\n  );\n  const newQuery = { ...query, order_by: undefined };\n\n  const hasFieldChanged = !isUndefined(field) && field !== prevField;\n  const hasChangedToCount = aggregate === 'count' && prevAggregate !== 'count';\n  const hasAggregateChanged = aggregate !== prevAggregate;\n\n  // if the current order by field is not set or not the same as the new field\n  // then default the new field with ascending direction\n  if (hasFieldChanged || hasChangedToCount || hasAggregateChanged) {\n    newQuery.order_by = pickBy({ field, aggregate, direction: 'asc' });\n  } else {\n    // if we're here then we're still on the same field\n    // if the direction is ascending then toggle to descending\n    // otherwise we're on descending and toggling sorting off\n    // so leave order by undefined\n    if (prevDirection === 'asc') {\n      newQuery.order_by = pickBy({\n        field,\n        aggregate,\n        direction: 'desc',\n      });\n    }\n  }\n  return newQuery;\n};\n\nexport function debouncify(fn) {\n  const queryManager = new DebouncePromise();\n  return (...args) => {\n    return queryManager.push(fn(...args));\n  };\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---25L-9\",\"tablePositioner\":\"tablePositioner---3KyPt\",\"labelContainer\":\"labelContainer---3bb5d\",\"table\":\"table---1GlOF\",\"funnel\":\"funnel---1miy8\",\"values\":\"values---3MPBS\",\"label\":\"label---3rbqN\",\"bar\":\"bar---Zwydo\",\"funnelCell\":\"funnelCell---YgPdT\",\"value\":\"value---ZDknZ\",\"percent\":\"percent---1-fV6\",\"small\":\"small---2KTfh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ruleBasedVisualisationPicker\":\"ruleBasedVisualisationPicker---1a2Dw\",\"visualisationIcon\":\"visualisationIcon---3bcDL\",\"visualisation\":\"visualisation---3Eb0k\",\"tooltipContainer\":\"tooltipContainer---2hPPi\",\"tooltip\":\"tooltip---2-m36\",\"tooltipDescription\":\"tooltipDescription---3YDcX\",\"tooltipPointer\":\"tooltipPointer---22nb1\",\"rule\":\"rule---3toSH\",\"ruleIndicator\":\"ruleIndicator---3qU1r\",\"passing\":\"passing---1T9MB\"};","import {\n  map,\n  filter,\n  chain,\n  includes,\n  head,\n  isUndefined,\n  reduce,\n  find,\n  isEmpty,\n  reject,\n} from 'lodash';\nimport { parseNumberBasedOnFormat } from '../universal/lib/parse-number';\nimport { getGeckometerValue } from '../universal/transformers/pegasus/helpers';\nimport { getGeckometerDefaultMinMax } from '../lib/geckometer';\nimport { TABULAR_REPORT } from './report-types';\n\nconst DATETIME_FORMATS = ['date', 'datetime', 'time'];\n\nconst MAX_COLUMNS = 10;\n\nconst toOptions = (items, disabledName = null) => {\n  return map(items, item => {\n    return {\n      value: item.name,\n      label: item.label,\n      disabled: item.name === disabledName,\n    };\n  });\n};\n\nconst toDateOrTimeGroups = groups => {\n  return filter(groups, ({ type }) => includes(DATETIME_FORMATS, type));\n};\n\nconst getCurrentFormat = (aggregations, yAxis) => {\n  return chain(aggregations)\n    .find({ name: yAxis })\n    .get('type')\n    .value();\n};\n\nconst getAlternativeSeries = (config, state) => {\n  const {\n    meta: { groups },\n  } = state;\n  const { xAxis = '' } = config;\n\n  // Pick first group that isn't used as xAxis\n  return chain(groups)\n    .map('name')\n    .without(xAxis)\n    .head()\n    .value();\n};\n\nconst getSeries = state => {\n  const { config } = state;\n  const { savedSeries } = config;\n\n  if (savedSeries) {\n    return savedSeries;\n  }\n\n  return getAlternativeSeries(config, state);\n};\n\n// Meta could have been changed after a widget has been created.\n// Check that meta is still available and default to first one if not\nconst ensureValidMeta = (field, config, state) => {\n  let collection = [];\n  switch (field) {\n    case 'xAxis':\n    case 'series':\n      const {\n        meta: { groups },\n      } = state;\n      collection = groups;\n      break;\n    case 'yAxis':\n      const {\n        meta: { aggregations },\n      } = state;\n      collection = aggregations;\n      break;\n    default:\n      break;\n  }\n\n  const availableGroups = map(collection, 'name');\n\n  if (!includes(availableGroups, config[field])) {\n    return head(availableGroups);\n  }\n\n  return config[field];\n};\n\nconst toValidAxisConfig = (config, state) => {\n  // make sure that xAxis and yAxis are always defined\n  const xAxis = ensureValidMeta('xAxis', config, state);\n\n  const yAxis = ensureValidMeta('yAxis', config, state);\n\n  return { ...config, xAxis, yAxis };\n};\n\nconst toValidSeriesConfig = (config, state) => {\n  const { series, xAxis } = config;\n\n  // If multi-series: series can't be the same as xAxis value\n  if (isUndefined(series)) {\n    return config;\n  }\n\n  const validMeta = ensureValidMeta('series', config, state);\n  const validConfig = { ...config, series: validMeta };\n  const { series: validSeries } = validConfig;\n\n  if (validSeries !== xAxis) {\n    return validConfig;\n  }\n\n  return { ...validConfig, series: getAlternativeSeries(validConfig, state) };\n};\n\nconst toValidLatestRecord = (config, state) => {\n  const {\n    meta: { groups },\n  } = state;\n  const { xAxis, numberToDisplay } = config;\n\n  if (numberToDisplay !== 'latestRecord') {\n    return config;\n  }\n\n  const dateGroups = toDateOrTimeGroups(groups);\n  if (!dateGroups.length) {\n    return { ...config, numberToDisplay: 'grandTotal' };\n  }\n\n  if (find(dateGroups, { name: xAxis })) {\n    return config;\n  }\n\n  return { ...config, xAxis: dateGroups[0].name };\n};\n\nconst toValidMinMax = (config, state) => {\n  const { meta, data } = state;\n\n  if (isEmpty(data)) {\n    return {\n      ...config,\n      _minDefault: '',\n      _maxDefault: '',\n    };\n  }\n\n  const { aggregations } = meta;\n  const { yAxis } = config;\n  const format = getCurrentFormat(aggregations, yAxis);\n  const {\n    data: { total, series },\n  } = state;\n  const value = getGeckometerValue(config, total, series);\n\n  return { ...config, ...getGeckometerDefaultMinMax(value, format) };\n};\n\nconst toValidTabularConfig = (config, state) => {\n  const { columns } = config;\n  const { columns: metaColumns } = state.meta;\n\n  // Forward config if there are already columns\n  // And check if the columns still exist in the metadata\n  if (columns && columns.length) {\n    const availableColumns = reject(\n      columns,\n      column =>\n        !find(metaColumns, {\n          name: column.field,\n        }),\n    );\n    return { ...config, columns: availableColumns };\n  }\n\n  const defaultColumns = metaColumns\n    .map(column => ({\n      field: column.name,\n    }))\n    .slice(0, MAX_COLUMNS);\n  return { ...config, columns: defaultColumns };\n};\n\nconst toValidConfig = state => {\n  const { config, meta } = state;\n\n  switch (meta.type) {\n    // We will need to add rules here to generate the config for tabular reports\n    case TABULAR_REPORT: {\n      return toValidTabularConfig(config, state);\n    }\n    default: {\n      // Apply the toValid function in order.\n      const toValidFunctions = [\n        toValidAxisConfig,\n        toValidSeriesConfig,\n        toValidLatestRecord,\n        toValidMinMax,\n      ];\n\n      return reduce(\n        toValidFunctions,\n        (intermediateConfig, fn) => {\n          return fn.call(this, intermediateConfig, state);\n        },\n        config,\n      );\n    }\n  }\n};\n\nconst setMinMaxFromDefaults = state => {\n  const { config } = state;\n  const { type, min, max, _minDefault, _maxDefault } = config;\n\n  if (type !== 'geckometer') {\n    return state;\n  }\n\n  let updatedMin = min;\n  if (isUndefined(parseNumberBasedOnFormat(min))) {\n    updatedMin = _minDefault;\n  }\n\n  let updatedMax = max;\n  if (isUndefined(parseNumberBasedOnFormat(max))) {\n    updatedMax = _maxDefault;\n  }\n\n  const updatedConfig = { ...config, min: updatedMin, max: updatedMax };\n  return { ...state, config: updatedConfig };\n};\n\nconst toRenderableState = state => {\n  return setMinMaxFromDefaults(state);\n};\n\nconst isValidInterval = (intervals, interval) => {\n  return chain(intervals)\n    .map('value')\n    .includes(interval)\n    .value();\n};\n\nexport {\n  toOptions,\n  toDateOrTimeGroups,\n  getCurrentFormat,\n  getAlternativeSeries,\n  getSeries,\n  ensureValidMeta,\n  toValidAxisConfig,\n  toValidSeriesConfig,\n  toValidLatestRecord,\n  toValidConfig,\n  toValidMinMax,\n  toValidTabularConfig,\n  toRenderableState,\n  isValidInterval,\n};\n","import { memoize } from 'lodash';\n\nclass AuthStrategy {\n  set({ strategy, value }) {\n    this.strategy = strategy;\n    this.value = value;\n  }\n\n  getQueryParam() {\n    if (!this.strategy || this.strategy === 'cookie') {\n      return null;\n    }\n\n    return `${this.strategy}=${this.value}`;\n  }\n}\n\nAuthStrategy.getInstance = memoize(() => {\n  return new AuthStrategy();\n});\n\nexport default AuthStrategy;\n","class DebouncePromise {\n  push(promise) {\n    this.current = promise;\n\n    return new Promise((resolve, reject) => {\n      promise.then(\n        res => {\n          if (this.current === promise) {\n            resolve(res);\n            this.current = null;\n          }\n        },\n        err => {\n          if (this.current === promise) {\n            reject(err);\n            this.current = null;\n          }\n        },\n      );\n    });\n  }\n}\n\nexport default DebouncePromise;\n","module.exports = (__webpack_require__(28))(1114);","import * as queryActions from '../../actions/universal-query-actions';\nimport * as bootstrapActions from '../../actions/universal-bootstrap-actions';\nimport { Node, getMetricFields, getFieldsByType } from '../../graph';\nimport { get, chain, flatten, includes, some, uniq, values } from 'lodash';\nimport {\n  TIMESPAN_TYPES,\n  GROUP_BY_CATEGORY_TYPES,\n  GROUP_BY_TIME_TYPES,\n  FILTER_FIELD_TYPES,\n  DETAILS_TYPES,\n  ORDER_BY_TYPES,\n  groupMetrics,\n} from '../../ui-field-options';\n\nconst METRIC_TYPES = [\n  'count',\n  'int',\n  'duration',\n  'percent',\n  'currency',\n  'float',\n  'details',\n];\n\nexport const initialState = {};\n\n// Group by category and sort alphabetically\nconst groupFieldsByCategory = fields => {\n  // Custom categories from metadata are ordered first because\n  // when looking for their index CATEGORIES_ORDER it returns -1\n  const CATEGORIES_ORDER = [undefined, Node.DATETIME, Node.CUSTOM_FIELD];\n  return values(\n    chain(fields)\n      .sortBy(['name'])\n      .sortBy(({ category }) => CATEGORIES_ORDER.indexOf(category))\n      .groupBy('category')\n      .value(),\n  );\n};\n\nconst canNodeGroupBy = predicate => node =>\n  predicate(node) && !node.exclude_from_groupby;\n\nconst getMetricOptions = (graph, metricsOrder) => {\n  const metrics = getMetricFields(graph, METRIC_TYPES);\n  return groupMetrics(metrics, metricsOrder);\n};\n\nconst getGroupByOptions = (\n  mainGraph,\n  entryResources,\n  vizType,\n  predicate = () => true,\n) => {\n  let fields;\n  switch (vizType) {\n    case 'line':\n      fields = getFieldsByType(\n        mainGraph,\n        GROUP_BY_TIME_TYPES,\n        entryResources,\n        vizType,\n        canNodeGroupBy(predicate),\n      );\n      break;\n    case 'leaderboard':\n    case 'table':\n      fields = getFieldsByType(\n        mainGraph,\n        GROUP_BY_CATEGORY_TYPES,\n        entryResources,\n        vizType,\n        canNodeGroupBy(predicate),\n      );\n      break;\n    case 'bar':\n    case 'column':\n      fields = getFieldsByType(\n        mainGraph,\n        [...GROUP_BY_CATEGORY_TYPES, ...GROUP_BY_TIME_TYPES],\n        entryResources,\n        vizType,\n        canNodeGroupBy(predicate),\n      );\n      break;\n    default:\n      return undefined;\n  }\n\n  return groupFieldsByCategory(fields);\n};\n\nconst getSplitByOptions = (\n  mainGraph,\n  entryResources,\n  vizType,\n  predicate = () => true,\n) => {\n  switch (vizType) {\n    case 'line':\n    case 'column':\n      return groupFieldsByCategory(\n        getFieldsByType(\n          mainGraph,\n          GROUP_BY_CATEGORY_TYPES,\n          entryResources,\n          vizType,\n          canNodeGroupBy(predicate),\n        ),\n      );\n    default:\n      return undefined;\n  }\n};\n\nconst getFilterOptions = (\n  mainGraph,\n  entryResources,\n  vizType,\n  predicate = () => true,\n) => {\n  // TODO: We need to check here if it's a prerequisite, rather than an SA filter\n\n  return groupFieldsByCategory(\n    getFieldsByType(\n      mainGraph,\n      FILTER_FIELD_TYPES,\n      entryResources,\n      vizType,\n      node =>\n        !node.exclude_from_filters &&\n        !node.is_global &&\n        !node.is_vip &&\n        predicate(node),\n    ),\n  );\n};\n\nconst getDetailsOptions = (mainGraph, entryResources, vizType) => {\n  switch (vizType) {\n    case 'table':\n      return groupFieldsByCategory(\n        getFieldsByType(\n          mainGraph,\n          DETAILS_TYPES,\n          entryResources,\n          vizType,\n          n => !n.exclude_from_details,\n        ),\n      );\n    default:\n      return undefined;\n  }\n};\n\nconst getOrderByOptions = (mainGraph, entryResources, vizType) => {\n  switch (vizType) {\n    case 'table':\n      return groupFieldsByCategory(\n        getFieldsByType(\n          mainGraph,\n          ORDER_BY_TYPES,\n          entryResources,\n          vizType,\n          n => !n.exclude_from_details,\n        ),\n      );\n    default:\n      return undefined;\n  }\n};\n\nconst uiOptionsReducer = (\n  state = initialState,\n  action,\n  mainGraph,\n  entryResources,\n  vizType,\n) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case bootstrapActions.setUiOptions.type: {\n      const metricCategories = action.payload;\n      const metrics = getMetricOptions(mainGraph, metricCategories);\n\n      return {\n        ...state,\n        metrics,\n      };\n    }\n    case queryActions.setVisualisationType.type: {\n      const filterAssociatedFields = get(\n        action,\n        'payload.metric.filter_associated_fields',\n      );\n\n      // Only groupBy and splitBy options can change when switching visualisation\n      const groupBy = getGroupByOptions(\n        mainGraph,\n        entryResources,\n        vizType,\n        filterAssociatedFields,\n      );\n      const splitBy = getSplitByOptions(\n        mainGraph,\n        entryResources,\n        vizType,\n        filterAssociatedFields,\n      );\n      const filters = getFilterOptions(\n        mainGraph,\n        entryResources,\n        vizType,\n        filterAssociatedFields,\n      );\n\n      return {\n        ...state,\n        groupBy,\n        splitBy,\n        filters,\n      };\n    }\n    case bootstrapActions.setPrerequisiteOptions.type:\n      return {\n        ...state,\n        prerequisites: payload,\n      };\n    case bootstrapActions.setInitialQueries.type:\n    case queryActions.setMetricField.type: {\n      let groupBy, detailsColumns, orderBy;\n\n      const {\n        payload: {\n          time_fields: metricTimeFields,\n          type: metricType,\n          filter_associated_fields: filterAssociatedFields,\n        } = {},\n      } = action;\n\n      const timespans =\n        metricTimeFields ||\n        getFieldsByType(mainGraph, TIMESPAN_TYPES, entryResources, vizType);\n      const splitBy = getSplitByOptions(\n        mainGraph,\n        entryResources,\n        vizType,\n        filterAssociatedFields,\n      );\n\n      if (metricType === 'details') {\n        groupBy = [];\n        detailsColumns = getDetailsOptions(mainGraph, entryResources, vizType);\n        orderBy = getOrderByOptions(mainGraph, entryResources, vizType);\n      } else {\n        groupBy = getGroupByOptions(\n          mainGraph,\n          entryResources,\n          vizType,\n          filterAssociatedFields,\n        );\n        detailsColumns = [];\n      }\n      const filters = getFilterOptions(\n        mainGraph,\n        entryResources,\n        vizType,\n        filterAssociatedFields,\n      );\n\n      return {\n        ...state,\n        timespans: [timespans],\n        groupBy,\n        splitBy,\n        filters,\n        detailsColumns,\n        orderBy,\n      };\n    }\n    default:\n      return state;\n  }\n};\n\nexport const getAvailableMetrics = (metrics, currentMetric) => {\n  if (\n    !currentMetric ||\n    includes(flatten(metrics.map(g => g.options)), currentMetric)\n  ) {\n    return metrics;\n  }\n\n  // Add current metric in it's own group if it doesn't exist (this can happen when we\n  // add a rule to remove a metric and you edit a widget with the deprecated metric)\n  return [...metrics, { options: [currentMetric] }];\n};\n\nexport const getAvailableFilters = (\n  groupedFilters,\n  uiQueryFilters = [],\n  currentFilter,\n) => {\n  const exclusionGroups = chain(uiQueryFilters)\n    .flatten()\n    .filter(\n      f => f.node && f.node !== currentFilter && f.node.filter_exclusion_groups,\n    )\n    .reduce((res, f) => [...res, ...f.node.filter_exclusion_groups], [])\n    .value();\n\n  const currentFilters = uiQueryFilters.map(filter => filter.node);\n\n  // Remove already used filter nodes but keep current one when editing\n  return chain(groupedFilters)\n    .map(filters => {\n      return filters.filter(\n        f =>\n          (currentFilter && currentFilter === f) ||\n          !(\n            currentFilters.includes(f) ||\n            (f.filter_exclusion_groups\n              ? some(exclusionGroups, e =>\n                  f.filter_exclusion_groups.includes(e),\n                )\n              : false)\n          ),\n      );\n    })\n    .filter(filters => !!filters.length)\n    .value();\n};\n\nexport const appendSelectedNodes = (uiOptions, uiQuery) => {\n  if (!uiQuery.timespans || !uiQuery.timespans[0]) {\n    return uiOptions;\n  }\n\n  // Timespan only has one group, so just amend timespans[0]\n  return {\n    ...uiOptions,\n    timespans: [uniq([...uiOptions.timespans[0], uiQuery.timespans[0].node])],\n  };\n};\n\nexport default uiOptionsReducer;\n","import uiOptionsReducer, {\n  getAvailableFilters,\n  appendSelectedNodes,\n  getAvailableMetrics,\n} from './ui-options-reducer';\nexport {\n  uiOptionsReducer as default,\n  getAvailableFilters,\n  appendSelectedNodes,\n  getAvailableMetrics,\n};\n","export const ERROR_TYPES = {\n  UNKNOWN: 'UNKNOWN',\n  QUERY_FAILED: 'QUERY_FAILED',\n  CONNECTION_FAILED: 'CONNECTION_FAILED',\n  TIMEOUT: 'TIMEOUT',\n  CANCELED: 'CANCELED',\n  INVALID_QUERY: 'INVALID_QUERY',\n  DANGEROUS_USER_PERMISSIONS: 'DANGEROUS_USER_PERMISSIONS',\n  VALUE_OUT_OF_RANGE: 'VALUE_OUT_OF_RANGE',\n  NOT_FOUND: 'NOT_FOUND',\n  PERMISSION_DENIED: 'PERMISSION_DENIED',\n  QUERY_RESPONSE_TOO_LARGE: 'QUERY_RESPONSE_TOO_LARGE',\n};\n\n/*\n * getApolloErrorType\n *\n * Apollo errors can contain both network errors and graphQL errors.\n * This helper function wraps up the complexity and returns an\n * error type string constant for all types of Apollo error.\n */\nexport const getApolloErrorType = apolloError => {\n  const { graphQLErrors } = apolloError;\n\n  /*\n   * There can be multiple graphQL errors in a\n   * single Apollo error. For now we can assume\n   * that we only care about the first one.\n   */\n  if (graphQLErrors && graphQLErrors.length) {\n    return ERROR_TYPES[graphQLErrors[0].type] || ERROR_TYPES.UNKNOWN;\n  }\n\n  /*\n   * We might need to handle different kinds of\n   * network error individually in the future\n   * but for now we can convert them all to\n   * UNKNOWN\n   */\n  return ERROR_TYPES.UNKNOWN;\n};\n","import { fetchAllJSON } from '../universal/fetch';\n\nfunction refresh(prefix) {\n  return fetchAllJSON(`/${prefix}/reload`, {\n    method: 'PUT',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n    },\n    credentials: 'include',\n  });\n}\n\nfunction refreshDashboard(id) {\n  return refresh(`dashboards/${id}`);\n}\n\nfunction refreshSharingLoop(code) {\n  return refresh(`loop/${code}`);\n}\n\nexport { refreshDashboard, refreshSharingLoop };\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { noop } from 'lodash';\nimport Icon from '@UI/icon';\n\nimport style from './select-style.scss';\n\nconst SelectComponent = ({\n  name,\n  value,\n  disabled,\n  children,\n  defaultValue,\n  isFullWidth,\n  onChange,\n}) => {\n  const classes = classNames(style.select, {\n    [style.isFullWidth]: isFullWidth,\n  });\n\n  return (\n    <div className={style.selectWrapper}>\n      <select\n        className={classes}\n        id={name}\n        name={name}\n        value={value}\n        onChange={e => onChange(name, e.target.value)}\n        disabled={disabled}\n        defaultValue={defaultValue}\n      >\n        {children}\n      </select>\n      <span className={style.icon}>\n        <Icon name=\"caret-down\" fontWeight={Icon.FONT_WEIGHTS.FA_SOLID} />\n      </span>\n    </div>\n  );\n};\n\nSelectComponent.defaultProps = {\n  disabled: false,\n  onChange: noop,\n};\n\nSelectComponent.propTypes = {\n  children: PropTypes.node,\n  defaultValue: PropTypes.string,\n  disabled: PropTypes.bool,\n  isFullWidth: PropTypes.bool,\n  name: PropTypes.string,\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  onChange: PropTypes.func,\n};\n\nexport default SelectComponent;\n","import SelectComponent from './select-component';\nexport default SelectComponent;\n","import { sortBy, capitalize } from 'lodash';\nimport apolloClient from '../services/concierge-service/apollo-client';\nimport { Dashboards } from '../services/concierge-service/graphql/dashboards-query.graphql';\nimport { TRACKING_LAYOUT_TYPES } from '@Tracking/contexts/dashboard';\n\nconst getUserDisplayName = user => {\n  return user.first_name ? `${user.first_name} ${user.last_name}` : user.email;\n};\n\nconst sortGroupsByName = groups => {\n  return sortBy(groups, [({ name = '' }) => name.toLowerCase(), 'id']);\n};\n\nconst getDashboardTrackingProps = legacyId => {\n  const { dashboards } = apolloClient.create().readQuery({\n    query: Dashboards,\n  });\n\n  if (!dashboards) {\n    return {};\n  }\n\n  const dashboard = dashboards.find(d => d.legacyId === legacyId.toString());\n\n  if (!dashboard) {\n    return {};\n  }\n\n  const type = TRACKING_LAYOUT_TYPES[dashboard.layoutType.__typename];\n\n  const props = {\n    'Dashboard ID': dashboard.id,\n    'Legacy dashboard ID': dashboard.legacyId,\n    'Dashboard type': type,\n  };\n\n  switch (type) {\n    case TRACKING_LAYOUT_TYPES.ClassicLayout:\n      props['Classicboard column count'] = dashboard.layoutType.columnCount;\n      break;\n\n    case TRACKING_LAYOUT_TYPES.FixedLayout:\n      props['Fixieboard grid size'] = capitalize(dashboard.layoutType.grid);\n      break;\n\n    default:\n      break;\n  }\n\n  return props;\n};\n\nexport { getUserDisplayName, sortGroupsByName, getDashboardTrackingProps };\n","export default [\n  12,\n  14,\n  16,\n  18,\n  21,\n  24,\n  28,\n  32,\n  36,\n  42,\n  48,\n  55,\n  63,\n  73,\n  84,\n  96,\n  110,\n  127,\n  146,\n  167,\n  192,\n  221,\n  253,\n  291,\n  334,\n  384,\n];\n","import scale from './scale';\n\nconst clamp = value => {\n  return Math.min(Math.max(value, 0), scale.length - 1);\n};\n\nconst typeScale = index => {\n  const scaleIndex = clamp(index);\n\n  const px = () => scale[scaleIndex];\n\n  // Return a rem string from pixel value\n  const rem = () => `${px() / 16}rem`;\n\n  const increase = value => {\n    return typeScale(scaleIndex + value);\n  };\n\n  const decrease = value => {\n    return typeScale(scaleIndex - value);\n  };\n\n  return {\n    px,\n    rem,\n    increase,\n    decrease,\n    scaleIndex,\n  };\n};\n\nexport default typeScale;\n","import typeScale from './type-scale';\n\nexport default typeScale;\n","import PromoCard, {\n  PromoCardHeader,\n  PromoCardFooter,\n  PromoCardLink,\n} from './promo-card-component';\nexport default PromoCard;\nexport { PromoCardHeader, PromoCardFooter, PromoCardLink };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1W14-\",\"header\":\"header---3nxck\",\"footer\":\"footer---2dMK1\",\"buttons\":\"buttons---j6ywr\",\"progressBar\":\"progressBar---1ewaq\",\"editorMessage\":\"editorMessage---3W4aG\",\"success\":\"success---1UWvN\",\"successSubtitle\":\"successSubtitle---jfx48\",\"editorContainer\":\"editorContainer---28Hqg\",\"loadingPositioner\":\"loadingPositioner---3q_hD\",\"error\":\"error---cGiLC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---NRbgQ\",\"headerContainer\":\"headerContainer----Ehsf\",\"header\":\"header---2Vtsg\",\"icon\":\"icon---U8wz1\",\"subtitle\":\"subtitle---X13tR\",\"requirements\":\"requirements---13tOm\",\"form\":\"form---3wqIK\",\"halfFields\":\"halfFields---3GsOg\",\"field\":\"field---3RpGr\",\"supplementary\":\"supplementary---3WJU6\",\"supplementaryIcon\":\"supplementaryIcon---xrSiq\",\"select\":\"select---2Ou0e\",\"actions\":\"actions---1gdKZ\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Input from '../../../components/form/input';\nimport Button from '@UI/button';\nimport ButtonGroup from '@UI/button-group';\nimport { isUndefined, bindAll } from 'lodash';\n\nimport style from './unit-control-style.scss';\n\nclass UnitControlComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, ['handleInputChange']);\n  }\n\n  handleInputChange({ value }) {\n    const { prefix, onChange } = this.props;\n\n    let prefixValue, suffixValue;\n\n    if (!isUndefined(prefix)) {\n      prefixValue = value;\n    } else {\n      suffixValue = value;\n    }\n    onChange({ prefix: prefixValue, suffix: suffixValue });\n  }\n\n  render() {\n    const { prefix, suffix, onChange } = this.props;\n    const hasPrefix = !isUndefined(prefix);\n    const hasSuffix = !isUndefined(suffix);\n    const invalidProps = hasPrefix && hasSuffix;\n    const hasPrefixOrSuffix = hasPrefix || hasSuffix;\n    const inputValue = prefix || suffix;\n\n    return (\n      <div>\n        <ButtonGroup theme={ButtonGroup.THEMES.LIGHT}>\n          <Button\n            onClick={() => {\n              if (isUndefined(prefix) && isUndefined(suffix)) {\n                return;\n              }\n              onChange({ prefix: undefined, suffix: undefined });\n            }}\n            checked={!hasPrefixOrSuffix}\n          >\n            Auto\n          </Button>\n          <Button\n            onClick={() => {\n              if (!isUndefined(prefix)) {\n                return;\n              }\n              onChange({ prefix: suffix || '', suffix: undefined });\n              setTimeout(() => {\n                this.textInput.focusTextInput();\n              }, 0);\n            }}\n            checked={!invalidProps && hasPrefix}\n          >\n            Prefix\n          </Button>\n          <Button\n            onClick={() => {\n              if (!isUndefined(suffix)) {\n                return;\n              }\n              onChange({ prefix: undefined, suffix: prefix || '' });\n              setTimeout(() => {\n                this.textInput.focusTextInput();\n              }, 0);\n            }}\n            checked={!invalidProps && hasSuffix}\n          >\n            Suffix\n          </Button>\n        </ButtonGroup>\n        <div className={style.inputWrapper}>\n          <Input\n            id=\"unit\"\n            name=\"unit\"\n            value={inputValue}\n            placeholder=\"$£€\"\n            isSmall\n            disabled={!hasPrefixOrSuffix}\n            maxLength={3}\n            onChange={this.handleInputChange}\n            ref={input => {\n              this.textInput = input;\n            }}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\nUnitControlComponent.propTypes = {\n  prefix: PropTypes.string,\n  suffix: PropTypes.string,\n  onChange: PropTypes.func,\n};\n\nexport default UnitControlComponent;\n","import UnitControlComponent from './unit-control-component';\nexport default UnitControlComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport ButtonGroup from '@UI/button-group';\nimport Button from '@UI/button';\nimport InlineSettings from '../../../components/form/inline-settings';\nimport FormattedMessage from '../../../lib/i18n';\nimport { isUndefined, bindAll } from 'lodash';\nimport classNames from 'classnames';\nimport UnitControl from '../unit-control';\nimport {\n  ABBREVIATION_BUTTONS,\n  INIT_PRECISION,\n  MIN_PRECISION,\n  MAX_PRECISION,\n} from './';\n\nimport style from './advanced-settings-style.scss';\n\nclass AdvancedSettingsComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleAbbreviationChange', 'handleNumberFormatUpdate');\n  }\n\n  handleAbbreviationChange({ value, options }) {\n    if (this.props.numberFormat.abbreviation === value) {\n      return;\n    }\n\n    this.handleNumberFormatUpdate({ [options.name]: value });\n  }\n\n  handleNumberFormatUpdate(update) {\n    const { onNumberFormatUpdate } = this.props;\n\n    onNumberFormatUpdate(update);\n  }\n\n  handlePrecisionChange(value) {\n    if (this.props.numberFormat.precision !== value) {\n      this.props.onNumberFormatUpdate({ precision: value });\n    }\n  }\n\n  renderAbbreviationButtons(abbreviation) {\n    const abbreviationButtons = ABBREVIATION_BUTTONS.map(button => {\n      const { value, label } = button;\n      const options = { name: 'abbreviation' };\n\n      return (\n        <Button\n          key={label}\n          checked={value === abbreviation}\n          onClick={() => this.handleAbbreviationChange({ value, options })}\n        >\n          {label}\n        </Button>\n      );\n    });\n\n    return (\n      <ButtonGroup theme={ButtonGroup.THEMES.LIGHT}>\n        {abbreviationButtons}\n      </ButtonGroup>\n    );\n  }\n\n  renderPrecisionButtons(precision) {\n    const isPrecisionDefined = !isUndefined(precision);\n\n    const precisionStyle = classNames(style.precisionNumber, {\n      [style.inactive]: !isPrecisionDefined,\n    });\n\n    const isDecreaseDisabled =\n      !isPrecisionDefined || precision <= MIN_PRECISION;\n    const isIncreaseDisabled =\n      !isPrecisionDefined || precision >= MAX_PRECISION;\n    const displayedPrecision = isPrecisionDefined ? precision : INIT_PRECISION;\n\n    return [\n      <ButtonGroup key=\"precisionGroup\" theme={ButtonGroup.THEMES.LIGHT}>\n        <Button\n          onClick={() => this.handlePrecisionChange(undefined)}\n          checked={!isPrecisionDefined}\n        >\n          Auto\n        </Button>\n        <Button\n          onClick={() =>\n            this.handlePrecisionChange(precision || INIT_PRECISION)\n          }\n          checked={isPrecisionDefined}\n        >\n          Fixed\n        </Button>\n      </ButtonGroup>,\n      <div className={style.precisionGroup} key=\"precisionChangeGroup\">\n        <ButtonGroup theme={ButtonGroup.THEMES.LIGHT}>\n          <Button\n            onClick={() => this.handlePrecisionChange(precision - 1)}\n            disabled={isDecreaseDisabled}\n          >\n            –\n          </Button>\n          <div className={precisionStyle}>{displayedPrecision}</div>\n          <Button\n            onClick={() => this.handlePrecisionChange(precision + 1)}\n            disabled={isIncreaseDisabled}\n          >\n            +\n          </Button>\n        </ButtonGroup>\n      </div>,\n    ];\n  }\n\n  render() {\n    const { numberFormat, currentType, labelMargin } = this.props;\n\n    if (currentType === 'duration') {\n      return <FormattedMessage id=\"widget.fineTune.emptyMessage\" />;\n    }\n\n    const { abbreviation, precision, prefix, suffix } = numberFormat;\n\n    return (\n      <span>\n        <InlineSettings label=\"Abbreviation\" labelMargin={labelMargin}>\n          {this.renderAbbreviationButtons(abbreviation)}\n        </InlineSettings>\n        <InlineSettings label=\"Decimal Places\" labelMargin={labelMargin}>\n          {this.renderPrecisionButtons(precision)}\n        </InlineSettings>\n        <InlineSettings label=\"Unit\" labelMargin={labelMargin}>\n          <UnitControl\n            onChange={this.handleNumberFormatUpdate}\n            prefix={prefix}\n            suffix={suffix}\n          />\n        </InlineSettings>\n      </span>\n    );\n  }\n}\n\nAdvancedSettingsComponent.defaultProps = {\n  numberFormat: {},\n};\n\nAdvancedSettingsComponent.propTypes = {\n  currentType: PropTypes.string,\n  labelMargin: PropTypes.number,\n  numberFormat: PropTypes.object,\n  onNumberFormatUpdate: PropTypes.func,\n};\n\nexport default AdvancedSettingsComponent;\n","import AdvancedSettings from './advanced-settings-component';\n\nconst ABBREVIATION_BUTTONS = [\n  { value: undefined, label: 'Auto' },\n  { value: 'none', label: 'None' },\n  { value: 'K', label: 'K' },\n  { value: 'M', label: 'M' },\n  { value: 'B', label: 'B' },\n];\nconst INIT_PRECISION = 2;\nconst MIN_PRECISION = 0;\nconst MAX_PRECISION = 6;\n\nexport default AdvancedSettings;\nexport { ABBREVIATION_BUTTONS, INIT_PRECISION, MIN_PRECISION, MAX_PRECISION };\n","const delay = millis => new Promise(resolve => setTimeout(resolve, millis));\n\nexport default delay;\n","import delay from './delay';\nexport default delay;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport styles from './warning-style.scss';\n\nconst WarningComponent = ({ children }) => {\n  return <div className={styles.warning}>{children}</div>;\n};\n\nWarningComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default WarningComponent;\n","import Warning from './warning-component';\n\nexport default Warning;\n","import delay from '../../lib/delay';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport {\n  getPairingStatus,\n  getPairingCode,\n  exchangeDeviceToken,\n} from '../../services/management-service';\nimport {\n  POLL_INTERVAL,\n  MAX_CODE_COUNT,\n  ERROR_MESSAGE,\n} from '../constants/tv-page-constants';\nimport { FetchError } from '../../universal/fetch';\nimport { redirect } from '../../lib/global';\n\nconst _pollFetch = async (doFetch, interval, limit) => {\n  let count = 1;\n  let response = await doFetch();\n\n  while (response.status === 202) {\n    if (count >= limit) {\n      throw new FetchError('POLL_FETCH_LIMIT_EXCEEDED');\n    }\n\n    await delay(interval);\n\n    count += 1;\n    response = await doFetch();\n  }\n\n  return response;\n};\n\nconst _handleStatusError = error => {\n  const { status } = error;\n\n  switch (status) {\n    case 400:\n    case 404:\n    case 410:\n      // Code has expired, is invalid or the\n      // device token has already been retrieved\n      return null;\n    default:\n      throw error;\n  }\n};\n\nconst _pollForPairingStatus = async code => {\n  const MAX_POLL_COUNT = 1000;\n  try {\n    const response = await _pollFetch(\n      () => getPairingStatus(code),\n      POLL_INTERVAL,\n      MAX_POLL_COUNT,\n    );\n    const { token } = await response.json();\n    return token;\n  } catch (error) {\n    return _handleStatusError(error);\n  }\n};\n\n// Actions\nexport const setCode = createAction('TvPage:SET_CODE');\nexport const setDevice = createAction('TvPage:SET_DEVICE');\nexport const setError = createErrorAction('TvPage:SET_ERROR');\n\n// Async Actions\nexport const init = () => async dispatch => {\n  try {\n    let codeCount = 0;\n    while (codeCount < MAX_CODE_COUNT) {\n      const { code } = await getPairingCode();\n\n      dispatch(setCode(code));\n\n      const token = await _pollForPairingStatus(code);\n      if (token) {\n        const { url } = await exchangeDeviceToken(token);\n        redirect(url);\n        return;\n      }\n      // else expired, get a new code\n      codeCount += 1;\n    }\n\n    // We have hit the max code count\n    dispatch(setError(new Error('MAX_CODE_COUNT_REACHED'), ERROR_MESSAGE));\n  } catch (error) {\n    dispatch(setError(error, ERROR_MESSAGE));\n  }\n};\n","export const POLL_INTERVAL = 1500; // 1.5 seconds\nexport const CODE_LIFETIME = 5; // code is valid for 5 minutes\n// this is the max amount of codes that we want to refresh, anymore and user\n// should refresh cos they're wasting our precious time\nexport const MAX_CODE_COUNT = 60 / CODE_LIFETIME;\nexport const ERROR_MESSAGE = 'Please refresh the page to get a code.';\n","const pattern = /\\r?\\n|\\r/g;\n\nexport default function stripNewlines(text) {\n  return text ? text.replace(pattern, '') : '';\n}\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\nimport stripNewlines from '../../../lib/strip-newlines';\n\nimport style from './editable-input-style.scss';\n\nclass EditableInputComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(\n      this,\n      'handleBlur',\n      'handleChange',\n      'handleClick',\n      'handleKeyDown',\n      'handleFocus',\n    );\n\n    this.state = { text: props.text || '' };\n  }\n\n  componentDidMount() {\n    findDOMNode(this.refs.inputText).select();\n    this.setAutoHeight();\n  }\n\n  handleClick() {\n    this.setAutoHeight();\n  }\n\n  handleFocus(e) {\n    this.setAutoHeight();\n\n    const { onFocus } = this.props;\n    if (onFocus) {\n      onFocus(e);\n    }\n  }\n\n  handleBlur() {\n    const { handleBlur: handler } = this.props;\n\n    handler(this.state.text.trim());\n  }\n\n  handleChange(e) {\n    this.setAutoHeight();\n\n    this.setState({ text: stripNewlines(e.target.value) });\n  }\n\n  handleKeyDown(e) {\n    const el = findDOMNode(this);\n    switch (e.key) {\n      case 'Escape':\n        this.setState({ text: this.props.text });\n        e.target.value = this.props.text;\n        el.blur();\n        break;\n      case 'Enter':\n        el.blur();\n        break;\n      default:\n        break;\n    }\n  }\n\n  render() {\n    const {\n      name,\n      placeholder,\n      isMultiLine,\n      inputClassName,\n      maxLength,\n    } = this.props;\n    const classes = classNames(style.editableInput, inputClassName, {\n      [style.input]: !isMultiLine,\n    });\n\n    return (\n      <textarea\n        ref=\"inputText\"\n        rows=\"1\"\n        name={name}\n        className={classes}\n        placeholder={placeholder}\n        value={this.state.text}\n        onClick={this.handleClick}\n        onBlur={this.handleBlur}\n        onChange={this.handleChange}\n        onFocus={this.handleFocus}\n        onKeyDown={this.handleKeyDown}\n        maxLength={maxLength}\n      />\n    );\n  }\n\n  setAutoHeight() {\n    // This is a dom hack to auto grow and shrink the textarea while typing\n    if (this.props.isMultiLine) {\n      const el = this.refs.inputText;\n      el.style.overflowY = 'hidden';\n      el.style.height = 'auto';\n      el.style.height = `${el.scrollHeight + 1}px`; // +1 because of the border :/\n    }\n  }\n}\n\nEditableInputComponent.propTypes = {\n  handleBlur: PropTypes.func,\n  inputClassName: PropTypes.string,\n  isMultiLine: PropTypes.bool,\n  maxLength: PropTypes.number,\n  name: PropTypes.string,\n  placeholder: PropTypes.string,\n  text: PropTypes.string,\n  onFocus: PropTypes.func,\n};\n\nEditableInputComponent.defaultProps = {\n  isMultiLine: false,\n};\nexport default EditableInputComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport EditableInputComponent from './editable-input-component';\nimport classNames from 'classnames';\nimport { bindAll, isString } from 'lodash';\nimport stripNewlines from '../../../lib/strip-newlines';\n\nimport style from './editable-style.scss';\n\nconst ZERO_WIDTH_SPACE = '\\u200b';\n\nclass EditableComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, 'handleEnterEditMode', 'handleBlur', 'renderContent');\n\n    this.state = { isEditing: false };\n  }\n\n  handleEnterEditMode() {\n    this.setState({ isEditing: true });\n  }\n\n  handleBlur(val) {\n    this.props.onSubmit(val);\n    this.setState({ isEditing: false });\n  }\n\n  renderContent() {\n    const {\n      text,\n      name,\n      placeholder,\n      showPlaceholderOnHover,\n      isMultiLine,\n      inputClassName,\n      isDashboardTitle,\n    } = this.props;\n    const strippedText = stripNewlines(text);\n    const isPlaceholder = !isString(text) || !text.length;\n    const displayedText = isPlaceholder ? placeholder : strippedText;\n\n    if (this.state.isEditing) {\n      return (\n        <EditableInputComponent\n          {...this.props}\n          text={strippedText}\n          name={name}\n          isMultiLine={isMultiLine}\n          handleBlur={this.handleBlur}\n          inputClassName={inputClassName}\n        />\n      );\n    }\n\n    const labelClasses = classNames(style.editable, inputClassName, {\n      [style.isDashboardTitle]: isDashboardTitle,\n      [style.multiLines]: isMultiLine,\n      [style.showPlaceholderOnHover]: showPlaceholderOnHover,\n      placeholder: isPlaceholder,\n    });\n\n    return (\n      <label onClick={this.handleEnterEditMode} className={labelClasses}>\n        {displayedText || ZERO_WIDTH_SPACE}\n      </label>\n    );\n  }\n\n  render() {\n    const { className } = this.props;\n\n    return <span className={className}>{this.renderContent()}</span>;\n  }\n}\n\nEditableComponent.propTypes = {\n  onSubmit: PropTypes.func.isRequired,\n  className: PropTypes.string,\n  inputClassName: PropTypes.string,\n  isDashboardTitle: PropTypes.bool,\n  isMultiLine: PropTypes.bool,\n  name: PropTypes.string,\n  placeholder: PropTypes.string,\n  showPlaceholderOnHover: PropTypes.bool,\n  text: PropTypes.string,\n};\n\nEditableComponent.defaultProps = {\n  isMultiLine: false,\n  isDashboardTitle: false,\n};\n\nexport default EditableComponent;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage, { formatMessage } from '../../../lib/i18n';\nimport { Row, Column } from '../../../components/layout';\nimport SelectDropdown from '../../../components/select-dropdown';\nimport Input from '../../../components/form/input';\nimport DurationInput from '../../../components/form/duration-input';\nimport Icon from '@UI/icon';\nimport { parseDurationInput } from '../../../lib/humanise-number';\nimport { every, isFinite, isArray, isUndefined, isEmpty, isNil } from 'lodash';\nimport classNames from 'classnames';\nimport { selectionToString } from '../../../spreadsheet-config/helpers';\n\nimport style from './status-indicators-form-style.scss';\n\nconst STATE_LABELS = {\n  positive: 'universal.statusIndicators.success',\n  warning: 'universal.statusIndicators.warning',\n};\nconst REVERSE_STATES = {\n  positive: 'warning',\n  warning: 'positive',\n};\nconst transformThresholdsToFormState = (\n  thresholds,\n  currentUpperState = 'warning',\n) => {\n  const [upper, lower = []] = thresholds.reduce(\n    (memo, value) => {\n      // Split our thresholds into upper and lower when we encounter\n      // the 'neutral' state\n      if (value === 'neutral') {\n        return [[], ...memo];\n      }\n      memo[0].push(value);\n\n      return memo;\n    },\n    [[]],\n  );\n\n  let [lowerState] = lower;\n  let [, upperState] = upper;\n  const [, lowerValue] = lower;\n  const [upperValue] = upper;\n\n  // Apply a default lower state when we have an upper state\n  if (!lowerState && upperState) {\n    lowerState = REVERSE_STATES[upperState];\n  }\n\n  // Apply a default upper state when we have a lower state\n  if (!upperState && lowerState) {\n    upperState = REVERSE_STATES[lowerState];\n  }\n\n  // Apply defaults when we have no values\n  if (!lowerState && !upperState) {\n    lowerState = REVERSE_STATES[currentUpperState];\n    upperState = currentUpperState;\n  }\n\n  return {\n    lowerState,\n    lowerValue,\n    upperState,\n    upperValue,\n  };\n};\nconst transformFormStateToThresholds = ({\n  lowerState,\n  lowerValue,\n  upperState,\n  upperValue,\n}) => {\n  let thresholds = [];\n\n  if (isFinite(lowerValue) || isArray(lowerValue)) {\n    thresholds = [lowerState, lowerValue];\n  }\n\n  thresholds.push('neutral');\n\n  if (isFinite(upperValue) || isArray(upperValue)) {\n    thresholds = [...thresholds, upperValue, upperState];\n  }\n\n  // We have no thresholds to set so empty the array\n  if (thresholds.length === 1) {\n    return [];\n  }\n\n  return thresholds;\n};\n\nconst renderDefaultInput = (\n  format,\n  name,\n  currentValue,\n  onChange,\n  smallestInputUnit,\n) => {\n  const isFiniteValue = isFinite(parseFloat(currentValue));\n  const isCellSelection = isArray(currentValue);\n\n  if ('duration' === format) {\n    const onDurationChange = ({ value: rawValue }) => {\n      const isNullDuration = every(rawValue, d => d === '');\n      const value = isNullDuration\n        ? ''\n        : parseDurationInput(rawValue, 'milliseconds');\n\n      onChange({ value });\n    };\n\n    const displayValue =\n      currentValue === '' || isNil(currentValue)\n        ? undefined\n        : parseFloat(currentValue);\n\n    return (\n      <Row flexWrap={false} align=\"center\">\n        <span className={style.durationInput}>\n          <DurationInput\n            name={name}\n            value={displayValue}\n            smallestInputUnit={smallestInputUnit}\n            controlInputs\n            onChange={onDurationChange}\n          />\n        </span>\n        <span className={style.durationInputClear}>\n          {isFiniteValue && (\n            <button\n              onClick={() => onChange({ value: '' })}\n              className={style.iconButton}\n            >\n              <Icon name=\"times\" />\n            </button>\n          )}\n        </span>\n      </Row>\n    );\n  }\n\n  let value = isFiniteValue ? currentValue : '';\n  let type = 'number';\n\n  // We're going to display cell selections but disabled the input\n  // we will direct the user to the edit screen where cells can be selected\n  if (isCellSelection) {\n    value = selectionToString(currentValue);\n    type = 'text';\n  }\n\n  return (\n    <Input\n      isSmall\n      placeholder=\"0\"\n      name={name}\n      value={value}\n      onChange={onChange}\n      type={type}\n      disabled={isCellSelection}\n    />\n  );\n};\n\nclass StatusIndicatorsFormComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    let upperValue, lowerValue;\n\n    // If we already have some indicators, use it to seed the component state\n    if (!isEmpty(props.indicators)) {\n      const formState = transformThresholdsToFormState(\n        props.indicators.thresholds,\n        props.indicators._currentUpperState,\n      );\n\n      upperValue = formState.upperValue;\n      lowerValue = formState.lowerValue;\n    }\n\n    this.state = { upperValue, lowerValue };\n  }\n\n  componentDidUpdate() {\n    const { indicators = {}, format } = this.props;\n    const { thresholds = [] } = indicators;\n\n    if (isEmpty(indicators) || isEmpty(thresholds)) {\n      // If we've updated to an empty state, clear the local component state, except for\n      // durations, which are a special case\n      if (format !== 'duration') {\n        this.setState({ upperValue: '', lowerValue: '' });\n      }\n\n      return;\n    }\n\n    const {\n      thresholds: newThresholds,\n      _currentUpperState: _newCurrentUpperState,\n    } = indicators;\n\n    let {\n      lowerValue: newLowerValue,\n      upperValue: newUpperValue,\n    } = transformThresholdsToFormState(newThresholds, _newCurrentUpperState);\n\n    const getNewValue = rawValue => {\n      if (isUndefined(rawValue)) return '';\n      if (isArray(rawValue)) return rawValue;\n\n      return rawValue.toString();\n    };\n    newLowerValue = getNewValue(newLowerValue);\n    newUpperValue = getNewValue(newUpperValue);\n\n    // If we are dealing with duration values or cell selections, we don't\n    // need to do anything special. Just update the value if it is different.\n    if (isArray(newLowerValue) || this.props.format === 'duration') {\n      if (newLowerValue !== this.state.lowerValue) {\n        this.setState({ lowerValue: newLowerValue }); // eslint-disable-line\n      }\n    }\n\n    if (isArray(newUpperValue) || this.props.format === 'duration') {\n      if (newUpperValue !== this.state.upperValue) {\n        this.setState({ upperValue: newUpperValue }); // eslint-disable-line\n      }\n    }\n\n    // For numbers, if the new value is actually different to the old value (even\n    // after parsing) then we want to update it. The reason for this is to prevent\n    // `0.0` being parsed to `0`, meaning people can't type `0.001`, for example.\n    const parsedLowerValue = parseFloat(this.state.lowerValue);\n    const parsedUpperValue = parseFloat(this.state.upperValue);\n\n    if (newLowerValue !== parsedLowerValue.toString()) {\n      this.setState({ lowerValue: newLowerValue }); // eslint-disable-line\n    }\n\n    if (newUpperValue !== parsedUpperValue.toString()) {\n      this.setState({ upperValue: newUpperValue }); // eslint-disable-line\n    }\n  }\n\n  render() {\n    const {\n      onChange,\n      indicators: { thresholds = [], _currentUpperState } = {},\n      format,\n      smallestInputUnit,\n      renderInput = renderDefaultInput,\n    } = this.props;\n\n    const formState = transformThresholdsToFormState(\n      thresholds,\n      _currentUpperState,\n    );\n    const { lowerState, upperState } = formState;\n    const onChangeThresholds = currentFormState => {\n      const newThresholds = transformFormStateToThresholds(currentFormState);\n\n      onChange({\n        _currentUpperState: currentFormState.upperState,\n        thresholds: newThresholds,\n      });\n    };\n    const onChangeUpperState = newUpperState => {\n      onChangeThresholds({\n        ...formState,\n        lowerState: REVERSE_STATES[newUpperState],\n        upperState: newUpperState,\n      });\n    };\n    const onChangeLowerValue = ({ value }) => {\n      this.setState({ lowerValue: value });\n\n      onChangeThresholds({\n        ...formState,\n        lowerValue: parseFloat(value),\n      });\n    };\n    const onChangeUpperValue = ({ value }) => {\n      this.setState({ upperValue: value });\n\n      onChangeThresholds({\n        ...formState,\n        upperValue: parseFloat(value),\n      });\n    };\n    const className = classNames({\n      [style.duration]: format === 'duration',\n    });\n\n    return (\n      <div className={className}>\n        <Row marginBottom={1} flexWrap={false}>\n          <div className={style[upperState]} />\n          <Column justify=\"center\" marginRight={1} className={style.state}>\n            <SelectDropdown\n              selected={upperState}\n              options={[\n                {\n                  value: 'warning',\n                  label: formatMessage('universal.statusIndicators.warning'),\n                },\n                {\n                  value: 'positive',\n                  label: formatMessage('universal.statusIndicators.success'),\n                },\n              ]}\n              onChange={onChangeUpperState}\n            />\n          </Column>\n          <Column justify=\"center\" marginRight={1}>\n            {renderInput(\n              format,\n              'upper',\n              this.state.upperValue,\n              onChangeUpperValue,\n              smallestInputUnit,\n            )}\n          </Column>\n          <Column justify=\"center\" className={style.thresholdType}>\n            <FormattedMessage id=\"universal.statusIndicators.orAbove\" />\n          </Column>\n        </Row>\n        <Row flexWrap={false}>\n          <div className={style[lowerState]} />\n          <Column justify=\"center\" marginRight={1} className={style.state}>\n            <span className={style.stateLabel}>\n              <FormattedMessage id={STATE_LABELS[lowerState]} />\n            </span>\n          </Column>\n          <Column justify=\"center\" marginRight={1}>\n            {renderInput(\n              format,\n              'lower',\n              this.state.lowerValue,\n              onChangeLowerValue,\n              smallestInputUnit,\n            )}\n          </Column>\n          <Column justify=\"center\" className={style.thresholdType}>\n            <FormattedMessage id=\"universal.statusIndicators.orBelow\" />\n          </Column>\n        </Row>\n      </div>\n    );\n  }\n}\n\nStatusIndicatorsFormComponent.defaultProps = {\n  smallestInputUnit: 'seconds',\n};\n\nStatusIndicatorsFormComponent.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  format: PropTypes.string,\n  indicators: PropTypes.shape({\n    _currentUpperState: PropTypes.string,\n    thresholds: PropTypes.array,\n  }),\n  renderInput: PropTypes.func,\n  smallestInputUnit: PropTypes.string,\n};\nexport {\n  StatusIndicatorsFormComponent as default,\n  transformFormStateToThresholds,\n  transformThresholdsToFormState,\n};\n","import StatusIndicatorsFormComponent, {\n  transformFormStateToThresholds,\n  transformThresholdsToFormState,\n} from './status-indicators-form-component';\nexport {\n  StatusIndicatorsFormComponent as default,\n  transformFormStateToThresholds,\n  transformThresholdsToFormState,\n};\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport Link from '../link';\n\nimport style from './error-style.scss';\n\nexport const SALESFORCE_API_ACCESS_HELP_LINK =\n  'https://support.geckoboard.com/hc/en-us/articles/216804218#connect';\nexport const SALESFORCE_API_LIMIT_REACHED_HELP_LINK =\n  'https://support.geckoboard.com/hc/en-us/articles/216804218';\nexport const MORE_INFO_ARTICLE = 'Learn more';\n\nclass ErrorComponent extends Component {\n  renderErrorLink() {\n    const { errorLink, errorLinkText, onErrorLinkClick } = this.props;\n\n    if (!errorLink && !onErrorLinkClick) return null;\n\n    return (\n      <Link href={errorLink} onClick={onErrorLinkClick}>\n        {errorLinkText}\n      </Link>\n    );\n  }\n\n  render() {\n    const { errorMessage, className } = this.props;\n\n    if (!errorMessage) return null;\n\n    const classes = classNames(style.error, className);\n\n    if (errorMessage.indexOf('account or edition of Salesforce') !== -1) {\n      return (\n        <div className={classes}>\n          {errorMessage}{' '}\n          <Link href={SALESFORCE_API_ACCESS_HELP_LINK}>\n            {MORE_INFO_ARTICLE}\n          </Link>\n        </div>\n      );\n    }\n\n    if (\n      errorMessage.indexOf(\n        'Salesforce daily API request limit has been reached',\n      ) !== -1\n    ) {\n      return (\n        <div className={classes}>\n          {errorMessage}{' '}\n          <Link href={SALESFORCE_API_LIMIT_REACHED_HELP_LINK}>\n            {MORE_INFO_ARTICLE}\n          </Link>\n        </div>\n      );\n    }\n\n    return (\n      <div className={classes}>\n        {errorMessage} {this.renderErrorLink()}\n      </div>\n    );\n  }\n}\n\nErrorComponent.propTypes = {\n  className: PropTypes.string,\n  errorLink: PropTypes.string,\n  errorLinkText: PropTypes.string,\n  errorMessage: PropTypes.string,\n  onErrorLinkClick: PropTypes.func,\n};\n\nexport default ErrorComponent;\n","import ErrorComponent from './error-component';\nexport default ErrorComponent;\n","import createAction from '../../../lib/redux/create-action';\nimport { GRID_ROWS, GRID_COLUMNS } from '../container-layout-constants';\nimport {\n  getSections,\n  isIntersecting,\n  isContainedBy,\n} from '../container-layout-helpers';\nimport * as instrumentMenuActions from '../../../instrument-menu/actions/instrument-menu-actions';\nimport { chain, isEqual } from 'lodash';\n\nexport const DASHBOARD_AREA = {\n  rowStart: 1,\n  columnStart: 1,\n  rowSpan: GRID_ROWS,\n  columnSpan: GRID_COLUMNS,\n};\n\nexport const resizeContainerStart = createAction(\n  'ContainerLayout:RESIZE_CONTAINER_START',\n);\nexport const resizeContainerEnd = createAction(\n  'ContainerLayout:RESIZE_CONTAINER_END',\n);\nexport const setEmptySpaces = createAction('ContainerLayout:SET_EMPTY_SPACES');\nexport const removeEmptySpaces = createAction(\n  'ContainerLayout:REMOVE_EMPTY_SPACES',\n);\nexport const setSelectedContainer = createAction(\n  'ContainerLayout:SET_SELECTED_CONTAINER',\n);\nexport const deselectContainer = createAction(\n  'ContainerLayout: DESELECT_CONTAINER',\n);\n\nexport const deselectAll = () => dispatch => {\n  dispatch(deselectContainer());\n  dispatch(instrumentMenuActions.closeMenu());\n};\n\nexport const getEmptySpaces = containers => {\n  if (!containers.length) {\n    return [DASHBOARD_AREA];\n  }\n\n  let emptySpaces = [DASHBOARD_AREA];\n\n  containers.forEach(container => {\n    emptySpaces = chain(emptySpaces)\n      .reduce((accumulatedSpaces, space, index) => {\n        const isOverlapping = isIntersecting(space, container.area);\n\n        if (!isOverlapping) {\n          return accumulatedSpaces;\n        }\n\n        // Remove the space that the container is intersecting with and\n        // create new empty spaces around the container.\n        accumulatedSpaces[index] = null;\n        const sections = getSections(space, container.area);\n        return [...accumulatedSpaces, ...sections];\n      }, emptySpaces)\n      .filter(space => space !== null)\n      .uniqWith(isEqual)\n      .value();\n  });\n\n  const filteredEmptySpaces = emptySpaces.filter((emptySpace, index) => {\n    return chain(emptySpaces)\n      .map((comparisonSpace, comparisonIndex) => {\n        // prevents comparing a space to itself\n        if (index === comparisonIndex) {\n          return false;\n        }\n\n        return isContainedBy(comparisonSpace, emptySpace);\n      })\n      .every(spaceToKeep => spaceToKeep === false)\n      .value();\n  });\n\n  return filteredEmptySpaces;\n};\n\nexport const selectContainer = containerId => (dispatch, getState) => {\n  const { selectedContainer } = getState().containerLayout;\n  if (containerId === selectedContainer) {\n    return;\n  }\n  dispatch(setSelectedContainer(containerId));\n};\n\nexport const moveContainerStart = (containerId, containers) => (\n  dispatch,\n  getState,\n) => {\n  const { selectedContainer } = getState().containerLayout;\n\n  if (containerId !== selectedContainer) {\n    dispatch(deselectContainer());\n  }\n\n  const emptySpaces = getEmptySpaces(containers);\n  dispatch(setEmptySpaces(emptySpaces));\n};\n\nexport const moveFrameStart = (_, containers) => dispatch => {\n  const emptySpaces = getEmptySpaces(containers);\n  dispatch(setEmptySpaces(emptySpaces));\n};\n","import { merge } from 'lodash';\nimport { hasDisabledSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'column',\n    hasHeader: true,\n  };\n};\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst MAX_SERIES = 3;\n\nconst configMappingRules = {\n  line: [\n    ['series', value => value.slice(0, MAX_SERIES)],\n    'goal',\n    'reverseGoalDirection',\n    'xAxis',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n    'dataRange',\n  ],\n  text: [['value', (value, series) => series || [value], 'series']],\n  number: [\n    ['value', (value, series) => series || [value], 'series'],\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  leaderboard: [\n    [\n      'values',\n      (newValue, lastValue = []) =>\n        newValue ? merge(lastValue, [newValue]) : undefined,\n      'series',\n    ],\n    ['labels', null, 'xAxis'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  geckometer: [\n    [\n      'value',\n      (newValue, lastValue = []) => merge(lastValue, [newValue]),\n      'series',\n    ],\n    'numberFormat',\n  ],\n  bar: [\n    'xAxis',\n    ['series', (newValue, lastValue = []) => merge(lastValue, newValue)],\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  table: [\n    ['columns', ([value] = []) => value, 'xAxis'],\n    ['columns', ([, ...value]) => value.slice(0, MAX_SERIES - 1), 'series'],\n    'hasHeader',\n    'dataRange',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n  MAX_SERIES,\n};\n","import { universal as universalTransformer } from '../../universal/transformers';\nimport { mergeQueryResults } from '../../universal/lib/queries-universal';\nimport { arrangeConfig } from './config-helpers';\n\nexport const transformData = (queries, queryResults, config, timezone) => {\n  const { type: vizType } = config;\n\n  return universalTransformer[vizType].transform(\n    mergeQueryResults(queries, queryResults, vizType),\n    { ...arrangeConfig(config), queries },\n    timezone,\n  );\n};\n","import servicePicker from '../../services/service-picker';\nimport * as pickerActions from '../../file-picker/actions/picker-actions';\n\nexport const fileFetchSuccessful = files =>\n  pickerActions.fetchFilesSuccess({ files });\n\nexport const fileFetchFailed = error =>\n  pickerActions.fetchFilesFailed(error, {\n    message: error.message,\n    isServiceAccountExpired: 'ErrOAuthTokenExpiredOrInvalid' === error.type,\n  });\n\nconst fetchFiles = (serviceName, opts) => async dispatch => {\n  try {\n    const files = await servicePicker(serviceName).fetchList(serviceName, opts);\n    dispatch(fileFetchSuccessful(files));\n  } catch (error) {\n    dispatch(fileFetchFailed(error));\n  }\n};\n\nexport default fetchFiles;\n","import createAction from '../../lib/redux/create-action';\n\nexport const hydrate = createAction('DynamicConfig:HYDRATE');\nexport const update = createAction('DynamicConfig:UPDATE');\nexport const clear = createAction('DynamicConfig:CLEAR');\nexport const save = createAction('DynamicConfig:SAVE');\n\nexport const focusInput = createAction('DynamicConfig:FOCUS_INPUT');\nexport const setValue = createAction('DynamicConfig:SET_VALUE');\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { getPlans, getDevices } from '../../services/management-service';\nimport { collectPurchasedAddons, getDefaultAddons } from '../lib/plan-helpers';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport { setDevices } from '../../manage-screens/actions/manage-screens-actions';\n\n// Actions\nexport const cancel = createAction('Account:CANCEL');\nexport const selectPlan = createAction('Account:SELECT_PLAN');\nexport const selectAddon = createAction('Account:SELECT_ADDON');\nexport const setPaymentInterval = createAction('Account:SET_PAYMENT_INTERVAL');\n\nexport const initialisePlansStart = createAction(\n  'Account:INITIALISE_PLANS_START',\n);\nexport const initialisePlansSuccess = createAction(\n  'Account:INITIALISE_PLANS_SUCCESS',\n);\nexport const initialisePlansFailed = createErrorAction(\n  'Account:INITIALISE_PLANS_FAILED',\n);\n\n// Thunk Actions\nexport const initialisePlans = (\n  orgId,\n  usage,\n  currentPlan,\n  fetchDevices,\n) => async dispatch => {\n  dispatch(initialisePlansStart());\n\n  try {\n    if (fetchDevices) {\n      const devices = await getDevices();\n      dispatch(setDevices(devices));\n    }\n    const plans = await getPlans(orgId);\n    let selectedAddons = {};\n\n    if (currentPlan) {\n      selectedAddons = collectPurchasedAddons(currentPlan);\n    }\n\n    plans.forEach(plan => {\n      const { id } = plan;\n\n      // when there is no addon for the plan choose a sensible default\n      if (!selectedAddons[id]) {\n        selectedAddons[id] = getDefaultAddons(plan, usage);\n      }\n    });\n\n    dispatch(initialisePlansSuccess({ plans, selectedAddons }));\n  } catch (error) {\n    dispatch(initialisePlansFailed(error));\n    dispatchToGeckoJS('plan:error', { error });\n  }\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---3sW1X\",\"iconWrapper\":\"iconWrapper---2_IY6\",\"icon\":\"icon---1ES2i\",\"iconSecondary\":\"iconSecondary---27NTt\",\"mainImage\":\"mainImage---1kjL4\",\"mainColumn\":\"mainColumn---1A-rl\",\"main\":\"main---239EW\",\"secondary\":\"secondary---2Ckon\",\"divider\":\"divider---39hj8\",\"medium\":\"medium---3vnDD\",\"large\":\"large---30X2e\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"offlineBanner\":\"offlineBanner---2wS6w\",\"title\":\"title---NodRY\",\"contentWrapper\":\"contentWrapper---3pGeE\",\"content\":\"content---1SKA9\",\"isOffline\":\"isOffline---1aCdL\",\"footerWrapper\":\"footerWrapper---LObOl\",\"footer\":\"footer---315CW\",\"footerInner\":\"footerInner---2hqae\",\"dashboardTitle\":\"dashboardTitle---3on5N\",\"menu\":\"menu---1Whzl\",\"emptyDashboard\":\"emptyDashboard---3bny0\",\"emptyContent\":\"emptyContent---BQ4V8\",\"reconnectButton\":\"reconnectButton---39x0U\",\"switchToDesktop\":\"switchToDesktop---SEUSg\",\"switchToDesktopButton\":\"switchToDesktopButton---29G2A\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---6nFRh\",\"inputWrapper\":\"inputWrapper---34Yfg\",\"small\":\"small---2RHNE\",\"error\":\"error---3bnua\",\"input\":\"input---1iAdz\",\"container\":\"container---m7cHB\",\"itemsContainer\":\"itemsContainer---2IPXQ\",\"containerOpen\":\"containerOpen---PupHf\",\"item\":\"item---1jRPy\",\"highlighted\":\"highlighted---2CRtr\",\"userTypedValue\":\"userTypedValue---3piWe\",\"itemHighlighted\":\"itemHighlighted---olzSX\",\"noResults\":\"noResults---35_-Y\",\"tag\":\"tag---5-PKJ\",\"removeTag\":\"removeTag---2-ZFw\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classnames from 'classnames';\n\nimport style from './inline-settings-style.scss';\n\nclass InlineSettingsComponent extends Component {\n  render() {\n    const { label, labelMargin, layoutClassName, children } = this.props;\n    const classes = classnames(layoutClassName, style.inlineSettings);\n\n    return (\n      <div className={classes}>\n        {!!label && (\n          <div\n            className={style.label}\n            style={{ marginRight: `${labelMargin}em` }}\n          >\n            {label}\n          </div>\n        )}\n        {children}\n      </div>\n    );\n  }\n}\n\nInlineSettingsComponent.defaultProps = {\n  labelMargin: 0,\n};\n\nInlineSettingsComponent.propTypes = {\n  children: PropTypes.node,\n  label: PropTypes.node,\n  labelMargin: PropTypes.number,\n  layoutClassName: PropTypes.string,\n};\n\nexport default InlineSettingsComponent;\n","import InlineSettingsComponent from './inline-settings-component';\nexport default InlineSettingsComponent;\n","import { greedilyParseFloat } from '../../spreadsheet-helpers';\nimport { chain, map, isMatch, head, isNull, negate } from 'lodash';\nimport { isDatetime, isNumber, getSelectionFormat } from './helpers';\n\nconst isNotNull = negate(isNull);\n// Helpers common to visualisations like the line and bar chart\n\nfunction getLabelsType(selection) {\n  if (isDatetime(selection)) {\n    return 'datetime';\n  }\n\n  if (isNumber(selection)) {\n    return 'number';\n  }\n\n  return 'standard';\n}\n\nfunction getDefaultLegendName(id) {\n  const alpha = String.fromCharCode(65 + id);\n  return `Series ${alpha}`;\n}\n\nfunction isFirstCellHeader(firstCell, indexHeader) {\n  if (!indexHeader || isNull(firstCell)) {\n    return true; // Free Range selection always first cell as header\n  }\n  return isMatch(firstCell, indexHeader);\n}\n\nfunction getSeriesName(firstCell = {}, id, labels, hasFirstCellHeader) {\n  if (labels && labels[id]) {\n    return labels[id];\n  }\n\n  if (hasFirstCellHeader && firstCell && firstCell.value) {\n    return firstCell.value;\n  }\n\n  return getDefaultLegendName(id);\n}\n\nfunction getSeriesValues(cells) {\n  return cells.map(cell => {\n    if (!cell) return null;\n\n    return greedilyParseFloat(cell.value);\n  });\n}\n\nfunction getSeries(allSelectedCells, headerIndices, labels) {\n  return chain(allSelectedCells)\n    .zip(headerIndices)\n    .map(([cells, headerIndex], id) => {\n      const firstCell = head(cells);\n\n      const hasFirstCellHeader =\n        headerIndices && isFirstCellHeader(firstCell, headerIndex);\n\n      const targetCells = hasFirstCellHeader ? cells.slice(1) : cells;\n      const [type, currency] = getSelectionFormat(\n        targetCells.filter(isNotNull),\n      );\n      const data = getSeriesValues(targetCells);\n      const name = getSeriesName(firstCell, id, labels, hasFirstCellHeader);\n\n      return { name, data, type, currency };\n    })\n    .filter(series => !series.data.every(Number.isNaN)) // Skip a series if every value is a non-number\n    .map(series => {\n      let { data } = series;\n\n      data = data.map(value => (Number.isNaN(value) ? null : value)); // If there is a non-number replace it with null to signal skipping this in the visualisation\n\n      return { ...series, data };\n    })\n    .value();\n}\n\nfunction getLabels(selectedCells, headerIndices) {\n  const hasFirstCellHeader =\n    headerIndices && isFirstCellHeader(head(selectedCells), headerIndices);\n\n  const labelCells = hasFirstCellHeader\n    ? selectedCells.slice(1)\n    : selectedCells;\n  const type = getLabelsType(labelCells);\n  const labels = map(labelCells, 'value');\n\n  return { labels, type };\n}\n\nexport { getSeries, getLabels };\n","import { pick } from 'lodash';\n\nfunction transform(data, config = {}, timezone, context = {}) {\n  return { ...context, ...pick(config, 'numberFormat') };\n}\n\nexport { transform };\n","import { reduce, cloneDeep } from 'lodash';\n\nconst composeTransformers = (...transformers) => (\n  data,\n  config,\n  timezone,\n  initialContext = {},\n) => {\n  return reduce(\n    transformers,\n    (context, transformer) => transformer(data, config, timezone, context),\n    cloneDeep(initialContext),\n  );\n};\n\nconst composeApplyConfigTransformers = (...transformers) => (\n  data,\n  config,\n  timezone,\n) =>\n  reduce(\n    transformers,\n    (context, transformer) => transformer(data, config, timezone, context),\n    cloneDeep(data),\n  );\n\nexport { composeTransformers, composeApplyConfigTransformers };\n","/* eslint camelcase:0 */\nimport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n} from '../../spreadsheet-helpers';\nimport { omit, isEmpty, isNil } from 'lodash';\nimport { getSelectionFormat, getMixedInputValue } from './helpers';\nimport { getSeries, getLabels } from './series-helpers';\nimport { transform as numberFormatTransform } from '../shared/number-format';\nimport { composeTransformers } from '../compose-transformers';\n\nconst barTransform = (spreadsheet, config, timezone, initialContext = {}) => {\n  const context = {};\n  const {\n    hasHeader,\n    xAxis,\n    series = [],\n    goal,\n    reverseGoalDirection,\n    legends,\n  } = config;\n\n  if (!xAxis) {\n    return context;\n  }\n\n  const { cells } = spreadsheet;\n  const seriesCells = getSelectedCells(cells, series);\n  const [xAxisCells] = getSelectedCells(cells, [xAxis]);\n  let format, unit, headerXAxisIndices, headerSeriesIndices;\n\n  if (xAxisCells.length) {\n    // We have labels at least\n    if (hasHeader) {\n      const selections = [xAxis, ...series];\n      const selectedCells = [xAxisCells, ...seriesCells];\n\n      [headerXAxisIndices, ...headerSeriesIndices] = getSelectionHeaderIndices(\n        selections,\n        selectedCells,\n      );\n    }\n\n    const seriesOfSelection = getSeries(\n      seriesCells,\n      headerSeriesIndices,\n      legends,\n    );\n    [format, unit] = getSelectionFormat(seriesOfSelection);\n\n    let seriesValues = seriesOfSelection.map(line =>\n      omit(line, 'type', 'currency'),\n    );\n\n    if (isEmpty(seriesValues)) {\n      // If no series has been selected we would still like to render the chart for the config page\n      // We can do this by passing fake values for the series down\n      const name = 'Series A';\n      const data = [];\n      xAxisCells.forEach(() => data.push(0));\n      seriesValues = hasHeader ? [{ name, data }] : [{ data }];\n    } else {\n      // We also need to ensure that the data array within each series object does not contain only null values\n      // This occurence can happen if a user selects a Series then clears the input\n      seriesValues = seriesValues.map(seriesObj => {\n        const { name } = seriesObj;\n        let { data } = seriesObj;\n\n        // Here we are checking that if every element in the array is null, if so we pass down fake values for the series\n        if (data.every(element => isNil(element))) {\n          data = [];\n          xAxisCells.forEach(() => data.push(0));\n        }\n\n        return { name, data };\n      });\n    }\n\n    context.x_axis = getLabels(xAxisCells, headerXAxisIndices);\n    context.series = seriesValues;\n    context.y_axis = { format, unit };\n\n    // Bar does not currently support anything but date time formatting on the x-axis\n    if ('datetime' !== context.x_axis.type) {\n      context.x_axis.type = 'standard';\n    }\n  }\n\n  context.threshold = getMixedInputValue(cells, goal, format);\n  context.reverseGoalDirection = reverseGoalDirection;\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(barTransform, numberFormatTransform);\n\nexport { transform };\n","/* eslint camelcase:0 */\nimport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n} from '../../spreadsheet-helpers';\nimport {\n  isUndefined,\n  isNil,\n  omit,\n  partial,\n  zipWith,\n  defaultTo,\n  isEmpty,\n} from 'lodash';\nimport { getSelectionFormat, getMixedInputValue } from './helpers';\nimport { getSeries, getLabels } from './series-helpers';\nimport { transform as numberFormatTransform } from '../shared/number-format';\nimport { composeTransformers } from '../compose-transformers';\n\nconst getStartOfSelection = selection => {\n  let [[startCol, startRow]] = selection;\n  if (startCol === -1) {\n    startCol = 0;\n  }\n  if (startRow === -1) {\n    startRow = 0;\n  }\n\n  return [startCol + 1, startRow + 1];\n};\nconst indexXAxis = (cells, selection) => {\n  const [startCol, startRow] = getStartOfSelection(selection);\n\n  return cells.map(cell => cell.column - startCol + cell.row - startRow);\n};\nconst indexSeries = (cells, selection) => {\n  const [startCol, startRow] = getStartOfSelection(selection);\n\n  return cells.reduce((memo, cell) => {\n    memo[cell.column - startCol + cell.row - startRow] = cell;\n    return memo;\n  }, {});\n};\n// if the cell relative to the series headers is missing\n// they will not get included in the \"aligned series\"\n// as `indexXAxis` will not index the missing cell\n// and subsequently alignSeries won't include the headers,\n// so here we insert a cell at the indices calculated by\n// headerXAxisIndices\nconst padXAxis = (cells, indices) => {\n  let padding = [];\n  if (!isUndefined(indices)) {\n    const head = cells[0];\n    if (head.row !== indices.row || head.column !== indices.column) {\n      padding = [indices];\n    }\n  }\n  return [...padding, ...cells];\n};\nconst alignSeries = (indexedXAxis, indexedSeries) => {\n  return indexedSeries.map(series => {\n    return indexedXAxis.map(index => series[index] || null);\n  });\n};\nconst scatterPoints = (labels, { name, data: series }) => {\n  // All undefined values should be changed to null, for Tabloid to validate\n  const data = zipWith(labels, series, (label, value) => [\n    label,\n    defaultTo(value, null),\n  ]).slice(0, labels.length);\n\n  return { name, data };\n};\n\nconst lineTransform = (spreadsheet, config, timezone, initialContext = {}) => {\n  const context = {};\n  const {\n    hasHeader,\n    xAxis,\n    series = [],\n    goal,\n    legends,\n    reverseGoalDirection,\n    minYAxis,\n    maxYAxis,\n  } = config;\n\n  if (!xAxis) {\n    return context;\n  }\n\n  const { cells } = spreadsheet;\n  const seriesCells = getSelectedCells(cells, series);\n  const [xAxisCells] = getSelectedCells(cells, [xAxis]);\n  let format, unit, headerXAxisIndices, headerSeriesIndices;\n\n  if (xAxisCells.length) {\n    // We have labels at least\n    if (hasHeader) {\n      const selections = [xAxis, ...series];\n      const selectedCells = [xAxisCells, ...seriesCells];\n\n      [headerXAxisIndices, ...headerSeriesIndices] = getSelectionHeaderIndices(\n        selections,\n        selectedCells,\n      );\n    }\n    // pad out the x axis if we're missing the cell relative to the series headers\n    const paddedXAxisCells = padXAxis(xAxisCells, headerXAxisIndices);\n    // Build an index from the cells we have found in our X-axis selection\n    const indexedXAxis = indexXAxis(paddedXAxisCells, xAxis);\n\n    // Build a corresponding index of our series cells\n    const indexedSeries = seriesCells.map((sCells, i) => {\n      return indexSeries(sCells, series[i]);\n    });\n\n    // Match our series up with our X-axis cells to create a correctly\n    // aligned array of series. This ensures that any missing values are\n    // filled with nulls\n    const alignedSeries = alignSeries(indexedXAxis, indexedSeries);\n    const seriesOfSelection = getSeries(\n      alignedSeries,\n      headerSeriesIndices,\n      legends,\n    );\n    const xAxisLabels = getLabels(xAxisCells, headerXAxisIndices);\n    let seriesValues = seriesOfSelection.map(line =>\n      omit(line, 'type', 'currency'),\n    );\n\n    if (isEmpty(seriesValues)) {\n      // If no series has been selected we would still like to render the chart for the config page\n      // We can do this by passing fake values for the series down\n      const name = 'Series A';\n      const data = [];\n      xAxisCells.forEach(() => data.push(0));\n      seriesValues = hasHeader ? [{ name, data }] : [{ data }];\n    } else {\n      // We also need to ensure that the data array within each series object does not contain only null values\n      // This occurence can happen if a user selects a Series then clears the input\n      seriesValues = seriesValues.map(seriesObj => {\n        const { name } = seriesObj;\n        let { data } = seriesObj;\n\n        // Here we are checking that if every element in the array is null, if so we pass down fake values for the series\n        if (data.every(element => isNil(element))) {\n          data = [];\n          xAxisCells.forEach(() => data.push(0));\n        }\n\n        return { name, data };\n      });\n    }\n\n    switch (xAxisLabels.type) {\n      case 'number':\n        const labels = xAxisLabels.labels.map(parseFloat);\n        context.series = seriesValues.map(partial(scatterPoints, labels));\n        context.x_axis = {};\n        break;\n\n      case 'datetime':\n        context.series = seriesValues.map(\n          partial(scatterPoints, xAxisLabels.labels),\n        );\n        context.x_axis = { type: 'datetime' };\n        break;\n\n      default:\n        context.series = seriesValues;\n        context.x_axis = xAxisLabels;\n    }\n\n    [format, unit] = getSelectionFormat(seriesOfSelection);\n    context.y_axis = { format, unit };\n  }\n\n  context.threshold = getMixedInputValue(cells, goal, format);\n  context.reverseGoalDirection = reverseGoalDirection;\n  context.minYAxis = getMixedInputValue(cells, minYAxis, format);\n  context.maxYAxis = getMixedInputValue(cells, maxYAxis, format);\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(lineTransform, numberFormatTransform);\n\nexport { transform };\n","import { isUndefined } from 'lodash';\n\nfunction transform(\n  payload,\n  { comparison } = {},\n  timezone,\n  initialContext = {},\n) {\n  const context = {};\n\n  if (!isUndefined(comparison)) {\n    context.comparison = comparison;\n  }\n\n  return { ...initialContext, ...context };\n}\n\nexport { transform };\n","import { getSelectedCells } from '../../spreadsheet-helpers';\nimport { isArray, chain, isEmpty, isFinite } from 'lodash';\n\nfunction transform(\n  { cells },\n  {\n    indicators: { thresholds: originalThresholds = [] } = {},\n    statusIndicator,\n  } = {},\n  __,\n  initialContext = {},\n) {\n  const context = { ...initialContext };\n  const { format } = initialContext;\n\n  const getValue = value => {\n    if (!isArray(value)) {\n      return value;\n    }\n\n    const formatPercent = format === 'percent' ? v => v * 100 : v => v;\n\n    return chain(cells)\n      .thru(cells => getSelectedCells(cells, [value])) // eslint-disable-line no-shadow\n      .head()\n      .map('value')\n      .last()\n      .thru(parseFloat)\n      .thru(formatPercent)\n      .value();\n  };\n\n  if (originalThresholds.length) {\n    const thresholds = originalThresholds.map(getValue);\n    context.indicators = {\n      thresholds,\n    };\n  }\n\n  if (statusIndicator) {\n    const mappedStatusIndicator = {};\n    const lowerThreshold = parseFloat(getValue(statusIndicator.lowerThreshold));\n    const upperThreshold = parseFloat(getValue(statusIndicator.upperThreshold));\n\n    if (isFinite(lowerThreshold)) {\n      mappedStatusIndicator.lowerThreshold = lowerThreshold;\n    }\n\n    if (isFinite(upperThreshold)) {\n      mappedStatusIndicator.upperThreshold = upperThreshold;\n    }\n\n    if (!isEmpty(mappedStatusIndicator)) {\n      mappedStatusIndicator.positiveDirection =\n        statusIndicator.positiveDirection;\n      context.statusIndicator = mappedStatusIndicator;\n    }\n  }\n\n  return context;\n}\n\nexport { transform };\n","import {\n  getSelectedCells,\n  greedilyParseFloat,\n} from '../../spreadsheet-helpers';\nimport { flatten, map, isArray, chain, isFinite, isString, last } from 'lodash';\nimport { getSelectionFormat } from './helpers';\nimport { transform as numberFormatTransform } from '../shared/number-format';\nimport { transform as comparisonTransform } from '../per-visualisation/number/comparison';\nimport { transform as statusIndicatorsTransform } from './status-indicators';\nimport { composeTransformers } from '../compose-transformers';\n\nconst getNumberSeriesValues = (allCells, selection) => {\n  const [cells] = getSelectedCells(allCells, [selection]) || [[]];\n  const values = map(cells, 'value').map(greedilyParseFloat);\n\n  return { cells, values };\n};\n\nconst getNumberValue = (cells, value, format) => {\n  let v = value;\n  if (isArray(v)) {\n    v = chain(cells)\n      .thru(cells => getSelectedCells(cells, [v])) // eslint-disable-line no-shadow\n      .head()\n      .map('value')\n      .last()\n      .value();\n  }\n\n  if (isString(v)) {\n    v = parseFloat(v);\n  }\n\n  // Convert a typed goal to a percentage\n  if (format === 'percent' && !isArray(value)) {\n    v /= 100;\n  }\n\n  return v;\n};\n\nconst injectComparisonValues = (value, comparison, cells) => [\n  ...getNumberSeriesValues(cells, comparison.value).values,\n  last(value),\n];\n\nconst numberTransformV1 = (\n  { cells },\n  { value, goal, comparison = {}, progressIndicator },\n  timezone,\n  initialContext,\n) => {\n  const context = {};\n  let { cells: selectedCells, values: parsedValues } = getNumberSeriesValues(\n    cells,\n    value,\n  );\n  let format;\n  let unit;\n\n  // Omit the first value if we cant coerce it into a float\n  if (isNaN(parsedValues[0])) {\n    parsedValues = parsedValues.slice(1);\n    selectedCells = selectedCells.slice(1);\n  }\n\n  [format, unit] = getSelectionFormat(selectedCells);\n\n  // The number widget can't handle dates\n  if ('datetime' === format) {\n    format = 'decimal';\n  }\n\n  if (flatten(parsedValues).length) {\n    context.format = format;\n    context.unit = unit;\n    context.value = parsedValues;\n  }\n\n  const threshold = getNumberValue(cells, goal, format);\n  if (isFinite(threshold)) {\n    context.threshold = threshold;\n  }\n\n  const startingValue = getNumberValue(cells, comparison.startingValue, format);\n  if (isFinite(startingValue)) {\n    context.startingValue = startingValue;\n  }\n\n  // With the new number viz, we need to support the modern\n  // config format here as well as the old goal above.\n  if (progressIndicator) {\n    const targetValue = getNumberValue(\n      cells,\n      progressIndicator.targetValue,\n      format,\n    );\n\n    if (isFinite(targetValue)) {\n      const progressStartingValue =\n        getNumberValue(cells, progressIndicator.startingValue, format) || 0;\n\n      context.progressIndicator = {\n        startingValue: progressStartingValue,\n        targetValue,\n      };\n    }\n  }\n\n  if (isArray(comparison.value)) {\n    context.value = injectComparisonValues(\n      context.value,\n      comparison,\n      cells,\n      format,\n    );\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst numberTransform = (data, config, timezone, initialContext = {}) => {\n  return numberTransformV1(data, config, timezone, initialContext);\n};\n\nconst transform = composeTransformers(\n  numberTransform,\n  numberFormatTransform,\n  comparisonTransform,\n  statusIndicatorsTransform,\n);\n\nexport { transform };\n","import {\n  getSelectedCells,\n  greedilyParseFloat,\n  getSelectionHeaderIndices,\n  stableItemSort,\n} from '../../spreadsheet-helpers';\nimport { chain, zip, isFinite, isMatch, partialRight } from 'lodash';\nimport { transform as numberFormatTransform } from '../shared/number-format';\nimport { composeTransformers } from '../compose-transformers';\n\nconst toItem = ([{ value: label }, { value = '', type, currency } = {}]) => {\n  const parsedValue = greedilyParseFloat(value);\n  const item = { label };\n\n  if (isFinite(parsedValue)) {\n    item.value = parsedValue;\n  }\n\n  if (type === 'currency') {\n    item.unit = currency;\n    item.format = 'currency';\n  }\n\n  if (type === 'percentage') {\n    item.format = 'percent';\n  }\n\n  return item;\n};\n\nconst skipHeader = (hasHeader, indexHeader, firstCell) => {\n  if (!hasHeader) return false;\n  return indexHeader && isMatch(firstCell, indexHeader);\n};\n\nconst leaderboardTransform = (\n  { cells },\n  { values, labels, hasHeader, reverseSort },\n  timezone,\n  initialContext = {},\n) => {\n  if (!labels) {\n    return {};\n  }\n\n  const selected = getSelectedCells(cells, [labels, values]);\n  const headerIndices = getSelectionHeaderIndices([labels, values], selected);\n\n  const selectedWithoutHeader = chain(selected)\n    .zip(headerIndices)\n    // eslint-disable-next-line no-shadow\n    .map(([cells, headerIndex]) => {\n      const [firstCell, ...rest] = cells;\n      if (skipHeader(hasHeader, headerIndex, firstCell)) {\n        return rest;\n      }\n      return cells;\n    })\n    .value(); // Omit header cells\n\n  const items = chain(zip(...selectedWithoutHeader))\n    .filter(([label]) => !!label) // Remove items with no label\n    .map(toItem)\n    .thru(partialRight(stableItemSort, reverseSort))\n    .value();\n\n  return { ...initialContext, items };\n};\n\nconst transform = composeTransformers(\n  leaderboardTransform,\n  numberFormatTransform,\n);\n\nexport { transform };\n","import { getSelectedCells } from '../../spreadsheet-helpers';\nimport { isFinite, map, isUndefined } from 'lodash';\nimport {\n  getSelectionFormat,\n  getMixedInputValue,\n  getNumericCells,\n  getGeckometerValue,\n} from './helpers';\nimport { transform as numberFormatTransform } from '../shared/number-format';\nimport { transform as statusIndicatorsTransform } from './status-indicators';\nimport { composeTransformers } from '../compose-transformers';\n\nconst geckometerTransform = (data, config, timezone, initialContext = {}) => {\n  const { cells } = data;\n  const { value, goal, reverseGoalDirection, min = {}, max = {} } = config;\n\n  const item = getGeckometerValue(value, cells);\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const numericCells = getNumericCells(selectedCells);\n  const values = map(numericCells, 'value');\n  const [format, unit] = getSelectionFormat(numericCells);\n\n  if (!isFinite(item)) {\n    return {};\n  }\n\n  const threshold = getMixedInputValue(cells, goal, format);\n\n  let minValue = getMixedInputValue(cells, min.value, format);\n  if (isUndefined(minValue)) {\n    minValue = Math.min(...values);\n  }\n\n  let maxValue = getMixedInputValue(cells, max.value, format);\n  if (isUndefined(maxValue)) {\n    maxValue = Math.max(...values);\n  }\n\n  return {\n    ...initialContext,\n    item,\n    min: { value: minValue },\n    max: { value: maxValue },\n    threshold,\n    format,\n    unit,\n    reverseGoalDirection,\n  };\n};\n\nconst transform = composeTransformers(\n  geckometerTransform,\n  numberFormatTransform,\n  statusIndicatorsTransform,\n);\n\nexport { transform };\n","import { getSelectedCells } from '../../spreadsheet-helpers';\nimport { composeTransformers } from '../compose-transformers';\nimport { map } from 'lodash';\nimport { transform as textVisualisationTransform } from '../per-visualisation/text';\n\nconst textTransform = (\n  { cells },\n  { value, hasHeader },\n  timezone,\n  initialContext = {},\n) => {\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const values = map(selectedCells, 'value');\n\n  if (!values.length) {\n    return initialContext;\n  }\n\n  const context = {};\n\n  if (hasHeader) {\n    const [, ...rest] = values;\n    context.value = rest;\n  } else {\n    context.value = values;\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(\n  textTransform,\n  textVisualisationTransform,\n);\n\nexport { transform };\n","import { isUndefined } from 'lodash';\n\nfunction transform(payload, { isLoop } = {}, timezone, initialContext = {}) {\n  const context = {};\n\n  if (!isUndefined(isLoop)) {\n    context.isLoop = isLoop;\n  }\n\n  return { ...initialContext, ...context };\n}\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(numberFormatTransform);\n\nexport { transform };\n","import { composeTransformers } from '../compose-transformers';\nimport { transform as genericTableTransform } from '../per-visualisation/table';\nimport {\n  getSelectedCells,\n  getSelectionHeaderIndices,\n  greedilyParseFloat,\n} from '../../spreadsheet-helpers';\nimport { getSelectionFormat, isNumber } from './helpers';\nimport { chain, head, isMatch, times, constant } from 'lodash';\n\nconst MAX_LENGTH_OF_COLUMN = 50;\n\nconst getCellFormat = type => {\n  if (type === 'percentage') {\n    return 'percent';\n  }\n\n  if (type === 'number') {\n    return 'decimal';\n  }\n\n  return type;\n};\n\nconst getBestSelectionFormat = selections => {\n  const [format, unit] = getSelectionFormat(selections);\n\n  // Apply no format when the column is text or has mixed types\n  if (format === 'decimal' && !isNumber(selections)) {\n    return [];\n  }\n\n  return [format, unit];\n};\n\nconst mapCell = cell => {\n  if (!cell) return null;\n\n  const { type, value: rawValue, human, currency } = cell;\n  const cellType = getCellFormat(type);\n  let value;\n\n  switch (cellType) {\n    case 'decimal':\n    case 'percent':\n    case 'currency':\n      value = greedilyParseFloat(rawValue);\n      break;\n    default:\n      value = rawValue;\n  }\n\n  return {\n    type: cellType,\n    value,\n    human,\n    unit: currency,\n  };\n};\n\nconst mapHeading = ({ type, value, human } = {}) => {\n  const cellType = getCellFormat(type);\n  let heading;\n\n  switch (cellType) {\n    case 'decimal':\n      heading = `${parseFloat(value)}`;\n      break;\n    case 'percent':\n      heading = `${parseFloat(value) * 100}%`;\n      break;\n    case 'text':\n      heading = value;\n      break;\n    default:\n      heading = human;\n  }\n\n  return { heading };\n};\n\nconst hasCellHeader = (cells, headerIndices, headerIndex) => {\n  const firstCell = head(cells);\n  const isFirstCellHeader = !headerIndex\n    ? true\n    : isMatch(firstCell, headerIndex);\n\n  return headerIndices && isFirstCellHeader;\n};\n\nconst tableTransform = (spreadsheet, config, timezone, initialContext = {}) => {\n  const context = {};\n  const { columns = [], hasHeader } = config;\n\n  if (!columns.length) {\n    return context;\n  }\n\n  const { cells } = spreadsheet;\n  const columnsCells = getSelectedCells(cells, columns);\n  let headerIndices;\n\n  if (hasHeader) {\n    headerIndices = getSelectionHeaderIndices(columns, columnsCells);\n  }\n\n  const [headingCells = [], dataCells] = chain(columnsCells)\n    .zip(headerIndices)\n    .map(([columnCells, headerIndex]) => {\n      const hasFirstCellHeader = hasCellHeader(\n        columnCells,\n        headerIndices,\n        headerIndex,\n      );\n\n      if (!hasFirstCellHeader) {\n        return [undefined, columnCells];\n      }\n\n      const [heading, ...rest] = columnCells;\n      return [heading, rest];\n    })\n    .reject(([heading, rest]) => {\n      // Remove the whole column if there is no heading and if there are no values.\n      // But the column is kept if a heading is set\n      return !heading && !rest.length;\n    })\n    .unzip()\n    .value();\n\n  // +1 when we're slicing off the header cell\n  const headerOffset = hasHeader ? 1 : 0;\n\n  // as empty cells won't appear amongst selected cells we need\n  // to compensate by filling in the gaps based on the \"coordinates\"\n  // of a given cell in a series\n  const fillEmptyCells = (colCells, i) => {\n    let [[startCol, startRow]] = columns[i];\n    if (startCol < 0) startCol = 0;\n    if (startRow < 0) startRow = 0;\n\n    // When calculating a given cells index in the 'series' we need to calculate an\n    // offset from our header cells if we have them or from the beginning of the selection failing that\n    // so we can insert the cells at the correct index in the new 'filled' series\n    const offset = (headerIndices && headerIndices[i]) || {\n      column: startCol + 1,\n      row: startRow + 1,\n    };\n\n    return colCells.reduce((memo, cell) => {\n      // if we already have a column that is of max length\n      // then we should not add any more items to it\n      if (memo.length === MAX_LENGTH_OF_COLUMN) {\n        return memo;\n      }\n      // calculate the index to use in the memo'd array\n      const index =\n        cell.row - offset.row + cell.column - offset.column - headerOffset;\n\n      // if the index would lie outside of the maximum length for a column\n      // then we don't add the cell and just fill up empty values until\n      // the max length\n      if (index >= MAX_LENGTH_OF_COLUMN) {\n        const fillToEndCount = MAX_LENGTH_OF_COLUMN - memo.length;\n        return [...memo, ...times(fillToEndCount, constant(null))];\n      }\n      // calculate how empty cells we've missed in the memo'd array\n      const missingCount = index - memo.length;\n\n      // fill in the empty cells with null values\n      return [...memo, ...times(missingCount, constant(null)), cell];\n    }, []);\n  };\n\n  const rows = chain(dataCells)\n    .map(fillEmptyCells)\n    .map(column => column.map(mapCell))\n    .unzip()\n    .value();\n\n  const columnConfig = chain(dataCells)\n    .map(getBestSelectionFormat)\n    .map(([format, unit]) => ({ format, unit }))\n    .merge(headingCells.map(mapHeading))\n    .value();\n\n  if (columnConfig.length) {\n    context.columns = columnConfig;\n  }\n\n  context.data = rows;\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(tableTransform, genericTableTransform);\n\nexport { transform, MAX_LENGTH_OF_COLUMN };\n","import { isUndefined, has } from 'lodash';\nimport { parseNumberBasedOnFormat } from '../../lib/parse-number';\n\nfunction transform(\n  payload,\n  { goal, comparison, reverseGoalDirection } = {},\n  timezone,\n  initialContext = {},\n) {\n  const newContext = {};\n\n  const { format } = initialContext;\n\n  if (!isUndefined(goal)) {\n    newContext.threshold = parseNumberBasedOnFormat(goal, format);\n  }\n\n  if (\n    has(comparison, 'startingValue') &&\n    !isUndefined(comparison.startingValue)\n  ) {\n    newContext.startingValue = parseNumberBasedOnFormat(\n      comparison.startingValue.toString(),\n      format,\n    );\n  }\n\n  if (!isUndefined(reverseGoalDirection)) {\n    newContext.reverseGoalDirection = reverseGoalDirection;\n  }\n\n  return { ...initialContext, ...newContext };\n}\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { transform as goalTransform } from '../../shared/goal';\nimport { transform as yAxisMinMaxTransform } from './yaxisminmax';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(\n  numberFormatTransform,\n  goalTransform,\n  yAxisMinMaxTransform,\n);\n\nexport { transform };\n","import { isUndefined } from 'lodash';\nimport { parseNumberBasedOnFormat } from '../../../lib/parse-number';\n\nfunction transform(\n  payload,\n  { minYAxis, maxYAxis } = {},\n  timezone,\n  initialContext = {},\n) {\n  const { format } = initialContext;\n  const context = {};\n\n  if (!isUndefined(minYAxis)) {\n    context.minYAxis = parseNumberBasedOnFormat(minYAxis, format);\n  }\n\n  if (!isUndefined(maxYAxis)) {\n    context.maxYAxis = parseNumberBasedOnFormat(maxYAxis, format);\n  }\n\n  return { ...initialContext, ...context };\n}\n\nexport { transform };\n","/* eslint camelcase:0 */\nimport { zip, partial } from 'lodash';\nimport {\n  getSeries,\n  getXLabels,\n  getYAxisFormat,\n  destructureSalesforceConfigWrap,\n} from './helpers';\nimport { transform as genericLineTransform } from '../per-visualisation/line';\nimport { composeTransformers } from '../compose-transformers';\n\nconst scatterPoints = (labels, { name, data: series }) => {\n  const data = zip(labels, series).slice(0, labels.length);\n  return { name, data };\n};\n\nconst lineTransform = (pegasusPayload, timezone, initialContext = {}) => {\n  const {\n    axis_metadata: axisMetadata,\n    x_labels: xLabels,\n    series,\n  } = pegasusPayload;\n\n  if (!xLabels || !xLabels.length) {\n    return {};\n  }\n\n  const context = {};\n  const xAxisLabels = getXLabels(axisMetadata.x_type, xLabels);\n  const seriesValues = getSeries(series);\n  const [format, unit] = getYAxisFormat(\n    axisMetadata.y_type,\n    axisMetadata.y_unit,\n  );\n\n  context.format = format;\n  context.y_axis = { format, unit };\n\n  switch (xAxisLabels.type) {\n    case 'number':\n      const labels = xAxisLabels.labels.map(parseFloat);\n      context.series = seriesValues.map(partial(scatterPoints, labels));\n      context.x_axis = {};\n      break;\n\n    case 'datetime':\n      context.series = seriesValues.map(\n        partial(scatterPoints, xAxisLabels.labels),\n      );\n      context.x_axis = { type: 'datetime' };\n      break;\n\n    default:\n      context.series = seriesValues;\n      context.x_axis = xAxisLabels;\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = destructureSalesforceConfigWrap(\n  composeTransformers(lineTransform, genericLineTransform),\n);\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { transform as goalTransform } from '../../shared/goal';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(numberFormatTransform, goalTransform);\n\nexport { transform };\n","import {\n  getSeries,\n  getXLabels,\n  getYAxisFormat,\n  destructureSalesforceConfigWrap,\n} from './helpers';\nimport { transform as genericBarTransform } from '../per-visualisation/bar';\nimport { composeTransformers } from '../compose-transformers';\n\nconst barTransform = (pegasusPayload, timezone, initialContext = {}) => {\n  const {\n    axis_metadata: axisMetadata = {},\n    x_labels: xLabels,\n    series = [],\n  } = pegasusPayload;\n\n  if (!xLabels || !xLabels.length) {\n    return {};\n  }\n\n  const context = {};\n  const xAxisLabels = getXLabels(axisMetadata.x_type, xLabels);\n  const seriesValues = getSeries(series);\n  const [format, unit] = getYAxisFormat(\n    axisMetadata.y_type,\n    axisMetadata.y_unit,\n  );\n\n  context.series = seriesValues;\n  context.format = format;\n  context.x_axis = xAxisLabels;\n  context.y_axis = { format, unit };\n\n  // Bar does not currently support anything but date time formatting on the x-axis\n  if ('datetime' !== xAxisLabels.type) {\n    context.x_axis.type = 'standard';\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = destructureSalesforceConfigWrap(\n  composeTransformers(barTransform, genericBarTransform),\n);\n\nexport { transform };\n","import { limitSeriesTransformWrap } from './helpers';\nimport { transform as lineTransform } from './line';\n\nconst transform = limitSeriesTransformWrap(3, lineTransform);\n\nexport { transform };\n","import { isFinite } from 'lodash';\n\nconst getValueBasedOnFormat = (value, format) => {\n  if (!isFinite(value)) {\n    return undefined;\n  }\n\n  if (format === 'percent') {\n    return value / 100;\n  }\n\n  return value;\n};\n\nfunction transform(\n  payload,\n  { progressIndicator } = {},\n  timezone,\n  initialContext = {},\n) {\n  const newContext = {};\n\n  if (progressIndicator) {\n    const { format } = initialContext;\n    const targetValue = getValueBasedOnFormat(\n      progressIndicator.targetValue,\n      format,\n    );\n\n    if (isFinite(targetValue)) {\n      const progressStartingValue = getValueBasedOnFormat(\n        progressIndicator.startingValue || 0,\n        format,\n      );\n\n      newContext.progressIndicator = {\n        startingValue: progressStartingValue,\n        targetValue,\n      };\n    }\n  }\n\n  return { ...initialContext, ...newContext };\n}\n\nexport { transform };\n","import { pick } from 'lodash';\n\nfunction transform(__, config = {}, ___, context = {}) {\n  return { ...context, ...pick(config, 'indicators') };\n}\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { transform as goalTransform } from '../../shared/goal';\nimport { transform as comparisonTransform } from './comparison';\nimport { transform as progressIndicator } from '../../shared/progress-indicator';\nimport { transform as statusIndicators } from '../../shared/status-indicators';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(\n  numberFormatTransform,\n  goalTransform,\n  comparisonTransform,\n  progressIndicator,\n  statusIndicators,\n);\n\nexport { transform };\n","import { getYAxisFormat, destructureSalesforceConfigWrap } from './helpers';\nimport { transform as genericNumberTransform } from '../per-visualisation/number';\nimport { composeTransformers } from '../compose-transformers';\n\nconst getYFormat = axisMetadata => {\n  const [format, unit] = getYAxisFormat(\n    axisMetadata.y_type,\n    axisMetadata.y_unit,\n  );\n\n  // The number widget can't handle dates\n  if ('datetime' === format) {\n    return ['decimal', unit];\n  }\n\n  return [format, unit];\n};\n\n/**\n * Salesforce number transformer\n * @param {Object} payload - Data that is returned from the backend (pegasus) for the number visualisation.\n * @param {number} payload.total - The total calculated from all the records.\n * @param {Object} payload.axis_metadata\n * @param {string} payload.axis_metadata.x_type\n * @param {string} payload.axis_metadata.y_type\n * @param {string} payload.axis_metadata.y_unit\n * @param {Object[]} payload.series\n * @param {Object} payload.series[]\n * @param {string} payload.series[].label\n * @param {Object[]} payload.series[].values\n * @param {number} payload.series[].total\n * @param {Object[]} payload.x_labels\n * @param {Object} payload.x_labels[]\n * @param {string} payload.x_labels[].label\n *\n * @param {Object} config - User configuration.\n * @param {string} config.numberToDisplay - Can be `latestRecord` or `grandTotal`.\n */\nconst numberTransform = (\n  payload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  const { numberToDisplay } = config;\n  const { total, axis_metadata: axisMetadata = {}, series = [] } = payload;\n\n  const [format, unit] = getYFormat(axisMetadata);\n  let value = [total];\n\n  if ('latestRecord' === numberToDisplay) {\n    if (!series.length) {\n      return {};\n    }\n    const [firstSeries] = series;\n    value = firstSeries.values;\n  }\n\n  return { ...initialContext, format, unit, value };\n};\n\nconst transform = destructureSalesforceConfigWrap(\n  composeTransformers(numberTransform, genericNumberTransform),\n);\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(numberFormatTransform);\n\nexport { transform };\n","import _ from 'lodash';\nimport { destructureSalesforceConfigWrap } from './helpers';\nimport { transform as genericLeaderboardTransform } from '../per-visualisation/leaderboard';\nimport { composeTransformers } from '../compose-transformers';\n\nconst xLabelToItem = (xLabel, index, values, axisMetadata) => {\n  const item = {\n    label: xLabel.label,\n    value: values[index],\n  };\n\n  if (axisMetadata.y_type === 'currency') {\n    item.unit = axisMetadata.y_unit;\n    item.format = 'currency';\n  }\n\n  if (axisMetadata.y_type === 'percentage') {\n    item.format = 'percent';\n  }\n\n  return item;\n};\n\nconst leaderboardTransform = (\n  { axis_metadata: axisMetadata, x_labels: xLabels, series },\n  { reverseSort } = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (\n    !axisMetadata ||\n    !xLabels ||\n    !series ||\n    xLabels.length < 1 ||\n    series.length < 1\n  ) {\n    return {};\n  }\n\n  const context = {};\n  const values = series[0].values;\n\n  const items = _.chain(xLabels)\n    .map((xLabel, index) => xLabelToItem(xLabel, index, values, axisMetadata))\n    .sort(({ value: a }, { value: b }) => b - a)\n    .value();\n\n  context.items = items;\n\n  if (reverseSort) {\n    context.items = context.items.reverse();\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = destructureSalesforceConfigWrap(\n  composeTransformers(leaderboardTransform, genericLeaderboardTransform),\n);\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { transform as goalTransform } from '../../shared/goal';\nimport { transform as minMaxTransform } from './minmax';\nimport { transform as statusIndicators } from '../../shared/status-indicators';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(\n  numberFormatTransform,\n  goalTransform,\n  minMaxTransform,\n  statusIndicators,\n);\n\nexport { transform };\n","import { isUndefined } from 'lodash';\nimport { parseNumberBasedOnFormat } from '../../../lib/parse-number';\n\nfunction transform(payload, { min, max } = {}, timezone, initialContext = {}) {\n  const { format } = initialContext;\n  const context = {};\n\n  if (!isUndefined(min)) {\n    const value =\n      typeof min !== 'string' ? min : parseNumberBasedOnFormat(min, format);\n\n    context.min = { value };\n  }\n\n  if (!isUndefined(max)) {\n    const value =\n      typeof max !== 'string' ? max : parseNumberBasedOnFormat(max, format);\n\n    context.max = { value };\n  }\n\n  return { ...initialContext, ...context };\n}\n\nexport { transform };\n","import { isUndefined } from 'lodash';\nimport {\n  getYAxisFormat,\n  getGeckometerValue,\n  destructureSalesforceConfigWrap,\n} from './helpers';\nimport { transform as genericGeckometerTransform } from '../per-visualisation/geckometer';\nimport { composeTransformers } from '../compose-transformers';\n\nconst geckometerTransform = (\n  pegasusPayload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  const {\n    total,\n    axis_metadata: axisMetadata = {},\n    series = [],\n  } = pegasusPayload;\n\n  const [dataFormat, unit] = getYAxisFormat(\n    axisMetadata.y_type,\n    axisMetadata.y_unit,\n  );\n\n  const format = 'datetime' === dataFormat ? 'decimal' : dataFormat; // Cannot handle date\n  const item = getGeckometerValue(config, total, series);\n\n  if (isUndefined(item)) {\n    return {};\n  }\n\n  return {\n    ...initialContext,\n    item,\n    format,\n    unit,\n  };\n};\n\nconst transform = destructureSalesforceConfigWrap(\n  composeTransformers(geckometerTransform, genericGeckometerTransform),\n);\n\nexport { transform };\n","import { merge } from 'lodash';\nimport { transform as genericTableTransform } from '../per-visualisation/table';\nimport { composeTransformers } from '../compose-transformers';\n\nconst pickFormat = type => {\n  switch (type) {\n    case 'percentage':\n      return 'percent';\n    case 'string':\n      return undefined;\n    case 'date':\n      return 'datetime';\n    case 'number':\n      return 'decimal';\n    default:\n      return type;\n  }\n};\n\nconst injectFormats = columnTypes =>\n  columnTypes.map(metric => ({\n    format: pickFormat(metric.type),\n    unit: metric.unit,\n  }));\n\nconst injectHeadings = (columns, headings, hasHeader) => {\n  if (!hasHeader) {\n    return columns;\n  }\n\n  return merge(\n    columns,\n    headings.map(heading => ({\n      heading,\n    })),\n  );\n};\n\n/**\n * Salesforce table transformer\n * @param {Object} data - Data that is returned from the backend for the table visualisation.\n * @param {Object[]} data.data - The visualisation data.\n * @param {Object[]} data.data[] - A data row.\n * @param {(string|number)} data.data[][] - The value of the field.\n * @param {Object[]} data.column_types - Describes the format of the column and the unit in case of a currency.\n * @param {string} data.column_types[].type - Describes the type of the column.\n * Can be `currency`, `number`, `percentage`, `date`, `datetime`, `string`\n * @param {string} [data.column_types[].unit] - If the type is `currency`, a unit will be given.\n * Units can be \"USD\" or other currency codes.\n * @param {Object[]} data.headings - An array with the field names.\n * @param {string} data.headings[] - The name of a field.\n */\nconst tableTransform = (data, { config = {} } = {}) => {\n  if (!data) {\n    return {};\n  }\n\n  const context = {};\n\n  const {\n    data: visualisationData = [],\n    column_types: columnTypes = [],\n    headings = [],\n  } = data;\n  const { hasHeader } = config;\n\n  let columns = injectFormats(columnTypes);\n  columns = injectHeadings(columns, headings, hasHeader);\n\n  if (columns.length) {\n    context.columns = columns;\n  }\n\n  context.data = visualisationData;\n\n  return context;\n};\n\nconst transform = composeTransformers(tableTransform, genericTableTransform);\n\nexport { transform };\n","import { map, filter, times, forEach, isNil } from 'lodash';\n\nexport const getCellValue = cell => {\n  if (!cell) {\n    return null;\n  }\n\n  switch (cell.__typename) {\n    case 'DatabaseBooleanValue':\n      return cell.boolean;\n    case 'DatabaseFloatValue':\n      return cell.float;\n    case 'DatabaseIntegerValue':\n      return cell.integer;\n    case 'DatabaseStringValue':\n      return cell.string;\n    case 'DatabaseTimestampValue':\n      return cell.timestamp;\n    default:\n      return null;\n  }\n};\n\nexport const getValuesFromRow = row => {\n  return map(row, getCellValue);\n};\n\nexport const processSeries = data => {\n  // Data should exist, have at least one item, with at least one data point\n  if (isNil(data) || isNil(data[0]) || data[0].length < 2) {\n    return [];\n  }\n\n  const noOfValues = data[0].length - 1;\n  const processedSeries = times(noOfValues, () => []);\n  // Strip out any data points with no x-axis value\n  const filteredData = filter(data, i => !isNil(i[0]));\n\n  // We need to transform from a single array of data into multiple arrays,\n  // one for each series. So:\n  // [[<datetime>, <value_1>, <value_2>], [<datetime>, <value_1>, <value_2>]]\n  // becomes\n  // [[<datetime>, <value_1>], [<datetime>, <value_1>]]\n  // and\n  // [[<datetime>, <value_2>], [<datetime>, <value_2>]]\n  forEach(filteredData, item => {\n    const [head, ...rest] = item;\n    forEach(rest, (dataPoint, index) => {\n      processedSeries[index].push([head, dataPoint]);\n    });\n  });\n\n  return processedSeries;\n};\n","import { omit } from 'lodash';\n\nconst cleanTransformedData = transformedData =>\n  omit(transformedData, [\n    'threshold',\n    'startingValue',\n    'comparison',\n    'reverseGoalDirection',\n  ]);\n\nexport default cleanTransformedData;\n","import { chain } from 'lodash';\nimport { getValuesFromRow, processSeries } from './helpers';\nimport cleanTransformedData from '../shared/clean-transformed-data';\nimport {\n  composeTransformers,\n  composeApplyConfigTransformers,\n} from '../compose-transformers';\nimport { transform as goalTransform } from '../../transformers/shared/goal';\n\nconst formatSeries = series => ({ data: series });\n\n/*\n * For multi-series we need to add column names to\n * the series. This function takes the columns and\n * returns a formatter that can be passed to series.map()\n */\nconst createMultiSeriesFormatter = columns => (series, i) => ({\n  data: series,\n  name: columns[i + 1].name,\n});\n\nconst lineTransform = ({ data }) => {\n  if (!data || !data.databaseQuery) {\n    return {};\n  }\n\n  const { rows, columns } = data.databaseQuery;\n\n  const seriesData = chain(rows)\n    // returns the values\n    .map(({ values }) => getValuesFromRow(values))\n    .value();\n\n  // process each series and return an array of series ([[], [], ...)\n  const processedSeries = processSeries(seriesData);\n  const isMulti = processedSeries.length > 1;\n  const seriesFormatter = isMulti\n    ? createMultiSeriesFormatter(columns)\n    : formatSeries;\n\n  const series = chain(processedSeries)\n    // wraps array into { data: array }\n    .map(seriesFormatter)\n    // filter elements with no data, they should be stripped as you cannot have empty series (trigger an error)\n    .filter(result => result.data.length > 0)\n    .value();\n\n  return {\n    series,\n    x_axis: { type: 'datetime' },\n    y_axis: { format: 'decimal' }, // We only support decimal values right now\n    format: 'decimal',\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(lineTransform, goalTransform);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = (data, config) => {\n  const cleanedData = cleanTransformedData(data);\n  return composeApplyConfigTransformers(goalTransform)(cleanedData, config);\n};\n\nexport { transform, applyConfig };\n","import { chain } from 'lodash';\nimport { getValuesFromRow } from './helpers';\nimport cleanTransformedData from '../shared/clean-transformed-data';\nimport {\n  composeTransformers,\n  composeApplyConfigTransformers,\n} from '../compose-transformers';\nimport { transform as goalTransform } from '../../transformers/shared/goal';\n\nconst barTransform = ({ data }) => {\n  if (!data || !data.databaseQuery) {\n    return {};\n  }\n\n  // set values with default empty arrays in case array length is 0 after filter (unzip with returns undefined for both labels and series)\n  const [labels = [], series = []] = chain(data.databaseQuery.rows)\n    .map(({ values }) => getValuesFromRow(values))\n    .filter(([label]) => label !== null)\n    .unzip();\n\n  const xAxis = data.databaseQuery.columns[0] || {};\n\n  return {\n    series: series.length ? [{ data: series }] : [],\n    x_axis: {\n      labels,\n      type: xAxis.dataType === 'TIMESTAMP' ? 'datetime' : 'standard',\n    },\n    y_axis: { format: 'decimal' }, // We only support decimal values right now\n    format: 'decimal',\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(barTransform, goalTransform);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = (data, config) => {\n  const cleanedData = cleanTransformedData(data);\n  return composeApplyConfigTransformers(goalTransform)(cleanedData, config);\n};\n\nexport { transform, applyConfig };\n","import { map, unzip } from 'lodash';\nimport { getValuesFromRow, processSeries } from './helpers';\nimport cleanTransformedData from '../shared/clean-transformed-data';\nimport {\n  composeTransformers,\n  composeApplyConfigTransformers,\n} from '../compose-transformers';\nimport { transform as goalTransform } from '../../transformers/shared/goal';\n\nconst columnTransform = ({ data }) => {\n  if (!data || !data.databaseQuery) {\n    return {};\n  }\n\n  const seriesData = map(data.databaseQuery.rows, ({ values }) =>\n    getValuesFromRow(values),\n  ).filter(([label]) => label !== null);\n\n  // Pull the labels out of the unprocessed series data\n  const [labels = []] = unzip(seriesData);\n\n  // Separate the values for each series into their own arrays\n  const series = map(processSeries(seriesData), item => {\n    const [, values] = unzip(item);\n\n    return { data: values };\n  });\n\n  const xAxis = data.databaseQuery.columns[0] || {};\n\n  return {\n    series,\n    x_axis: {\n      labels,\n      type: xAxis.dataType === 'TIMESTAMP' ? 'datetime' : 'standard',\n    },\n    y_axis: { format: 'decimal' }, // We only support decimal values right now\n    format: 'decimal',\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(columnTransform, goalTransform);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = (data, config) => {\n  const cleanedData = cleanTransformedData(data);\n  return composeApplyConfigTransformers(goalTransform)(cleanedData, config);\n};\n\nexport { transform, applyConfig };\n","import { get, reverse, isFinite } from 'lodash';\nimport cleanTransformedData from '../shared/clean-transformed-data';\nimport { transform as genericNumberTransform } from '../per-visualisation/number';\nimport {\n  composeTransformers,\n  composeApplyConfigTransformers,\n} from '../compose-transformers';\nimport { getCellValue } from './helpers';\n\nconst getFirstCol = row => getCellValue(row.values[0]);\n\nconst numberTransform = data => {\n  const rows = get(data, 'data.databaseQuery.rows');\n\n  if (!rows) {\n    return {};\n  }\n\n  const value = reverse(rows.map(getFirstCol)).filter(isFinite);\n\n  return {\n    value,\n    format: 'decimal',\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(numberTransform, genericNumberTransform);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = (data, config) => {\n  const cleanedData = cleanTransformedData(data);\n  return composeApplyConfigTransformers(genericNumberTransform)(\n    cleanedData,\n    config,\n  );\n};\n\nexport { transform, applyConfig };\n","import { chain, has } from 'lodash';\nimport { getValuesFromRow } from './helpers';\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = ({ data } = {}) => {\n  if (!has(data, 'databaseQuery.rows[0]')) {\n    return {};\n  }\n\n  const items = chain(data.databaseQuery.rows)\n    // transform data into [[label, value], ...]\n    .map(({ values }) => getValuesFromRow(values))\n    // removes entries with null label\n    .filter(([label]) => label !== null)\n    // transform [label, value] into { label, value }\n    .map(([label, value]) => ({ label, value }))\n    // sort by value\n    .sortBy('value')\n    // reverse, so highest value is at the top\n    .reverse()\n    .value();\n\n  return {\n    items,\n    format: 'decimal',\n  };\n};\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = data => data;\n\nexport { transform, applyConfig };\n","import { get, last } from 'lodash';\nimport { transform as genericGeckometerTransform } from '../per-visualisation/geckometer';\nimport { composeTransformers } from '../compose-transformers';\nimport { getCellValue } from './helpers';\nimport { roundToPowerOfTen } from '../../lib/round-to-power-of-ten';\n\nconst getFirstCol = row => getCellValue(row.values[0]);\n\nconst geckometerTransform = data => {\n  const rows = get(data, 'data.databaseQuery.rows');\n\n  if (!rows) {\n    return {};\n  }\n\n  const value = last(rows.map(getFirstCol));\n\n  return {\n    item: value,\n    format: 'decimal',\n    min: { value: 0 },\n    max: { value: roundToPowerOfTen(value) },\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(\n  geckometerTransform,\n  genericGeckometerTransform,\n);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = data => data;\n\nexport { transform, applyConfig };\n","import { get } from 'lodash';\nimport { transform as genericTableTransform } from '../per-visualisation/table';\nimport { composeTransformers } from '../compose-transformers';\nimport { getCellValue } from './helpers';\n\nconst pickFormat = type => {\n  switch (type) {\n    case 'INTEGER':\n    case 'FLOAT':\n      return 'decimal';\n    case 'TIMESTAMP':\n      return 'datetime';\n    default:\n      return undefined;\n  }\n};\n\nconst tableTransform = data => {\n  const d = get(data, 'data.databaseQuery');\n\n  if (!d) {\n    return {};\n  }\n\n  const columns = d.columns.map(({ name: heading, dataType }) => {\n    const format = pickFormat(dataType);\n    return format ? { heading, format } : { heading };\n  });\n\n  const rows = d.rows.map(row => row.values.map(getCellValue));\n\n  return {\n    columns,\n    data: rows,\n  };\n};\n\n/*\n * transform\n *\n * This is the full transformer that takes the high\n * fidelity raw data from our backend services and\n * transforms it into a low fidelity data payload\n * that our visualisations expect.\n *\n * rawData + widgetConfig => transform => transformedData\n */\nconst transform = composeTransformers(tableTransform, genericTableTransform);\n\n/*\n * applyConfig\n *\n * This is a lightweight transformer that doesn't require\n * the high fidelity raw data. This can be used in cases\n * where an update to config can affect the widget data\n * in a way that is completely disconnected from the\n * raw data. For example applying a fixed goal.\n *\n * transformedData1 + widgetConfig => transform => transformedData2\n */\nconst applyConfig = data => data;\n\nexport { transform, applyConfig };\n","const pickFormat = type => {\n  switch (type) {\n    case 'percentage':\n      return 'percent';\n    case 'money':\n      return 'currency';\n    default:\n      return 'decimal';\n  }\n};\n\nexport { pickFormat };\n","import { cloneDeep, partial } from 'lodash';\nimport { pickFormat } from './helpers';\nimport { transform as genericLineTransform } from '../per-visualisation/line';\nimport { composeTransformers } from '../compose-transformers';\n\nconst transformSeries = ({ secondaryIndex } = {}, { data, name }, index) => {\n  // We clone because the line chart mutates the datetime for each point\n  if (index === secondaryIndex) {\n    // Set comparison secondary line\n    return { data: cloneDeep(data), name, type: 'secondary' };\n  }\n  return { data: cloneDeep(data), name };\n};\n\nconst generateYAxis = (metricUnit, format) => {\n  const yAxis = {\n    format,\n  };\n\n  if (metricUnit) {\n    yAxis.unit = metricUnit;\n  }\n\n  return yAxis;\n};\n\nconst lineTransform = (data, cfg) => {\n  if (!data) {\n    return {};\n  }\n\n  const { series, metric_type: metricType, metric_unit: metricUnit } = data;\n\n  // Iris will return `null` for the `data` in each series if the dataset is empty\n  // In that case we cannot render\n  if (!series.length || series.some(s => s.data === null)) {\n    return {};\n  }\n\n  const format = pickFormat(metricType);\n  const yAxis = generateYAxis(metricUnit, format);\n\n  const context = {\n    series: series.map(partial(transformSeries, cfg)),\n    x_axis: {\n      type: 'datetime',\n    },\n    y_axis: yAxis,\n    format,\n  };\n\n  return context;\n};\n\nconst transform = composeTransformers(lineTransform, genericLineTransform);\n\nexport { transform };\n","import { has } from 'lodash';\nimport { pickFormat } from './helpers';\nimport { transform as genericNumberTransform } from '../per-visualisation/number';\nimport { composeTransformers } from '../compose-transformers';\n\nconst numberTransform = (payload, timezone, initialContext = {}) => {\n  if (!has(payload, 'values[0]')) {\n    return {};\n  }\n\n  const { metric_type: metricType, metric_unit: metricUnit } = payload;\n  const format = pickFormat(metricType);\n\n  const visualisationConfig = {\n    value: payload.values,\n    format,\n  };\n\n  if (metricUnit) {\n    visualisationConfig.unit = metricUnit;\n  }\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(numberTransform, genericNumberTransform);\n\nexport { transform };\n","import { unzip, has } from 'lodash';\nimport { pickFormat } from './helpers';\nimport { composeTransformers } from '../compose-transformers';\nimport { transform as genericBarTransform } from '../per-visualisation/bar';\n\nconst pickXAxisType = type => {\n  switch (type) {\n    case 'datetime':\n      return type;\n    default:\n      return 'standard';\n  }\n};\n\nconst generateYAxis = (metricUnit, format) => {\n  const yAxis = {\n    format,\n  };\n\n  if (metricUnit) {\n    yAxis.unit = metricUnit;\n  }\n\n  return yAxis;\n};\n\nconst barTransform = (payload, config = {}, timezone, initialContext = {}) => {\n  if (!has(payload, 'series[0].data')) {\n    return {};\n  }\n\n  const [labels, data] = unzip(payload.series[0].data);\n  const orientation = config.type === 'bar' ? 'horizontal' : 'vertical'; // To be removed once migration is complete\n  const type = pickXAxisType(payload.x_axis_type);\n  const { metric_type: metricType, metric_unit: metricUnit } = payload;\n  const format = pickFormat(metricType);\n  const yAxis = generateYAxis(metricUnit, format);\n\n  const context = {\n    series: [{ data }],\n    x_axis: {\n      labels,\n      type,\n    },\n    y_axis: yAxis,\n    orientation,\n    format,\n  };\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(barTransform, genericBarTransform);\n\nexport { transform };\n","import { has } from 'lodash';\nimport { pickFormat } from './helpers';\nimport { transform as genericLeaderboardTransform } from '../per-visualisation/leaderboard';\nimport { composeTransformers } from '../compose-transformers';\n\nconst leaderboardTransform = (\n  payload,\n  { reverseSort } = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (!has(payload, 'values[0]')) {\n    return {};\n  }\n\n  const items = payload.values.map(([label, value]) => ({ label, value }));\n  const { metric_type: metricType, metric_unit: metricUnit } = payload;\n\n  const visualisationConfig = {\n    items,\n    format: pickFormat(metricType),\n  };\n\n  if (metricUnit) {\n    visualisationConfig.unit = metricUnit;\n  }\n\n  if (reverseSort) {\n    visualisationConfig.items = visualisationConfig.items.reverse();\n  }\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(\n  leaderboardTransform,\n  genericLeaderboardTransform,\n);\n\nexport { transform };\n","import { has } from 'lodash';\nimport { pickFormat } from './helpers';\nimport { transform as genericGeckometerTransform } from '../per-visualisation/geckometer';\nimport { composeTransformers } from '../compose-transformers';\n\nconst geckometerTransform = (payload, timezone, initialContext = {}) => {\n  if (!has(payload, 'values[0]')) {\n    return {};\n  }\n\n  const { metric_type: metricType, metric_unit: metricUnit } = payload;\n  const format = pickFormat(metricType);\n\n  const context = {\n    item: payload.values[0],\n    format,\n  };\n\n  if (metricUnit) {\n    context.unit = metricUnit;\n  }\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(\n  geckometerTransform,\n  genericGeckometerTransform,\n);\n\nexport { transform };\n","import { merge, isUndefined, findIndex, pickBy, isNil } from 'lodash';\nimport { transform as genericTableTransform } from '../per-visualisation/table';\nimport { composeTransformers } from '../compose-transformers';\n\nconst pickFormat = type => {\n  switch (type) {\n    case 'percentage':\n      return 'percent';\n    case 'money':\n      return 'currency';\n    case 'string':\n      return undefined;\n    case 'date':\n    case 'datetime':\n      return 'datetime';\n    default:\n      return 'decimal';\n  }\n};\n\nconst injectFormats = columnTypes =>\n  columnTypes.map(metric => ({\n    format: pickFormat(metric.type),\n    unit: metric.unit,\n  }));\n\nconst injectHeadings = (columns, headings, hasHeader) => {\n  if (!hasHeader) {\n    return columns;\n  }\n\n  return merge(\n    columns,\n    headings.map(heading => ({\n      heading,\n    })),\n  );\n};\n\nconst injectSortOrder = (columns, query) => {\n  if (!query.order_by) {\n    return columns;\n  }\n\n  let queryColumns = [...query.columns];\n\n  if (query.group_by) {\n    queryColumns = [query.group_by, ...queryColumns];\n  }\n\n  const { field, aggregate, direction } = query.order_by;\n  const sortedColIndex = findIndex(queryColumns, pickBy({ field, aggregate }));\n\n  if (sortedColIndex === -1) {\n    return columns;\n  }\n\n  columns[sortedColIndex] = columns[sortedColIndex] || {};\n  columns[sortedColIndex].sort = direction;\n\n  return columns;\n};\n\n/**\n * Datasets table transformer\n * @param {Object} data - Data that is returned from the backend for the table visualisation.\n * @param {Object[]} data.data - The visualisation data.\n * @param {Object[]} data.data[] - A data row.\n * @param {(string|number)} data.data[][] - The value of the field.\n * @param {Object[]} data.column_types - Describes the format of the column and the unit in case of a currency.\n * @param {string} data.column_types[].type - Describes the type of the column.\n * Can be `date`, `datetime`, `number`, `percentage`, `string`, `money`.\n * @param {string} [data.column_types[].unit] - If the type is `money`, a unit will be given.\n * Units can be \"USD\" or other currency codes.\n * @param {Object[]} data.headings - An array with the field names.\n * @param {string} data.headings[] - The name of a field.\n */\nconst tableTransform = (data, cfg = {}) => {\n  if (!data) {\n    return {};\n  }\n\n  const context = {};\n\n  const { column_types: columnTypes = [], headings = [] } = data;\n  const visualisationData = isNil(data.data) ? [] : data.data;\n  const { hasHeader, query = {}, tableType } = cfg;\n\n  let columns = injectFormats(columnTypes);\n  columns = injectHeadings(columns, headings, hasHeader);\n  columns = injectSortOrder(columns, query);\n\n  if (columns.length) {\n    context.columns = columns;\n\n    // In a summarized table the first column is our `group_by` which\n    // we ignore for the purposes of number formatting\n    const columnOffset = tableType === 'summarized' ? -1 : undefined;\n    if (!isUndefined(columnOffset)) {\n      context.columnOffset = columnOffset;\n    }\n  }\n\n  context.data = visualisationData;\n\n  return context;\n};\n\nconst transform = composeTransformers(tableTransform, genericTableTransform);\n\nexport { transform };\n","import { transform as genericLineTransform } from '../per-visualisation/line';\nimport { composeTransformers } from '../compose-transformers';\nimport {\n  getMainColumnField,\n  getIncompleteFromNow,\n  ensureTimespan,\n  getMultilineScatterSeries,\n  getFormat,\n  fillInValues,\n} from './helpers';\nimport { isUndefined, last } from 'lodash';\n\nconst lineTransform = (payload, config = {}, timezone, initialContext = {}) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n\n  const lineColumn = getMainColumnField(config);\n  const {\n    queryMetas: [{ select: selectMeta = [] } = {}] = [],\n    queries = [],\n    timespanComparison,\n  } = config;\n  const [\n    {\n      filter: [{ operands: [qty, unitTs] = [] } = {}] = [],\n      group_by: [{ bucket_by: bucket } = {}] = [],\n    } = {},\n  ] = queries;\n  const format = getFormat(lineColumn, config);\n\n  let series = getMultilineScatterSeries(\n    payload,\n    selectMeta,\n    !isUndefined(timespanComparison),\n  ) || [{ data: payload }];\n\n  if (qty && unitTs) {\n    series = series.map(s => {\n      return {\n        ...s,\n        data: fillInValues(\n          ensureTimespan(s.data, timezone, qty, unitTs, bucket),\n          last(selectMeta).type,\n        ),\n        incomplete_from: getIncompleteFromNow(timezone, bucket),\n      };\n    });\n  }\n\n  const context = {\n    x_axis: { type: 'datetime' },\n    y_axis: format,\n    series,\n    format: format.format,\n  };\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(lineTransform, genericLineTransform);\nexport { transform };\n","import { transform as genericNumberTransform } from '../per-visualisation/number';\nimport { composeTransformers } from '../compose-transformers';\nimport { getMainColumnField, getFormat, parseNumberValue } from './helpers';\nimport { isUndefined } from 'lodash';\n\nconst numberTransform = (\n  payload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (!payload) {\n    return {};\n  }\n  const numberColumn = getMainColumnField(config);\n  const format = getFormat(numberColumn, config);\n  const {\n    queryMetas: [{ select: [selectMeta = {}] = [] } = {}] = [],\n    timespanComparison,\n  } = config;\n  const isTimespanComparisonOn = !isUndefined(timespanComparison);\n\n  // In case of timespancomparison we receive 2 array. The first one is actual\n  // value and second is previous period\n  const wrappedValue = isTimespanComparisonOn ? payload[0] : payload;\n  const value = parseNumberValue(wrappedValue);\n\n  const visualisationConfig = {\n    value,\n    ...format,\n  };\n\n  // Only process time comparison if main value is not null\n  if (value && payload[1] && isTimespanComparisonOn) {\n    const parsedComparisonValue = parseNumberValue(payload[1]);\n\n    // Comparison value is set as first element by default\n    if (parsedComparisonValue) {\n      visualisationConfig.value = [...parsedComparisonValue, ...value];\n    } else {\n      visualisationConfig.value = [null, ...value]; // Just put null in if it's null or undefined\n    }\n\n    if (timespanComparison.type === 'percentage') {\n      visualisationConfig.comparison = {\n        type: 'percentage',\n      };\n    } else if (timespanComparison.type === 'difference') {\n      visualisationConfig.comparison = {\n        type: 'number',\n      };\n    }\n\n    if (selectMeta.hasReverseComparison) {\n      visualisationConfig.comparison = {\n        ...visualisationConfig.comparison,\n        reversed: true,\n      };\n    }\n  }\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(numberTransform, genericNumberTransform);\n\nexport { transform };\n","import { unzip, map } from 'lodash';\nimport { composeTransformers } from '../compose-transformers';\nimport { transform as genericBarTransform } from '../per-visualisation/bar';\nimport {\n  DEFAULT_LABEL,\n  getMainColumnField,\n  getEnumHumanValue,\n  ensureTimespan,\n  getMultilineScatterSeries,\n  getMultilineSeriesAndLabels,\n  getFormat,\n} from './helpers';\n\nconst pickXAxisType = type => {\n  switch (type) {\n    case 'datetime':\n      return type;\n    default:\n      return 'standard';\n  }\n};\n\nconst barTransform = (payload, config = {}, timezone, initialContext = {}) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n\n  const isMultiSeries = payload && payload[0].length > 2;\n  let labels, data, series;\n\n  const { queryMetas = [], queries = [] } = config;\n  const [\n    {\n      filter: [{ operands: [qty, unitTs] = [] } = {}] = [],\n      group_by: [{ bucket_by: bucket } = {}] = [],\n    } = {},\n  ] = queries;\n  const [{ select: selectMeta = [] } = {}] = queryMetas;\n  const [selectXAxis = {}] = selectMeta;\n  const type = pickXAxisType(selectXAxis.type);\n\n  const orientation = config.type === 'bar' ? 'horizontal' : 'vertical';\n\n  let fullData = payload;\n\n  if (!isMultiSeries) {\n    if (type === 'datetime') {\n      if (qty && unitTs) {\n        fullData = ensureTimespan(fullData, timezone, qty, unitTs, bucket);\n      }\n    }\n\n    [labels, data] = unzip(fullData);\n    series = [{ data }];\n  } else {\n    if (type === 'datetime') {\n      // Set labels\n      [labels, data] = unzip(payload);\n\n      // Visualisation supports scatter with datetime, but not with categorical data\n      series = getMultilineScatterSeries(payload, selectMeta);\n\n      if (type === 'datetime') {\n        if (qty && unitTs) {\n          series = series.map(s => {\n            return {\n              ...s,\n              data: ensureTimespan(s.data, timezone, qty, unitTs, bucket),\n            };\n          });\n        }\n      }\n    } else {\n      ({ labels, series } = getMultilineSeriesAndLabels(payload, selectMeta));\n    }\n\n    series = series.slice(0, 3);\n  }\n\n  const barColumn = getMainColumnField(config);\n  const format = getFormat(barColumn, config);\n\n  const formattedLabels = map(labels, label => {\n    const formattedLabel = label || DEFAULT_LABEL;\n    if (selectXAxis.type === 'enum') {\n      return getEnumHumanValue(formattedLabel, selectXAxis.values);\n    }\n    return formattedLabel;\n  });\n\n  const context = {\n    series,\n    x_axis: {\n      labels: formattedLabels,\n      type,\n    },\n    y_axis: {\n      ...format,\n    },\n    orientation,\n    format: format.format,\n  };\n\n  return { ...initialContext, ...context };\n};\n\nconst transform = composeTransformers(barTransform, genericBarTransform);\n\nexport { transform };\n","import { transform as genericGeckometerTransform } from '../per-visualisation/geckometer';\nimport { composeTransformers } from '../compose-transformers';\nimport { getMainColumnField, getFormat, parseNumberValue } from './helpers';\nimport { isNull } from 'lodash';\n\nconst geckometerTransform = (\n  payload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n  const meterColumn = getMainColumnField(config);\n  const format = getFormat(meterColumn, config);\n\n  const parsedValue = parseNumberValue(payload);\n  const item = isNull(parsedValue) ? null : parsedValue[0];\n\n  const visualisationConfig = {\n    item,\n    ...format,\n  };\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(\n  geckometerTransform,\n  genericGeckometerTransform,\n);\n\nexport { transform };\n","import { transform as genericLeaderboardTransform } from '../per-visualisation/leaderboard';\nimport { composeTransformers } from '../compose-transformers';\nimport { chain } from 'lodash';\nimport {\n  DEFAULT_LABEL,\n  getMainColumnField,\n  getEnumHumanValue,\n  getFormat,\n} from './helpers';\n\nconst formatLabel = (label, selectXAxis) => {\n  const formattedLabel = label || DEFAULT_LABEL;\n  if (selectXAxis.type === 'enum') {\n    return getEnumHumanValue(formattedLabel, selectXAxis.values);\n  }\n  return formattedLabel;\n};\n\nconst leaderboardTransform = (\n  payload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n  const leaderboardColumn = getMainColumnField(config);\n  const format = getFormat(leaderboardColumn, config);\n  const {\n    queryMetas: [{ select: [selectXAxis = {}] = [] } = {}] = [],\n  } = config;\n\n  const items = chain(payload)\n    .map(([label, value]) => ({\n      label: formatLabel(label, selectXAxis),\n      value,\n      ...format,\n    }))\n    .value();\n\n  const visualisationConfig = { items };\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(\n  leaderboardTransform,\n  genericLeaderboardTransform,\n);\n\nexport { transform };\n","import { transform as genericTableTranform } from '../per-visualisation/table';\nimport { composeTransformers } from '../compose-transformers';\nimport {\n  find,\n  findIndex,\n  forEach,\n  isArray,\n  isNull,\n  orderBy,\n  reduce,\n  some,\n} from 'lodash';\nimport { getFormat } from './helpers';\n\nconst tableTransform = (\n  payload,\n  config = {},\n  timezone,\n  initialContext = {},\n) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n  const {\n    queryMetas: [{ select = [] } = {}] = [],\n    queries: [{ order_by: [{ order = 'asc' } = {}] = [] } = {}] = [],\n    detailsMetricResource,\n  } = config;\n\n  const isDetailsTable = !!detailsMetricResource;\n  let data = payload;\n\n  if (!isDetailsTable) {\n    // For table visualisation we need to ensure sorting FE side as multiple\n    // queries might return different/mismatching sorted results\n    const groupByType = select[0].type;\n    if (groupByType === 'enum') {\n      data = orderBy(\n        data,\n        ([val]) => {\n          // push no value to the end\n          if (isNull(val)) {\n            return order === 'asc' ? select[0].values.legnth : -1;\n          }\n          return findIndex(select[0].values, v => v.key === val);\n        },\n        order,\n      );\n    } else {\n      data = orderBy(data, ([val]) => val, order);\n    }\n  }\n\n  if (some(select, s => s.type === 'enum')) {\n    const values = reduce(\n      select,\n      (res, field, index) => {\n        if (field.type === 'enum') {\n          res[index] = field.values;\n        }\n        return res;\n      },\n      {},\n    );\n\n    data = data.map(row => {\n      const r = [...row];\n      forEach(values, (val, index) => {\n        const currentValue = row[index];\n        const newValue = find(val, v => v.key === currentValue);\n        r[index] = newValue ? newValue.value : '';\n      });\n      return r;\n    });\n  }\n\n  // Handle array values as string\n  data = data.map(row => row.map(c => (isArray(c) ? c.join(', ') : c)));\n\n  const visualisationConfig = {\n    data,\n    columns: select.map(m => {\n      const col = { heading: m.name };\n      if (!['string', 'enum'].includes(m.type)) {\n        return { ...col, ...getFormat(m, config, isDetailsTable) };\n      }\n\n      return col;\n    }),\n  };\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(tableTransform, genericTableTranform);\n\nexport { transform };\n","import { transform as numberFormatTransform } from '../../shared/number-format';\nimport { composeTransformers } from '../../compose-transformers';\n\nconst transform = composeTransformers(numberFormatTransform);\n\nexport { transform };\n","import { transform as genericFeedTransform } from '../per-visualisation/feed';\nimport { composeTransformers } from '../compose-transformers';\nimport { DEFAULT_LABEL, getFormat } from './helpers';\nimport universalConfig from '../../config';\nimport { find, isNull, some } from 'lodash';\n\nconst UNIVERSAL_ASSETS_FOLDER = 'universal';\n\nconst feedTransform = (payload, config = {}, timezone, initialContext = {}) => {\n  if (!payload || !payload.length) {\n    return {};\n  }\n\n  const { queryMetas: [{ select = [] } = {}] = [], integrationName } = config;\n\n  let data = payload;\n  if (some(select, s => s.type === 'enum' || s.type === 'image')) {\n    const fmtFunctions = select.map(n => {\n      let fn = v => v; // default identity\n\n      if (n.type === 'enum') {\n        if (n.iconSuffix) {\n          // Apply icon path\n          fn = v => {\n            const path = [\n              `/${UNIVERSAL_ASSETS_FOLDER}`,\n              integrationName,\n              n.primary_resource,\n              n.key,\n              isNull(v) ? 'null' : v,\n            ];\n            return `${path.join('/')}${n.iconSuffix}`;\n          };\n        } else {\n          // Use values from enum values\n          fn = v => {\n            const newValue = find(n.values, t => t.key === v);\n            return newValue ? newValue.value : DEFAULT_LABEL;\n          };\n        }\n      } else if (n.type === 'image') {\n        const placeholderPath = [\n          universalConfig.STATIC_ASSET_URL,\n          UNIVERSAL_ASSETS_FOLDER,\n          integrationName,\n          n.primary_resource,\n          n.key,\n          'placeholder.svg',\n        ].join('/');\n\n        fn = v => {\n          return v || placeholderPath;\n        };\n      }\n      return fn;\n    });\n\n    data = data.map(row =>\n      row.map((field, index) => fmtFunctions[index](field)),\n    );\n  }\n\n  const visualisationConfig = {\n    data,\n    columns: select.map(m => {\n      const col = {};\n      if (!['string', 'enum'].includes(m.type)) {\n        return { ...col, ...getFormat(m, config, true) };\n      }\n\n      if (m.iconSuffix) {\n        return { ...col, format: 'icon' };\n      }\n\n      return col;\n    }),\n  };\n\n  return { ...initialContext, ...visualisationConfig };\n};\n\nconst transform = composeTransformers(feedTransform, genericFeedTransform);\n\nexport { transform };\n","import * as spreadsheets from './spreadsheet';\nimport * as salesforce from './pegasus';\nimport * as database from './database';\nimport * as datasets from './datasets';\nimport * as universal from './universal';\n\nexport { spreadsheets, salesforce, database, datasets, universal };\n","/**\n * openWindow\n *\n * @param windowName Should not contain any space, undescore or hyphen for\n * ie9. (http://stackoverflow.com/a/9590948/2259520)\n * @return new Popup Window\n */\nfunction openWindow(windowName) {\n  windowName = windowName || '';\n  return window.open(\n    'about:blank',\n    windowName,\n    [\n      'width=800',\n      'height=700',\n      'status=no',\n      'menubar=no',\n      'top=100',\n      'left=100',\n      'resizable=no',\n      'scrollbars=yes',\n      'dependent=yes',\n      'dialog=yes',\n    ].join(','),\n  );\n}\n\nexport { openWindow as open };\n","import { fetchJSONWithCredentials } from '../universal/fetch';\nimport config from '../universal/config';\n\nconst regenerateLoopLink = loopId => {\n  const URL = `${\n    config.get().ManagementBaseURL\n  }/sharing_loops/${loopId}/regenerate_code`;\n\n  return fetchJSONWithCredentials(URL, {\n    method: 'POST',\n    headers: {\n      Accept: 'application/json',\n    },\n  });\n};\n\nexport { regenerateLoopLink };\n","import React from 'react';\nimport { isUndefined } from 'lodash';\nimport createAction from '../../lib/redux/create-action';\nimport * as dashboardService from '../../services/dashboard-service';\nimport * as loopService from '../../services/loop-service';\nimport * as dashboardActions from '../../dashboard/actions/dashboard-actions';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport * as toastConstants from '../../toast/toast-constants';\nimport { getSharingURL } from '../../lib/sharing';\nimport { getLoopURL } from '../../lib/loop';\nimport { getDashboardTrackingProps } from '../helpers';\nimport { trackEvent } from '@Tracking';\nimport { LOCATIONS } from '@Tracking/constants';\nimport {\n  dashboardDeleted,\n  dashboardLoopRegeneratedSharingLink,\n  dashboardRegeneratedSharingLink,\n} from '@Tracking/events';\nimport FormattedMessage from '../../lib/i18n';\n\nexport const regenerateDashboardSharingLinkSuccess = createAction(\n  'Admin:REGENERATE_DASHBOARD_SHARING_LINK_SUCCESS',\n);\n\nexport const regenerateLoopSharingLinkSuccess = createAction(\n  'Admin:REGENERATE_LOOP_SHARING_LINK_SUCCESS',\n);\n\nexport const deleteDashboardSuccess = createAction(\n  'Admin:DELETE_DASHBOARD_SUCCESS',\n);\n\nexport const regenerateDashboardSharingLink = dashboardId => async (\n  dispatch,\n  getState,\n) => {\n  try {\n    const {\n      dashboard: { dashboard: currentDashboard },\n    } = getState();\n    const {\n      sharing_hash: sharingHash,\n    } = await dashboardService.regenerateSharingLink(dashboardId);\n\n    dispatch(\n      regenerateDashboardSharingLinkSuccess({\n        dashboardId,\n        sharingHash,\n      }),\n    );\n\n    if (!isUndefined(currentDashboard) && dashboardId === currentDashboard.id) {\n      dispatch(dashboardActions.setCurrentDashboardSharingLink(sharingHash));\n    }\n\n    const link = getSharingURL(sharingHash);\n    dispatch(\n      toastActions.showToast({\n        type: toastConstants.REGENERATED_SHARING_LINK,\n        link,\n      }),\n    );\n\n    trackEvent(\n      dashboardRegeneratedSharingLink({\n        ...getDashboardTrackingProps(dashboardId),\n        Location: LOCATIONS.AdminDashboards,\n      }),\n    );\n  } catch (error) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const regenerateLoopSharingLink = loopId => async dispatch => {\n  try {\n    const { code } = await loopService.regenerateLoopLink(loopId);\n\n    dispatch(\n      regenerateLoopSharingLinkSuccess({\n        loopId,\n        code,\n      }),\n    );\n\n    const link = getLoopURL(code);\n    dispatch(\n      toastActions.showToast({\n        type: toastConstants.REGENERATED_LOOP_SHARING_LINK,\n        link,\n        loopId,\n      }),\n    );\n\n    trackEvent(\n      dashboardLoopRegeneratedSharingLink({\n        'Dashboard loop ID': `${loopId}`,\n      }),\n    );\n  } catch (error) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n\nexport const deleteDashboard = dashboardId => async dispatch => {\n  try {\n    await dashboardService.deleteDashboard(dashboardId);\n    dispatch(deleteDashboardSuccess({ dashboardId }));\n\n    trackEvent(\n      dashboardDeleted({\n        ...getDashboardTrackingProps(dashboardId),\n        Location: LOCATIONS.AdminDashboards,\n      }),\n    );\n\n    const message = (\n      <FormattedMessage id=\"dashboards.dashboardDeletionSuccessful\" />\n    );\n    dispatch(\n      toastActions.showToast({\n        type: toastConstants.SUCCESS,\n        message,\n      }),\n    );\n  } catch (error) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","import { DARK_THEME } from '../dashboard/themes/theme-constants';\n\nconst defaultValues = {\n  showFooter: true,\n  showClock: true,\n  showLogo: true,\n  logoSrc: null,\n  theme: DARK_THEME,\n  tvMode: false,\n  scaleToFit: false,\n  largeTitles: false,\n};\n\nexport const getCustomizeValues = (dashboard, customize) => {\n  if (customize && customize.values) {\n    const { widgets = {}, ...customizeValues } = customize.values;\n\n    return {\n      ...customizeValues,\n      largeTitles: widgets.largeTitles,\n    };\n  }\n\n  if (dashboard) {\n    const { toggles = [] } = dashboard;\n\n    return {\n      ...defaultValues,\n      ...dashboard.customization,\n      theme: dashboard.theme,\n      scaleToFit: dashboard.scale_when_fullscreen,\n      tvMode: dashboard.tv_mode,\n      largeTitles: toggles.includes('large_widget_titles'),\n      cssFile: dashboard.css,\n    };\n  }\n\n  return defaultValues;\n};\n","import { getWindow } from '../global';\n\nexport const MOBILE_BREAKPOINT = 767;\nexport const SHOW_DESKTOP_VIEW_KEY = 'showDesktopView';\n\nconst getViewport = () => getWindow().document.getElementsByName('viewport')[0];\n\nexport const switchToDesktopView = () => {\n  getWindow().localStorage.setItem(SHOW_DESKTOP_VIEW_KEY, true);\n  getWindow().location.reload(false);\n};\n\nexport const switchToMobileView = () => {\n  getWindow().localStorage.removeItem(SHOW_DESKTOP_VIEW_KEY);\n  getWindow().location.reload(false);\n};\n\nexport const getShowDesktopView = () =>\n  getWindow().localStorage.getItem(SHOW_DESKTOP_VIEW_KEY) || false;\n\nexport const setPageToFitScreen = () => {\n  getViewport().setAttribute('content', '');\n};\n\nexport const isMobileViewport = clientWidth => clientWidth <= MOBILE_BREAKPOINT;\n","import {\n  MOBILE_BREAKPOINT,\n  switchToDesktopView,\n  switchToMobileView,\n  getShowDesktopView,\n  setPageToFitScreen,\n  isMobileViewport,\n} from './mobile';\n\nexport {\n  MOBILE_BREAKPOINT,\n  switchToDesktopView,\n  switchToMobileView,\n  getShowDesktopView,\n  setPageToFitScreen,\n  isMobileViewport,\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---3lAui\",\"draggable\":\"draggable---1T2gk\",\"title\":\"title---1Nc_2\",\"options\":\"options---3lbU3\",\"settingsButton\":\"settingsButton---3RY3R\",\"menu\":\"menu---jlgUU\",\"open\":\"open---3SKPI\",\"statusIndicator\":\"statusIndicator---Nq7TX\",\"staleData\":\"staleData---HkduQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---OUYTU\",\"contentRow\":\"contentRow---34J81\",\"tabs\":\"tabs---lALUm\",\"tabsInner\":\"tabsInner---2-6bc\",\"tabLink\":\"tabLink---3LAnW\",\"active\":\"active---1B6-W\",\"iconContainer\":\"iconContainer---1JF25\"};","import { memoize } from 'lodash';\nimport { getWindow } from '../../lib/global';\n\n/*\n * SegmentTracker\n * window.analytics is the SegmentIO API. It's assigned to window in app.\n * Before tracking, the user needs to be identified with their tracking id.\n * If the user is not identified, the console will show a warning.\n *\n * The tracker will track on production and on staging. And it will log the\n * track call to the console in development and on staging.\n */\nclass SegmentTracker {\n  constructor() {\n    this.window = getWindow();\n    this.isUserIdentified = false;\n    this.contextProperties = {};\n\n    // On dev or while impersonating, the tracker is disabled\n    this.doTrack = !!this.window.TRACKING_ENABLED && this.window.analytics;\n\n    // Logging is enabled on development and on staging environment\n    this.doLog = !!(\n      this.window.console &&\n      this.window.GB_ENV &&\n      (this.window.GB_ENV === 'development' ||\n        this.window.GB_ENV === 'delta' ||\n        this.window.GB_ENV === 'staging')\n    );\n  }\n\n  init(user, organization, contextProperties) {\n    const superProperties = {\n      gb_user_id: user.id,\n      tracking_id: user.tracking_id,\n      email: user.email,\n      job_role: user.job_role,\n      first_contact: user.first_contact,\n      initial_referrer: user.initial_referrer,\n      utm_source: user.utm_source,\n      utm_name: user.utm_name,\n      utm_medium: user.utm_medium,\n      utm_term: user.utm_term,\n      utm_content: user.utm_content,\n      landing_page: user.landing_page,\n      subscription_date: user.subscription_date,\n      trial_end: user.trial_end,\n      signup_date: user.signup_date,\n      mailer: user.mailer,\n      account: user.account,\n      organization_id: organization.id,\n      plan: organization.plan,\n      billing: organization.billing,\n      trial_days_remaining: organization.trial_days_remaining,\n      day_in_lifetime: organization.day_in_lifetime,\n    };\n\n    if (contextProperties) {\n      this.contextProperties = contextProperties;\n    }\n\n    if (this.doTrack) {\n      this.window.analytics.identify(user.tracking_id, superProperties);\n    }\n\n    if (this.doLog) {\n      // eslint-disable-next-line no-console\n      console.log(\n        `SegmentTracker.init with user: ${JSON.stringify(superProperties)}`,\n      );\n    }\n\n    this.isUserIdentified = true;\n  }\n\n  track(event, properties) {\n    if (!this.isUserIdentified) {\n      console.warn(\n        'SegmentTracker: Could not track. User has not been identified',\n      );\n      return;\n    }\n\n    // Merging properties that are being sent with the event, and\n    // properties that have been set when initializing the tracker.\n    const allProperties = {\n      ...(properties || {}),\n      ...(this.contextProperties || {}),\n    };\n\n    if (this.doTrack) {\n      this.window.analytics.track(event, allProperties);\n    }\n\n    if (this.doLog) {\n      // eslint-disable-next-line no-console\n      console.log(\n        `SegmentTracker.track: ${event} ${\n          allProperties ? `(${JSON.stringify(allProperties)})` : ''\n        }`,\n      );\n    }\n  }\n}\n\nSegmentTracker.getInstance = memoize(() => new SegmentTracker());\nexport default SegmentTracker;\n","import SegmentTracker from './segment-tracker';\nexport default SegmentTracker;\n","/*! https://mths.be/he v1.2.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t// All astral symbols.\n\tvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\t// All ASCII symbols (not just printable ASCII) except those listed in the\n\t// first column of the overrides table.\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides\n\tvar regexAsciiWhitelist = /[\\x01-\\x7F]/g;\n\t// All BMP symbols that are not ASCII newlines, printable ASCII symbols, or\n\t// code points listed in the first column of the overrides table on\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.\n\tvar regexBmpWhitelist = /[\\x01-\\t\\x0B\\f\\x0E-\\x1F\\x7F\\x81\\x8D\\x8F\\x90\\x9D\\xA0-\\uFFFF]/g;\n\n\tvar regexEncodeNonAscii = /<\\u20D2|=\\u20E5|>\\u20D2|\\u205F\\u200A|\\u219D\\u0338|\\u2202\\u0338|\\u2220\\u20D2|\\u2229\\uFE00|\\u222A\\uFE00|\\u223C\\u20D2|\\u223D\\u0331|\\u223E\\u0333|\\u2242\\u0338|\\u224B\\u0338|\\u224D\\u20D2|\\u224E\\u0338|\\u224F\\u0338|\\u2250\\u0338|\\u2261\\u20E5|\\u2264\\u20D2|\\u2265\\u20D2|\\u2266\\u0338|\\u2267\\u0338|\\u2268\\uFE00|\\u2269\\uFE00|\\u226A\\u0338|\\u226A\\u20D2|\\u226B\\u0338|\\u226B\\u20D2|\\u227F\\u0338|\\u2282\\u20D2|\\u2283\\u20D2|\\u228A\\uFE00|\\u228B\\uFE00|\\u228F\\u0338|\\u2290\\u0338|\\u2293\\uFE00|\\u2294\\uFE00|\\u22B4\\u20D2|\\u22B5\\u20D2|\\u22D8\\u0338|\\u22D9\\u0338|\\u22DA\\uFE00|\\u22DB\\uFE00|\\u22F5\\u0338|\\u22F9\\u0338|\\u2933\\u0338|\\u29CF\\u0338|\\u29D0\\u0338|\\u2A6D\\u0338|\\u2A70\\u0338|\\u2A7D\\u0338|\\u2A7E\\u0338|\\u2AA1\\u0338|\\u2AA2\\u0338|\\u2AAC\\uFE00|\\u2AAD\\uFE00|\\u2AAF\\u0338|\\u2AB0\\u0338|\\u2AC5\\u0338|\\u2AC6\\u0338|\\u2ACB\\uFE00|\\u2ACC\\uFE00|\\u2AFD\\u20E5|[\\xA0-\\u0113\\u0116-\\u0122\\u0124-\\u012B\\u012E-\\u014D\\u0150-\\u017E\\u0192\\u01B5\\u01F5\\u0237\\u02C6\\u02C7\\u02D8-\\u02DD\\u0311\\u0391-\\u03A1\\u03A3-\\u03A9\\u03B1-\\u03C9\\u03D1\\u03D2\\u03D5\\u03D6\\u03DC\\u03DD\\u03F0\\u03F1\\u03F5\\u03F6\\u0401-\\u040C\\u040E-\\u044F\\u0451-\\u045C\\u045E\\u045F\\u2002-\\u2005\\u2007-\\u2010\\u2013-\\u2016\\u2018-\\u201A\\u201C-\\u201E\\u2020-\\u2022\\u2025\\u2026\\u2030-\\u2035\\u2039\\u203A\\u203E\\u2041\\u2043\\u2044\\u204F\\u2057\\u205F-\\u2063\\u20AC\\u20DB\\u20DC\\u2102\\u2105\\u210A-\\u2113\\u2115-\\u211E\\u2122\\u2124\\u2127-\\u2129\\u212C\\u212D\\u212F-\\u2131\\u2133-\\u2138\\u2145-\\u2148\\u2153-\\u215E\\u2190-\\u219B\\u219D-\\u21A7\\u21A9-\\u21AE\\u21B0-\\u21B3\\u21B5-\\u21B7\\u21BA-\\u21DB\\u21DD\\u21E4\\u21E5\\u21F5\\u21FD-\\u2205\\u2207-\\u2209\\u220B\\u220C\\u220F-\\u2214\\u2216-\\u2218\\u221A\\u221D-\\u2238\\u223A-\\u2257\\u2259\\u225A\\u225C\\u225F-\\u2262\\u2264-\\u228B\\u228D-\\u229B\\u229D-\\u22A5\\u22A7-\\u22B0\\u22B2-\\u22BB\\u22BD-\\u22DB\\u22DE-\\u22E3\\u22E6-\\u22F7\\u22F9-\\u22FE\\u2305\\u2306\\u2308-\\u2310\\u2312\\u2313\\u2315\\u2316\\u231C-\\u231F\\u2322\\u2323\\u232D\\u232E\\u2336\\u233D\\u233F\\u237C\\u23B0\\u23B1\\u23B4-\\u23B6\\u23DC-\\u23DF\\u23E2\\u23E7\\u2423\\u24C8\\u2500\\u2502\\u250C\\u2510\\u2514\\u2518\\u251C\\u2524\\u252C\\u2534\\u253C\\u2550-\\u256C\\u2580\\u2584\\u2588\\u2591-\\u2593\\u25A1\\u25AA\\u25AB\\u25AD\\u25AE\\u25B1\\u25B3-\\u25B5\\u25B8\\u25B9\\u25BD-\\u25BF\\u25C2\\u25C3\\u25CA\\u25CB\\u25EC\\u25EF\\u25F8-\\u25FC\\u2605\\u2606\\u260E\\u2640\\u2642\\u2660\\u2663\\u2665\\u2666\\u266A\\u266D-\\u266F\\u2713\\u2717\\u2720\\u2736\\u2758\\u2772\\u2773\\u27C8\\u27C9\\u27E6-\\u27ED\\u27F5-\\u27FA\\u27FC\\u27FF\\u2902-\\u2905\\u290C-\\u2913\\u2916\\u2919-\\u2920\\u2923-\\u292A\\u2933\\u2935-\\u2939\\u293C\\u293D\\u2945\\u2948-\\u294B\\u294E-\\u2976\\u2978\\u2979\\u297B-\\u297F\\u2985\\u2986\\u298B-\\u2996\\u299A\\u299C\\u299D\\u29A4-\\u29B7\\u29B9\\u29BB\\u29BC\\u29BE-\\u29C5\\u29C9\\u29CD-\\u29D0\\u29DC-\\u29DE\\u29E3-\\u29E5\\u29EB\\u29F4\\u29F6\\u2A00-\\u2A02\\u2A04\\u2A06\\u2A0C\\u2A0D\\u2A10-\\u2A17\\u2A22-\\u2A27\\u2A29\\u2A2A\\u2A2D-\\u2A31\\u2A33-\\u2A3C\\u2A3F\\u2A40\\u2A42-\\u2A4D\\u2A50\\u2A53-\\u2A58\\u2A5A-\\u2A5D\\u2A5F\\u2A66\\u2A6A\\u2A6D-\\u2A75\\u2A77-\\u2A9A\\u2A9D-\\u2AA2\\u2AA4-\\u2AB0\\u2AB3-\\u2AC8\\u2ACB\\u2ACC\\u2ACF-\\u2ADB\\u2AE4\\u2AE6-\\u2AE9\\u2AEB-\\u2AF3\\u2AFD\\uFB00-\\uFB04]|\\uD835[\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDD6B]/g;\n\tvar encodeMap = {'\\xAD':'shy','\\u200C':'zwnj','\\u200D':'zwj','\\u200E':'lrm','\\u2063':'ic','\\u2062':'it','\\u2061':'af','\\u200F':'rlm','\\u200B':'ZeroWidthSpace','\\u2060':'NoBreak','\\u0311':'DownBreve','\\u20DB':'tdot','\\u20DC':'DotDot','\\t':'Tab','\\n':'NewLine','\\u2008':'puncsp','\\u205F':'MediumSpace','\\u2009':'thinsp','\\u200A':'hairsp','\\u2004':'emsp13','\\u2002':'ensp','\\u2005':'emsp14','\\u2003':'emsp','\\u2007':'numsp','\\xA0':'nbsp','\\u205F\\u200A':'ThickSpace','\\u203E':'oline','_':'lowbar','\\u2010':'dash','\\u2013':'ndash','\\u2014':'mdash','\\u2015':'horbar',',':'comma',';':'semi','\\u204F':'bsemi',':':'colon','\\u2A74':'Colone','!':'excl','\\xA1':'iexcl','?':'quest','\\xBF':'iquest','.':'period','\\u2025':'nldr','\\u2026':'mldr','\\xB7':'middot','\\'':'apos','\\u2018':'lsquo','\\u2019':'rsquo','\\u201A':'sbquo','\\u2039':'lsaquo','\\u203A':'rsaquo','\"':'quot','\\u201C':'ldquo','\\u201D':'rdquo','\\u201E':'bdquo','\\xAB':'laquo','\\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\\u2308':'lceil','\\u2309':'rceil','\\u230A':'lfloor','\\u230B':'rfloor','\\u2985':'lopar','\\u2986':'ropar','\\u298B':'lbrke','\\u298C':'rbrke','\\u298D':'lbrkslu','\\u298E':'rbrksld','\\u298F':'lbrksld','\\u2990':'rbrkslu','\\u2991':'langd','\\u2992':'rangd','\\u2993':'lparlt','\\u2994':'rpargt','\\u2995':'gtlPar','\\u2996':'ltrPar','\\u27E6':'lobrk','\\u27E7':'robrk','\\u27E8':'lang','\\u27E9':'rang','\\u27EA':'Lang','\\u27EB':'Rang','\\u27EC':'loang','\\u27ED':'roang','\\u2772':'lbbrk','\\u2773':'rbbrk','\\u2016':'Vert','\\xA7':'sect','\\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\\u2030':'permil','\\u2031':'pertenk','\\u2020':'dagger','\\u2021':'Dagger','\\u2022':'bull','\\u2043':'hybull','\\u2032':'prime','\\u2033':'Prime','\\u2034':'tprime','\\u2057':'qprime','\\u2035':'bprime','\\u2041':'caret','`':'grave','\\xB4':'acute','\\u02DC':'tilde','^':'Hat','\\xAF':'macr','\\u02D8':'breve','\\u02D9':'dot','\\xA8':'die','\\u02DA':'ring','\\u02DD':'dblac','\\xB8':'cedil','\\u02DB':'ogon','\\u02C6':'circ','\\u02C7':'caron','\\xB0':'deg','\\xA9':'copy','\\xAE':'reg','\\u2117':'copysr','\\u2118':'wp','\\u211E':'rx','\\u2127':'mho','\\u2129':'iiota','\\u2190':'larr','\\u219A':'nlarr','\\u2192':'rarr','\\u219B':'nrarr','\\u2191':'uarr','\\u2193':'darr','\\u2194':'harr','\\u21AE':'nharr','\\u2195':'varr','\\u2196':'nwarr','\\u2197':'nearr','\\u2198':'searr','\\u2199':'swarr','\\u219D':'rarrw','\\u219D\\u0338':'nrarrw','\\u219E':'Larr','\\u219F':'Uarr','\\u21A0':'Rarr','\\u21A1':'Darr','\\u21A2':'larrtl','\\u21A3':'rarrtl','\\u21A4':'mapstoleft','\\u21A5':'mapstoup','\\u21A6':'map','\\u21A7':'mapstodown','\\u21A9':'larrhk','\\u21AA':'rarrhk','\\u21AB':'larrlp','\\u21AC':'rarrlp','\\u21AD':'harrw','\\u21B0':'lsh','\\u21B1':'rsh','\\u21B2':'ldsh','\\u21B3':'rdsh','\\u21B5':'crarr','\\u21B6':'cularr','\\u21B7':'curarr','\\u21BA':'olarr','\\u21BB':'orarr','\\u21BC':'lharu','\\u21BD':'lhard','\\u21BE':'uharr','\\u21BF':'uharl','\\u21C0':'rharu','\\u21C1':'rhard','\\u21C2':'dharr','\\u21C3':'dharl','\\u21C4':'rlarr','\\u21C5':'udarr','\\u21C6':'lrarr','\\u21C7':'llarr','\\u21C8':'uuarr','\\u21C9':'rrarr','\\u21CA':'ddarr','\\u21CB':'lrhar','\\u21CC':'rlhar','\\u21D0':'lArr','\\u21CD':'nlArr','\\u21D1':'uArr','\\u21D2':'rArr','\\u21CF':'nrArr','\\u21D3':'dArr','\\u21D4':'iff','\\u21CE':'nhArr','\\u21D5':'vArr','\\u21D6':'nwArr','\\u21D7':'neArr','\\u21D8':'seArr','\\u21D9':'swArr','\\u21DA':'lAarr','\\u21DB':'rAarr','\\u21DD':'zigrarr','\\u21E4':'larrb','\\u21E5':'rarrb','\\u21F5':'duarr','\\u21FD':'loarr','\\u21FE':'roarr','\\u21FF':'hoarr','\\u2200':'forall','\\u2201':'comp','\\u2202':'part','\\u2202\\u0338':'npart','\\u2203':'exist','\\u2204':'nexist','\\u2205':'empty','\\u2207':'Del','\\u2208':'in','\\u2209':'notin','\\u220B':'ni','\\u220C':'notni','\\u03F6':'bepsi','\\u220F':'prod','\\u2210':'coprod','\\u2211':'sum','+':'plus','\\xB1':'pm','\\xF7':'div','\\xD7':'times','<':'lt','\\u226E':'nlt','<\\u20D2':'nvlt','=':'equals','\\u2260':'ne','=\\u20E5':'bne','\\u2A75':'Equal','>':'gt','\\u226F':'ngt','>\\u20D2':'nvgt','\\xAC':'not','|':'vert','\\xA6':'brvbar','\\u2212':'minus','\\u2213':'mp','\\u2214':'plusdo','\\u2044':'frasl','\\u2216':'setmn','\\u2217':'lowast','\\u2218':'compfn','\\u221A':'Sqrt','\\u221D':'prop','\\u221E':'infin','\\u221F':'angrt','\\u2220':'ang','\\u2220\\u20D2':'nang','\\u2221':'angmsd','\\u2222':'angsph','\\u2223':'mid','\\u2224':'nmid','\\u2225':'par','\\u2226':'npar','\\u2227':'and','\\u2228':'or','\\u2229':'cap','\\u2229\\uFE00':'caps','\\u222A':'cup','\\u222A\\uFE00':'cups','\\u222B':'int','\\u222C':'Int','\\u222D':'tint','\\u2A0C':'qint','\\u222E':'oint','\\u222F':'Conint','\\u2230':'Cconint','\\u2231':'cwint','\\u2232':'cwconint','\\u2233':'awconint','\\u2234':'there4','\\u2235':'becaus','\\u2236':'ratio','\\u2237':'Colon','\\u2238':'minusd','\\u223A':'mDDot','\\u223B':'homtht','\\u223C':'sim','\\u2241':'nsim','\\u223C\\u20D2':'nvsim','\\u223D':'bsim','\\u223D\\u0331':'race','\\u223E':'ac','\\u223E\\u0333':'acE','\\u223F':'acd','\\u2240':'wr','\\u2242':'esim','\\u2242\\u0338':'nesim','\\u2243':'sime','\\u2244':'nsime','\\u2245':'cong','\\u2247':'ncong','\\u2246':'simne','\\u2248':'ap','\\u2249':'nap','\\u224A':'ape','\\u224B':'apid','\\u224B\\u0338':'napid','\\u224C':'bcong','\\u224D':'CupCap','\\u226D':'NotCupCap','\\u224D\\u20D2':'nvap','\\u224E':'bump','\\u224E\\u0338':'nbump','\\u224F':'bumpe','\\u224F\\u0338':'nbumpe','\\u2250':'doteq','\\u2250\\u0338':'nedot','\\u2251':'eDot','\\u2252':'efDot','\\u2253':'erDot','\\u2254':'colone','\\u2255':'ecolon','\\u2256':'ecir','\\u2257':'cire','\\u2259':'wedgeq','\\u225A':'veeeq','\\u225C':'trie','\\u225F':'equest','\\u2261':'equiv','\\u2262':'nequiv','\\u2261\\u20E5':'bnequiv','\\u2264':'le','\\u2270':'nle','\\u2264\\u20D2':'nvle','\\u2265':'ge','\\u2271':'nge','\\u2265\\u20D2':'nvge','\\u2266':'lE','\\u2266\\u0338':'nlE','\\u2267':'gE','\\u2267\\u0338':'ngE','\\u2268\\uFE00':'lvnE','\\u2268':'lnE','\\u2269':'gnE','\\u2269\\uFE00':'gvnE','\\u226A':'ll','\\u226A\\u0338':'nLtv','\\u226A\\u20D2':'nLt','\\u226B':'gg','\\u226B\\u0338':'nGtv','\\u226B\\u20D2':'nGt','\\u226C':'twixt','\\u2272':'lsim','\\u2274':'nlsim','\\u2273':'gsim','\\u2275':'ngsim','\\u2276':'lg','\\u2278':'ntlg','\\u2277':'gl','\\u2279':'ntgl','\\u227A':'pr','\\u2280':'npr','\\u227B':'sc','\\u2281':'nsc','\\u227C':'prcue','\\u22E0':'nprcue','\\u227D':'sccue','\\u22E1':'nsccue','\\u227E':'prsim','\\u227F':'scsim','\\u227F\\u0338':'NotSucceedsTilde','\\u2282':'sub','\\u2284':'nsub','\\u2282\\u20D2':'vnsub','\\u2283':'sup','\\u2285':'nsup','\\u2283\\u20D2':'vnsup','\\u2286':'sube','\\u2288':'nsube','\\u2287':'supe','\\u2289':'nsupe','\\u228A\\uFE00':'vsubne','\\u228A':'subne','\\u228B\\uFE00':'vsupne','\\u228B':'supne','\\u228D':'cupdot','\\u228E':'uplus','\\u228F':'sqsub','\\u228F\\u0338':'NotSquareSubset','\\u2290':'sqsup','\\u2290\\u0338':'NotSquareSuperset','\\u2291':'sqsube','\\u22E2':'nsqsube','\\u2292':'sqsupe','\\u22E3':'nsqsupe','\\u2293':'sqcap','\\u2293\\uFE00':'sqcaps','\\u2294':'sqcup','\\u2294\\uFE00':'sqcups','\\u2295':'oplus','\\u2296':'ominus','\\u2297':'otimes','\\u2298':'osol','\\u2299':'odot','\\u229A':'ocir','\\u229B':'oast','\\u229D':'odash','\\u229E':'plusb','\\u229F':'minusb','\\u22A0':'timesb','\\u22A1':'sdotb','\\u22A2':'vdash','\\u22AC':'nvdash','\\u22A3':'dashv','\\u22A4':'top','\\u22A5':'bot','\\u22A7':'models','\\u22A8':'vDash','\\u22AD':'nvDash','\\u22A9':'Vdash','\\u22AE':'nVdash','\\u22AA':'Vvdash','\\u22AB':'VDash','\\u22AF':'nVDash','\\u22B0':'prurel','\\u22B2':'vltri','\\u22EA':'nltri','\\u22B3':'vrtri','\\u22EB':'nrtri','\\u22B4':'ltrie','\\u22EC':'nltrie','\\u22B4\\u20D2':'nvltrie','\\u22B5':'rtrie','\\u22ED':'nrtrie','\\u22B5\\u20D2':'nvrtrie','\\u22B6':'origof','\\u22B7':'imof','\\u22B8':'mumap','\\u22B9':'hercon','\\u22BA':'intcal','\\u22BB':'veebar','\\u22BD':'barvee','\\u22BE':'angrtvb','\\u22BF':'lrtri','\\u22C0':'Wedge','\\u22C1':'Vee','\\u22C2':'xcap','\\u22C3':'xcup','\\u22C4':'diam','\\u22C5':'sdot','\\u22C6':'Star','\\u22C7':'divonx','\\u22C8':'bowtie','\\u22C9':'ltimes','\\u22CA':'rtimes','\\u22CB':'lthree','\\u22CC':'rthree','\\u22CD':'bsime','\\u22CE':'cuvee','\\u22CF':'cuwed','\\u22D0':'Sub','\\u22D1':'Sup','\\u22D2':'Cap','\\u22D3':'Cup','\\u22D4':'fork','\\u22D5':'epar','\\u22D6':'ltdot','\\u22D7':'gtdot','\\u22D8':'Ll','\\u22D8\\u0338':'nLl','\\u22D9':'Gg','\\u22D9\\u0338':'nGg','\\u22DA\\uFE00':'lesg','\\u22DA':'leg','\\u22DB':'gel','\\u22DB\\uFE00':'gesl','\\u22DE':'cuepr','\\u22DF':'cuesc','\\u22E6':'lnsim','\\u22E7':'gnsim','\\u22E8':'prnsim','\\u22E9':'scnsim','\\u22EE':'vellip','\\u22EF':'ctdot','\\u22F0':'utdot','\\u22F1':'dtdot','\\u22F2':'disin','\\u22F3':'isinsv','\\u22F4':'isins','\\u22F5':'isindot','\\u22F5\\u0338':'notindot','\\u22F6':'notinvc','\\u22F7':'notinvb','\\u22F9':'isinE','\\u22F9\\u0338':'notinE','\\u22FA':'nisd','\\u22FB':'xnis','\\u22FC':'nis','\\u22FD':'notnivc','\\u22FE':'notnivb','\\u2305':'barwed','\\u2306':'Barwed','\\u230C':'drcrop','\\u230D':'dlcrop','\\u230E':'urcrop','\\u230F':'ulcrop','\\u2310':'bnot','\\u2312':'profline','\\u2313':'profsurf','\\u2315':'telrec','\\u2316':'target','\\u231C':'ulcorn','\\u231D':'urcorn','\\u231E':'dlcorn','\\u231F':'drcorn','\\u2322':'frown','\\u2323':'smile','\\u232D':'cylcty','\\u232E':'profalar','\\u2336':'topbot','\\u233D':'ovbar','\\u233F':'solbar','\\u237C':'angzarr','\\u23B0':'lmoust','\\u23B1':'rmoust','\\u23B4':'tbrk','\\u23B5':'bbrk','\\u23B6':'bbrktbrk','\\u23DC':'OverParenthesis','\\u23DD':'UnderParenthesis','\\u23DE':'OverBrace','\\u23DF':'UnderBrace','\\u23E2':'trpezium','\\u23E7':'elinters','\\u2423':'blank','\\u2500':'boxh','\\u2502':'boxv','\\u250C':'boxdr','\\u2510':'boxdl','\\u2514':'boxur','\\u2518':'boxul','\\u251C':'boxvr','\\u2524':'boxvl','\\u252C':'boxhd','\\u2534':'boxhu','\\u253C':'boxvh','\\u2550':'boxH','\\u2551':'boxV','\\u2552':'boxdR','\\u2553':'boxDr','\\u2554':'boxDR','\\u2555':'boxdL','\\u2556':'boxDl','\\u2557':'boxDL','\\u2558':'boxuR','\\u2559':'boxUr','\\u255A':'boxUR','\\u255B':'boxuL','\\u255C':'boxUl','\\u255D':'boxUL','\\u255E':'boxvR','\\u255F':'boxVr','\\u2560':'boxVR','\\u2561':'boxvL','\\u2562':'boxVl','\\u2563':'boxVL','\\u2564':'boxHd','\\u2565':'boxhD','\\u2566':'boxHD','\\u2567':'boxHu','\\u2568':'boxhU','\\u2569':'boxHU','\\u256A':'boxvH','\\u256B':'boxVh','\\u256C':'boxVH','\\u2580':'uhblk','\\u2584':'lhblk','\\u2588':'block','\\u2591':'blk14','\\u2592':'blk12','\\u2593':'blk34','\\u25A1':'squ','\\u25AA':'squf','\\u25AB':'EmptyVerySmallSquare','\\u25AD':'rect','\\u25AE':'marker','\\u25B1':'fltns','\\u25B3':'xutri','\\u25B4':'utrif','\\u25B5':'utri','\\u25B8':'rtrif','\\u25B9':'rtri','\\u25BD':'xdtri','\\u25BE':'dtrif','\\u25BF':'dtri','\\u25C2':'ltrif','\\u25C3':'ltri','\\u25CA':'loz','\\u25CB':'cir','\\u25EC':'tridot','\\u25EF':'xcirc','\\u25F8':'ultri','\\u25F9':'urtri','\\u25FA':'lltri','\\u25FB':'EmptySmallSquare','\\u25FC':'FilledSmallSquare','\\u2605':'starf','\\u2606':'star','\\u260E':'phone','\\u2640':'female','\\u2642':'male','\\u2660':'spades','\\u2663':'clubs','\\u2665':'hearts','\\u2666':'diams','\\u266A':'sung','\\u2713':'check','\\u2717':'cross','\\u2720':'malt','\\u2736':'sext','\\u2758':'VerticalSeparator','\\u27C8':'bsolhsub','\\u27C9':'suphsol','\\u27F5':'xlarr','\\u27F6':'xrarr','\\u27F7':'xharr','\\u27F8':'xlArr','\\u27F9':'xrArr','\\u27FA':'xhArr','\\u27FC':'xmap','\\u27FF':'dzigrarr','\\u2902':'nvlArr','\\u2903':'nvrArr','\\u2904':'nvHarr','\\u2905':'Map','\\u290C':'lbarr','\\u290D':'rbarr','\\u290E':'lBarr','\\u290F':'rBarr','\\u2910':'RBarr','\\u2911':'DDotrahd','\\u2912':'UpArrowBar','\\u2913':'DownArrowBar','\\u2916':'Rarrtl','\\u2919':'latail','\\u291A':'ratail','\\u291B':'lAtail','\\u291C':'rAtail','\\u291D':'larrfs','\\u291E':'rarrfs','\\u291F':'larrbfs','\\u2920':'rarrbfs','\\u2923':'nwarhk','\\u2924':'nearhk','\\u2925':'searhk','\\u2926':'swarhk','\\u2927':'nwnear','\\u2928':'toea','\\u2929':'tosa','\\u292A':'swnwar','\\u2933':'rarrc','\\u2933\\u0338':'nrarrc','\\u2935':'cudarrr','\\u2936':'ldca','\\u2937':'rdca','\\u2938':'cudarrl','\\u2939':'larrpl','\\u293C':'curarrm','\\u293D':'cularrp','\\u2945':'rarrpl','\\u2948':'harrcir','\\u2949':'Uarrocir','\\u294A':'lurdshar','\\u294B':'ldrushar','\\u294E':'LeftRightVector','\\u294F':'RightUpDownVector','\\u2950':'DownLeftRightVector','\\u2951':'LeftUpDownVector','\\u2952':'LeftVectorBar','\\u2953':'RightVectorBar','\\u2954':'RightUpVectorBar','\\u2955':'RightDownVectorBar','\\u2956':'DownLeftVectorBar','\\u2957':'DownRightVectorBar','\\u2958':'LeftUpVectorBar','\\u2959':'LeftDownVectorBar','\\u295A':'LeftTeeVector','\\u295B':'RightTeeVector','\\u295C':'RightUpTeeVector','\\u295D':'RightDownTeeVector','\\u295E':'DownLeftTeeVector','\\u295F':'DownRightTeeVector','\\u2960':'LeftUpTeeVector','\\u2961':'LeftDownTeeVector','\\u2962':'lHar','\\u2963':'uHar','\\u2964':'rHar','\\u2965':'dHar','\\u2966':'luruhar','\\u2967':'ldrdhar','\\u2968':'ruluhar','\\u2969':'rdldhar','\\u296A':'lharul','\\u296B':'llhard','\\u296C':'rharul','\\u296D':'lrhard','\\u296E':'udhar','\\u296F':'duhar','\\u2970':'RoundImplies','\\u2971':'erarr','\\u2972':'simrarr','\\u2973':'larrsim','\\u2974':'rarrsim','\\u2975':'rarrap','\\u2976':'ltlarr','\\u2978':'gtrarr','\\u2979':'subrarr','\\u297B':'suplarr','\\u297C':'lfisht','\\u297D':'rfisht','\\u297E':'ufisht','\\u297F':'dfisht','\\u299A':'vzigzag','\\u299C':'vangrt','\\u299D':'angrtvbd','\\u29A4':'ange','\\u29A5':'range','\\u29A6':'dwangle','\\u29A7':'uwangle','\\u29A8':'angmsdaa','\\u29A9':'angmsdab','\\u29AA':'angmsdac','\\u29AB':'angmsdad','\\u29AC':'angmsdae','\\u29AD':'angmsdaf','\\u29AE':'angmsdag','\\u29AF':'angmsdah','\\u29B0':'bemptyv','\\u29B1':'demptyv','\\u29B2':'cemptyv','\\u29B3':'raemptyv','\\u29B4':'laemptyv','\\u29B5':'ohbar','\\u29B6':'omid','\\u29B7':'opar','\\u29B9':'operp','\\u29BB':'olcross','\\u29BC':'odsold','\\u29BE':'olcir','\\u29BF':'ofcir','\\u29C0':'olt','\\u29C1':'ogt','\\u29C2':'cirscir','\\u29C3':'cirE','\\u29C4':'solb','\\u29C5':'bsolb','\\u29C9':'boxbox','\\u29CD':'trisb','\\u29CE':'rtriltri','\\u29CF':'LeftTriangleBar','\\u29CF\\u0338':'NotLeftTriangleBar','\\u29D0':'RightTriangleBar','\\u29D0\\u0338':'NotRightTriangleBar','\\u29DC':'iinfin','\\u29DD':'infintie','\\u29DE':'nvinfin','\\u29E3':'eparsl','\\u29E4':'smeparsl','\\u29E5':'eqvparsl','\\u29EB':'lozf','\\u29F4':'RuleDelayed','\\u29F6':'dsol','\\u2A00':'xodot','\\u2A01':'xoplus','\\u2A02':'xotime','\\u2A04':'xuplus','\\u2A06':'xsqcup','\\u2A0D':'fpartint','\\u2A10':'cirfnint','\\u2A11':'awint','\\u2A12':'rppolint','\\u2A13':'scpolint','\\u2A14':'npolint','\\u2A15':'pointint','\\u2A16':'quatint','\\u2A17':'intlarhk','\\u2A22':'pluscir','\\u2A23':'plusacir','\\u2A24':'simplus','\\u2A25':'plusdu','\\u2A26':'plussim','\\u2A27':'plustwo','\\u2A29':'mcomma','\\u2A2A':'minusdu','\\u2A2D':'loplus','\\u2A2E':'roplus','\\u2A2F':'Cross','\\u2A30':'timesd','\\u2A31':'timesbar','\\u2A33':'smashp','\\u2A34':'lotimes','\\u2A35':'rotimes','\\u2A36':'otimesas','\\u2A37':'Otimes','\\u2A38':'odiv','\\u2A39':'triplus','\\u2A3A':'triminus','\\u2A3B':'tritime','\\u2A3C':'iprod','\\u2A3F':'amalg','\\u2A40':'capdot','\\u2A42':'ncup','\\u2A43':'ncap','\\u2A44':'capand','\\u2A45':'cupor','\\u2A46':'cupcap','\\u2A47':'capcup','\\u2A48':'cupbrcap','\\u2A49':'capbrcup','\\u2A4A':'cupcup','\\u2A4B':'capcap','\\u2A4C':'ccups','\\u2A4D':'ccaps','\\u2A50':'ccupssm','\\u2A53':'And','\\u2A54':'Or','\\u2A55':'andand','\\u2A56':'oror','\\u2A57':'orslope','\\u2A58':'andslope','\\u2A5A':'andv','\\u2A5B':'orv','\\u2A5C':'andd','\\u2A5D':'ord','\\u2A5F':'wedbar','\\u2A66':'sdote','\\u2A6A':'simdot','\\u2A6D':'congdot','\\u2A6D\\u0338':'ncongdot','\\u2A6E':'easter','\\u2A6F':'apacir','\\u2A70':'apE','\\u2A70\\u0338':'napE','\\u2A71':'eplus','\\u2A72':'pluse','\\u2A73':'Esim','\\u2A77':'eDDot','\\u2A78':'equivDD','\\u2A79':'ltcir','\\u2A7A':'gtcir','\\u2A7B':'ltquest','\\u2A7C':'gtquest','\\u2A7D':'les','\\u2A7D\\u0338':'nles','\\u2A7E':'ges','\\u2A7E\\u0338':'nges','\\u2A7F':'lesdot','\\u2A80':'gesdot','\\u2A81':'lesdoto','\\u2A82':'gesdoto','\\u2A83':'lesdotor','\\u2A84':'gesdotol','\\u2A85':'lap','\\u2A86':'gap','\\u2A87':'lne','\\u2A88':'gne','\\u2A89':'lnap','\\u2A8A':'gnap','\\u2A8B':'lEg','\\u2A8C':'gEl','\\u2A8D':'lsime','\\u2A8E':'gsime','\\u2A8F':'lsimg','\\u2A90':'gsiml','\\u2A91':'lgE','\\u2A92':'glE','\\u2A93':'lesges','\\u2A94':'gesles','\\u2A95':'els','\\u2A96':'egs','\\u2A97':'elsdot','\\u2A98':'egsdot','\\u2A99':'el','\\u2A9A':'eg','\\u2A9D':'siml','\\u2A9E':'simg','\\u2A9F':'simlE','\\u2AA0':'simgE','\\u2AA1':'LessLess','\\u2AA1\\u0338':'NotNestedLessLess','\\u2AA2':'GreaterGreater','\\u2AA2\\u0338':'NotNestedGreaterGreater','\\u2AA4':'glj','\\u2AA5':'gla','\\u2AA6':'ltcc','\\u2AA7':'gtcc','\\u2AA8':'lescc','\\u2AA9':'gescc','\\u2AAA':'smt','\\u2AAB':'lat','\\u2AAC':'smte','\\u2AAC\\uFE00':'smtes','\\u2AAD':'late','\\u2AAD\\uFE00':'lates','\\u2AAE':'bumpE','\\u2AAF':'pre','\\u2AAF\\u0338':'npre','\\u2AB0':'sce','\\u2AB0\\u0338':'nsce','\\u2AB3':'prE','\\u2AB4':'scE','\\u2AB5':'prnE','\\u2AB6':'scnE','\\u2AB7':'prap','\\u2AB8':'scap','\\u2AB9':'prnap','\\u2ABA':'scnap','\\u2ABB':'Pr','\\u2ABC':'Sc','\\u2ABD':'subdot','\\u2ABE':'supdot','\\u2ABF':'subplus','\\u2AC0':'supplus','\\u2AC1':'submult','\\u2AC2':'supmult','\\u2AC3':'subedot','\\u2AC4':'supedot','\\u2AC5':'subE','\\u2AC5\\u0338':'nsubE','\\u2AC6':'supE','\\u2AC6\\u0338':'nsupE','\\u2AC7':'subsim','\\u2AC8':'supsim','\\u2ACB\\uFE00':'vsubnE','\\u2ACB':'subnE','\\u2ACC\\uFE00':'vsupnE','\\u2ACC':'supnE','\\u2ACF':'csub','\\u2AD0':'csup','\\u2AD1':'csube','\\u2AD2':'csupe','\\u2AD3':'subsup','\\u2AD4':'supsub','\\u2AD5':'subsub','\\u2AD6':'supsup','\\u2AD7':'suphsub','\\u2AD8':'supdsub','\\u2AD9':'forkv','\\u2ADA':'topfork','\\u2ADB':'mlcp','\\u2AE4':'Dashv','\\u2AE6':'Vdashl','\\u2AE7':'Barv','\\u2AE8':'vBar','\\u2AE9':'vBarv','\\u2AEB':'Vbar','\\u2AEC':'Not','\\u2AED':'bNot','\\u2AEE':'rnmid','\\u2AEF':'cirmid','\\u2AF0':'midcir','\\u2AF1':'topcir','\\u2AF2':'nhpar','\\u2AF3':'parsim','\\u2AFD':'parsl','\\u2AFD\\u20E5':'nparsl','\\u266D':'flat','\\u266E':'natur','\\u266F':'sharp','\\xA4':'curren','\\xA2':'cent','$':'dollar','\\xA3':'pound','\\xA5':'yen','\\u20AC':'euro','\\xB9':'sup1','\\xBD':'half','\\u2153':'frac13','\\xBC':'frac14','\\u2155':'frac15','\\u2159':'frac16','\\u215B':'frac18','\\xB2':'sup2','\\u2154':'frac23','\\u2156':'frac25','\\xB3':'sup3','\\xBE':'frac34','\\u2157':'frac35','\\u215C':'frac38','\\u2158':'frac45','\\u215A':'frac56','\\u215D':'frac58','\\u215E':'frac78','\\uD835\\uDCB6':'ascr','\\uD835\\uDD52':'aopf','\\uD835\\uDD1E':'afr','\\uD835\\uDD38':'Aopf','\\uD835\\uDD04':'Afr','\\uD835\\uDC9C':'Ascr','\\xAA':'ordf','\\xE1':'aacute','\\xC1':'Aacute','\\xE0':'agrave','\\xC0':'Agrave','\\u0103':'abreve','\\u0102':'Abreve','\\xE2':'acirc','\\xC2':'Acirc','\\xE5':'aring','\\xC5':'angst','\\xE4':'auml','\\xC4':'Auml','\\xE3':'atilde','\\xC3':'Atilde','\\u0105':'aogon','\\u0104':'Aogon','\\u0101':'amacr','\\u0100':'Amacr','\\xE6':'aelig','\\xC6':'AElig','\\uD835\\uDCB7':'bscr','\\uD835\\uDD53':'bopf','\\uD835\\uDD1F':'bfr','\\uD835\\uDD39':'Bopf','\\u212C':'Bscr','\\uD835\\uDD05':'Bfr','\\uD835\\uDD20':'cfr','\\uD835\\uDCB8':'cscr','\\uD835\\uDD54':'copf','\\u212D':'Cfr','\\uD835\\uDC9E':'Cscr','\\u2102':'Copf','\\u0107':'cacute','\\u0106':'Cacute','\\u0109':'ccirc','\\u0108':'Ccirc','\\u010D':'ccaron','\\u010C':'Ccaron','\\u010B':'cdot','\\u010A':'Cdot','\\xE7':'ccedil','\\xC7':'Ccedil','\\u2105':'incare','\\uD835\\uDD21':'dfr','\\u2146':'dd','\\uD835\\uDD55':'dopf','\\uD835\\uDCB9':'dscr','\\uD835\\uDC9F':'Dscr','\\uD835\\uDD07':'Dfr','\\u2145':'DD','\\uD835\\uDD3B':'Dopf','\\u010F':'dcaron','\\u010E':'Dcaron','\\u0111':'dstrok','\\u0110':'Dstrok','\\xF0':'eth','\\xD0':'ETH','\\u2147':'ee','\\u212F':'escr','\\uD835\\uDD22':'efr','\\uD835\\uDD56':'eopf','\\u2130':'Escr','\\uD835\\uDD08':'Efr','\\uD835\\uDD3C':'Eopf','\\xE9':'eacute','\\xC9':'Eacute','\\xE8':'egrave','\\xC8':'Egrave','\\xEA':'ecirc','\\xCA':'Ecirc','\\u011B':'ecaron','\\u011A':'Ecaron','\\xEB':'euml','\\xCB':'Euml','\\u0117':'edot','\\u0116':'Edot','\\u0119':'eogon','\\u0118':'Eogon','\\u0113':'emacr','\\u0112':'Emacr','\\uD835\\uDD23':'ffr','\\uD835\\uDD57':'fopf','\\uD835\\uDCBB':'fscr','\\uD835\\uDD09':'Ffr','\\uD835\\uDD3D':'Fopf','\\u2131':'Fscr','\\uFB00':'fflig','\\uFB03':'ffilig','\\uFB04':'ffllig','\\uFB01':'filig','fj':'fjlig','\\uFB02':'fllig','\\u0192':'fnof','\\u210A':'gscr','\\uD835\\uDD58':'gopf','\\uD835\\uDD24':'gfr','\\uD835\\uDCA2':'Gscr','\\uD835\\uDD3E':'Gopf','\\uD835\\uDD0A':'Gfr','\\u01F5':'gacute','\\u011F':'gbreve','\\u011E':'Gbreve','\\u011D':'gcirc','\\u011C':'Gcirc','\\u0121':'gdot','\\u0120':'Gdot','\\u0122':'Gcedil','\\uD835\\uDD25':'hfr','\\u210E':'planckh','\\uD835\\uDCBD':'hscr','\\uD835\\uDD59':'hopf','\\u210B':'Hscr','\\u210C':'Hfr','\\u210D':'Hopf','\\u0125':'hcirc','\\u0124':'Hcirc','\\u210F':'hbar','\\u0127':'hstrok','\\u0126':'Hstrok','\\uD835\\uDD5A':'iopf','\\uD835\\uDD26':'ifr','\\uD835\\uDCBE':'iscr','\\u2148':'ii','\\uD835\\uDD40':'Iopf','\\u2110':'Iscr','\\u2111':'Im','\\xED':'iacute','\\xCD':'Iacute','\\xEC':'igrave','\\xCC':'Igrave','\\xEE':'icirc','\\xCE':'Icirc','\\xEF':'iuml','\\xCF':'Iuml','\\u0129':'itilde','\\u0128':'Itilde','\\u0130':'Idot','\\u012F':'iogon','\\u012E':'Iogon','\\u012B':'imacr','\\u012A':'Imacr','\\u0133':'ijlig','\\u0132':'IJlig','\\u0131':'imath','\\uD835\\uDCBF':'jscr','\\uD835\\uDD5B':'jopf','\\uD835\\uDD27':'jfr','\\uD835\\uDCA5':'Jscr','\\uD835\\uDD0D':'Jfr','\\uD835\\uDD41':'Jopf','\\u0135':'jcirc','\\u0134':'Jcirc','\\u0237':'jmath','\\uD835\\uDD5C':'kopf','\\uD835\\uDCC0':'kscr','\\uD835\\uDD28':'kfr','\\uD835\\uDCA6':'Kscr','\\uD835\\uDD42':'Kopf','\\uD835\\uDD0E':'Kfr','\\u0137':'kcedil','\\u0136':'Kcedil','\\uD835\\uDD29':'lfr','\\uD835\\uDCC1':'lscr','\\u2113':'ell','\\uD835\\uDD5D':'lopf','\\u2112':'Lscr','\\uD835\\uDD0F':'Lfr','\\uD835\\uDD43':'Lopf','\\u013A':'lacute','\\u0139':'Lacute','\\u013E':'lcaron','\\u013D':'Lcaron','\\u013C':'lcedil','\\u013B':'Lcedil','\\u0142':'lstrok','\\u0141':'Lstrok','\\u0140':'lmidot','\\u013F':'Lmidot','\\uD835\\uDD2A':'mfr','\\uD835\\uDD5E':'mopf','\\uD835\\uDCC2':'mscr','\\uD835\\uDD10':'Mfr','\\uD835\\uDD44':'Mopf','\\u2133':'Mscr','\\uD835\\uDD2B':'nfr','\\uD835\\uDD5F':'nopf','\\uD835\\uDCC3':'nscr','\\u2115':'Nopf','\\uD835\\uDCA9':'Nscr','\\uD835\\uDD11':'Nfr','\\u0144':'nacute','\\u0143':'Nacute','\\u0148':'ncaron','\\u0147':'Ncaron','\\xF1':'ntilde','\\xD1':'Ntilde','\\u0146':'ncedil','\\u0145':'Ncedil','\\u2116':'numero','\\u014B':'eng','\\u014A':'ENG','\\uD835\\uDD60':'oopf','\\uD835\\uDD2C':'ofr','\\u2134':'oscr','\\uD835\\uDCAA':'Oscr','\\uD835\\uDD12':'Ofr','\\uD835\\uDD46':'Oopf','\\xBA':'ordm','\\xF3':'oacute','\\xD3':'Oacute','\\xF2':'ograve','\\xD2':'Ograve','\\xF4':'ocirc','\\xD4':'Ocirc','\\xF6':'ouml','\\xD6':'Ouml','\\u0151':'odblac','\\u0150':'Odblac','\\xF5':'otilde','\\xD5':'Otilde','\\xF8':'oslash','\\xD8':'Oslash','\\u014D':'omacr','\\u014C':'Omacr','\\u0153':'oelig','\\u0152':'OElig','\\uD835\\uDD2D':'pfr','\\uD835\\uDCC5':'pscr','\\uD835\\uDD61':'popf','\\u2119':'Popf','\\uD835\\uDD13':'Pfr','\\uD835\\uDCAB':'Pscr','\\uD835\\uDD62':'qopf','\\uD835\\uDD2E':'qfr','\\uD835\\uDCC6':'qscr','\\uD835\\uDCAC':'Qscr','\\uD835\\uDD14':'Qfr','\\u211A':'Qopf','\\u0138':'kgreen','\\uD835\\uDD2F':'rfr','\\uD835\\uDD63':'ropf','\\uD835\\uDCC7':'rscr','\\u211B':'Rscr','\\u211C':'Re','\\u211D':'Ropf','\\u0155':'racute','\\u0154':'Racute','\\u0159':'rcaron','\\u0158':'Rcaron','\\u0157':'rcedil','\\u0156':'Rcedil','\\uD835\\uDD64':'sopf','\\uD835\\uDCC8':'sscr','\\uD835\\uDD30':'sfr','\\uD835\\uDD4A':'Sopf','\\uD835\\uDD16':'Sfr','\\uD835\\uDCAE':'Sscr','\\u24C8':'oS','\\u015B':'sacute','\\u015A':'Sacute','\\u015D':'scirc','\\u015C':'Scirc','\\u0161':'scaron','\\u0160':'Scaron','\\u015F':'scedil','\\u015E':'Scedil','\\xDF':'szlig','\\uD835\\uDD31':'tfr','\\uD835\\uDCC9':'tscr','\\uD835\\uDD65':'topf','\\uD835\\uDCAF':'Tscr','\\uD835\\uDD17':'Tfr','\\uD835\\uDD4B':'Topf','\\u0165':'tcaron','\\u0164':'Tcaron','\\u0163':'tcedil','\\u0162':'Tcedil','\\u2122':'trade','\\u0167':'tstrok','\\u0166':'Tstrok','\\uD835\\uDCCA':'uscr','\\uD835\\uDD66':'uopf','\\uD835\\uDD32':'ufr','\\uD835\\uDD4C':'Uopf','\\uD835\\uDD18':'Ufr','\\uD835\\uDCB0':'Uscr','\\xFA':'uacute','\\xDA':'Uacute','\\xF9':'ugrave','\\xD9':'Ugrave','\\u016D':'ubreve','\\u016C':'Ubreve','\\xFB':'ucirc','\\xDB':'Ucirc','\\u016F':'uring','\\u016E':'Uring','\\xFC':'uuml','\\xDC':'Uuml','\\u0171':'udblac','\\u0170':'Udblac','\\u0169':'utilde','\\u0168':'Utilde','\\u0173':'uogon','\\u0172':'Uogon','\\u016B':'umacr','\\u016A':'Umacr','\\uD835\\uDD33':'vfr','\\uD835\\uDD67':'vopf','\\uD835\\uDCCB':'vscr','\\uD835\\uDD19':'Vfr','\\uD835\\uDD4D':'Vopf','\\uD835\\uDCB1':'Vscr','\\uD835\\uDD68':'wopf','\\uD835\\uDCCC':'wscr','\\uD835\\uDD34':'wfr','\\uD835\\uDCB2':'Wscr','\\uD835\\uDD4E':'Wopf','\\uD835\\uDD1A':'Wfr','\\u0175':'wcirc','\\u0174':'Wcirc','\\uD835\\uDD35':'xfr','\\uD835\\uDCCD':'xscr','\\uD835\\uDD69':'xopf','\\uD835\\uDD4F':'Xopf','\\uD835\\uDD1B':'Xfr','\\uD835\\uDCB3':'Xscr','\\uD835\\uDD36':'yfr','\\uD835\\uDCCE':'yscr','\\uD835\\uDD6A':'yopf','\\uD835\\uDCB4':'Yscr','\\uD835\\uDD1C':'Yfr','\\uD835\\uDD50':'Yopf','\\xFD':'yacute','\\xDD':'Yacute','\\u0177':'ycirc','\\u0176':'Ycirc','\\xFF':'yuml','\\u0178':'Yuml','\\uD835\\uDCCF':'zscr','\\uD835\\uDD37':'zfr','\\uD835\\uDD6B':'zopf','\\u2128':'Zfr','\\u2124':'Zopf','\\uD835\\uDCB5':'Zscr','\\u017A':'zacute','\\u0179':'Zacute','\\u017E':'zcaron','\\u017D':'Zcaron','\\u017C':'zdot','\\u017B':'Zdot','\\u01B5':'imped','\\xFE':'thorn','\\xDE':'THORN','\\u0149':'napos','\\u03B1':'alpha','\\u0391':'Alpha','\\u03B2':'beta','\\u0392':'Beta','\\u03B3':'gamma','\\u0393':'Gamma','\\u03B4':'delta','\\u0394':'Delta','\\u03B5':'epsi','\\u03F5':'epsiv','\\u0395':'Epsilon','\\u03DD':'gammad','\\u03DC':'Gammad','\\u03B6':'zeta','\\u0396':'Zeta','\\u03B7':'eta','\\u0397':'Eta','\\u03B8':'theta','\\u03D1':'thetav','\\u0398':'Theta','\\u03B9':'iota','\\u0399':'Iota','\\u03BA':'kappa','\\u03F0':'kappav','\\u039A':'Kappa','\\u03BB':'lambda','\\u039B':'Lambda','\\u03BC':'mu','\\xB5':'micro','\\u039C':'Mu','\\u03BD':'nu','\\u039D':'Nu','\\u03BE':'xi','\\u039E':'Xi','\\u03BF':'omicron','\\u039F':'Omicron','\\u03C0':'pi','\\u03D6':'piv','\\u03A0':'Pi','\\u03C1':'rho','\\u03F1':'rhov','\\u03A1':'Rho','\\u03C3':'sigma','\\u03A3':'Sigma','\\u03C2':'sigmaf','\\u03C4':'tau','\\u03A4':'Tau','\\u03C5':'upsi','\\u03A5':'Upsilon','\\u03D2':'Upsi','\\u03C6':'phi','\\u03D5':'phiv','\\u03A6':'Phi','\\u03C7':'chi','\\u03A7':'Chi','\\u03C8':'psi','\\u03A8':'Psi','\\u03C9':'omega','\\u03A9':'ohm','\\u0430':'acy','\\u0410':'Acy','\\u0431':'bcy','\\u0411':'Bcy','\\u0432':'vcy','\\u0412':'Vcy','\\u0433':'gcy','\\u0413':'Gcy','\\u0453':'gjcy','\\u0403':'GJcy','\\u0434':'dcy','\\u0414':'Dcy','\\u0452':'djcy','\\u0402':'DJcy','\\u0435':'iecy','\\u0415':'IEcy','\\u0451':'iocy','\\u0401':'IOcy','\\u0454':'jukcy','\\u0404':'Jukcy','\\u0436':'zhcy','\\u0416':'ZHcy','\\u0437':'zcy','\\u0417':'Zcy','\\u0455':'dscy','\\u0405':'DScy','\\u0438':'icy','\\u0418':'Icy','\\u0456':'iukcy','\\u0406':'Iukcy','\\u0457':'yicy','\\u0407':'YIcy','\\u0439':'jcy','\\u0419':'Jcy','\\u0458':'jsercy','\\u0408':'Jsercy','\\u043A':'kcy','\\u041A':'Kcy','\\u045C':'kjcy','\\u040C':'KJcy','\\u043B':'lcy','\\u041B':'Lcy','\\u0459':'ljcy','\\u0409':'LJcy','\\u043C':'mcy','\\u041C':'Mcy','\\u043D':'ncy','\\u041D':'Ncy','\\u045A':'njcy','\\u040A':'NJcy','\\u043E':'ocy','\\u041E':'Ocy','\\u043F':'pcy','\\u041F':'Pcy','\\u0440':'rcy','\\u0420':'Rcy','\\u0441':'scy','\\u0421':'Scy','\\u0442':'tcy','\\u0422':'Tcy','\\u045B':'tshcy','\\u040B':'TSHcy','\\u0443':'ucy','\\u0423':'Ucy','\\u045E':'ubrcy','\\u040E':'Ubrcy','\\u0444':'fcy','\\u0424':'Fcy','\\u0445':'khcy','\\u0425':'KHcy','\\u0446':'tscy','\\u0426':'TScy','\\u0447':'chcy','\\u0427':'CHcy','\\u045F':'dzcy','\\u040F':'DZcy','\\u0448':'shcy','\\u0428':'SHcy','\\u0449':'shchcy','\\u0429':'SHCHcy','\\u044A':'hardcy','\\u042A':'HARDcy','\\u044B':'ycy','\\u042B':'Ycy','\\u044C':'softcy','\\u042C':'SOFTcy','\\u044D':'ecy','\\u042D':'Ecy','\\u044E':'yucy','\\u042E':'YUcy','\\u044F':'yacy','\\u042F':'YAcy','\\u2135':'aleph','\\u2136':'beth','\\u2137':'gimel','\\u2138':'daleth'};\n\n\tvar regexEscape = /[\"&'<>`]/g;\n\tvar escapeMap = {\n\t\t'\"': '&quot;',\n\t\t'&': '&amp;',\n\t\t'\\'': '&#x27;',\n\t\t'<': '&lt;',\n\t\t// See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the\n\t\t// following is not strictly necessary unless it’s part of a tag or an\n\t\t// unquoted attribute value. We’re only escaping it to support those\n\t\t// situations, and for XML support.\n\t\t'>': '&gt;',\n\t\t// In Internet Explorer ≤ 8, the backtick character can be used\n\t\t// to break out of (un)quoted attribute values or HTML comments.\n\t\t// See http://html5sec.org/#102, http://html5sec.org/#108, and\n\t\t// http://html5sec.org/#133.\n\t\t'`': '&#x60;'\n\t};\n\n\tvar regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;\n\tvar regexInvalidRawCodePoint = /[\\0-\\x08\\x0B\\x0E-\\x1F\\x7F-\\x9F\\uFDD0-\\uFDEF\\uFFFE\\uFFFF]|[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n\tvar regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g;\n\tvar decodeMap = {'aacute':'\\xE1','Aacute':'\\xC1','abreve':'\\u0103','Abreve':'\\u0102','ac':'\\u223E','acd':'\\u223F','acE':'\\u223E\\u0333','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','acy':'\\u0430','Acy':'\\u0410','aelig':'\\xE6','AElig':'\\xC6','af':'\\u2061','afr':'\\uD835\\uDD1E','Afr':'\\uD835\\uDD04','agrave':'\\xE0','Agrave':'\\xC0','alefsym':'\\u2135','aleph':'\\u2135','alpha':'\\u03B1','Alpha':'\\u0391','amacr':'\\u0101','Amacr':'\\u0100','amalg':'\\u2A3F','amp':'&','AMP':'&','and':'\\u2227','And':'\\u2A53','andand':'\\u2A55','andd':'\\u2A5C','andslope':'\\u2A58','andv':'\\u2A5A','ang':'\\u2220','ange':'\\u29A4','angle':'\\u2220','angmsd':'\\u2221','angmsdaa':'\\u29A8','angmsdab':'\\u29A9','angmsdac':'\\u29AA','angmsdad':'\\u29AB','angmsdae':'\\u29AC','angmsdaf':'\\u29AD','angmsdag':'\\u29AE','angmsdah':'\\u29AF','angrt':'\\u221F','angrtvb':'\\u22BE','angrtvbd':'\\u299D','angsph':'\\u2222','angst':'\\xC5','angzarr':'\\u237C','aogon':'\\u0105','Aogon':'\\u0104','aopf':'\\uD835\\uDD52','Aopf':'\\uD835\\uDD38','ap':'\\u2248','apacir':'\\u2A6F','ape':'\\u224A','apE':'\\u2A70','apid':'\\u224B','apos':'\\'','ApplyFunction':'\\u2061','approx':'\\u2248','approxeq':'\\u224A','aring':'\\xE5','Aring':'\\xC5','ascr':'\\uD835\\uDCB6','Ascr':'\\uD835\\uDC9C','Assign':'\\u2254','ast':'*','asymp':'\\u2248','asympeq':'\\u224D','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','awconint':'\\u2233','awint':'\\u2A11','backcong':'\\u224C','backepsilon':'\\u03F6','backprime':'\\u2035','backsim':'\\u223D','backsimeq':'\\u22CD','Backslash':'\\u2216','Barv':'\\u2AE7','barvee':'\\u22BD','barwed':'\\u2305','Barwed':'\\u2306','barwedge':'\\u2305','bbrk':'\\u23B5','bbrktbrk':'\\u23B6','bcong':'\\u224C','bcy':'\\u0431','Bcy':'\\u0411','bdquo':'\\u201E','becaus':'\\u2235','because':'\\u2235','Because':'\\u2235','bemptyv':'\\u29B0','bepsi':'\\u03F6','bernou':'\\u212C','Bernoullis':'\\u212C','beta':'\\u03B2','Beta':'\\u0392','beth':'\\u2136','between':'\\u226C','bfr':'\\uD835\\uDD1F','Bfr':'\\uD835\\uDD05','bigcap':'\\u22C2','bigcirc':'\\u25EF','bigcup':'\\u22C3','bigodot':'\\u2A00','bigoplus':'\\u2A01','bigotimes':'\\u2A02','bigsqcup':'\\u2A06','bigstar':'\\u2605','bigtriangledown':'\\u25BD','bigtriangleup':'\\u25B3','biguplus':'\\u2A04','bigvee':'\\u22C1','bigwedge':'\\u22C0','bkarow':'\\u290D','blacklozenge':'\\u29EB','blacksquare':'\\u25AA','blacktriangle':'\\u25B4','blacktriangledown':'\\u25BE','blacktriangleleft':'\\u25C2','blacktriangleright':'\\u25B8','blank':'\\u2423','blk12':'\\u2592','blk14':'\\u2591','blk34':'\\u2593','block':'\\u2588','bne':'=\\u20E5','bnequiv':'\\u2261\\u20E5','bnot':'\\u2310','bNot':'\\u2AED','bopf':'\\uD835\\uDD53','Bopf':'\\uD835\\uDD39','bot':'\\u22A5','bottom':'\\u22A5','bowtie':'\\u22C8','boxbox':'\\u29C9','boxdl':'\\u2510','boxdL':'\\u2555','boxDl':'\\u2556','boxDL':'\\u2557','boxdr':'\\u250C','boxdR':'\\u2552','boxDr':'\\u2553','boxDR':'\\u2554','boxh':'\\u2500','boxH':'\\u2550','boxhd':'\\u252C','boxhD':'\\u2565','boxHd':'\\u2564','boxHD':'\\u2566','boxhu':'\\u2534','boxhU':'\\u2568','boxHu':'\\u2567','boxHU':'\\u2569','boxminus':'\\u229F','boxplus':'\\u229E','boxtimes':'\\u22A0','boxul':'\\u2518','boxuL':'\\u255B','boxUl':'\\u255C','boxUL':'\\u255D','boxur':'\\u2514','boxuR':'\\u2558','boxUr':'\\u2559','boxUR':'\\u255A','boxv':'\\u2502','boxV':'\\u2551','boxvh':'\\u253C','boxvH':'\\u256A','boxVh':'\\u256B','boxVH':'\\u256C','boxvl':'\\u2524','boxvL':'\\u2561','boxVl':'\\u2562','boxVL':'\\u2563','boxvr':'\\u251C','boxvR':'\\u255E','boxVr':'\\u255F','boxVR':'\\u2560','bprime':'\\u2035','breve':'\\u02D8','Breve':'\\u02D8','brvbar':'\\xA6','bscr':'\\uD835\\uDCB7','Bscr':'\\u212C','bsemi':'\\u204F','bsim':'\\u223D','bsime':'\\u22CD','bsol':'\\\\','bsolb':'\\u29C5','bsolhsub':'\\u27C8','bull':'\\u2022','bullet':'\\u2022','bump':'\\u224E','bumpe':'\\u224F','bumpE':'\\u2AAE','bumpeq':'\\u224F','Bumpeq':'\\u224E','cacute':'\\u0107','Cacute':'\\u0106','cap':'\\u2229','Cap':'\\u22D2','capand':'\\u2A44','capbrcup':'\\u2A49','capcap':'\\u2A4B','capcup':'\\u2A47','capdot':'\\u2A40','CapitalDifferentialD':'\\u2145','caps':'\\u2229\\uFE00','caret':'\\u2041','caron':'\\u02C7','Cayleys':'\\u212D','ccaps':'\\u2A4D','ccaron':'\\u010D','Ccaron':'\\u010C','ccedil':'\\xE7','Ccedil':'\\xC7','ccirc':'\\u0109','Ccirc':'\\u0108','Cconint':'\\u2230','ccups':'\\u2A4C','ccupssm':'\\u2A50','cdot':'\\u010B','Cdot':'\\u010A','cedil':'\\xB8','Cedilla':'\\xB8','cemptyv':'\\u29B2','cent':'\\xA2','centerdot':'\\xB7','CenterDot':'\\xB7','cfr':'\\uD835\\uDD20','Cfr':'\\u212D','chcy':'\\u0447','CHcy':'\\u0427','check':'\\u2713','checkmark':'\\u2713','chi':'\\u03C7','Chi':'\\u03A7','cir':'\\u25CB','circ':'\\u02C6','circeq':'\\u2257','circlearrowleft':'\\u21BA','circlearrowright':'\\u21BB','circledast':'\\u229B','circledcirc':'\\u229A','circleddash':'\\u229D','CircleDot':'\\u2299','circledR':'\\xAE','circledS':'\\u24C8','CircleMinus':'\\u2296','CirclePlus':'\\u2295','CircleTimes':'\\u2297','cire':'\\u2257','cirE':'\\u29C3','cirfnint':'\\u2A10','cirmid':'\\u2AEF','cirscir':'\\u29C2','ClockwiseContourIntegral':'\\u2232','CloseCurlyDoubleQuote':'\\u201D','CloseCurlyQuote':'\\u2019','clubs':'\\u2663','clubsuit':'\\u2663','colon':':','Colon':'\\u2237','colone':'\\u2254','Colone':'\\u2A74','coloneq':'\\u2254','comma':',','commat':'@','comp':'\\u2201','compfn':'\\u2218','complement':'\\u2201','complexes':'\\u2102','cong':'\\u2245','congdot':'\\u2A6D','Congruent':'\\u2261','conint':'\\u222E','Conint':'\\u222F','ContourIntegral':'\\u222E','copf':'\\uD835\\uDD54','Copf':'\\u2102','coprod':'\\u2210','Coproduct':'\\u2210','copy':'\\xA9','COPY':'\\xA9','copysr':'\\u2117','CounterClockwiseContourIntegral':'\\u2233','crarr':'\\u21B5','cross':'\\u2717','Cross':'\\u2A2F','cscr':'\\uD835\\uDCB8','Cscr':'\\uD835\\uDC9E','csub':'\\u2ACF','csube':'\\u2AD1','csup':'\\u2AD0','csupe':'\\u2AD2','ctdot':'\\u22EF','cudarrl':'\\u2938','cudarrr':'\\u2935','cuepr':'\\u22DE','cuesc':'\\u22DF','cularr':'\\u21B6','cularrp':'\\u293D','cup':'\\u222A','Cup':'\\u22D3','cupbrcap':'\\u2A48','cupcap':'\\u2A46','CupCap':'\\u224D','cupcup':'\\u2A4A','cupdot':'\\u228D','cupor':'\\u2A45','cups':'\\u222A\\uFE00','curarr':'\\u21B7','curarrm':'\\u293C','curlyeqprec':'\\u22DE','curlyeqsucc':'\\u22DF','curlyvee':'\\u22CE','curlywedge':'\\u22CF','curren':'\\xA4','curvearrowleft':'\\u21B6','curvearrowright':'\\u21B7','cuvee':'\\u22CE','cuwed':'\\u22CF','cwconint':'\\u2232','cwint':'\\u2231','cylcty':'\\u232D','dagger':'\\u2020','Dagger':'\\u2021','daleth':'\\u2138','darr':'\\u2193','dArr':'\\u21D3','Darr':'\\u21A1','dash':'\\u2010','dashv':'\\u22A3','Dashv':'\\u2AE4','dbkarow':'\\u290F','dblac':'\\u02DD','dcaron':'\\u010F','Dcaron':'\\u010E','dcy':'\\u0434','Dcy':'\\u0414','dd':'\\u2146','DD':'\\u2145','ddagger':'\\u2021','ddarr':'\\u21CA','DDotrahd':'\\u2911','ddotseq':'\\u2A77','deg':'\\xB0','Del':'\\u2207','delta':'\\u03B4','Delta':'\\u0394','demptyv':'\\u29B1','dfisht':'\\u297F','dfr':'\\uD835\\uDD21','Dfr':'\\uD835\\uDD07','dHar':'\\u2965','dharl':'\\u21C3','dharr':'\\u21C2','DiacriticalAcute':'\\xB4','DiacriticalDot':'\\u02D9','DiacriticalDoubleAcute':'\\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\\u02DC','diam':'\\u22C4','diamond':'\\u22C4','Diamond':'\\u22C4','diamondsuit':'\\u2666','diams':'\\u2666','die':'\\xA8','DifferentialD':'\\u2146','digamma':'\\u03DD','disin':'\\u22F2','div':'\\xF7','divide':'\\xF7','divideontimes':'\\u22C7','divonx':'\\u22C7','djcy':'\\u0452','DJcy':'\\u0402','dlcorn':'\\u231E','dlcrop':'\\u230D','dollar':'$','dopf':'\\uD835\\uDD55','Dopf':'\\uD835\\uDD3B','dot':'\\u02D9','Dot':'\\xA8','DotDot':'\\u20DC','doteq':'\\u2250','doteqdot':'\\u2251','DotEqual':'\\u2250','dotminus':'\\u2238','dotplus':'\\u2214','dotsquare':'\\u22A1','doublebarwedge':'\\u2306','DoubleContourIntegral':'\\u222F','DoubleDot':'\\xA8','DoubleDownArrow':'\\u21D3','DoubleLeftArrow':'\\u21D0','DoubleLeftRightArrow':'\\u21D4','DoubleLeftTee':'\\u2AE4','DoubleLongLeftArrow':'\\u27F8','DoubleLongLeftRightArrow':'\\u27FA','DoubleLongRightArrow':'\\u27F9','DoubleRightArrow':'\\u21D2','DoubleRightTee':'\\u22A8','DoubleUpArrow':'\\u21D1','DoubleUpDownArrow':'\\u21D5','DoubleVerticalBar':'\\u2225','downarrow':'\\u2193','Downarrow':'\\u21D3','DownArrow':'\\u2193','DownArrowBar':'\\u2913','DownArrowUpArrow':'\\u21F5','DownBreve':'\\u0311','downdownarrows':'\\u21CA','downharpoonleft':'\\u21C3','downharpoonright':'\\u21C2','DownLeftRightVector':'\\u2950','DownLeftTeeVector':'\\u295E','DownLeftVector':'\\u21BD','DownLeftVectorBar':'\\u2956','DownRightTeeVector':'\\u295F','DownRightVector':'\\u21C1','DownRightVectorBar':'\\u2957','DownTee':'\\u22A4','DownTeeArrow':'\\u21A7','drbkarow':'\\u2910','drcorn':'\\u231F','drcrop':'\\u230C','dscr':'\\uD835\\uDCB9','Dscr':'\\uD835\\uDC9F','dscy':'\\u0455','DScy':'\\u0405','dsol':'\\u29F6','dstrok':'\\u0111','Dstrok':'\\u0110','dtdot':'\\u22F1','dtri':'\\u25BF','dtrif':'\\u25BE','duarr':'\\u21F5','duhar':'\\u296F','dwangle':'\\u29A6','dzcy':'\\u045F','DZcy':'\\u040F','dzigrarr':'\\u27FF','eacute':'\\xE9','Eacute':'\\xC9','easter':'\\u2A6E','ecaron':'\\u011B','Ecaron':'\\u011A','ecir':'\\u2256','ecirc':'\\xEA','Ecirc':'\\xCA','ecolon':'\\u2255','ecy':'\\u044D','Ecy':'\\u042D','eDDot':'\\u2A77','edot':'\\u0117','eDot':'\\u2251','Edot':'\\u0116','ee':'\\u2147','efDot':'\\u2252','efr':'\\uD835\\uDD22','Efr':'\\uD835\\uDD08','eg':'\\u2A9A','egrave':'\\xE8','Egrave':'\\xC8','egs':'\\u2A96','egsdot':'\\u2A98','el':'\\u2A99','Element':'\\u2208','elinters':'\\u23E7','ell':'\\u2113','els':'\\u2A95','elsdot':'\\u2A97','emacr':'\\u0113','Emacr':'\\u0112','empty':'\\u2205','emptyset':'\\u2205','EmptySmallSquare':'\\u25FB','emptyv':'\\u2205','EmptyVerySmallSquare':'\\u25AB','emsp':'\\u2003','emsp13':'\\u2004','emsp14':'\\u2005','eng':'\\u014B','ENG':'\\u014A','ensp':'\\u2002','eogon':'\\u0119','Eogon':'\\u0118','eopf':'\\uD835\\uDD56','Eopf':'\\uD835\\uDD3C','epar':'\\u22D5','eparsl':'\\u29E3','eplus':'\\u2A71','epsi':'\\u03B5','epsilon':'\\u03B5','Epsilon':'\\u0395','epsiv':'\\u03F5','eqcirc':'\\u2256','eqcolon':'\\u2255','eqsim':'\\u2242','eqslantgtr':'\\u2A96','eqslantless':'\\u2A95','Equal':'\\u2A75','equals':'=','EqualTilde':'\\u2242','equest':'\\u225F','Equilibrium':'\\u21CC','equiv':'\\u2261','equivDD':'\\u2A78','eqvparsl':'\\u29E5','erarr':'\\u2971','erDot':'\\u2253','escr':'\\u212F','Escr':'\\u2130','esdot':'\\u2250','esim':'\\u2242','Esim':'\\u2A73','eta':'\\u03B7','Eta':'\\u0397','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','euro':'\\u20AC','excl':'!','exist':'\\u2203','Exists':'\\u2203','expectation':'\\u2130','exponentiale':'\\u2147','ExponentialE':'\\u2147','fallingdotseq':'\\u2252','fcy':'\\u0444','Fcy':'\\u0424','female':'\\u2640','ffilig':'\\uFB03','fflig':'\\uFB00','ffllig':'\\uFB04','ffr':'\\uD835\\uDD23','Ffr':'\\uD835\\uDD09','filig':'\\uFB01','FilledSmallSquare':'\\u25FC','FilledVerySmallSquare':'\\u25AA','fjlig':'fj','flat':'\\u266D','fllig':'\\uFB02','fltns':'\\u25B1','fnof':'\\u0192','fopf':'\\uD835\\uDD57','Fopf':'\\uD835\\uDD3D','forall':'\\u2200','ForAll':'\\u2200','fork':'\\u22D4','forkv':'\\u2AD9','Fouriertrf':'\\u2131','fpartint':'\\u2A0D','frac12':'\\xBD','frac13':'\\u2153','frac14':'\\xBC','frac15':'\\u2155','frac16':'\\u2159','frac18':'\\u215B','frac23':'\\u2154','frac25':'\\u2156','frac34':'\\xBE','frac35':'\\u2157','frac38':'\\u215C','frac45':'\\u2158','frac56':'\\u215A','frac58':'\\u215D','frac78':'\\u215E','frasl':'\\u2044','frown':'\\u2322','fscr':'\\uD835\\uDCBB','Fscr':'\\u2131','gacute':'\\u01F5','gamma':'\\u03B3','Gamma':'\\u0393','gammad':'\\u03DD','Gammad':'\\u03DC','gap':'\\u2A86','gbreve':'\\u011F','Gbreve':'\\u011E','Gcedil':'\\u0122','gcirc':'\\u011D','Gcirc':'\\u011C','gcy':'\\u0433','Gcy':'\\u0413','gdot':'\\u0121','Gdot':'\\u0120','ge':'\\u2265','gE':'\\u2267','gel':'\\u22DB','gEl':'\\u2A8C','geq':'\\u2265','geqq':'\\u2267','geqslant':'\\u2A7E','ges':'\\u2A7E','gescc':'\\u2AA9','gesdot':'\\u2A80','gesdoto':'\\u2A82','gesdotol':'\\u2A84','gesl':'\\u22DB\\uFE00','gesles':'\\u2A94','gfr':'\\uD835\\uDD24','Gfr':'\\uD835\\uDD0A','gg':'\\u226B','Gg':'\\u22D9','ggg':'\\u22D9','gimel':'\\u2137','gjcy':'\\u0453','GJcy':'\\u0403','gl':'\\u2277','gla':'\\u2AA5','glE':'\\u2A92','glj':'\\u2AA4','gnap':'\\u2A8A','gnapprox':'\\u2A8A','gne':'\\u2A88','gnE':'\\u2269','gneq':'\\u2A88','gneqq':'\\u2269','gnsim':'\\u22E7','gopf':'\\uD835\\uDD58','Gopf':'\\uD835\\uDD3E','grave':'`','GreaterEqual':'\\u2265','GreaterEqualLess':'\\u22DB','GreaterFullEqual':'\\u2267','GreaterGreater':'\\u2AA2','GreaterLess':'\\u2277','GreaterSlantEqual':'\\u2A7E','GreaterTilde':'\\u2273','gscr':'\\u210A','Gscr':'\\uD835\\uDCA2','gsim':'\\u2273','gsime':'\\u2A8E','gsiml':'\\u2A90','gt':'>','Gt':'\\u226B','GT':'>','gtcc':'\\u2AA7','gtcir':'\\u2A7A','gtdot':'\\u22D7','gtlPar':'\\u2995','gtquest':'\\u2A7C','gtrapprox':'\\u2A86','gtrarr':'\\u2978','gtrdot':'\\u22D7','gtreqless':'\\u22DB','gtreqqless':'\\u2A8C','gtrless':'\\u2277','gtrsim':'\\u2273','gvertneqq':'\\u2269\\uFE00','gvnE':'\\u2269\\uFE00','Hacek':'\\u02C7','hairsp':'\\u200A','half':'\\xBD','hamilt':'\\u210B','hardcy':'\\u044A','HARDcy':'\\u042A','harr':'\\u2194','hArr':'\\u21D4','harrcir':'\\u2948','harrw':'\\u21AD','Hat':'^','hbar':'\\u210F','hcirc':'\\u0125','Hcirc':'\\u0124','hearts':'\\u2665','heartsuit':'\\u2665','hellip':'\\u2026','hercon':'\\u22B9','hfr':'\\uD835\\uDD25','Hfr':'\\u210C','HilbertSpace':'\\u210B','hksearow':'\\u2925','hkswarow':'\\u2926','hoarr':'\\u21FF','homtht':'\\u223B','hookleftarrow':'\\u21A9','hookrightarrow':'\\u21AA','hopf':'\\uD835\\uDD59','Hopf':'\\u210D','horbar':'\\u2015','HorizontalLine':'\\u2500','hscr':'\\uD835\\uDCBD','Hscr':'\\u210B','hslash':'\\u210F','hstrok':'\\u0127','Hstrok':'\\u0126','HumpDownHump':'\\u224E','HumpEqual':'\\u224F','hybull':'\\u2043','hyphen':'\\u2010','iacute':'\\xED','Iacute':'\\xCD','ic':'\\u2063','icirc':'\\xEE','Icirc':'\\xCE','icy':'\\u0438','Icy':'\\u0418','Idot':'\\u0130','iecy':'\\u0435','IEcy':'\\u0415','iexcl':'\\xA1','iff':'\\u21D4','ifr':'\\uD835\\uDD26','Ifr':'\\u2111','igrave':'\\xEC','Igrave':'\\xCC','ii':'\\u2148','iiiint':'\\u2A0C','iiint':'\\u222D','iinfin':'\\u29DC','iiota':'\\u2129','ijlig':'\\u0133','IJlig':'\\u0132','Im':'\\u2111','imacr':'\\u012B','Imacr':'\\u012A','image':'\\u2111','ImaginaryI':'\\u2148','imagline':'\\u2110','imagpart':'\\u2111','imath':'\\u0131','imof':'\\u22B7','imped':'\\u01B5','Implies':'\\u21D2','in':'\\u2208','incare':'\\u2105','infin':'\\u221E','infintie':'\\u29DD','inodot':'\\u0131','int':'\\u222B','Int':'\\u222C','intcal':'\\u22BA','integers':'\\u2124','Integral':'\\u222B','intercal':'\\u22BA','Intersection':'\\u22C2','intlarhk':'\\u2A17','intprod':'\\u2A3C','InvisibleComma':'\\u2063','InvisibleTimes':'\\u2062','iocy':'\\u0451','IOcy':'\\u0401','iogon':'\\u012F','Iogon':'\\u012E','iopf':'\\uD835\\uDD5A','Iopf':'\\uD835\\uDD40','iota':'\\u03B9','Iota':'\\u0399','iprod':'\\u2A3C','iquest':'\\xBF','iscr':'\\uD835\\uDCBE','Iscr':'\\u2110','isin':'\\u2208','isindot':'\\u22F5','isinE':'\\u22F9','isins':'\\u22F4','isinsv':'\\u22F3','isinv':'\\u2208','it':'\\u2062','itilde':'\\u0129','Itilde':'\\u0128','iukcy':'\\u0456','Iukcy':'\\u0406','iuml':'\\xEF','Iuml':'\\xCF','jcirc':'\\u0135','Jcirc':'\\u0134','jcy':'\\u0439','Jcy':'\\u0419','jfr':'\\uD835\\uDD27','Jfr':'\\uD835\\uDD0D','jmath':'\\u0237','jopf':'\\uD835\\uDD5B','Jopf':'\\uD835\\uDD41','jscr':'\\uD835\\uDCBF','Jscr':'\\uD835\\uDCA5','jsercy':'\\u0458','Jsercy':'\\u0408','jukcy':'\\u0454','Jukcy':'\\u0404','kappa':'\\u03BA','Kappa':'\\u039A','kappav':'\\u03F0','kcedil':'\\u0137','Kcedil':'\\u0136','kcy':'\\u043A','Kcy':'\\u041A','kfr':'\\uD835\\uDD28','Kfr':'\\uD835\\uDD0E','kgreen':'\\u0138','khcy':'\\u0445','KHcy':'\\u0425','kjcy':'\\u045C','KJcy':'\\u040C','kopf':'\\uD835\\uDD5C','Kopf':'\\uD835\\uDD42','kscr':'\\uD835\\uDCC0','Kscr':'\\uD835\\uDCA6','lAarr':'\\u21DA','lacute':'\\u013A','Lacute':'\\u0139','laemptyv':'\\u29B4','lagran':'\\u2112','lambda':'\\u03BB','Lambda':'\\u039B','lang':'\\u27E8','Lang':'\\u27EA','langd':'\\u2991','langle':'\\u27E8','lap':'\\u2A85','Laplacetrf':'\\u2112','laquo':'\\xAB','larr':'\\u2190','lArr':'\\u21D0','Larr':'\\u219E','larrb':'\\u21E4','larrbfs':'\\u291F','larrfs':'\\u291D','larrhk':'\\u21A9','larrlp':'\\u21AB','larrpl':'\\u2939','larrsim':'\\u2973','larrtl':'\\u21A2','lat':'\\u2AAB','latail':'\\u2919','lAtail':'\\u291B','late':'\\u2AAD','lates':'\\u2AAD\\uFE00','lbarr':'\\u290C','lBarr':'\\u290E','lbbrk':'\\u2772','lbrace':'{','lbrack':'[','lbrke':'\\u298B','lbrksld':'\\u298F','lbrkslu':'\\u298D','lcaron':'\\u013E','Lcaron':'\\u013D','lcedil':'\\u013C','Lcedil':'\\u013B','lceil':'\\u2308','lcub':'{','lcy':'\\u043B','Lcy':'\\u041B','ldca':'\\u2936','ldquo':'\\u201C','ldquor':'\\u201E','ldrdhar':'\\u2967','ldrushar':'\\u294B','ldsh':'\\u21B2','le':'\\u2264','lE':'\\u2266','LeftAngleBracket':'\\u27E8','leftarrow':'\\u2190','Leftarrow':'\\u21D0','LeftArrow':'\\u2190','LeftArrowBar':'\\u21E4','LeftArrowRightArrow':'\\u21C6','leftarrowtail':'\\u21A2','LeftCeiling':'\\u2308','LeftDoubleBracket':'\\u27E6','LeftDownTeeVector':'\\u2961','LeftDownVector':'\\u21C3','LeftDownVectorBar':'\\u2959','LeftFloor':'\\u230A','leftharpoondown':'\\u21BD','leftharpoonup':'\\u21BC','leftleftarrows':'\\u21C7','leftrightarrow':'\\u2194','Leftrightarrow':'\\u21D4','LeftRightArrow':'\\u2194','leftrightarrows':'\\u21C6','leftrightharpoons':'\\u21CB','leftrightsquigarrow':'\\u21AD','LeftRightVector':'\\u294E','LeftTee':'\\u22A3','LeftTeeArrow':'\\u21A4','LeftTeeVector':'\\u295A','leftthreetimes':'\\u22CB','LeftTriangle':'\\u22B2','LeftTriangleBar':'\\u29CF','LeftTriangleEqual':'\\u22B4','LeftUpDownVector':'\\u2951','LeftUpTeeVector':'\\u2960','LeftUpVector':'\\u21BF','LeftUpVectorBar':'\\u2958','LeftVector':'\\u21BC','LeftVectorBar':'\\u2952','leg':'\\u22DA','lEg':'\\u2A8B','leq':'\\u2264','leqq':'\\u2266','leqslant':'\\u2A7D','les':'\\u2A7D','lescc':'\\u2AA8','lesdot':'\\u2A7F','lesdoto':'\\u2A81','lesdotor':'\\u2A83','lesg':'\\u22DA\\uFE00','lesges':'\\u2A93','lessapprox':'\\u2A85','lessdot':'\\u22D6','lesseqgtr':'\\u22DA','lesseqqgtr':'\\u2A8B','LessEqualGreater':'\\u22DA','LessFullEqual':'\\u2266','LessGreater':'\\u2276','lessgtr':'\\u2276','LessLess':'\\u2AA1','lesssim':'\\u2272','LessSlantEqual':'\\u2A7D','LessTilde':'\\u2272','lfisht':'\\u297C','lfloor':'\\u230A','lfr':'\\uD835\\uDD29','Lfr':'\\uD835\\uDD0F','lg':'\\u2276','lgE':'\\u2A91','lHar':'\\u2962','lhard':'\\u21BD','lharu':'\\u21BC','lharul':'\\u296A','lhblk':'\\u2584','ljcy':'\\u0459','LJcy':'\\u0409','ll':'\\u226A','Ll':'\\u22D8','llarr':'\\u21C7','llcorner':'\\u231E','Lleftarrow':'\\u21DA','llhard':'\\u296B','lltri':'\\u25FA','lmidot':'\\u0140','Lmidot':'\\u013F','lmoust':'\\u23B0','lmoustache':'\\u23B0','lnap':'\\u2A89','lnapprox':'\\u2A89','lne':'\\u2A87','lnE':'\\u2268','lneq':'\\u2A87','lneqq':'\\u2268','lnsim':'\\u22E6','loang':'\\u27EC','loarr':'\\u21FD','lobrk':'\\u27E6','longleftarrow':'\\u27F5','Longleftarrow':'\\u27F8','LongLeftArrow':'\\u27F5','longleftrightarrow':'\\u27F7','Longleftrightarrow':'\\u27FA','LongLeftRightArrow':'\\u27F7','longmapsto':'\\u27FC','longrightarrow':'\\u27F6','Longrightarrow':'\\u27F9','LongRightArrow':'\\u27F6','looparrowleft':'\\u21AB','looparrowright':'\\u21AC','lopar':'\\u2985','lopf':'\\uD835\\uDD5D','Lopf':'\\uD835\\uDD43','loplus':'\\u2A2D','lotimes':'\\u2A34','lowast':'\\u2217','lowbar':'_','LowerLeftArrow':'\\u2199','LowerRightArrow':'\\u2198','loz':'\\u25CA','lozenge':'\\u25CA','lozf':'\\u29EB','lpar':'(','lparlt':'\\u2993','lrarr':'\\u21C6','lrcorner':'\\u231F','lrhar':'\\u21CB','lrhard':'\\u296D','lrm':'\\u200E','lrtri':'\\u22BF','lsaquo':'\\u2039','lscr':'\\uD835\\uDCC1','Lscr':'\\u2112','lsh':'\\u21B0','Lsh':'\\u21B0','lsim':'\\u2272','lsime':'\\u2A8D','lsimg':'\\u2A8F','lsqb':'[','lsquo':'\\u2018','lsquor':'\\u201A','lstrok':'\\u0142','Lstrok':'\\u0141','lt':'<','Lt':'\\u226A','LT':'<','ltcc':'\\u2AA6','ltcir':'\\u2A79','ltdot':'\\u22D6','lthree':'\\u22CB','ltimes':'\\u22C9','ltlarr':'\\u2976','ltquest':'\\u2A7B','ltri':'\\u25C3','ltrie':'\\u22B4','ltrif':'\\u25C2','ltrPar':'\\u2996','lurdshar':'\\u294A','luruhar':'\\u2966','lvertneqq':'\\u2268\\uFE00','lvnE':'\\u2268\\uFE00','macr':'\\xAF','male':'\\u2642','malt':'\\u2720','maltese':'\\u2720','map':'\\u21A6','Map':'\\u2905','mapsto':'\\u21A6','mapstodown':'\\u21A7','mapstoleft':'\\u21A4','mapstoup':'\\u21A5','marker':'\\u25AE','mcomma':'\\u2A29','mcy':'\\u043C','Mcy':'\\u041C','mdash':'\\u2014','mDDot':'\\u223A','measuredangle':'\\u2221','MediumSpace':'\\u205F','Mellintrf':'\\u2133','mfr':'\\uD835\\uDD2A','Mfr':'\\uD835\\uDD10','mho':'\\u2127','micro':'\\xB5','mid':'\\u2223','midast':'*','midcir':'\\u2AF0','middot':'\\xB7','minus':'\\u2212','minusb':'\\u229F','minusd':'\\u2238','minusdu':'\\u2A2A','MinusPlus':'\\u2213','mlcp':'\\u2ADB','mldr':'\\u2026','mnplus':'\\u2213','models':'\\u22A7','mopf':'\\uD835\\uDD5E','Mopf':'\\uD835\\uDD44','mp':'\\u2213','mscr':'\\uD835\\uDCC2','Mscr':'\\u2133','mstpos':'\\u223E','mu':'\\u03BC','Mu':'\\u039C','multimap':'\\u22B8','mumap':'\\u22B8','nabla':'\\u2207','nacute':'\\u0144','Nacute':'\\u0143','nang':'\\u2220\\u20D2','nap':'\\u2249','napE':'\\u2A70\\u0338','napid':'\\u224B\\u0338','napos':'\\u0149','napprox':'\\u2249','natur':'\\u266E','natural':'\\u266E','naturals':'\\u2115','nbsp':'\\xA0','nbump':'\\u224E\\u0338','nbumpe':'\\u224F\\u0338','ncap':'\\u2A43','ncaron':'\\u0148','Ncaron':'\\u0147','ncedil':'\\u0146','Ncedil':'\\u0145','ncong':'\\u2247','ncongdot':'\\u2A6D\\u0338','ncup':'\\u2A42','ncy':'\\u043D','Ncy':'\\u041D','ndash':'\\u2013','ne':'\\u2260','nearhk':'\\u2924','nearr':'\\u2197','neArr':'\\u21D7','nearrow':'\\u2197','nedot':'\\u2250\\u0338','NegativeMediumSpace':'\\u200B','NegativeThickSpace':'\\u200B','NegativeThinSpace':'\\u200B','NegativeVeryThinSpace':'\\u200B','nequiv':'\\u2262','nesear':'\\u2928','nesim':'\\u2242\\u0338','NestedGreaterGreater':'\\u226B','NestedLessLess':'\\u226A','NewLine':'\\n','nexist':'\\u2204','nexists':'\\u2204','nfr':'\\uD835\\uDD2B','Nfr':'\\uD835\\uDD11','nge':'\\u2271','ngE':'\\u2267\\u0338','ngeq':'\\u2271','ngeqq':'\\u2267\\u0338','ngeqslant':'\\u2A7E\\u0338','nges':'\\u2A7E\\u0338','nGg':'\\u22D9\\u0338','ngsim':'\\u2275','ngt':'\\u226F','nGt':'\\u226B\\u20D2','ngtr':'\\u226F','nGtv':'\\u226B\\u0338','nharr':'\\u21AE','nhArr':'\\u21CE','nhpar':'\\u2AF2','ni':'\\u220B','nis':'\\u22FC','nisd':'\\u22FA','niv':'\\u220B','njcy':'\\u045A','NJcy':'\\u040A','nlarr':'\\u219A','nlArr':'\\u21CD','nldr':'\\u2025','nle':'\\u2270','nlE':'\\u2266\\u0338','nleftarrow':'\\u219A','nLeftarrow':'\\u21CD','nleftrightarrow':'\\u21AE','nLeftrightarrow':'\\u21CE','nleq':'\\u2270','nleqq':'\\u2266\\u0338','nleqslant':'\\u2A7D\\u0338','nles':'\\u2A7D\\u0338','nless':'\\u226E','nLl':'\\u22D8\\u0338','nlsim':'\\u2274','nlt':'\\u226E','nLt':'\\u226A\\u20D2','nltri':'\\u22EA','nltrie':'\\u22EC','nLtv':'\\u226A\\u0338','nmid':'\\u2224','NoBreak':'\\u2060','NonBreakingSpace':'\\xA0','nopf':'\\uD835\\uDD5F','Nopf':'\\u2115','not':'\\xAC','Not':'\\u2AEC','NotCongruent':'\\u2262','NotCupCap':'\\u226D','NotDoubleVerticalBar':'\\u2226','NotElement':'\\u2209','NotEqual':'\\u2260','NotEqualTilde':'\\u2242\\u0338','NotExists':'\\u2204','NotGreater':'\\u226F','NotGreaterEqual':'\\u2271','NotGreaterFullEqual':'\\u2267\\u0338','NotGreaterGreater':'\\u226B\\u0338','NotGreaterLess':'\\u2279','NotGreaterSlantEqual':'\\u2A7E\\u0338','NotGreaterTilde':'\\u2275','NotHumpDownHump':'\\u224E\\u0338','NotHumpEqual':'\\u224F\\u0338','notin':'\\u2209','notindot':'\\u22F5\\u0338','notinE':'\\u22F9\\u0338','notinva':'\\u2209','notinvb':'\\u22F7','notinvc':'\\u22F6','NotLeftTriangle':'\\u22EA','NotLeftTriangleBar':'\\u29CF\\u0338','NotLeftTriangleEqual':'\\u22EC','NotLess':'\\u226E','NotLessEqual':'\\u2270','NotLessGreater':'\\u2278','NotLessLess':'\\u226A\\u0338','NotLessSlantEqual':'\\u2A7D\\u0338','NotLessTilde':'\\u2274','NotNestedGreaterGreater':'\\u2AA2\\u0338','NotNestedLessLess':'\\u2AA1\\u0338','notni':'\\u220C','notniva':'\\u220C','notnivb':'\\u22FE','notnivc':'\\u22FD','NotPrecedes':'\\u2280','NotPrecedesEqual':'\\u2AAF\\u0338','NotPrecedesSlantEqual':'\\u22E0','NotReverseElement':'\\u220C','NotRightTriangle':'\\u22EB','NotRightTriangleBar':'\\u29D0\\u0338','NotRightTriangleEqual':'\\u22ED','NotSquareSubset':'\\u228F\\u0338','NotSquareSubsetEqual':'\\u22E2','NotSquareSuperset':'\\u2290\\u0338','NotSquareSupersetEqual':'\\u22E3','NotSubset':'\\u2282\\u20D2','NotSubsetEqual':'\\u2288','NotSucceeds':'\\u2281','NotSucceedsEqual':'\\u2AB0\\u0338','NotSucceedsSlantEqual':'\\u22E1','NotSucceedsTilde':'\\u227F\\u0338','NotSuperset':'\\u2283\\u20D2','NotSupersetEqual':'\\u2289','NotTilde':'\\u2241','NotTildeEqual':'\\u2244','NotTildeFullEqual':'\\u2247','NotTildeTilde':'\\u2249','NotVerticalBar':'\\u2224','npar':'\\u2226','nparallel':'\\u2226','nparsl':'\\u2AFD\\u20E5','npart':'\\u2202\\u0338','npolint':'\\u2A14','npr':'\\u2280','nprcue':'\\u22E0','npre':'\\u2AAF\\u0338','nprec':'\\u2280','npreceq':'\\u2AAF\\u0338','nrarr':'\\u219B','nrArr':'\\u21CF','nrarrc':'\\u2933\\u0338','nrarrw':'\\u219D\\u0338','nrightarrow':'\\u219B','nRightarrow':'\\u21CF','nrtri':'\\u22EB','nrtrie':'\\u22ED','nsc':'\\u2281','nsccue':'\\u22E1','nsce':'\\u2AB0\\u0338','nscr':'\\uD835\\uDCC3','Nscr':'\\uD835\\uDCA9','nshortmid':'\\u2224','nshortparallel':'\\u2226','nsim':'\\u2241','nsime':'\\u2244','nsimeq':'\\u2244','nsmid':'\\u2224','nspar':'\\u2226','nsqsube':'\\u22E2','nsqsupe':'\\u22E3','nsub':'\\u2284','nsube':'\\u2288','nsubE':'\\u2AC5\\u0338','nsubset':'\\u2282\\u20D2','nsubseteq':'\\u2288','nsubseteqq':'\\u2AC5\\u0338','nsucc':'\\u2281','nsucceq':'\\u2AB0\\u0338','nsup':'\\u2285','nsupe':'\\u2289','nsupE':'\\u2AC6\\u0338','nsupset':'\\u2283\\u20D2','nsupseteq':'\\u2289','nsupseteqq':'\\u2AC6\\u0338','ntgl':'\\u2279','ntilde':'\\xF1','Ntilde':'\\xD1','ntlg':'\\u2278','ntriangleleft':'\\u22EA','ntrianglelefteq':'\\u22EC','ntriangleright':'\\u22EB','ntrianglerighteq':'\\u22ED','nu':'\\u03BD','Nu':'\\u039D','num':'#','numero':'\\u2116','numsp':'\\u2007','nvap':'\\u224D\\u20D2','nvdash':'\\u22AC','nvDash':'\\u22AD','nVdash':'\\u22AE','nVDash':'\\u22AF','nvge':'\\u2265\\u20D2','nvgt':'>\\u20D2','nvHarr':'\\u2904','nvinfin':'\\u29DE','nvlArr':'\\u2902','nvle':'\\u2264\\u20D2','nvlt':'<\\u20D2','nvltrie':'\\u22B4\\u20D2','nvrArr':'\\u2903','nvrtrie':'\\u22B5\\u20D2','nvsim':'\\u223C\\u20D2','nwarhk':'\\u2923','nwarr':'\\u2196','nwArr':'\\u21D6','nwarrow':'\\u2196','nwnear':'\\u2927','oacute':'\\xF3','Oacute':'\\xD3','oast':'\\u229B','ocir':'\\u229A','ocirc':'\\xF4','Ocirc':'\\xD4','ocy':'\\u043E','Ocy':'\\u041E','odash':'\\u229D','odblac':'\\u0151','Odblac':'\\u0150','odiv':'\\u2A38','odot':'\\u2299','odsold':'\\u29BC','oelig':'\\u0153','OElig':'\\u0152','ofcir':'\\u29BF','ofr':'\\uD835\\uDD2C','Ofr':'\\uD835\\uDD12','ogon':'\\u02DB','ograve':'\\xF2','Ograve':'\\xD2','ogt':'\\u29C1','ohbar':'\\u29B5','ohm':'\\u03A9','oint':'\\u222E','olarr':'\\u21BA','olcir':'\\u29BE','olcross':'\\u29BB','oline':'\\u203E','olt':'\\u29C0','omacr':'\\u014D','Omacr':'\\u014C','omega':'\\u03C9','Omega':'\\u03A9','omicron':'\\u03BF','Omicron':'\\u039F','omid':'\\u29B6','ominus':'\\u2296','oopf':'\\uD835\\uDD60','Oopf':'\\uD835\\uDD46','opar':'\\u29B7','OpenCurlyDoubleQuote':'\\u201C','OpenCurlyQuote':'\\u2018','operp':'\\u29B9','oplus':'\\u2295','or':'\\u2228','Or':'\\u2A54','orarr':'\\u21BB','ord':'\\u2A5D','order':'\\u2134','orderof':'\\u2134','ordf':'\\xAA','ordm':'\\xBA','origof':'\\u22B6','oror':'\\u2A56','orslope':'\\u2A57','orv':'\\u2A5B','oS':'\\u24C8','oscr':'\\u2134','Oscr':'\\uD835\\uDCAA','oslash':'\\xF8','Oslash':'\\xD8','osol':'\\u2298','otilde':'\\xF5','Otilde':'\\xD5','otimes':'\\u2297','Otimes':'\\u2A37','otimesas':'\\u2A36','ouml':'\\xF6','Ouml':'\\xD6','ovbar':'\\u233D','OverBar':'\\u203E','OverBrace':'\\u23DE','OverBracket':'\\u23B4','OverParenthesis':'\\u23DC','par':'\\u2225','para':'\\xB6','parallel':'\\u2225','parsim':'\\u2AF3','parsl':'\\u2AFD','part':'\\u2202','PartialD':'\\u2202','pcy':'\\u043F','Pcy':'\\u041F','percnt':'%','period':'.','permil':'\\u2030','perp':'\\u22A5','pertenk':'\\u2031','pfr':'\\uD835\\uDD2D','Pfr':'\\uD835\\uDD13','phi':'\\u03C6','Phi':'\\u03A6','phiv':'\\u03D5','phmmat':'\\u2133','phone':'\\u260E','pi':'\\u03C0','Pi':'\\u03A0','pitchfork':'\\u22D4','piv':'\\u03D6','planck':'\\u210F','planckh':'\\u210E','plankv':'\\u210F','plus':'+','plusacir':'\\u2A23','plusb':'\\u229E','pluscir':'\\u2A22','plusdo':'\\u2214','plusdu':'\\u2A25','pluse':'\\u2A72','PlusMinus':'\\xB1','plusmn':'\\xB1','plussim':'\\u2A26','plustwo':'\\u2A27','pm':'\\xB1','Poincareplane':'\\u210C','pointint':'\\u2A15','popf':'\\uD835\\uDD61','Popf':'\\u2119','pound':'\\xA3','pr':'\\u227A','Pr':'\\u2ABB','prap':'\\u2AB7','prcue':'\\u227C','pre':'\\u2AAF','prE':'\\u2AB3','prec':'\\u227A','precapprox':'\\u2AB7','preccurlyeq':'\\u227C','Precedes':'\\u227A','PrecedesEqual':'\\u2AAF','PrecedesSlantEqual':'\\u227C','PrecedesTilde':'\\u227E','preceq':'\\u2AAF','precnapprox':'\\u2AB9','precneqq':'\\u2AB5','precnsim':'\\u22E8','precsim':'\\u227E','prime':'\\u2032','Prime':'\\u2033','primes':'\\u2119','prnap':'\\u2AB9','prnE':'\\u2AB5','prnsim':'\\u22E8','prod':'\\u220F','Product':'\\u220F','profalar':'\\u232E','profline':'\\u2312','profsurf':'\\u2313','prop':'\\u221D','Proportion':'\\u2237','Proportional':'\\u221D','propto':'\\u221D','prsim':'\\u227E','prurel':'\\u22B0','pscr':'\\uD835\\uDCC5','Pscr':'\\uD835\\uDCAB','psi':'\\u03C8','Psi':'\\u03A8','puncsp':'\\u2008','qfr':'\\uD835\\uDD2E','Qfr':'\\uD835\\uDD14','qint':'\\u2A0C','qopf':'\\uD835\\uDD62','Qopf':'\\u211A','qprime':'\\u2057','qscr':'\\uD835\\uDCC6','Qscr':'\\uD835\\uDCAC','quaternions':'\\u210D','quatint':'\\u2A16','quest':'?','questeq':'\\u225F','quot':'\"','QUOT':'\"','rAarr':'\\u21DB','race':'\\u223D\\u0331','racute':'\\u0155','Racute':'\\u0154','radic':'\\u221A','raemptyv':'\\u29B3','rang':'\\u27E9','Rang':'\\u27EB','rangd':'\\u2992','range':'\\u29A5','rangle':'\\u27E9','raquo':'\\xBB','rarr':'\\u2192','rArr':'\\u21D2','Rarr':'\\u21A0','rarrap':'\\u2975','rarrb':'\\u21E5','rarrbfs':'\\u2920','rarrc':'\\u2933','rarrfs':'\\u291E','rarrhk':'\\u21AA','rarrlp':'\\u21AC','rarrpl':'\\u2945','rarrsim':'\\u2974','rarrtl':'\\u21A3','Rarrtl':'\\u2916','rarrw':'\\u219D','ratail':'\\u291A','rAtail':'\\u291C','ratio':'\\u2236','rationals':'\\u211A','rbarr':'\\u290D','rBarr':'\\u290F','RBarr':'\\u2910','rbbrk':'\\u2773','rbrace':'}','rbrack':']','rbrke':'\\u298C','rbrksld':'\\u298E','rbrkslu':'\\u2990','rcaron':'\\u0159','Rcaron':'\\u0158','rcedil':'\\u0157','Rcedil':'\\u0156','rceil':'\\u2309','rcub':'}','rcy':'\\u0440','Rcy':'\\u0420','rdca':'\\u2937','rdldhar':'\\u2969','rdquo':'\\u201D','rdquor':'\\u201D','rdsh':'\\u21B3','Re':'\\u211C','real':'\\u211C','realine':'\\u211B','realpart':'\\u211C','reals':'\\u211D','rect':'\\u25AD','reg':'\\xAE','REG':'\\xAE','ReverseElement':'\\u220B','ReverseEquilibrium':'\\u21CB','ReverseUpEquilibrium':'\\u296F','rfisht':'\\u297D','rfloor':'\\u230B','rfr':'\\uD835\\uDD2F','Rfr':'\\u211C','rHar':'\\u2964','rhard':'\\u21C1','rharu':'\\u21C0','rharul':'\\u296C','rho':'\\u03C1','Rho':'\\u03A1','rhov':'\\u03F1','RightAngleBracket':'\\u27E9','rightarrow':'\\u2192','Rightarrow':'\\u21D2','RightArrow':'\\u2192','RightArrowBar':'\\u21E5','RightArrowLeftArrow':'\\u21C4','rightarrowtail':'\\u21A3','RightCeiling':'\\u2309','RightDoubleBracket':'\\u27E7','RightDownTeeVector':'\\u295D','RightDownVector':'\\u21C2','RightDownVectorBar':'\\u2955','RightFloor':'\\u230B','rightharpoondown':'\\u21C1','rightharpoonup':'\\u21C0','rightleftarrows':'\\u21C4','rightleftharpoons':'\\u21CC','rightrightarrows':'\\u21C9','rightsquigarrow':'\\u219D','RightTee':'\\u22A2','RightTeeArrow':'\\u21A6','RightTeeVector':'\\u295B','rightthreetimes':'\\u22CC','RightTriangle':'\\u22B3','RightTriangleBar':'\\u29D0','RightTriangleEqual':'\\u22B5','RightUpDownVector':'\\u294F','RightUpTeeVector':'\\u295C','RightUpVector':'\\u21BE','RightUpVectorBar':'\\u2954','RightVector':'\\u21C0','RightVectorBar':'\\u2953','ring':'\\u02DA','risingdotseq':'\\u2253','rlarr':'\\u21C4','rlhar':'\\u21CC','rlm':'\\u200F','rmoust':'\\u23B1','rmoustache':'\\u23B1','rnmid':'\\u2AEE','roang':'\\u27ED','roarr':'\\u21FE','robrk':'\\u27E7','ropar':'\\u2986','ropf':'\\uD835\\uDD63','Ropf':'\\u211D','roplus':'\\u2A2E','rotimes':'\\u2A35','RoundImplies':'\\u2970','rpar':')','rpargt':'\\u2994','rppolint':'\\u2A12','rrarr':'\\u21C9','Rrightarrow':'\\u21DB','rsaquo':'\\u203A','rscr':'\\uD835\\uDCC7','Rscr':'\\u211B','rsh':'\\u21B1','Rsh':'\\u21B1','rsqb':']','rsquo':'\\u2019','rsquor':'\\u2019','rthree':'\\u22CC','rtimes':'\\u22CA','rtri':'\\u25B9','rtrie':'\\u22B5','rtrif':'\\u25B8','rtriltri':'\\u29CE','RuleDelayed':'\\u29F4','ruluhar':'\\u2968','rx':'\\u211E','sacute':'\\u015B','Sacute':'\\u015A','sbquo':'\\u201A','sc':'\\u227B','Sc':'\\u2ABC','scap':'\\u2AB8','scaron':'\\u0161','Scaron':'\\u0160','sccue':'\\u227D','sce':'\\u2AB0','scE':'\\u2AB4','scedil':'\\u015F','Scedil':'\\u015E','scirc':'\\u015D','Scirc':'\\u015C','scnap':'\\u2ABA','scnE':'\\u2AB6','scnsim':'\\u22E9','scpolint':'\\u2A13','scsim':'\\u227F','scy':'\\u0441','Scy':'\\u0421','sdot':'\\u22C5','sdotb':'\\u22A1','sdote':'\\u2A66','searhk':'\\u2925','searr':'\\u2198','seArr':'\\u21D8','searrow':'\\u2198','sect':'\\xA7','semi':';','seswar':'\\u2929','setminus':'\\u2216','setmn':'\\u2216','sext':'\\u2736','sfr':'\\uD835\\uDD30','Sfr':'\\uD835\\uDD16','sfrown':'\\u2322','sharp':'\\u266F','shchcy':'\\u0449','SHCHcy':'\\u0429','shcy':'\\u0448','SHcy':'\\u0428','ShortDownArrow':'\\u2193','ShortLeftArrow':'\\u2190','shortmid':'\\u2223','shortparallel':'\\u2225','ShortRightArrow':'\\u2192','ShortUpArrow':'\\u2191','shy':'\\xAD','sigma':'\\u03C3','Sigma':'\\u03A3','sigmaf':'\\u03C2','sigmav':'\\u03C2','sim':'\\u223C','simdot':'\\u2A6A','sime':'\\u2243','simeq':'\\u2243','simg':'\\u2A9E','simgE':'\\u2AA0','siml':'\\u2A9D','simlE':'\\u2A9F','simne':'\\u2246','simplus':'\\u2A24','simrarr':'\\u2972','slarr':'\\u2190','SmallCircle':'\\u2218','smallsetminus':'\\u2216','smashp':'\\u2A33','smeparsl':'\\u29E4','smid':'\\u2223','smile':'\\u2323','smt':'\\u2AAA','smte':'\\u2AAC','smtes':'\\u2AAC\\uFE00','softcy':'\\u044C','SOFTcy':'\\u042C','sol':'/','solb':'\\u29C4','solbar':'\\u233F','sopf':'\\uD835\\uDD64','Sopf':'\\uD835\\uDD4A','spades':'\\u2660','spadesuit':'\\u2660','spar':'\\u2225','sqcap':'\\u2293','sqcaps':'\\u2293\\uFE00','sqcup':'\\u2294','sqcups':'\\u2294\\uFE00','Sqrt':'\\u221A','sqsub':'\\u228F','sqsube':'\\u2291','sqsubset':'\\u228F','sqsubseteq':'\\u2291','sqsup':'\\u2290','sqsupe':'\\u2292','sqsupset':'\\u2290','sqsupseteq':'\\u2292','squ':'\\u25A1','square':'\\u25A1','Square':'\\u25A1','SquareIntersection':'\\u2293','SquareSubset':'\\u228F','SquareSubsetEqual':'\\u2291','SquareSuperset':'\\u2290','SquareSupersetEqual':'\\u2292','SquareUnion':'\\u2294','squarf':'\\u25AA','squf':'\\u25AA','srarr':'\\u2192','sscr':'\\uD835\\uDCC8','Sscr':'\\uD835\\uDCAE','ssetmn':'\\u2216','ssmile':'\\u2323','sstarf':'\\u22C6','star':'\\u2606','Star':'\\u22C6','starf':'\\u2605','straightepsilon':'\\u03F5','straightphi':'\\u03D5','strns':'\\xAF','sub':'\\u2282','Sub':'\\u22D0','subdot':'\\u2ABD','sube':'\\u2286','subE':'\\u2AC5','subedot':'\\u2AC3','submult':'\\u2AC1','subne':'\\u228A','subnE':'\\u2ACB','subplus':'\\u2ABF','subrarr':'\\u2979','subset':'\\u2282','Subset':'\\u22D0','subseteq':'\\u2286','subseteqq':'\\u2AC5','SubsetEqual':'\\u2286','subsetneq':'\\u228A','subsetneqq':'\\u2ACB','subsim':'\\u2AC7','subsub':'\\u2AD5','subsup':'\\u2AD3','succ':'\\u227B','succapprox':'\\u2AB8','succcurlyeq':'\\u227D','Succeeds':'\\u227B','SucceedsEqual':'\\u2AB0','SucceedsSlantEqual':'\\u227D','SucceedsTilde':'\\u227F','succeq':'\\u2AB0','succnapprox':'\\u2ABA','succneqq':'\\u2AB6','succnsim':'\\u22E9','succsim':'\\u227F','SuchThat':'\\u220B','sum':'\\u2211','Sum':'\\u2211','sung':'\\u266A','sup':'\\u2283','Sup':'\\u22D1','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','supdot':'\\u2ABE','supdsub':'\\u2AD8','supe':'\\u2287','supE':'\\u2AC6','supedot':'\\u2AC4','Superset':'\\u2283','SupersetEqual':'\\u2287','suphsol':'\\u27C9','suphsub':'\\u2AD7','suplarr':'\\u297B','supmult':'\\u2AC2','supne':'\\u228B','supnE':'\\u2ACC','supplus':'\\u2AC0','supset':'\\u2283','Supset':'\\u22D1','supseteq':'\\u2287','supseteqq':'\\u2AC6','supsetneq':'\\u228B','supsetneqq':'\\u2ACC','supsim':'\\u2AC8','supsub':'\\u2AD4','supsup':'\\u2AD6','swarhk':'\\u2926','swarr':'\\u2199','swArr':'\\u21D9','swarrow':'\\u2199','swnwar':'\\u292A','szlig':'\\xDF','Tab':'\\t','target':'\\u2316','tau':'\\u03C4','Tau':'\\u03A4','tbrk':'\\u23B4','tcaron':'\\u0165','Tcaron':'\\u0164','tcedil':'\\u0163','Tcedil':'\\u0162','tcy':'\\u0442','Tcy':'\\u0422','tdot':'\\u20DB','telrec':'\\u2315','tfr':'\\uD835\\uDD31','Tfr':'\\uD835\\uDD17','there4':'\\u2234','therefore':'\\u2234','Therefore':'\\u2234','theta':'\\u03B8','Theta':'\\u0398','thetasym':'\\u03D1','thetav':'\\u03D1','thickapprox':'\\u2248','thicksim':'\\u223C','ThickSpace':'\\u205F\\u200A','thinsp':'\\u2009','ThinSpace':'\\u2009','thkap':'\\u2248','thksim':'\\u223C','thorn':'\\xFE','THORN':'\\xDE','tilde':'\\u02DC','Tilde':'\\u223C','TildeEqual':'\\u2243','TildeFullEqual':'\\u2245','TildeTilde':'\\u2248','times':'\\xD7','timesb':'\\u22A0','timesbar':'\\u2A31','timesd':'\\u2A30','tint':'\\u222D','toea':'\\u2928','top':'\\u22A4','topbot':'\\u2336','topcir':'\\u2AF1','topf':'\\uD835\\uDD65','Topf':'\\uD835\\uDD4B','topfork':'\\u2ADA','tosa':'\\u2929','tprime':'\\u2034','trade':'\\u2122','TRADE':'\\u2122','triangle':'\\u25B5','triangledown':'\\u25BF','triangleleft':'\\u25C3','trianglelefteq':'\\u22B4','triangleq':'\\u225C','triangleright':'\\u25B9','trianglerighteq':'\\u22B5','tridot':'\\u25EC','trie':'\\u225C','triminus':'\\u2A3A','TripleDot':'\\u20DB','triplus':'\\u2A39','trisb':'\\u29CD','tritime':'\\u2A3B','trpezium':'\\u23E2','tscr':'\\uD835\\uDCC9','Tscr':'\\uD835\\uDCAF','tscy':'\\u0446','TScy':'\\u0426','tshcy':'\\u045B','TSHcy':'\\u040B','tstrok':'\\u0167','Tstrok':'\\u0166','twixt':'\\u226C','twoheadleftarrow':'\\u219E','twoheadrightarrow':'\\u21A0','uacute':'\\xFA','Uacute':'\\xDA','uarr':'\\u2191','uArr':'\\u21D1','Uarr':'\\u219F','Uarrocir':'\\u2949','ubrcy':'\\u045E','Ubrcy':'\\u040E','ubreve':'\\u016D','Ubreve':'\\u016C','ucirc':'\\xFB','Ucirc':'\\xDB','ucy':'\\u0443','Ucy':'\\u0423','udarr':'\\u21C5','udblac':'\\u0171','Udblac':'\\u0170','udhar':'\\u296E','ufisht':'\\u297E','ufr':'\\uD835\\uDD32','Ufr':'\\uD835\\uDD18','ugrave':'\\xF9','Ugrave':'\\xD9','uHar':'\\u2963','uharl':'\\u21BF','uharr':'\\u21BE','uhblk':'\\u2580','ulcorn':'\\u231C','ulcorner':'\\u231C','ulcrop':'\\u230F','ultri':'\\u25F8','umacr':'\\u016B','Umacr':'\\u016A','uml':'\\xA8','UnderBar':'_','UnderBrace':'\\u23DF','UnderBracket':'\\u23B5','UnderParenthesis':'\\u23DD','Union':'\\u22C3','UnionPlus':'\\u228E','uogon':'\\u0173','Uogon':'\\u0172','uopf':'\\uD835\\uDD66','Uopf':'\\uD835\\uDD4C','uparrow':'\\u2191','Uparrow':'\\u21D1','UpArrow':'\\u2191','UpArrowBar':'\\u2912','UpArrowDownArrow':'\\u21C5','updownarrow':'\\u2195','Updownarrow':'\\u21D5','UpDownArrow':'\\u2195','UpEquilibrium':'\\u296E','upharpoonleft':'\\u21BF','upharpoonright':'\\u21BE','uplus':'\\u228E','UpperLeftArrow':'\\u2196','UpperRightArrow':'\\u2197','upsi':'\\u03C5','Upsi':'\\u03D2','upsih':'\\u03D2','upsilon':'\\u03C5','Upsilon':'\\u03A5','UpTee':'\\u22A5','UpTeeArrow':'\\u21A5','upuparrows':'\\u21C8','urcorn':'\\u231D','urcorner':'\\u231D','urcrop':'\\u230E','uring':'\\u016F','Uring':'\\u016E','urtri':'\\u25F9','uscr':'\\uD835\\uDCCA','Uscr':'\\uD835\\uDCB0','utdot':'\\u22F0','utilde':'\\u0169','Utilde':'\\u0168','utri':'\\u25B5','utrif':'\\u25B4','uuarr':'\\u21C8','uuml':'\\xFC','Uuml':'\\xDC','uwangle':'\\u29A7','vangrt':'\\u299C','varepsilon':'\\u03F5','varkappa':'\\u03F0','varnothing':'\\u2205','varphi':'\\u03D5','varpi':'\\u03D6','varpropto':'\\u221D','varr':'\\u2195','vArr':'\\u21D5','varrho':'\\u03F1','varsigma':'\\u03C2','varsubsetneq':'\\u228A\\uFE00','varsubsetneqq':'\\u2ACB\\uFE00','varsupsetneq':'\\u228B\\uFE00','varsupsetneqq':'\\u2ACC\\uFE00','vartheta':'\\u03D1','vartriangleleft':'\\u22B2','vartriangleright':'\\u22B3','vBar':'\\u2AE8','Vbar':'\\u2AEB','vBarv':'\\u2AE9','vcy':'\\u0432','Vcy':'\\u0412','vdash':'\\u22A2','vDash':'\\u22A8','Vdash':'\\u22A9','VDash':'\\u22AB','Vdashl':'\\u2AE6','vee':'\\u2228','Vee':'\\u22C1','veebar':'\\u22BB','veeeq':'\\u225A','vellip':'\\u22EE','verbar':'|','Verbar':'\\u2016','vert':'|','Vert':'\\u2016','VerticalBar':'\\u2223','VerticalLine':'|','VerticalSeparator':'\\u2758','VerticalTilde':'\\u2240','VeryThinSpace':'\\u200A','vfr':'\\uD835\\uDD33','Vfr':'\\uD835\\uDD19','vltri':'\\u22B2','vnsub':'\\u2282\\u20D2','vnsup':'\\u2283\\u20D2','vopf':'\\uD835\\uDD67','Vopf':'\\uD835\\uDD4D','vprop':'\\u221D','vrtri':'\\u22B3','vscr':'\\uD835\\uDCCB','Vscr':'\\uD835\\uDCB1','vsubne':'\\u228A\\uFE00','vsubnE':'\\u2ACB\\uFE00','vsupne':'\\u228B\\uFE00','vsupnE':'\\u2ACC\\uFE00','Vvdash':'\\u22AA','vzigzag':'\\u299A','wcirc':'\\u0175','Wcirc':'\\u0174','wedbar':'\\u2A5F','wedge':'\\u2227','Wedge':'\\u22C0','wedgeq':'\\u2259','weierp':'\\u2118','wfr':'\\uD835\\uDD34','Wfr':'\\uD835\\uDD1A','wopf':'\\uD835\\uDD68','Wopf':'\\uD835\\uDD4E','wp':'\\u2118','wr':'\\u2240','wreath':'\\u2240','wscr':'\\uD835\\uDCCC','Wscr':'\\uD835\\uDCB2','xcap':'\\u22C2','xcirc':'\\u25EF','xcup':'\\u22C3','xdtri':'\\u25BD','xfr':'\\uD835\\uDD35','Xfr':'\\uD835\\uDD1B','xharr':'\\u27F7','xhArr':'\\u27FA','xi':'\\u03BE','Xi':'\\u039E','xlarr':'\\u27F5','xlArr':'\\u27F8','xmap':'\\u27FC','xnis':'\\u22FB','xodot':'\\u2A00','xopf':'\\uD835\\uDD69','Xopf':'\\uD835\\uDD4F','xoplus':'\\u2A01','xotime':'\\u2A02','xrarr':'\\u27F6','xrArr':'\\u27F9','xscr':'\\uD835\\uDCCD','Xscr':'\\uD835\\uDCB3','xsqcup':'\\u2A06','xuplus':'\\u2A04','xutri':'\\u25B3','xvee':'\\u22C1','xwedge':'\\u22C0','yacute':'\\xFD','Yacute':'\\xDD','yacy':'\\u044F','YAcy':'\\u042F','ycirc':'\\u0177','Ycirc':'\\u0176','ycy':'\\u044B','Ycy':'\\u042B','yen':'\\xA5','yfr':'\\uD835\\uDD36','Yfr':'\\uD835\\uDD1C','yicy':'\\u0457','YIcy':'\\u0407','yopf':'\\uD835\\uDD6A','Yopf':'\\uD835\\uDD50','yscr':'\\uD835\\uDCCE','Yscr':'\\uD835\\uDCB4','yucy':'\\u044E','YUcy':'\\u042E','yuml':'\\xFF','Yuml':'\\u0178','zacute':'\\u017A','Zacute':'\\u0179','zcaron':'\\u017E','Zcaron':'\\u017D','zcy':'\\u0437','Zcy':'\\u0417','zdot':'\\u017C','Zdot':'\\u017B','zeetrf':'\\u2128','ZeroWidthSpace':'\\u200B','zeta':'\\u03B6','Zeta':'\\u0396','zfr':'\\uD835\\uDD37','Zfr':'\\u2128','zhcy':'\\u0436','ZHcy':'\\u0416','zigrarr':'\\u21DD','zopf':'\\uD835\\uDD6B','Zopf':'\\u2124','zscr':'\\uD835\\uDCCF','Zscr':'\\uD835\\uDCB5','zwj':'\\u200D','zwnj':'\\u200C'};\n\tvar decodeMapLegacy = {'aacute':'\\xE1','Aacute':'\\xC1','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','aelig':'\\xE6','AElig':'\\xC6','agrave':'\\xE0','Agrave':'\\xC0','amp':'&','AMP':'&','aring':'\\xE5','Aring':'\\xC5','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','brvbar':'\\xA6','ccedil':'\\xE7','Ccedil':'\\xC7','cedil':'\\xB8','cent':'\\xA2','copy':'\\xA9','COPY':'\\xA9','curren':'\\xA4','deg':'\\xB0','divide':'\\xF7','eacute':'\\xE9','Eacute':'\\xC9','ecirc':'\\xEA','Ecirc':'\\xCA','egrave':'\\xE8','Egrave':'\\xC8','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','frac12':'\\xBD','frac14':'\\xBC','frac34':'\\xBE','gt':'>','GT':'>','iacute':'\\xED','Iacute':'\\xCD','icirc':'\\xEE','Icirc':'\\xCE','iexcl':'\\xA1','igrave':'\\xEC','Igrave':'\\xCC','iquest':'\\xBF','iuml':'\\xEF','Iuml':'\\xCF','laquo':'\\xAB','lt':'<','LT':'<','macr':'\\xAF','micro':'\\xB5','middot':'\\xB7','nbsp':'\\xA0','not':'\\xAC','ntilde':'\\xF1','Ntilde':'\\xD1','oacute':'\\xF3','Oacute':'\\xD3','ocirc':'\\xF4','Ocirc':'\\xD4','ograve':'\\xF2','Ograve':'\\xD2','ordf':'\\xAA','ordm':'\\xBA','oslash':'\\xF8','Oslash':'\\xD8','otilde':'\\xF5','Otilde':'\\xD5','ouml':'\\xF6','Ouml':'\\xD6','para':'\\xB6','plusmn':'\\xB1','pound':'\\xA3','quot':'\"','QUOT':'\"','raquo':'\\xBB','reg':'\\xAE','REG':'\\xAE','sect':'\\xA7','shy':'\\xAD','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','szlig':'\\xDF','thorn':'\\xFE','THORN':'\\xDE','times':'\\xD7','uacute':'\\xFA','Uacute':'\\xDA','ucirc':'\\xFB','Ucirc':'\\xDB','ugrave':'\\xF9','Ugrave':'\\xD9','uml':'\\xA8','uuml':'\\xFC','Uuml':'\\xDC','yacute':'\\xFD','Yacute':'\\xDD','yen':'\\xA5','yuml':'\\xFF'};\n\tvar decodeMapNumeric = {'0':'\\uFFFD','128':'\\u20AC','130':'\\u201A','131':'\\u0192','132':'\\u201E','133':'\\u2026','134':'\\u2020','135':'\\u2021','136':'\\u02C6','137':'\\u2030','138':'\\u0160','139':'\\u2039','140':'\\u0152','142':'\\u017D','145':'\\u2018','146':'\\u2019','147':'\\u201C','148':'\\u201D','149':'\\u2022','150':'\\u2013','151':'\\u2014','152':'\\u02DC','153':'\\u2122','154':'\\u0161','155':'\\u203A','156':'\\u0153','158':'\\u017E','159':'\\u0178'};\n\tvar invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\tvar object = {};\n\tvar hasOwnProperty = object.hasOwnProperty;\n\tvar has = function(object, propertyName) {\n\t\treturn hasOwnProperty.call(object, propertyName);\n\t};\n\n\tvar contains = function(array, value) {\n\t\tvar index = -1;\n\t\tvar length = array.length;\n\t\twhile (++index < length) {\n\t\t\tif (array[index] == value) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\tvar merge = function(options, defaults) {\n\t\tif (!options) {\n\t\t\treturn defaults;\n\t\t}\n\t\tvar result = {};\n\t\tvar key;\n\t\tfor (key in defaults) {\n\t\t\t// A `hasOwnProperty` check is not needed here, since only recognized\n\t\t\t// option names are used anyway. Any others are ignored.\n\t\t\tresult[key] = has(options, key) ? options[key] : defaults[key];\n\t\t}\n\t\treturn result;\n\t};\n\n\t// Modified version of `ucs2encode`; see https://mths.be/punycode.\n\tvar codePointToSymbol = function(codePoint, strict) {\n\t\tvar output = '';\n\t\tif ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {\n\t\t\t// See issue #4:\n\t\t\t// “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is\n\t\t\t// greater than 0x10FFFF, then this is a parse error. Return a U+FFFD\n\t\t\t// REPLACEMENT CHARACTER.”\n\t\t\tif (strict) {\n\t\t\t\tparseError('character reference outside the permissible Unicode range');\n\t\t\t}\n\t\t\treturn '\\uFFFD';\n\t\t}\n\t\tif (has(decodeMapNumeric, codePoint)) {\n\t\t\tif (strict) {\n\t\t\t\tparseError('disallowed character reference');\n\t\t\t}\n\t\t\treturn decodeMapNumeric[codePoint];\n\t\t}\n\t\tif (strict && contains(invalidReferenceCodePoints, codePoint)) {\n\t\t\tparseError('disallowed character reference');\n\t\t}\n\t\tif (codePoint > 0xFFFF) {\n\t\t\tcodePoint -= 0x10000;\n\t\t\toutput += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);\n\t\t\tcodePoint = 0xDC00 | codePoint & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(codePoint);\n\t\treturn output;\n\t};\n\n\tvar hexEscape = function(codePoint) {\n\t\treturn '&#x' + codePoint.toString(16).toUpperCase() + ';';\n\t};\n\n\tvar decEscape = function(codePoint) {\n\t\treturn '&#' + codePoint + ';';\n\t};\n\n\tvar parseError = function(message) {\n\t\tthrow Error('Parse error: ' + message);\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar encode = function(string, options) {\n\t\toptions = merge(options, encode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidRawCodePoint.test(string)) {\n\t\t\tparseError('forbidden code point');\n\t\t}\n\t\tvar encodeEverything = options.encodeEverything;\n\t\tvar useNamedReferences = options.useNamedReferences;\n\t\tvar allowUnsafeSymbols = options.allowUnsafeSymbols;\n\t\tvar escapeCodePoint = options.decimal ? decEscape : hexEscape;\n\n\t\tvar escapeBmpSymbol = function(symbol) {\n\t\t\treturn escapeCodePoint(symbol.charCodeAt(0));\n\t\t};\n\n\t\tif (encodeEverything) {\n\t\t\t// Encode ASCII symbols.\n\t\t\tstring = string.replace(regexAsciiWhitelist, function(symbol) {\n\t\t\t\t// Use named references if requested & possible.\n\t\t\t\tif (useNamedReferences && has(encodeMap, symbol)) {\n\t\t\t\t\treturn '&' + encodeMap[symbol] + ';';\n\t\t\t\t}\n\t\t\t\treturn escapeBmpSymbol(symbol);\n\t\t\t});\n\t\t\t// Shorten a few escapes that represent two symbols, of which at least one\n\t\t\t// is within the ASCII range.\n\t\t\tif (useNamedReferences) {\n\t\t\t\tstring = string\n\t\t\t\t\t.replace(/&gt;\\u20D2/g, '&nvgt;')\n\t\t\t\t\t.replace(/&lt;\\u20D2/g, '&nvlt;')\n\t\t\t\t\t.replace(/&#x66;&#x6A;/g, '&fjlig;');\n\t\t\t}\n\t\t\t// Encode non-ASCII symbols.\n\t\t\tif (useNamedReferences) {\n\t\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Note: any remaining non-ASCII symbols are handled outside of the `if`.\n\t\t} else if (useNamedReferences) {\n\t\t\t// Apply named character references.\n\t\t\t// Encode `<>\"'&` using named character references.\n\t\t\tif (!allowUnsafeSymbols) {\n\t\t\t\tstring = string.replace(regexEscape, function(string) {\n\t\t\t\t\treturn '&' + encodeMap[string] + ';'; // no need to check `has()` here\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Shorten escapes that represent two symbols, of which at least one is\n\t\t\t// `<>\"'&`.\n\t\t\tstring = string\n\t\t\t\t.replace(/&gt;\\u20D2/g, '&nvgt;')\n\t\t\t\t.replace(/&lt;\\u20D2/g, '&nvlt;');\n\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t});\n\t\t} else if (!allowUnsafeSymbols) {\n\t\t\t// Encode `<>\"'&` using hexadecimal escapes, now that they’re not handled\n\t\t\t// using named character references.\n\t\t\tstring = string.replace(regexEscape, escapeBmpSymbol);\n\t\t}\n\t\treturn string\n\t\t\t// Encode astral symbols.\n\t\t\t.replace(regexAstralSymbols, function($0) {\n\t\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\t\tvar high = $0.charCodeAt(0);\n\t\t\t\tvar low = $0.charCodeAt(1);\n\t\t\t\tvar codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;\n\t\t\t\treturn escapeCodePoint(codePoint);\n\t\t\t})\n\t\t\t// Encode any remaining BMP symbols that are not printable ASCII symbols\n\t\t\t// using a hexadecimal escape.\n\t\t\t.replace(regexBmpWhitelist, escapeBmpSymbol);\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tencode.options = {\n\t\t'allowUnsafeSymbols': false,\n\t\t'encodeEverything': false,\n\t\t'strict': false,\n\t\t'useNamedReferences': false,\n\t\t'decimal' : false\n\t};\n\n\tvar decode = function(html, options) {\n\t\toptions = merge(options, decode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidEntity.test(html)) {\n\t\t\tparseError('malformed character reference');\n\t\t}\n\t\treturn html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) {\n\t\t\tvar codePoint;\n\t\t\tvar semicolon;\n\t\t\tvar decDigits;\n\t\t\tvar hexDigits;\n\t\t\tvar reference;\n\t\t\tvar next;\n\n\t\t\tif ($1) {\n\t\t\t\treference = $1;\n\t\t\t\t// Note: there is no need to check `has(decodeMap, reference)`.\n\t\t\t\treturn decodeMap[reference];\n\t\t\t}\n\n\t\t\tif ($2) {\n\t\t\t\t// Decode named character references without trailing `;`, e.g. `&amp`.\n\t\t\t\t// This is only a parse error if it gets converted to `&`, or if it is\n\t\t\t\t// followed by `=` in an attribute context.\n\t\t\t\treference = $2;\n\t\t\t\tnext = $3;\n\t\t\t\tif (next && options.isAttributeValue) {\n\t\t\t\t\tif (strict && next == '=') {\n\t\t\t\t\t\tparseError('`&` did not start a character reference');\n\t\t\t\t\t}\n\t\t\t\t\treturn $0;\n\t\t\t\t} else {\n\t\t\t\t\tif (strict) {\n\t\t\t\t\t\tparseError(\n\t\t\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Note: there is no need to check `has(decodeMapLegacy, reference)`.\n\t\t\t\t\treturn decodeMapLegacy[reference] + (next || '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($4) {\n\t\t\t\t// Decode decimal escapes, e.g. `&#119558;`.\n\t\t\t\tdecDigits = $4;\n\t\t\t\tsemicolon = $5;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(decDigits, 10);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\tif ($6) {\n\t\t\t\t// Decode hexadecimal escapes, e.g. `&#x1D306;`.\n\t\t\t\thexDigits = $6;\n\t\t\t\tsemicolon = $7;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(hexDigits, 16);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\t// If we’re still here, `if ($7)` is implied; it’s an ambiguous\n\t\t\t// ampersand for sure. https://mths.be/notes/ambiguous-ampersands\n\t\t\tif (strict) {\n\t\t\t\tparseError(\n\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn $0;\n\t\t});\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tdecode.options = {\n\t\t'isAttributeValue': false,\n\t\t'strict': false\n\t};\n\n\tvar escape = function(string) {\n\t\treturn string.replace(regexEscape, function($0) {\n\t\t\t// Note: there is no need to check `has(escapeMap, $0)` here.\n\t\t\treturn escapeMap[$0];\n\t\t});\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar he = {\n\t\t'version': '1.2.0',\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'escape': escape,\n\t\t'unescape': decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn he;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = he;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in he) {\n\t\t\t\thas(he, key) && (freeExports[key] = he[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.he = he;\n\t}\n\n}(this));\n","import React from 'react';\nimport AsyncComponentLoader from '../../../async-component-loader';\nimport importUniversalConfig from './import-universal-compact-config';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport styles from './universal-compact-config-style.scss';\n\nconst UniversalConfigLoader = props => (\n  <AsyncComponentLoader\n    importComponent={importUniversalConfig}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return (\n          <div className={styles.loadingPositioner}>\n            <LoadingSpinner />\n          </div>\n        );\n      }\n\n      const { UniversalCompactConfig } = component;\n      return <UniversalCompactConfig {...props} />;\n    }}\n  />\n);\n\nexport default UniversalConfigLoader;\n","import { once } from 'lodash';\n\n/*\n * importConfig\n *\n * Loads the entire database \"Edit from dashboard\" experience\n * asynchronously while ensuring that the bundle is only ever\n * requested once, even if it is requested in multiple\n * places simultaneously.\n *\n * PLEASE USE THIS INSTEAD OF IMPORTING THE\n * DATABASE CONFIG ENTRY FILE DIRECTLY.\n */\nconst __importConfig = () => import('./entry');\nconst importConfig = once(__importConfig);\n\nexport default importConfig;\n","import React from 'react';\nimport AsyncComponentLoader from '../../../async-component-loader';\nimport importConfig from './import-config';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport styles from '../../compact-config-style.scss';\n\nconst AsyncDatabaseCompactConfig = props => (\n  <AsyncComponentLoader\n    importComponent={importConfig}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return (\n          <div className={styles.loadingPositioner}>\n            <LoadingSpinner />\n          </div>\n        );\n      }\n\n      const { DatabaseCompactConfig } = component;\n      return <DatabaseCompactConfig {...props} />;\n    }}\n  />\n);\n\nexport default AsyncDatabaseCompactConfig;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { ApolloProvider } from 'react-apollo';\nimport { isUniversal } from '../lib/service';\nimport PanelContainer from './components/panel-container';\nimport { router } from '../router';\nimport DraggableContext from '../components/draggable-context';\nimport UniversalCompactConfig from '../universal-config/components/universal-compact-config';\nimport DatabaseCompactConfig from './services/database';\nimport apolloClient from '../services/concierge-service/apollo-client';\n\nimport styles from './compact-config-style.scss';\n\nclass CompactConfigComponent extends Component {\n  componentDidMount() {\n    // Adds \"?w={widgetKey}\" to the URL, to help customer success\n    // to debug widgets based on the widget key.\n    router.setQueryParam('w', this.props.widgetKey);\n  }\n\n  componentWillUnmount() {\n    router.removeQueryParam('w');\n  }\n\n  render() {\n    const { serviceName } = this.props;\n\n    return (\n      <div className={styles.compactConfig}>\n        <PanelContainer>\n          {isUniversal(serviceName) && (\n            <UniversalCompactConfig {...this.props} />\n          )}\n          {serviceName === 'database' && (\n            <DatabaseCompactConfig {...this.props} />\n          )}\n        </PanelContainer>\n      </div>\n    );\n  }\n}\n\nCompactConfigComponent.propTypes = {\n  serviceName: PropTypes.string,\n  widgetKey: PropTypes.string,\n};\n\nconst CompactConfigWithContext = props => (\n  <ApolloProvider client={apolloClient.create()}>\n    <DraggableContext>\n      <CompactConfigComponent {...props} />\n    </DraggableContext>\n  </ApolloProvider>\n);\n\nexport default CompactConfigWithContext;\nexport { CompactConfigComponent };\n","const METHODS = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'PATCH'];\nconst SAFE_METHODS = ['GET', 'HEAD'];\n\nfunction getCSRFToken() {\n  const hasWindow =\n    typeof window === 'object' && window.window === window && window;\n  if (!hasWindow || !window.document) {\n    return undefined;\n  }\n\n  const metaToken =\n    window.document.querySelector('meta[name=\"csrf-token\"]') || {};\n  return metaToken.content;\n}\n\nfunction applyCSRF(opts) {\n  const { method = 'GET' } = opts || {};\n  if (typeof __DEV__ !== 'undefined' && __DEV__ && !METHODS.includes(method)) {\n    throw new Error(`wrong HTTP method name: ${method}`);\n  }\n\n  if (!SAFE_METHODS.includes(method)) {\n    const CSRFToken = getCSRFToken();\n    if (CSRFToken) {\n      return {\n        ...opts,\n        headers: {\n          ...opts.headers,\n          'X-CSRF-Token': CSRFToken,\n        },\n      };\n    }\n  }\n\n  return opts;\n}\n\nexport { applyCSRF, getCSRFToken };\n","import { omitBy, startsWith } from 'lodash';\n\nfunction removeKeysWithUnderscore(config) {\n  return omitBy(config, (value, key) => startsWith(key, '_'));\n}\n\nexport { removeKeysWithUnderscore };\n","import {\n  chain,\n  compact,\n  every,\n  findIndex,\n  flatten,\n  head,\n  isNull,\n  isUndefined,\n  max,\n  reduce,\n} from 'lodash';\n\nconst supportsMultiSeries = vizType =>\n  ['line', 'column', 'table'].indexOf(vizType) !== -1;\n\nexport const getMetricsOrder = queries =>\n  queries.map(q =>\n    q.select.map(m => (isUndefined(m.multi_index) ? 0 : m.multi_index + 1)),\n  );\n\nexport const mergeQueryResults = (queries = [], queryResults, vizType) => {\n  if (!queryResults || every(queryResults, isNull)) {\n    return null;\n  }\n\n  // No need to process all queryresults if only one contains data\n  const compactedQueryResults = compact(queryResults);\n  if (compactedQueryResults.length === 1) {\n    return compactedQueryResults[0];\n  }\n\n  if (!supportsMultiSeries(vizType)) {\n    return queryResults;\n  }\n\n  const order = getMetricsOrder(queries);\n  const resSize = max(flatten(order)) + 1;\n  // Create placeholder for all points with x values like:\n  // [[x1, null, null], [x2, null, null], [x3, null, null]]\n  const mergedResults = chain(compactedQueryResults)\n    .map(q => q.map(d => head(d)))\n    .flatten()\n    .reject(isUndefined)\n    .uniq()\n    .map(x => {\n      const d = new Array(resSize).fill(null);\n      d[0] = x;\n      return d;\n    })\n    .value();\n\n  return reduce(\n    queryResults,\n    (res, queryResult, i) => {\n      if (!queryResult) {\n        return res;\n      }\n      const indices = order[i];\n\n      queryResult.forEach(qrRow => {\n        if (!isNull(qrRow)) {\n          const index = findIndex(res, row => row[0] === qrRow[0]);\n\n          indices.forEach((j, k) => (res[index][j] = qrRow[k]));\n        }\n      });\n\n      return res;\n    },\n    mergedResults,\n  );\n};\n","import localForage from 'localforage/dist/localforage.nopromises';\nimport { some } from 'lodash';\nimport { getGlobalFilters } from './reducer/ui-query-reducer/other-ui-query-reducer-methods';\n\nconst OLD_CACHE_KEY = 'universal-lastUsedAccount:';\nconst CACHE_KEY = 'universal-config-preferences:';\n\n// TODO remove from the 23rd of May\n// https://app.clubhouse.io/geckoboard/story/21150/remove-universal-config-old-service-account-preference-retrocompatibility\nconst getOldLastUsedAccountId = integration => {\n  return localForage.getItem(`${OLD_CACHE_KEY}${integration}`);\n};\n\n// TODO remove from the 23rd of May\n// https://app.clubhouse.io/geckoboard/story/21150/remove-universal-config-old-service-account-preference-retrocompatibility\nconst removeOldAccountId = integration => {\n  return localForage.removeItem(`${OLD_CACHE_KEY}${integration}`);\n};\n\nconst _getPreferences = integration => {\n  return localForage.getItem(`${CACHE_KEY}${integration}`);\n};\n\nexport const setPreferences = universalState => {\n  const {\n    source: { integration, service_account_id: serviceAccountId },\n    queries: [{ filter = [] } = {}] = [],\n  } = universalState;\n  const preferences = { service_account_id: serviceAccountId };\n\n  if (filter.length) {\n    preferences.filter = getGlobalFilters(filter);\n  }\n  // TODO remove from the 23rd of May\n  try {\n    removeOldAccountId(integration);\n  } catch (e) {\n    // silently fails\n  }\n  return localForage.setItem(`${CACHE_KEY}${integration}`, preferences);\n};\n\nexport const getPreferences = async universalState => {\n  const {\n    source: { integration, service_account_id: id },\n  } = universalState;\n  const pref = await _getPreferences(integration);\n\n  if (pref && pref.service_account_id === id) {\n    return pref;\n  }\n  return null;\n};\n\nconst getLastUsedAccountId = integration => {\n  return Promise.all([\n    _getPreferences(integration),\n    getOldLastUsedAccountId(integration),\n  ]).then(([preferences, oldId]) => {\n    let id;\n    if (preferences) {\n      ({ service_account_id: id } = preferences);\n    } else if (oldId) {\n      id = oldId;\n    }\n    return id;\n  });\n};\n\nexport const getServiceAccountId = async (integration, serviceAccounts) => {\n  const id = await getLastUsedAccountId(integration);\n  // service acount id is stored as number on serviceAccounts payload\n  const cachedAccountExists =\n    id && some(serviceAccounts, { id: parseInt(id, 10) });\n  // fallback on first available service account if not found / removed\n  return cachedAccountExists ? id : serviceAccounts[0].id;\n};\n","/* eslint camelcase:0 */\nimport { pick, map, keys, mapKeys } from 'lodash';\nimport config from '../universal/config';\n\nfunction getRedirectURL({ widget_type_id }) {\n  const { RootURL } = config.get();\n  if (widget_type_id) {\n    return `${RootURL}dashboard/oauth_return?widget=${widget_type_id}`;\n  }\n  return RootURL; // https://gecko.geckoboard.com/#/widget/id/account/id\n}\n\nfunction authUrl(service, options = {}) {\n  const { id, auth_type: authType, name } = service;\n  const { AuthBaseURL } = config.get();\n  let query = pick(options, 'group_id', 'service_account_id', 'redirect_url');\n\n  if (authType === 'basic') {\n    const path = location.pathname.replace(/^\\//, '');\n    return `/auth/basic?s=${id}&amp;r=${path}`;\n  }\n\n  // oauth from this point on\n  const url = `${AuthBaseURL}/${authType}/authorize/${name}`;\n\n  if (!query.redirect_url) {\n    query.redirect_url = getRedirectURL(options);\n  }\n\n  query.redirect_url = encodeURIComponent(query.redirect_url);\n\n  // It seems that this is only used by Zendesk to point at the correct subdomain for the OAuth flow\n  if (options.extra_params) {\n    const extraParams = mapKeys(\n      options.extra_params,\n      (_value, key) => `extra[${key}]`,\n    );\n    query = { ...query, ...extraParams };\n  }\n\n  if (keys(query).length) {\n    const queryString = map(query, (v, k) => `${k}=${v}`).join('&');\n\n    return `${url}?${queryString}`;\n  }\n\n  return url;\n}\n\nexport { authUrl };\n","import { bind, omitBy, isUndefined } from 'lodash';\nimport defer from './defer';\nimport config from '../universal/config';\nimport { authUrl } from './auth-url';\n\nfunction poll(popup, deferred) {\n  if (popup.closed) {\n    deferred.reject(new Error('Window closed'));\n    return;\n  }\n  if (!deferred.isPending()) {\n    window.OAuthCallbacks = undefined;\n    popup.close();\n    return;\n  }\n  setTimeout(bind(poll, null, popup, deferred), 200);\n}\n\nfunction resultHandler(resolution, deferred) {\n  return function callback(serviceId, widgetTypeId, message) {\n    let result = message;\n    if ('reject' === resolution) {\n      result = new Error(message);\n    }\n    deferred[resolution](result);\n  };\n}\n\nfunction redirectUrl(serviceId) {\n  const { RootURL } = config.get();\n  return `${RootURL}oauth/callback?service_id=${serviceId}`;\n}\n\nfunction OAuth(popup, service, groupId, formData, serviceAccountId) {\n  const deferred = defer();\n  const options = omitBy(\n    {\n      extra_params: formData,\n      group_id: groupId,\n      redirect_url: redirectUrl(service.id),\n      service_account_id: serviceAccountId,\n    },\n    isUndefined,\n  );\n  const url = authUrl(service, options);\n  const callbacks = {\n    succeed: resultHandler('resolve', deferred),\n    fail: resultHandler('reject', deferred),\n  };\n\n  window.OAuthCallbacks = callbacks;\n\n  popup.location = url;\n\n  poll(popup, deferred);\n\n  return deferred.promise;\n}\n\nexport { OAuth as auth };\n","export default function defer() {\n  const result = {};\n  let isResolved = false;\n  let isRejected = false;\n\n  result.isPending = () => {\n    return !isResolved && !isRejected;\n  };\n\n  result.promise = new Promise((resolve, reject) => {\n    result.resolve = (...args) => {\n      isResolved = true;\n      resolve(...args);\n    };\n    result.reject = (...args) => {\n      isRejected = true;\n      reject(...args);\n    };\n  });\n  return result;\n}\n","import React, { Component, createContext } from 'react';\nimport { debounce } from 'lodash';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router';\nimport { getWindow } from '../lib/global';\n\nexport const fakeIntercom = (...args) => {\n  const argString = args.join('/');\n  // eslint-disable-next-line no-console\n  console.log('Intercom message:', argString);\n};\n\nexport const messages = {\n  support: \"Hi! I'd like to request support for: \",\n};\n\nexport const IntercomContext = createContext({\n  available: false,\n  intercom: undefined,\n  messages: {},\n});\n\nexport const intercomContextTypes = PropTypes.shape({\n  available: PropTypes.bool,\n  intercom: PropTypes.func,\n  messages: PropTypes.object,\n});\n\nexport class IntercomProvider extends Component {\n  constructor(props) {\n    super(props);\n\n    /*\n     * Sometimes the route of our app can change\n     * multiple times very quickly. For example\n     * when we automatically redirect users to\n     * their current dashboard. Debouncing this\n     * update method will mean we don't update\n     * Intercom's context unnecessarily.\n     */\n    this.update = debounce(this.update.bind(this), 500);\n\n    this.state = {\n      intercom: this.intercom,\n      available: this.available,\n      messages,\n    };\n  }\n\n  componentDidMount() {\n    /*\n     * We need to tell intercom to update its\n     * context when the route changes.\n     */\n    this.unlisten = this.props.history.listen(this.update);\n\n    /*\n     * It's possible that this component is mounted\n     * before Intercom is available on the window.\n     *\n     * In this case lets try one more time after one\n     * second to find Intercom. This will hopefully\n     * be enough to remove any race conditions.\n     */\n    if (!this.state.available) {\n      this.timeout = setTimeout(() => {\n        this.setState({\n          intercom: this.intercom,\n          available: this.available,\n        });\n      }, 1000);\n    }\n  }\n\n  componentWillUnmount() {\n    /*\n     * Don't try and update state if the\n     * component has been unmounted.\n     */\n    clearTimeout(this.timeout);\n\n    if (typeof this.unlisten === 'function') this.unlisten();\n  }\n\n  get intercom() {\n    return this.available ? getWindow().Intercom : fakeIntercom;\n  }\n\n  get available() {\n    return getWindow() && !!getWindow().Intercom;\n  }\n\n  render() {\n    return (\n      <IntercomContext.Provider value={this.state}>\n        {this.props.children}\n      </IntercomContext.Provider>\n    );\n  }\n\n  update() {\n    this.intercom('update');\n  }\n}\n\nIntercomProvider.propTypes = {\n  history: PropTypes.object.isRequired,\n  children: PropTypes.element,\n};\n\nexport default withRouter(IntercomProvider);\n","import React from 'react';\nimport { IntercomContext } from './intercom-provider';\n\nexport const withIntercomContext = WrappedComponent => {\n  const wrappedDisplayName =\n    WrappedComponent.displayName || WrappedComponent.name || 'Component';\n\n  const withConsumer = props => (\n    <IntercomContext.Consumer>\n      {intercom => <WrappedComponent intercomContext={intercom} {...props} />}\n    </IntercomContext.Consumer>\n  );\n\n  withConsumer.displayName = `withIntercomContext(${wrappedDisplayName})`;\n\n  return withConsumer;\n};\n\nexport default IntercomContext.Consumer;\n","import IntercomProvider, {\n  intercomContextTypes,\n  messages,\n} from './intercom-provider';\nimport IntercomConsumer, { withIntercomContext } from './intercom-consumer';\n\nexport {\n  IntercomProvider,\n  IntercomConsumer,\n  withIntercomContext,\n  intercomContextTypes,\n  messages,\n};\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './status-label-style.scss';\n\nconst StatusLabelComponent = ({ type }) => (\n  <span className={style[type]}>{type}</span>\n);\n\nStatusLabelComponent.propTypes = {\n  type: PropTypes.string,\n};\n\nexport default StatusLabelComponent;\n","import StatusLabelComponent from './status-label-component';\nexport default StatusLabelComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"gecko-font\":\"gecko-font---3ptVp\",\"gecko-bar\":\"gecko-bar---3mHe6\",\"gecko-column\":\"gecko-column---_Es0S\",\"gecko-funnel\":\"gecko-funnel---2pFqJ\",\"gecko-geckometer\":\"gecko-geckometer---4jNXO\",\"gecko-leaderboard\":\"gecko-leaderboard---w2DX9\",\"gecko-line\":\"gecko-line---yx8h_\",\"gecko-number\":\"gecko-number---2wVAr\",\"gecko-rag\":\"gecko-rag---2GSfc\",\"gecko-text\":\"gecko-text---1XCwn\",\"gecko-table\":\"gecko-table---2f4Zz\",\"gecko-feed\":\"gecko-feed---1gcN8\",\"gecko-list\":\"gecko-list---1GlL4\",\"gecko-ragcolumn\":\"gecko-ragcolumn---jhWWL\",\"gecko-about\":\"gecko-about---2SKt9\",\"gecko-filter\":\"gecko-filter---1efrO\",\"gecko-format\":\"gecko-format---2Mn_q\",\"gecko-goal\":\"gecko-goal---3MV-2\",\"gecko-split-by\":\"gecko-split-by---MM9wx\",\"gecko-split-column\":\"gecko-split-column---1dQkK\",\"gecko-split-line\":\"gecko-split-line---257lw\",\"gecko-clock\":\"gecko-clock---3LWix\",\"gecko-sort-up\":\"gecko-sort-up---zdb7T\",\"gecko-sort-down\":\"gecko-sort-down---3Pea3\",\"gecko-sort\":\"gecko-sort---2JOaR\",\"gecko-more-decimals\":\"gecko-more-decimals---TyU0l\",\"gecko-less-decimals\":\"gecko-less-decimals---3MFs_\",\"gecko-map\":\"gecko-map---23v7K\",\"gecko-monitoring\":\"gecko-monitoring---27g3T\",\"gecko-bullet\":\"gecko-bullet---1MXUe\",\"gecko-highcharts\":\"gecko-highcharts---23YZe\",\"gecko-pie\":\"gecko-pie---Pe2aX\",\"gecko-slack\":\"gecko-slack---3kdqA\",\"muted\":\"muted---1J05L\",\"light\":\"light---OSRXB\",\"default\":\"default---3xrns\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"input\":\"input---2iJ-O\",\"disabled\":\"disabled---dSHR-\",\"small\":\"small---blMXF\",\"error\":\"error---bKT5j\",\"uppercase\":\"uppercase---gtk8e\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport { bindAll } from 'lodash';\nimport Icon from '@UI/icon';\n\nimport style from './modal-style.scss';\n\nclass ModalComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleKeydown', 'handleClick');\n  }\n\n  componentDidMount() {\n    document.addEventListener('keydown', this.handleKeydown);\n  }\n\n  componentWillUnmount() {\n    document.removeEventListener('keydown', this.handleKeydown);\n  }\n\n  handleKeydown(e) {\n    if (e.keyCode === 27 && this.props.visible) {\n      this.props.onClose();\n    }\n  }\n\n  handleClick(e) {\n    if (e.target === this.container || !this.container.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  renderCloseButton() {\n    const { hasCloseButton, onClose } = this.props;\n\n    if (hasCloseButton) {\n      return (\n        <button onClick={onClose} className={style.closeButton}>\n          <Icon name=\"times\" fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR} />\n        </button>\n      );\n    }\n\n    return null;\n  }\n\n  renderContent() {\n    const { visible, children } = this.props;\n    if (!visible) return null;\n\n    return (\n      <CSSTransition classNames=\"content\" timeout={500}>\n        <div\n          id=\"modal\"\n          className={style.flexContainer}\n          ref={div => (this.container = div)}\n        >\n          <div className={style.content} key=\"content\">\n            {this.renderCloseButton()}\n            <div className={style.scroller} data-acc-id=\"modal\">\n              {children}\n            </div>\n          </div>\n        </div>\n      </CSSTransition>\n    );\n  }\n\n  renderPopover() {\n    if (!this.props.visible) return null;\n\n    return (\n      <CSSTransition classNames=\"popover\" timeout={500}>\n        <div\n          className={style.popover}\n          key=\"popover\"\n          onClick={this.handleClick.bind(this)}\n        >\n          <TransitionGroup className={style.container}>\n            {this.renderContent()}\n          </TransitionGroup>\n        </div>\n      </CSSTransition>\n    );\n  }\n\n  render() {\n    return <TransitionGroup>{this.renderPopover()}</TransitionGroup>;\n  }\n}\n\nModalComponent.defaultProps = {\n  visible: false,\n  onClose: () => {},\n};\n\nModalComponent.propTypes = {\n  children: PropTypes.node,\n  hasCloseButton: PropTypes.bool,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nconst ModalSection = ({ children }) => (\n  <section className={style.section}>{children}</section>\n);\nModalSection.propTypes = { children: PropTypes.node };\n\nconst ModalHeading = ({ children, level }) => {\n  const TagName = `h${level}`;\n  return <TagName className={style.heading}>{children}</TagName>;\n};\nModalHeading.defaultProps = {\n  level: 3,\n};\nModalHeading.propTypes = {\n  children: PropTypes.node,\n  level: PropTypes.oneOf([1, 2, 3, 4, 5, 6]),\n};\n\nconst ModalText = ({ children }) => (\n  <div className={style.text}>{children}</div>\n);\nModalText.propTypes = { children: PropTypes.node };\n\nexport default ModalComponent;\nexport { ModalSection, ModalHeading, ModalText };\n","import { PureComponent } from 'react';\nimport { func, node } from 'prop-types';\n\nclass OnMount extends PureComponent {\n  componentDidMount() {\n    if (this.props.do) {\n      this.props.do();\n    }\n  }\n\n  render() {\n    return this.props.children;\n  }\n}\nOnMount.defaultProps = {\n  children: null,\n};\nOnMount.propTypes = {\n  children: node,\n  do: func,\n};\n\nexport { OnMount };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"list---jTAZ-\",\"title\":\"title---2tcT1\",\"description\":\"description---YKcZZ\",\"label\":\"label---6DA9W\",\"offScreenItems\":\"offScreenItems---382SQ\",\"pagination\":\"pagination---2A2Vb\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\n\nimport style from './select-dropdown-style.scss';\n\nclass SelectDropdownComponent extends Component {\n  renderOptions({ value, label }) {\n    return (\n      <option value={value} key={value}>\n        {label}\n      </option>\n    );\n  }\n\n  render() {\n    const { layoutClassName, name, options, onChange, selected } = this.props;\n    const classes = classNames(layoutClassName, style.wrapper);\n    if (!options) {\n      return null;\n    }\n\n    return (\n      <div className={classes}>\n        <select\n          name={name}\n          className={style.select}\n          value={selected}\n          onChange={e => {\n            onChange(e.target.value);\n          }}\n        >\n          {options.map(this.renderOptions)}\n        </select>\n      </div>\n    );\n  }\n}\n\nSelectDropdownComponent.propTypes = {\n  layoutClassName: PropTypes.string,\n  name: PropTypes.string,\n  options: PropTypes.arrayOf(\n    PropTypes.shape({\n      label: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n      value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n    }),\n  ),\n  selected: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  onChange: PropTypes.func,\n};\n\nexport default SelectDropdownComponent;\n","import SelectDropdownComponent from './select-dropdown-component';\nexport default SelectDropdownComponent;\n","import PropTypes from 'prop-types';\n\nimport tvStyle from './leaderboard-tv-style.scss';\nimport desktopStyle from './leaderboard-desktop-style.scss';\n\nconst LeaderboardStyleInjector = props => {\n  const { tvMode, children } = props;\n\n  const style = tvMode ? tvStyle : desktopStyle;\n  return children(style);\n};\n\nLeaderboardStyleInjector.propTypes = {\n  tvMode: PropTypes.bool,\n};\n\nexport default LeaderboardStyleInjector;\n","/* eslint camelcase: 0 */\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { humaniseNumber } from '../../lib/humanise-number';\n\nimport styles from './leaderboard-style.scss';\n\nclass LeaderboardItemComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { delta: 0 };\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    this.setState({\n      delta: this.props.rank - nextProps.rank,\n    });\n  }\n\n  render() {\n    const {\n      label,\n      value,\n      format,\n      unit,\n      numberFormat,\n      previous_rank,\n      rank,\n      displayArrow,\n      style,\n    } = this.props;\n\n    const formattedValue = humaniseNumber(value, {\n      format,\n      unit,\n      numberFormat,\n    });\n    const { delta } = this.state;\n\n    const classes = classNames(style.listItem, {\n      [styles.arrow]: displayArrow,\n      'moved moved-up': rank < previous_rank,\n      'moved moved-down': rank > previous_rank,\n    });\n\n    return (\n      <li key={label} data-delta={delta} className={classes}>\n        <span className={`leaderboard-label ${style.label}`}>\n          <span className=\"leaderboard-label-container\">{label}</span>\n        </span>\n        <span className=\"leaderboard-value\">{formattedValue}</span>\n      </li>\n    );\n  }\n}\n\nLeaderboardItemComponent.defaultProps = {\n  style: {},\n};\n\nLeaderboardItemComponent.propTypes = {\n  displayArrow: PropTypes.bool,\n  format: PropTypes.string,\n  label: PropTypes.string,\n  numberFormat: PropTypes.object,\n  previous_rank: PropTypes.number,\n  rank: PropTypes.number,\n  style: PropTypes.object,\n  unit: PropTypes.string,\n  value: PropTypes.number,\n};\n\nexport default LeaderboardItemComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport LeaderboardItem from './leaderboard-item';\nimport { getClientSize, getOffsetSize } from '../../lib/dom-helper';\nimport { findDOMNode } from 'react-dom';\nimport { some, isUndefined } from 'lodash';\n\nimport leaderboardStyles from './leaderboard-style.scss';\n\nclass LeaderboardVisualisationComponent extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      itemHeight: undefined,\n      containerHeight: undefined,\n    };\n  }\n\n  static canRender(cfg) {\n    return !!cfg.items;\n  }\n\n  componentDidMount() {\n    this.afterRender();\n  }\n\n  componentDidUpdate() {\n    this.afterRender();\n  }\n\n  renderItems(items) {\n    const { format, unit, numberFormat, style } = this.props;\n    const counter = {};\n    const displayArrows = some(items, item => !isUndefined(item.previous_rank));\n\n    return items\n      .map(item => {\n        const i =\n          counter[item.label] === undefined ? 0 : counter[item.label] + 1;\n        counter[item.label] = i;\n\n        return { item, key: `${item.label}${i}` };\n      })\n      .map(({ item, key }, i) => (\n        <LeaderboardItem\n          key={key}\n          rank={i + 1}\n          format={format}\n          unit={unit}\n          numberFormat={numberFormat}\n          displayArrow={displayArrows}\n          style={style}\n          {...item}\n        />\n      ));\n  }\n\n  render() {\n    const { items = [], style, isPreviewMode } = this.props;\n    const { containerHeight, itemHeight } = this.state;\n    const wrapperClasses = classNames(\n      'leaderboard',\n      leaderboardStyles.leaderboard,\n      style.list,\n      {\n        [leaderboardStyles.previewLayout]: isPreviewMode,\n      },\n    );\n\n    let count = items.length;\n\n    if (containerHeight && itemHeight) {\n      count = Math.floor(containerHeight / itemHeight);\n    }\n\n    const truncatedItems = items.slice(0, count);\n\n    return (\n      <ol className={wrapperClasses}>{this.renderItems(truncatedItems)}</ol>\n    );\n  }\n\n  afterRender() {\n    const el = findDOMNode(this);\n    const [, height] = getClientSize(el);\n\n    if (el.children.length) {\n      const [, itemHeight] = getOffsetSize(el.children[0]);\n\n      if (itemHeight && this.state.itemHeight !== itemHeight) {\n        // Items are all the same height atm, that's why we're\n        // only looking at the height of the first one.\n        this.setState({ itemHeight });\n      }\n    }\n\n    if (this.state.containerHeight !== height) {\n      this.setState({ containerHeight: height });\n    }\n  }\n}\n\nLeaderboardVisualisationComponent.defaultProps = {\n  isPreviewMode: false,\n  style: {},\n};\n\nLeaderboardVisualisationComponent.propTypes = {\n  format: PropTypes.string,\n  isPreviewMode: PropTypes.bool,\n  items: PropTypes.array,\n  numberFormat: PropTypes.object,\n  style: PropTypes.object,\n  unit: PropTypes.string,\n};\n\nexport default LeaderboardVisualisationComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport LeaderboardStyleInjector from './leaderboard-style-injector';\nimport LeaderboardComponent from './leaderboard-component';\n\nconst Leaderboard = props => (\n  <LeaderboardStyleInjector tvMode={props.tvMode}>\n    {style => <LeaderboardComponent {...props} style={style} />}\n  </LeaderboardStyleInjector>\n);\n\nLeaderboard.canRender = LeaderboardComponent.canRender;\n\nLeaderboard.propTypes = {\n  tvMode: PropTypes.bool,\n};\n\nexport default Leaderboard;\n","import { find, isEqual, isUndefined, reduce, includes, filter } from 'lodash';\n\n// TODO: Apply camelCase normalisation in fetch service and remove this\nconst normalisedPurchasedKeys = ({ addon_id: addonId, quantity }) => ({\n  addonId,\n  quantity,\n});\n\nconst ADDONS_DEFAULT_QUANTITY = {\n  max_dashboard_user_bundle: (usage, maxDashboards, maxQuantity) => {\n    const { dashboards, users } = usage;\n    const maxUsage = Math.max(dashboards, users);\n    const quantity = maxUsage - 1;\n\n    if (maxUsage > 0 && quantity <= maxQuantity) {\n      return quantity;\n    }\n    return 0;\n  },\n  max_dashboards: (usage, maxDashboards, maxQuantity) => {\n    const { dashboards } = usage;\n    const quantity = dashboards - maxDashboards;\n\n    if (dashboards > maxDashboards && quantity <= maxQuantity) {\n      return quantity;\n    }\n    return 0;\n  },\n};\n\nfunction getAddonsWithQuantities(availableAddons, selectedAddons) {\n  return availableAddons.map(addon => {\n    // Get currently selected quantity\n    const { quantity = 0 } = find(selectedAddons, { addonId: addon.id }) || {};\n    return { quantity, ...addon };\n  });\n}\n\nconst DASHBOARD_SUBJECTS = ['max_dashboards', 'max_dashboard_user_bundle'];\n\n/*\n * NOTE: This function is replicated in gecko-js\n */\nfunction extraDashboards(selected, available) {\n  return reduce(\n    selected,\n    (total, selectedAddon) => {\n      const { addonId, quantity } = selectedAddon;\n\n      const addon = find(available, { id: addonId });\n      if (addon && includes(DASHBOARD_SUBJECTS, addon.subject)) {\n        return total + quantity;\n      }\n\n      return total;\n    },\n    0,\n  );\n}\n\nfunction toExtraDashboardsAndUsers(addonWithQuantity) {\n  const { subject, quantity } = addonWithQuantity;\n  if (subject === 'max_dashboard_user_bundle') {\n    return {\n      dashboards: quantity,\n      users: quantity,\n    };\n  } else if (subject === 'max_dashboards') {\n    return {\n      dashboards: quantity,\n      users: 0,\n    };\n  }\n  return {\n    dashboards: 0,\n    users: 0,\n  };\n}\n\nfunction applyLimits(plan) {\n  const {\n    features: { max_dashboards: maxDashboards, max_users: maxUsers },\n    addons: { available = [] } = {},\n    selectedAddons,\n  } = plan;\n\n  const extras = getAddonsWithQuantities(available, selectedAddons).map(\n    toExtraDashboardsAndUsers,\n  );\n\n  const limits = {\n    dashboards: maxDashboards,\n    users: maxUsers,\n  };\n\n  extras.forEach(extra => {\n    limits.dashboards += extra.dashboards;\n    limits.users += extra.users;\n  });\n\n  if (!maxDashboards) limits.dashboards = null;\n  if (!maxUsers) limits.users = null;\n\n  return { limits, ...plan };\n}\n\nfunction getTotalAddonsPrice({ selectedAddons, isAnnual }, plan) {\n  let totalAddons = 0;\n  const { addons: { available = [], purchased = [] } = {} } = plan;\n  const addons = selectedAddons\n    ? selectedAddons\n    : purchased.map(normalisedPurchasedKeys);\n\n  addons.forEach(({ addonId, quantity }) => {\n    const addon = find(available, { id: addonId });\n    const {\n      price: { annual: addonAnnualPrice, monthly: addonMonthlyPrice },\n    } = addon;\n    const unitPrice = isAnnual ? addonAnnualPrice : addonMonthlyPrice;\n    totalAddons += quantity * unitPrice;\n  });\n\n  return totalAddons;\n}\n\nfunction applyPricing({ isAnnual }, plan) {\n  let displayedPrice = 0;\n  let totalAddons = 0;\n  const {\n    price: { annual: annualBase, monthly: monthlyBase },\n    selectedAddons = [],\n  } = plan;\n\n  if (selectedAddons.length) {\n    totalAddons = getTotalAddonsPrice({ selectedAddons, isAnnual }, plan);\n  }\n\n  displayedPrice += isAnnual ? annualBase : monthlyBase;\n  displayedPrice += totalAddons;\n\n  return { displayedPrice, ...plan };\n}\n\nfunction getCurrentPrice(currentPlan, isAnnual) {\n  const { price: { annual, monthly } = {} } = currentPlan;\n  const currentTotalAddonsPrice = getTotalAddonsPrice(\n    { isAnnual },\n    currentPlan,\n  );\n  let displayedCurrentPrice = isAnnual ? annual : monthly;\n  displayedCurrentPrice += currentTotalAddonsPrice;\n\n  return displayedCurrentPrice;\n}\n\nfunction collectPurchasedAddons(currentPlan) {\n  const { id, addons: { purchased = [] } = {} } = currentPlan;\n  const addons = purchased.map(normalisedPurchasedKeys);\n\n  return { [id]: addons };\n}\n\nfunction applySelectedAddons(plan, selectedAddons = {}) {\n  const { id } = plan;\n  const addons = selectedAddons[id] || [];\n\n  return { ...plan, selectedAddons: addons };\n}\n\nfunction flagIsCurrent({ isAnnual, currentIsAnnual }, currentPlan, plan) {\n  const { addons: { purchased = [] } = {} } = currentPlan;\n  const normalisedPurchased = purchased.map(normalisedPurchasedKeys);\n  const validSelectedAddons = plan.selectedAddons.filter(\n    ({ quantity }) => quantity !== 0,\n  );\n  const isCurrent =\n    isAnnual === currentIsAnnual &&\n    currentPlan.id === plan.id &&\n    isEqual(normalisedPurchased, validSelectedAddons);\n\n  return { ...plan, isCurrent };\n}\n\nfunction getDefaultAddons(plan, usage) {\n  const {\n    addons: { available } = {},\n    features: { max_dashboards: maxDashboards },\n  } = plan;\n\n  return available.map(\n    ({ subject, id: addonId, max_quantity: maxQuantity }) => {\n      let quantity = 0;\n      if (!isUndefined(ADDONS_DEFAULT_QUANTITY[subject])) {\n        quantity = ADDONS_DEFAULT_QUANTITY[subject](\n          usage,\n          maxDashboards,\n          maxQuantity,\n        );\n      }\n      return { addonId, quantity };\n    },\n  );\n}\n\nfunction removeEmptyAddons(plan) {\n  const { addons = [] } = plan;\n\n  const addonsWithQuantity = filter(addons, ({ quantity }) => quantity > 0);\n\n  return {\n    ...plan,\n    addons: addonsWithQuantity,\n  };\n}\n\nexport {\n  extraDashboards,\n  getAddonsWithQuantities,\n  applyLimits,\n  applyPricing,\n  collectPurchasedAddons,\n  applySelectedAddons,\n  flagIsCurrent,\n  getDefaultAddons,\n  getCurrentPrice,\n  removeEmptyAddons,\n};\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\n\nimport style from './link-style.scss';\n\nclass LinkComponent extends Component {\n  render() {\n    const { href, target, children, onClick } = this.props;\n\n    return (\n      <a href={href} className={style.link} target={target} onClick={onClick}>\n        {children}\n      </a>\n    );\n  }\n}\n\nLinkComponent.propTypes = {\n  children: PropTypes.node,\n  href: PropTypes.string,\n  target: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nexport default LinkComponent;\n","import Link from './link-component';\nexport default Link;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"goal\":\"goal---h8vx2\",\"goalProgress\":\"goalProgress---1dZsJ\",\"goalComplete\":\"goalComplete---1kBPX\",\"goalProgressBarTrack\":\"goalProgressBarTrack---1wgKp\",\"goalProgressBar\":\"goalProgressBar---g9dc1\",\"goalThreshold\":\"goalThreshold---3FZN6\",\"goalThresholdReached\":\"goalThresholdReached---3HRiD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"progressIndicatorContainer\":\"progressIndicatorContainer---JxopF\",\"progressBarContainer\":\"progressBarContainer---1CPo4\",\"progressBarBackground\":\"progressBarBackground---1Qro4\",\"progressBarProgress\":\"progressBarProgress---3Fu_P\",\"text\":\"text---3cd9a\",\"percentageText\":\"percentageText---3XygS\",\"targetText\":\"targetText---3GTP9\",\"targetReached\":\"targetReached---3uJV1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"pie\":\"pie---Qhnzx\",\"chart\":\"chart---18UgU\",\"legend\":\"legend---1s-XS\",\"legendList\":\"legendList---32pcU\",\"label\":\"label---2AdC4\",\"pill\":\"pill---3-CAY\",\"text\":\"text---3R58A\",\"arc\":\"arc---eEBwi\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Instrument\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"doNotUseLegacyWidgetKey\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataSource\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataURL\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"integration\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"platform\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"serviceAccountId\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"refreshMode\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ClientInitiated\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"intervalSeconds\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ServerSide\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frequency\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Bar\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"statusIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Clock\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timezone\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"offset\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"format\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Column\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"statusIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Geckometer\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"max\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"min\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"statusIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Image\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"source\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"reloadIntervalSeconds\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Label\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"messages\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"text\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Leaderboard\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"LegacyLine\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Line\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"max\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"min\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"statusIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Map\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"mapType\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"mapFocus\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Number\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"comparison\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PercentageComparison\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"positiveDirection\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberComparison\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"positiveDirection\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DynamicComparison\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormat\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"progressIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"targetValue\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"startingValue\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"statusIndicator\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Rag\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"ragType\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Table\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"numberFormats\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":2392}};\n    doc.loc.source = {\"body\":\"#import './numberFormat-fragment.graphql'\\n#import './statusIndicator-fragment.graphql'\\n\\nfragment InstrumentFragment on Instrument {\\n  __typename\\n  id\\n  title\\n  doNotUseLegacyWidgetKey\\n  dataSource {\\n    dataURL\\n    integration {\\n      name\\n      slug\\n    }\\n    platform\\n    serviceAccountId\\n  }\\n  refreshMode {\\n    __typename\\n    ...on ClientInitiated {\\n      intervalSeconds\\n    }\\n    ...on ServerSide {\\n      frequency\\n    }\\n  }\\n  ...on Bar {\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n    statusIndicator {\\n      ...StatusIndicatorFragment\\n    }\\n  }\\n  ...on Clock {\\n    timezone {\\n      offset\\n    }\\n    format\\n  }\\n  ...on Column {\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n    statusIndicator {\\n      ...StatusIndicatorFragment\\n    }\\n  }\\n  ...on Geckometer {\\n    max {\\n      __typename\\n      ...on FloatValue {\\n        value\\n      }\\n    }\\n    min {\\n      __typename\\n      ...on FloatValue {\\n        value\\n      }\\n    }\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n    statusIndicator {\\n      ...StatusIndicatorFragment\\n    }\\n  }\\n  ...on Image {\\n    source\\n    reloadIntervalSeconds\\n  }\\n  ...on Label {\\n    messages {\\n      text\\n      type\\n    }\\n  }\\n  ...on Leaderboard {\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n  }\\n  ...on LegacyLine {\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n  }\\n  ...on Line {\\n    max {\\n      __typename\\n      ...on FloatValue {\\n        value\\n      }\\n    }\\n    min {\\n      __typename\\n      ...on FloatValue {\\n        value\\n      }\\n    }\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n    statusIndicator {\\n      ...StatusIndicatorFragment\\n    }\\n  }\\n  ...on Map {\\n    mapType\\n    mapFocus\\n  }\\n  ...on Number {\\n    comparison {\\n      __typename\\n      ...on PercentageComparison {\\n        positiveDirection\\n        label\\n      }\\n      ...on NumberComparison {\\n        positiveDirection\\n        label\\n      }\\n      ...on DynamicComparison {\\n        label\\n      }\\n    }\\n    label\\n    numberFormat {\\n      ...NumberFormatFragment\\n    }\\n    progressIndicator {\\n      targetValue {\\n        ...on FloatValue {\\n          value\\n        }\\n      }\\n      startingValue {\\n        ...on FloatValue {\\n          value\\n        }\\n      }\\n    }\\n    statusIndicator {\\n      ...StatusIndicatorFragment\\n    }\\n  }\\n  ...on Rag {\\n    ragType\\n  }\\n  ...on Table {\\n    numberFormats {\\n      ...NumberFormatFragment\\n    }\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require('./numberFormat-fragment.graphql').definitions));\ndoc.definitions = doc.definitions.concat(unique(require('./statusIndicator-fragment.graphql').definitions));\n\n\n      module.exports = doc;\n    \n","import { forEach } from 'lodash';\nimport * as userActions from '../../user/actions/user-actions';\nimport * as groupsActions from '../../groups/actions/groups-actions';\n\nconst getKey = (userId, dashboardId) => `${userId}-${dashboardId}`;\n\nconst initialState = {};\n\nconst usersDashboardsReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case groupsActions.getPeopleSuccess.type: {\n      const {\n        people: { viewers },\n      } = payload;\n\n      const joins = {};\n      viewers.forEach(user => {\n        user.dashboard_ids.forEach(dashboardId => {\n          const key = getKey(user.id, dashboardId);\n          joins[key] = {\n            userId: user.id,\n            dashboardId,\n          };\n        });\n      });\n\n      return {\n        ...state,\n        ...joins,\n      };\n    }\n\n    case userActions.updateUsersDashboardsPermissionsSuccessful.type: {\n      const { usersDashboardsPermissions } = payload;\n\n      const joins = { ...state };\n\n      usersDashboardsPermissions.forEach(({ userId, dashboardId, role }) => {\n        const key = getKey(userId, dashboardId);\n        if (role === 'viewer') {\n          joins[key] = {\n            userId,\n            dashboardId,\n          };\n        } else if (role === 'none') {\n          delete joins[key];\n        }\n      });\n\n      return joins;\n    }\n\n    default:\n      return state;\n  }\n};\n\nconst getUserDashboardIds = (usersDashboards, id) => {\n  const dashboardIds = [];\n  forEach(usersDashboards, ({ userId, dashboardId }) => {\n    if (id === userId) {\n      dashboardIds.push(dashboardId);\n    }\n  });\n  return dashboardIds;\n};\n\nconst getDashboardUserIds = (usersDashboards, id) => {\n  const userIds = [];\n  forEach(usersDashboards, ({ userId, dashboardId }) => {\n    if (id === dashboardId) {\n      userIds.push(userId);\n    }\n  });\n  return userIds;\n};\n\nexport default usersDashboardsReducer;\nexport { initialState, getUserDashboardIds, getDashboardUserIds };\n","import bodyRenderer from './body-renderer';\nexport default bodyRenderer;\n","import React, { Component } from 'react';\nimport { createPortal } from 'react-dom';\n\n/**\n * bodyRenderer - Wraps a component so that it can be rendered directly into\n * document body, thereby avoiding any issues with zIndex stacking and overflow\n */\nexport default function bodyRenderer(WrappedComponent) {\n  class BodyRenderer extends Component {\n    constructor(props) {\n      super(props);\n\n      this.el = document.createElement('div');\n    }\n\n    componentDidMount() {\n      document.body.appendChild(this.el);\n    }\n\n    componentWillUnmount() {\n      document.body.removeChild(this.el);\n    }\n\n    render() {\n      return createPortal(<WrappedComponent {...this.props} />, this.el);\n    }\n  }\n\n  return BodyRenderer;\n}\n","import localForage from 'localforage/dist/localforage.nopromises';\nimport createAction from '../../lib/redux/create-action';\nimport { map, compact } from 'lodash';\n\nexport const setImports = createAction('Imports:SET_IMPORTS');\nexport const hideImport = createAction('Imports:HIDE_IMPORT');\nexport const queueServiceAccountId = createAction(\n  'Imports:QUEUE_SERVICE_ACCOUNT_ID',\n);\n\nexport const importsReceived = imports => async dispatch => {\n  // Filter out any imports that have already been dismissed by this user (stored in localStorage for now)\n  const activeImports = await Promise.all(\n    map(imports, async i => {\n      const storedImport = await localForage.getItem(`universalImport:${i.id}`);\n\n      return !!storedImport && storedImport.acknowledged ? undefined : i;\n    }),\n  );\n\n  dispatch(setImports(compact(activeImports)));\n};\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardWithContainersFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Dashboard\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"containers\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"area\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rowStart\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnStart\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rowSpan\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnSpan\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frames\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"instrument\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"span\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timezone\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardByIdWithContainers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardWithContainersFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardContainersAndFrames\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"containers\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"area\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rowStart\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnStart\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rowSpan\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnSpan\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frames\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"span\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardBySharingHashWithContainers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboardBySharingHash\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardWithContainersFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ScreenContentWithContainers\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"screenContent\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardWithContainersFragment\"},\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":1072}};\n    doc.loc.source = {\"body\":\"#import './instrument-fragment.graphql'\\n\\nfragment DashboardWithContainersFragment on Dashboard {\\n  id\\n  legacyId\\n  title\\n  containers {\\n    id\\n    title\\n    area {\\n      rowStart\\n      columnStart\\n      rowSpan\\n      columnSpan\\n    }\\n    frames {\\n      id\\n      instrument {\\n        ...InstrumentFragment\\n      }\\n      span\\n    }\\n  }\\n  timezone {\\n    name\\n  }\\n}\\n\\nquery DashboardByIdWithContainers($id: ID!) {\\n  dashboard(id: $id) {\\n    ...DashboardWithContainersFragment\\n  }\\n}\\n\\nquery DashboardContainersAndFrames($id: ID!) {\\n  dashboard(id: $id) {\\n    id\\n    containers {\\n      id\\n      title\\n      area {\\n        rowStart\\n        columnStart\\n        rowSpan\\n        columnSpan\\n      }\\n      frames {\\n        id\\n        span\\n      }\\n    }\\n  }\\n}\\n\\nquery DashboardBySharingHashWithContainers($sharingHash: String!) {\\n  dashboard: dashboardBySharingHash(sharingHash: $sharingHash) {\\n    ...DashboardWithContainersFragment\\n  }\\n}\\n\\nquery ScreenContentWithContainers($screenId: ID!) {\\n  dashboard: screenContent(screenId: $screenId) {\\n    ...DashboardWithContainersFragment\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require('./instrument-fragment.graphql').definitions));\n\n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DashboardByIdWithContainers\"] = oneQuery(doc, \"DashboardByIdWithContainers\");\n        \n        module.exports[\"DashboardContainersAndFrames\"] = oneQuery(doc, \"DashboardContainersAndFrames\");\n        \n        module.exports[\"DashboardBySharingHashWithContainers\"] = oneQuery(doc, \"DashboardBySharingHashWithContainers\");\n        \n        module.exports[\"ScreenContentWithContainers\"] = oneQuery(doc, \"ScreenContentWithContainers\");\n        \n","import React, { PureComponent } from 'react';\nimport { PROJECTIONS, sanitizeAndScalePoints } from '../../lib/maps';\nimport PropTypes from 'prop-types';\n\nimport styles from './map-style.scss';\n\nconst mapSettings = {\n  type: 'map',\n  dataProvider: {},\n\n  // Style land mass\n  addClassNames: true,\n  areasSettings: {\n    adjustOutlineThickness: false,\n    mouseEnabled: false,\n  },\n\n  // Disable mouse/touch interactions\n  panEventsEnabled: false,\n  dragMap: false,\n  zoomOnDoubleClick: false,\n  zoomControl: {\n    zoomControlEnabled: false,\n    homeButtonEnabled: false,\n  },\n\n  // Define default settings for dots\n  imagesSettings: {\n    // Apply a default color for dots, so it can be selected\n    // and changed to using a css variable in the css file\n    color: '#38cdff',\n  },\n};\n\nclass MapVisualisation extends PureComponent {\n  componentDidMount() {\n    const { AmChart, map, projection, points } = this.props;\n    const images = sanitizeAndScalePoints(points);\n\n    // Initialise map\n    this.map = AmChart.makeChart(this.domMap, {\n      ...mapSettings,\n      dataProvider: { map, images },\n      projection,\n    });\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (\n      this.props.map !== nextProps.map ||\n      this.props.points !== nextProps.points ||\n      this.props.projection !== nextProps.projection\n    ) {\n      this.updateMap(nextProps);\n    }\n  }\n\n  componentDidUpdate() {\n    // Re-render map everytime the component re-renders\n    this.map.validateData();\n  }\n\n  componentWillUnmount() {\n    if (this.map) {\n      this.map.clear();\n      this.map = null;\n    }\n  }\n\n  render() {\n    return (\n      <div\n        ref={map => (this.domMap = map)}\n        className={styles.mapVisualisation}\n      />\n    );\n  }\n\n  updateMap(nextProps) {\n    const { map, points, projection } = nextProps;\n    const images = sanitizeAndScalePoints(points);\n\n    this.map.projection = projection;\n    this.map.dataProvider = { map, images };\n    this.map.validateData();\n  }\n}\n\nMapVisualisation.propTypes = {\n  points: [],\n};\n\nMapVisualisation.propTypes = {\n  AmChart: PropTypes.object.isRequired,\n  map: PropTypes.string.isRequired,\n  projection: PropTypes.oneOf(Object.values(PROJECTIONS)).isRequired,\n  points: PropTypes.arrayOf(\n    PropTypes.shape({\n      latitude: PropTypes.number.isRequired,\n      longitude: PropTypes.number.isRequired,\n      city: PropTypes.shape({\n        city_name: PropTypes.string,\n        country_code: PropTypes.string,\n        region_code: PropTypes.string,\n      }),\n      color: PropTypes.string,\n      host: PropTypes.string,\n      ip: PropTypes.string,\n      size: PropTypes.number,\n    }),\n  ),\n};\n\nexport default MapVisualisation;\n","import React, { PureComponent } from 'react';\nimport { sanitizeAndScalePoints } from '../../lib/maps';\nimport PropTypes from 'prop-types';\nimport d3 from 'd3';\nimport styles from './map-style.scss';\n\nclass TopoJsonMapComponent extends PureComponent {\n  constructor() {\n    super();\n\n    this._projection = d3.geo.albersUsa();\n  }\n\n  componentDidMount() {\n    this.drawMap(this.props);\n    this.drawPoints(this.props.points);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (\n      this.props.topoJson[1] !== nextProps.topoJson[1] ||\n      this.props.size !== nextProps.size\n    ) {\n      this.drawMap(nextProps);\n    }\n\n    if (\n      this.props.points !== nextProps.points ||\n      this.props.size !== nextProps.size\n    ) {\n      this.drawPoints(nextProps.points);\n    }\n  }\n\n  componentWillUnmount() {\n    if (this._svg) {\n      this._svg.selectAll('path').remove();\n      this._svg.selectAll('circle').remove();\n    }\n  }\n\n  render() {\n    const { width, height } = this.props.size;\n\n    return (\n      <div className={styles.mapVisualisation}>\n        <svg\n          className={styles.topoSvg}\n          ref={map => (this.domMap = map)}\n          width={width}\n          height={height}\n        />\n      </div>\n    );\n  }\n\n  drawMap(props) {\n    const { width, height } = props.size;\n    const [topoJson, map] = props.topoJson;\n\n    const svg = (this._svg = d3.select(this.domMap));\n    const feature = topoJson.feature(map, map.objects.states);\n    this._projection.scale(1).translate([0, 0]);\n    const path = d3.geo.path().projection(this._projection);\n    const bounds = path.bounds(feature);\n\n    const scale =\n      1 /\n      Math.max(\n        (bounds[1][0] - bounds[0][0]) / width,\n        (bounds[1][1] - bounds[0][1]) / height,\n      );\n    const translate = [\n      (width - scale * (bounds[1][0] + bounds[0][0])) / 2,\n      (height - scale * (bounds[1][1] + bounds[0][1])) / 2,\n    ];\n\n    this._projection.scale(scale).translate(translate);\n\n    // We must redraw the map each time to ensure that we respect the visualisation `size`\n    svg.selectAll('path').remove();\n    svg.append('path').attr('d', path(feature));\n  }\n\n  drawPoints(points) {\n    const projectedPoints = sanitizeAndScalePoints(points)\n      .map(point => {\n        const coords = this._projection([point.longitude, point.latitude]);\n\n        if (!coords) return null;\n\n        return {\n          color: point.color,\n          width: point.width,\n          x: coords[0],\n          y: coords[1],\n        };\n      })\n      .filter(point => point !== null);\n\n    // We must remove each point to ensure that we respect the visualisation `size`\n    // D3 is efficient at only adding nodes when the data changes\n    // in this case d3 is not able to reconcile the change in `size` with any changes to\n    // our data so we cant take advantage of d3's efficient updates :(\n    this._svg.selectAll('circle').remove();\n    this._svg\n      .selectAll('circle')\n      .data(projectedPoints)\n      .enter()\n      .append('circle')\n      .attr('cx', d => d.x)\n      .attr('cy', d => d.y)\n      .attr('fill', d => d.color || '#38cdff')\n      .attr('r', d => d.width / 2 || 3);\n  }\n}\n\nTopoJsonMapComponent.propTypes = {\n  points: [],\n};\n\nTopoJsonMapComponent.propTypes = {\n  topoJson: PropTypes.array.isRequired,\n  points: PropTypes.arrayOf(\n    PropTypes.shape({\n      latitude: PropTypes.number.isRequired,\n      longitude: PropTypes.number.isRequired,\n      city: PropTypes.shape({\n        city_name: PropTypes.string,\n        country_code: PropTypes.string,\n        region_code: PropTypes.string,\n      }),\n      color: PropTypes.string,\n      host: PropTypes.string,\n      ip: PropTypes.string,\n      size: PropTypes.number,\n    }),\n  ),\n  size: PropTypes.shape({\n    height: PropTypes.number,\n    width: PropTypes.number,\n  }),\n};\n\nexport default TopoJsonMapComponent;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { layoutType } from '../prop-types';\nimport {\n  importMap,\n  importTopoJson,\n  getMapData,\n  MAP_TYPES,\n  PROJECTIONS,\n} from '../../lib/maps';\nimport MapComponent from './map-component';\nimport TopoJsonMapComponent from './topo-json-map-component';\n\nclass MapLoader extends PureComponent {\n  constructor() {\n    super();\n    this.state = {};\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillMount() {\n    this.loadMap();\n  }\n\n  componentDidUpdate(prevProps) {\n    const { mapType, value } = this.props;\n\n    if (mapType !== prevProps.mapType || value !== prevProps.value) {\n      this.loadMap();\n    }\n  }\n\n  render() {\n    const { points } = this.props;\n    const { AmChart, topoJson, mapData } = this.state;\n    if (!AmChart && !topoJson) {\n      return <div />;\n    }\n\n    if (topoJson) {\n      return (\n        <TopoJsonMapComponent\n          topoJson={topoJson}\n          map={mapData.ammapsId}\n          points={points}\n          projection={mapData.projection}\n          size={this.props.layout.pixels}\n        />\n      );\n    }\n\n    return (\n      <MapComponent\n        AmChart={AmChart}\n        map={mapData.ammapsId}\n        points={points}\n        projection={mapData.projection}\n      />\n    );\n  }\n\n  async loadMap() {\n    const { mapType, value } = this.props;\n    const mapData = getMapData(mapType, value);\n\n    if (mapData.projection === PROJECTIONS.ALBERS_USA) {\n      const topoJson = await importTopoJson(mapData.ammapsId); // We should change ammapsId to something agnostic\n\n      this.setState({ topoJson, AmChart: null, mapData });\n    } else {\n      const AmChart = await importMap(mapData.ammapsId);\n\n      this.setState({ AmChart, topoJson: null, mapData });\n    }\n  }\n}\n\nMapLoader.propTypes = {\n  mapType: PropTypes.oneOf([\n    MAP_TYPES.WORLD,\n    MAP_TYPES.CONTINENT,\n    MAP_TYPES.COUNTRY,\n    MAP_TYPES.REGION,\n  ]).isRequired,\n  layout: layoutType,\n  points: PropTypes.array,\n  value: PropTypes.string,\n};\n\nMapLoader.defaultProps = {\n  mapType: MAP_TYPES.WORLD,\n};\n\nexport default MapLoader;\n","import createAction from '../../../../../lib/redux/create-action';\nimport * as managementService from '../../../../../services/management-service';\n\nexport const openModal = createAction(\n  'DeleteDataSourceConfirmModal:OPEN_MODAL',\n);\nexport const closeModal = createAction(\n  'DeleteDataSourceConfirmModal:CLOSE_MODAL',\n);\nexport const setConnectionWidgetsData = createAction(\n  'DeleteDataSourceConfirmModal:SET_CONNECTION_WIDGETS',\n);\n\nexport const openModalWithConnection = connectionId => async dispatch => {\n  dispatch(openModal(connectionId));\n\n  const {\n    widgets,\n    dashboards_count: dashboardCount,\n    widgets_count: widgetCount,\n  } = await managementService.getWidgetsForService(connectionId);\n\n  dispatch(setConnectionWidgetsData({ widgets, dashboardCount, widgetCount }));\n};\n","export const WIDGET_PADDING = 14;\nexport const WIDGET_PADDING_TV_MODE = 18;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { getWindow } from '../lib/global';\nimport LineChart from './line-chart';\nimport ColumnChart from './column-chart';\nimport BarChart from './bar-chart';\nimport Funnel from './funnel';\nimport NumberVisualisation from './number';\nimport LeaderboardVisualisation from './leaderboard';\nimport GeckometerVisualisation from './geckometer';\nimport MapVisualisation from './map';\nimport Table from './table';\nimport Feed from './feed';\nimport Text from './text';\nimport Rag from './rag';\nimport RagColumn from './ragcolumn';\nimport PieChart from './pie-chart';\nimport HighchartOrLineChart from './highchart-or-line-chart';\nimport List from './list';\nimport Clock from './clock';\nimport Monitoring from './monitoring';\nimport Bullet from './bullet';\nimport Image from './image';\nimport TvMode from '../hoc/tv-mode';\nimport { chain, startsWith, isUndefined, isArray } from 'lodash';\n\nconst VISUALISATIONS = {\n  number: NumberVisualisation,\n  geckometer: GeckometerVisualisation,\n  line: LineChart,\n  column: ColumnChart,\n  bar: BarChart,\n  leaderboard: LeaderboardVisualisation,\n  map: MapVisualisation,\n  table: Table,\n  feed: Feed,\n  text: Text,\n  funnel: Funnel,\n  rag: Rag,\n  ragcolumn: RagColumn,\n  highcharts: HighchartOrLineChart,\n  pie: PieChart,\n  list: List,\n  clock: Clock,\n  monitoring: Monitoring,\n  bullet: Bullet,\n  image: Image,\n};\n\nconst VISUALISATION_TYPES = Object.keys(VISUALISATIONS);\n\nconst getVisualisationStatus = (visualisationType, configuration, data) => {\n  const VisualisationComponent = VISUALISATIONS[visualisationType];\n\n  if (\n    !VisualisationComponent ||\n    !VisualisationComponent.getVisualisationStatus ||\n    !configuration ||\n    !data\n  ) {\n    return undefined;\n  }\n\n  return VisualisationComponent.getVisualisationStatus(configuration, data);\n};\n\nfunction pickComponent(type) {\n  const VisualisationComponent = VISUALISATIONS[type];\n\n  if (!VisualisationComponent) {\n    throw new Error(`Visualisation of type \"${type}\" does not exist`);\n  }\n\n  return VisualisationComponent;\n}\n\nconst mapNumberFormat = numberFormat => {\n  if (isArray(numberFormat) || isUndefined(numberFormat)) {\n    return numberFormat;\n  }\n\n  // Since custom widgets and legacy widgets can set a default behaviour\n  // for the number formatting, we need to apply the default here\n  const { precision, abbreviation, prefix, suffix } = numberFormat || {};\n\n  const newNumberFormat = { ...numberFormat };\n\n  if (isUndefined(precision)) {\n    newNumberFormat.precision = numberFormat.defaultPrecision;\n  }\n\n  if (isUndefined(abbreviation)) {\n    newNumberFormat.abbreviation = numberFormat.defaultAbbreviation;\n  }\n\n  if (isUndefined(prefix) && isUndefined(suffix)) {\n    newNumberFormat.prefix = numberFormat.defaultPrefix;\n    newNumberFormat.suffix = numberFormat.defaultSuffix;\n  }\n\n  // Remove default keys and the ones that have an undefined value\n  return chain(newNumberFormat)\n    .omitBy(isUndefined)\n    .omitBy((_, key) => startsWith(key, 'default'))\n    .value();\n};\n\nclass VisualisationWrapperComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      width: undefined,\n      height: undefined,\n    };\n\n    this.setDimensions = this.setDimensions.bind(this);\n  }\n\n  static canRender(type, cfg) {\n    return pickComponent(type).canRender(cfg);\n  }\n\n  componentDidMount() {\n    this.setDimensions();\n\n    getWindow().addEventListener('resize', this.setDimensions);\n  }\n\n  componentDidUpdate() {\n    this.setDimensions();\n  }\n\n  componentWillUnmount() {\n    getWindow().removeEventListener('resize', this.setDimensions);\n  }\n\n  render() {\n    const { type, numberFormat } = this.props;\n    const { width, height } = this.state;\n    const VisualisationComponent = pickComponent(type);\n    const newNumberFormat = mapNumberFormat(numberFormat);\n\n    return (\n      <TvMode>\n        {tvMode => (\n          <VisualisationComponent\n            {...this.props}\n            tvMode={tvMode}\n            layout={{ pixels: { width, height } }}\n            numberFormat={newNumberFormat}\n          />\n        )}\n      </TvMode>\n    );\n  }\n\n  setDimensions() {\n    const el = findDOMNode(this);\n\n    if (\n      el.clientWidth !== this.state.width ||\n      el.clientHeight !== this.state.height\n    ) {\n      this.setState({\n        width: el.clientWidth,\n        height: el.clientHeight,\n      });\n    }\n  }\n}\n\nVisualisationWrapperComponent.propTypes = {\n  id: PropTypes.number,\n  isPreviewMode: PropTypes.bool,\n  numberFormat: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n  pixelHeight: PropTypes.number,\n  pixelWidth: PropTypes.number,\n  // We need to pass the pixelWidth and pixelHeight\n  // because the visualisation needs to be rerendered when the widget size changes\n  series: PropTypes.array,\n  type: PropTypes.string,\n};\n\nexport { VISUALISATIONS, VISUALISATION_TYPES, getVisualisationStatus };\nexport default VisualisationWrapperComponent;\n","import createReactRenderer from '../react-renderer';\nimport VisualisationWrapper, {\n  VISUALISATIONS,\n  VISUALISATION_TYPES,\n  getVisualisationStatus,\n} from './visualisation-wrapper-component';\n\nconst Visualisation = createReactRenderer(VisualisationWrapper);\n\nexport {\n  Visualisation as default,\n  VisualisationWrapper,\n  VISUALISATIONS,\n  VISUALISATION_TYPES,\n  getVisualisationStatus,\n};\n","import {\n  findIndex,\n  get,\n  includes,\n  isArray,\n  isUndefined,\n  pick,\n  set,\n  take,\n  times,\n} from 'lodash';\nimport { applyAndMerge } from '../../../lib/config-mapper';\nimport { FORM_TYPES } from './table-form-constants';\n\nclass TableSummaryModeNotSupportedError extends Error {\n  constructor() {\n    super();\n    this.type = 'ErrTableSummaryModeNotSupported';\n  }\n}\n\nconst MAX_COLUMNS = 10;\nconst DATETIME_BUCKETING_ONLY = ['minute', 'hour'];\nconst DEFAULT_AGGREGATE = 'sum';\n\nconst isTimeField = field => {\n  return ['date', 'datetime'].includes(field.type);\n};\n\nconst getDefaultQueryForRaw = fieldGroups => {\n  let columnFields = take(fieldGroups.string, 2);\n  if (columnFields.length !== 2) {\n    const takeLength = 2 - columnFields.length;\n    columnFields = [...columnFields, ...take(fieldGroups.numeric, takeLength)];\n  }\n  if (columnFields.length !== 2) {\n    const takeLength = 2 - columnFields.length;\n    columnFields = [\n      ...columnFields,\n      ...take(fieldGroups.groupable, takeLength),\n    ];\n  }\n  const columns = columnFields.map(({ key }) => ({ field: key }));\n  return { columns };\n};\n\nconst getDefaultQueryForSummary = fieldGroups => {\n  const firstGroupBy = get(fieldGroups, 'groupable[0]');\n  const firstNumericField = get(fieldGroups, 'numeric[0].key');\n\n  if (!firstGroupBy) {\n    throw new TableSummaryModeNotSupportedError();\n  }\n\n  const { key: groupByField, type: groupByType } = firstGroupBy;\n  const groupBy = { field: groupByField };\n  const column = {};\n\n  if (firstNumericField) {\n    column.field = firstNumericField;\n    column.aggregate = DEFAULT_AGGREGATE;\n  } else {\n    // Apply record count aggregation when there are no numeric fields\n    column.aggregate = 'count';\n    column._aggregate = DEFAULT_AGGREGATE;\n  }\n\n  if (groupByType !== 'string') {\n    groupBy.bucket_by = 'day';\n  }\n\n  return { group_by: groupBy, columns: [column] };\n};\n\nconst getDefaultQuery = (fieldGroups, config) => {\n  if (config.tableType === FORM_TYPES.SUMMARIZED) {\n    return getDefaultQueryForSummary(fieldGroups);\n  }\n\n  return getDefaultQueryForRaw(fieldGroups);\n};\n\nconst ensureConfig = currentConfig => {\n  const config = pick(\n    currentConfig,\n    'title',\n    'type',\n    'tableType',\n    'dataSetId',\n    'numberFormat',\n    'hasHeader',\n  );\n\n  const tableType = isUndefined(config.tableType)\n    ? FORM_TYPES.RAW\n    : config.tableType;\n  const hasHeader = isUndefined(config.hasHeader) ? true : config.hasHeader;\n  const numberFormat = isArray(config.numberFormat) ? config.numberFormat : [];\n\n  return { ...config, hasHeader, tableType, numberFormat };\n};\n\nconst updateQueryForSummary = (query, fields) => {\n  const newQuery = { ...query };\n  const { columns = [] } = newQuery;\n  const numberOfColumns = columns.length || 1;\n  const bucketBy = get(newQuery, 'group_by.bucket_by');\n  const groupByField = get(newQuery, 'group_by.field');\n  const isGroupingByTime = groupByField && isTimeField(fields[groupByField]);\n\n  // Ensure that we're bucketing when grouping by time\n  if (isGroupingByTime && !bucketBy) {\n    newQuery.group_by.bucket_by = 'day';\n  }\n\n  // Remove bucketing when grouping by strings\n  if (groupByField && !isGroupingByTime) {\n    delete newQuery.group_by.bucket_by;\n  }\n\n  // When switching to a date type from a datetime -\n  // 'hour' and 'minutes' are no longer a valid bucketing option\n  if (\n    includes(DATETIME_BUCKETING_ONLY, bucketBy) &&\n    fields[groupByField].type === 'date'\n  ) {\n    newQuery.group_by = {\n      ...newQuery.group_by,\n      bucket_by: 'day',\n    };\n  }\n\n  newQuery.columns = times(numberOfColumns, i => {\n    const column = { ...get(newQuery, `columns[${i}]`, {}) };\n\n    // Default aggregate to sum\n    if (!column.aggregate) {\n      column.aggregate = DEFAULT_AGGREGATE;\n    }\n\n    // Map the field value `aggregate:count` to the aggregate property\n    if (get(column, 'field') === 'aggregate:count') {\n      delete column.field;\n      column._aggregate = column.aggregate;\n      column.aggregate = 'count';\n    }\n    if (column.aggregate === column._aggregate) {\n      delete column._aggregate;\n    }\n\n    // When a field is applied and we're currently aggregating by count then we must revert to the original\n    // aggregate\n    if (column.field && column.aggregate === 'count') {\n      column.aggregate = column._aggregate || DEFAULT_AGGREGATE;\n      delete column._aggregate;\n    }\n\n    return column;\n  });\n\n  return newQuery;\n};\n\nconst updateQuery = (currentQuery, path, value, fields) => {\n  const newQuery = { ...set(currentQuery, path, value) };\n\n  // If there is an order by, make sure the field which is ordered by still exists\n  if (newQuery.order_by) {\n    const { field: orderByField } = newQuery.order_by;\n    const orderByFieldIndex = findIndex(newQuery.columns, {\n      field: orderByField,\n    });\n    if (orderByFieldIndex < 0) {\n      delete newQuery.order_by;\n    }\n  }\n\n  // The presence of `group_by` indicates that we are in summary mode\n  if (newQuery.group_by) {\n    return updateQueryForSummary(newQuery, fields);\n  }\n\n  return newQuery;\n};\n\nconst QUERY_MAPPING_RULES = {};\n\nconst mapQuery = (fromType, ...rest) =>\n  applyAndMerge(QUERY_MAPPING_RULES[fromType], ...rest);\n\nconst visualisationHelpers = {\n  ensureConfig,\n  getDefaultQuery,\n  updateQuery,\n  mapQuery,\n  getDefaultQueryForRaw,\n  getDefaultQueryForSummary,\n  MAX_COLUMNS,\n  TableSummaryModeNotSupportedError,\n};\n\nexport default visualisationHelpers;\n","export const TABULAR_REPORT = 'TABULAR';\nexport const MATRIX_REPORT = 'MATRIX';\nexport const SUMMARY_REPORT = 'SUMMARY';\n","import createAction from '../../lib/redux/create-action';\n\nexport const setActive = createAction('Selection:SET_ACTIVE');\nexport const clearAll = createAction('Selection:CLEAR_ALL');\nexport const updateSelections = createAction('Selections:UPDATE_BETA');\nexport const lockSelections = createAction('Selections:LOCK_ALL');\nexport const deleteSelection = createAction('Selections:DELETE');\nexport const setInitialConfig = createAction(\n  'Selections:SET_INITIAL_CONFIG_BETA',\n);\n","import { hasDisabledSelection } from '../selection-helpers';\nimport ColourBrewer from '../../../lib/colour-brewer';\n\nconst getDefaultConfig = selections => {\n  const [xAxis, ...series] = selections;\n\n  return {\n    type: 'column',\n    hasHeader: true,\n    goal: undefined,\n    numberFormat: {},\n    xAxis,\n    series,\n  };\n};\n\nconst getSelectionsFromConfig = config => [config.xAxis, ...config.series];\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst MAX_SERIES = 3;\n\nconst configMappingRules = {\n  line: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n    'title',\n  ],\n  text: ['dataRange', 'title'],\n  number: [\n    'dataRange',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n    'title',\n  ],\n  leaderboard: [\n    'dataRange',\n    ['labels', null, 'xAxis'],\n    'numberFormat',\n    'title',\n  ],\n  geckometer: ['dataRange', 'numberFormat', 'title'],\n  bar: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n    'title',\n  ],\n  table: ['dataRange', 'hasHeader', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n  MAX_SERIES,\n};\n","import columnChartVisualisationHelpers from './column-chart-helpers';\n\nconst getDefaultConfig = selections => {\n  const [xAxis, ...series] = selections;\n\n  return {\n    type: 'bar',\n    hasHeader: true,\n    goal: undefined,\n    numberFormat: {},\n    xAxis,\n    series,\n  };\n};\n\nconst getSelectionsFromConfig = config => [config.xAxis, ...config.series];\n\nconst isValid = columnChartVisualisationHelpers.isValid;\nconst headerPaths = columnChartVisualisationHelpers.headerPaths;\nconst headerColours = columnChartVisualisationHelpers.headerColours;\n\nconst configMappingRules = {\n  ...columnChartVisualisationHelpers.configMappingRules,\n  column: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n    'title',\n  ],\n  line: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n    'title',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import { hasDisabledSelection } from '../selection-helpers';\nimport ColourBrewer from '../../../lib/colour-brewer';\n\nconst getDefaultConfig = selections => {\n  const [xAxis, ...series] = selections;\n\n  return {\n    type: 'line',\n    hasHeader: true,\n    goal: undefined,\n    numberFormat: {},\n    xAxis,\n    series,\n  };\n};\n\nconst getSelectionsFromConfig = config => [config.xAxis, ...config.series];\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst configMappingRules = {\n  column: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n    'title',\n  ],\n  number: [\n    'dataRange',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n    'title',\n  ],\n  text: ['dataRange', 'title'],\n  leaderboard: ['dataRange', 'numberFormat', 'title'],\n  geckometer: [\n    'dataRange',\n    ['min', min => (min ? min.value : undefined), 'minYAxis'], // eslint-disable-line no-confusing-arrow\n    ['max', max => (max ? max.value : undefined), 'maxYAxis'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n    'title',\n  ],\n  bar: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n    'title',\n  ],\n  table: ['dataRange', 'hasHeader', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import { isUndefined, omitBy } from 'lodash';\nimport { isValidSelection } from '../selection-helpers';\n\nconst getDefaultConfig = selections => ({\n  type: 'number',\n  comparison: {},\n  numberFormat: {},\n  value: selections[0],\n});\n\nconst getSelectionsFromConfig = config => [[config.value[1], config.value[1]]];\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ comparison: { type } = {} }) => {\n  switch (type) {\n    case 'sparkline':\n      return [-1];\n    case 'percentage':\n    case 'number':\n      return [0, -1];\n    default:\n      return [];\n  }\n};\n\n// We map the goal direction from line, column and geckometer\n// to a sensible goal type\nconst GOAL_TO_COMPARISON = [\n  'goal',\n  (goal, lastComparison = {}) => {\n    if (!goal) return undefined;\n\n    return omitBy(\n      {\n        type: 'goal',\n        startingValue: lastComparison.startingValue,\n      },\n      isUndefined,\n    );\n  },\n  'comparison',\n];\n\nconst configMappingRules = {\n  column: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON, 'title'],\n  line: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON, 'title'],\n  leaderboard: ['dataRange', 'numberFormat', 'title'],\n  text: ['dataRange', 'title'],\n  geckometer: ['dataRange', 'numberFormat', 'indicators', 'title'],\n  bar: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON, 'title'],\n  table: ['dataRange', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { defaultTo } from 'lodash';\nimport {\n  TableHelpers,\n  TextHelpers,\n  GeckometerHelpers,\n  LeaderboardHelpers,\n  NumberHelpers,\n  BarChartHelpers,\n  ColumnChartHelpers,\n  LineChartHelpers,\n} from './visualisations';\n\nconst DATA_METHODS = {\n  line: LineChartHelpers,\n  column: ColumnChartHelpers,\n  bar: BarChartHelpers,\n  number: NumberHelpers,\n  leaderboard: LeaderboardHelpers,\n  geckometer: GeckometerHelpers,\n  text: TextHelpers,\n  table: TableHelpers,\n};\n\nconst getVisualisationHelpers = visualisation =>\n  defaultTo(DATA_METHODS[visualisation], LineChartHelpers);\n\nexport default getVisualisationHelpers;\n","import { isValidSelection } from '../selection-helpers';\n\nconst getDefaultConfig = selections => {\n  return {\n    type: 'leaderboard',\n    hasHeader: true,\n    reverseSort: false,\n    labels: selections[0],\n    values: selections[1],\n  };\n};\n\nconst getSelectionsFromConfig = config => [config.labels, config.values];\n\nconst isValid = ({ labels }) => {\n  return isValidSelection(labels);\n};\n\nconst headerPaths = () => {\n  return ['labels', 'values'];\n};\n\nconst configMappingRules = {\n  column: ['dataRange', 'numberFormat', 'title'],\n  line: ['dataRange', 'numberFormat', 'title'],\n  text: ['dataRange', 'title'],\n  number: ['dataRange', 'numberFormat', 'title'],\n  geckometer: ['dataRange', 'numberFormat', 'title'],\n  bar: ['dataRange', 'numberFormat', 'title'],\n  table: ['dataRange', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  headerPaths,\n  configMappingRules,\n};\n","import { isValidSelection } from '../selection-helpers';\n\nconst getDefaultConfig = selections => ({\n  type: 'geckometer',\n  numberFormat: {},\n  value: selections[0],\n});\n\nconst getSelectionsFromConfig = config => [[config.value[1], config.value[1]]];\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\nconst getSelectionTargets = (config, activeFieldPath) => {\n  switch (activeFieldPath) {\n    case 'value':\n      return [-1];\n    default:\n      return [];\n  }\n};\n\nconst configMappingRules = {\n  column: ['dataRange', 'numberFormat', 'title'],\n  line: [\n    'dataRange',\n    ['minYAxis', min => (min ? { value: min } : undefined), 'min'], // eslint-disable-line no-confusing-arrow\n    ['maxYAxis', max => (max ? { value: max } : undefined), 'max'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n    'title',\n  ],\n  text: ['dataRange', 'title'],\n  number: ['dataRange', 'numberFormat', 'indicators', 'title'],\n  leaderboard: ['dataRange', 'numberFormat', 'title'],\n  bar: ['dataRange', 'numberFormat', 'title'],\n  table: ['dataRange', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { isValidSelection } from '../selection-helpers';\n\nconst getDefaultConfig = selections => {\n  return {\n    type: 'text',\n    hasHeader: false,\n    value: selections[0],\n  };\n};\n\nconst getSelectionsFromConfig = config => [config.value];\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ isLoop }) => {\n  if (isLoop) {\n    return [-5, -4, -3, -2, -1];\n  }\n  return [-1];\n};\n\nconst configMappingRules = {\n  number: ['dataRange', 'title'],\n  geckometer: ['dataRange', 'title'],\n  leaderboard: ['dataRange', 'title'],\n  line: ['dataRange', 'title'],\n  column: ['dataRange', 'title'],\n  bar: ['dataRange', 'title'],\n  table: ['dataRange', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { some } from 'lodash';\nimport { isValidSelection } from '../selection-helpers';\nimport ColourBrewer from '../../../lib/colour-brewer';\n\nconst MIN_COLUMNS = 2;\nconst MAX_COLUMNS = 10;\n\nconst getDefaultConfig = selections => {\n  return {\n    type: 'table',\n    hasHeader: true,\n    columns: selections,\n    numberFormat: selections.map(() => null),\n  };\n};\n\nconst getSelectionsFromConfig = config => config.columns;\n\nconst isValid = cfg => {\n  return some(cfg.columns, isValidSelection);\n};\n\nconst headerPaths = () => {\n  return ['columns'];\n};\n\nconst headerColours = cfg => {\n  const { columns = [] } = cfg;\n  if (!columns.length) {\n    return { columns };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = columns.map(() => brewery.getNextColour());\n  return { columns: colours };\n};\n\nconst configMappingRules = {\n  line: ['dataRange', 'hasHeader', 'title'],\n  column: ['dataRange', 'hasHeader', 'title'],\n  bar: ['dataRange', 'hasHeader', 'title'],\n  number: ['dataRange', 'title'],\n  geckometer: ['dataRange', 'title'],\n  text: ['dataRange', 'title'],\n  leaderboard: ['dataRange', 'title'],\n};\n\nexport default {\n  getDefaultConfig,\n  getSelectionsFromConfig,\n  isValid,\n  configMappingRules,\n  headerPaths,\n  headerColours,\n  MIN_COLUMNS,\n  MAX_COLUMNS,\n};\n","import { find } from 'lodash';\nimport * as groupActions from '../../groups/actions/groups-actions';\nimport * as loopActions from '../actions/loop-actions';\n\nconst initialState = {\n  loadingDataSources: false,\n  loadingInvite: false,\n  loadingDashboards: false,\n  loadingLoops: false,\n  inviteError: null,\n  isReconnectModalOpen: false,\n  reconnectingDataSourceId: null,\n  isDeleting: true,\n  isDashboardPermissionsModalLoading: false,\n  isUserPermissionsModalLoading: false,\n};\n\nconst userById = (people, userId) => {\n  const users = [\n    ...(people.owners || []),\n    ...(people.members || []),\n    ...(people.viewers || []),\n  ];\n  return find(users, { id: userId });\n};\n\nconst adminReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case groupActions.getDashboardsStart.type:\n      return {\n        ...state,\n        loadingDashboards: true,\n      };\n\n    case groupActions.getDashboardsSuccess.type:\n    case groupActions.getDashboardsFailed.type:\n      return {\n        ...state,\n        loadingDashboards: false,\n      };\n\n    case groupActions.getPeopleStart.type:\n      return {\n        ...state,\n        loadingPeople: true,\n      };\n\n    case groupActions.getPeopleSuccess.type: {\n      return {\n        ...state,\n        loadingPeople: false,\n      };\n    }\n\n    case groupActions.getPeopleFailed.type:\n      return {\n        ...state,\n        loadingPeople: false,\n      };\n\n    case groupActions.getDataSourcesStart.type:\n      return {\n        ...state,\n        loadingDataSources: true,\n      };\n\n    case groupActions.getDataSourcesSuccess.type:\n    case groupActions.getDataSourcesFailed.type:\n      return {\n        ...state,\n        loadingDataSources: false,\n      };\n\n    case groupActions.deleteDataSourceStart.type:\n    case groupActions.deleteDataSourceFailed.type:\n      return {\n        ...state,\n        isDeleting: true,\n      };\n\n    case groupActions.inviteMembersStart.type: {\n      return {\n        ...state,\n        loadingInvite: true,\n        inviteError: null,\n      };\n    }\n\n    case groupActions.inviteMembersSuccess.type: {\n      return {\n        ...state,\n        loadingInvite: false,\n      };\n    }\n\n    case groupActions.inviteMembersFailed.type: {\n      return {\n        ...state,\n        loadingInvite: false,\n        inviteError: payload,\n      };\n    }\n\n    case groupActions.inviteMembersEmailInvalid.type: {\n      return {\n        ...state,\n        inviteError: { id: 'people.invalidMessage' },\n      };\n    }\n\n    case groupActions.inviteMembersClearError.type: {\n      return {\n        ...state,\n        inviteError: null,\n      };\n    }\n\n    case groupActions.openReconnectModal.type:\n      return {\n        ...state,\n        isReconnectModalOpen: true,\n        reconnectingDataSourceId: payload,\n      };\n\n    case groupActions.closeReconnectModal.type:\n      return {\n        ...state,\n        isReconnectModalOpen: false,\n        reconnectingDataSourceId: null,\n      };\n\n    case groupActions.openDashboardPermissionsModalStart.type:\n      return {\n        ...state,\n        isDashboardPermissionsModalLoading: true,\n      };\n\n    case groupActions.openDashboardPermissionsModalSuccess.type:\n    case groupActions.openDashboardPermissionsModalFailed.type:\n      return {\n        ...state,\n        isDashboardPermissionsModalLoading: false,\n      };\n\n    case groupActions.openUserPermissionsModalStart.type:\n      return {\n        ...state,\n        isUserPermissionsModalLoading: true,\n      };\n\n    case groupActions.openUserPermissionsModalSuccess.type:\n    case groupActions.openUserPermissionsModalFailed.type:\n      return {\n        ...state,\n        isUserPermissionsModalLoading: false,\n      };\n\n    case loopActions.getLoopsStart.type:\n      return {\n        ...state,\n        loadingLoops: true,\n      };\n\n    case loopActions.getLoopsSuccess.type:\n    case loopActions.getLoopsFailure.type:\n      return {\n        ...state,\n        loadingLoops: false,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default adminReducer;\nexport { initialState, userById };\n","import adminReducer, { userById } from './admin-reducer';\n\nexport default adminReducer;\nexport { userById };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---21DWo\",\"circle\":\"circle---3quZH\",\"dark\":\"dark---vRcgk\",\"circle2\":\"circle2---Hg1j2\",\"circle3\":\"circle3---3bhNZ\",\"circle4\":\"circle4---29X4k\",\"circle5\":\"circle5---Q8vso\",\"circle6\":\"circle6---3uJjN\",\"circle7\":\"circle7---7fR5Z\",\"circle8\":\"circle8---BYq77\",\"circle9\":\"circle9---egXNo\",\"circle10\":\"circle10---1oXpS\",\"circle11\":\"circle11---2UCjp\",\"circle12\":\"circle12---1fuu3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"modal---3yT9j\",\"heading\":\"heading---3FunG\",\"content\":\"content---2eI_v\",\"iconContainer\":\"iconContainer---xZv8u\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"durationInputContainer\":\"durationInputContainer---1B9w8\",\"durationInput\":\"durationInput---1sko1\",\"input\":\"input---1CelR\",\"suffix\":\"suffix---1fgJ0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"selectWrapper\":\"selectWrapper---1W8nM\",\"icon\":\"icon---1ebVc\",\"select\":\"select---pdf4i\",\"isFullWidth\":\"isFullWidth---1zLXS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"radioLabel\":\"radioLabel---15A3f\",\"radioInput\":\"radioInput---3e3YF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"tooltipWrapper\":\"tooltipWrapper---2z1uU\",\"messageWrapper\":\"messageWrapper---2P0lY\",\"hoverTarget\":\"hoverTarget---k36RE\",\"tooltip\":\"tooltip---2iW1b\",\"isLight\":\"isLight---AK2IV\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"value\":\"value---MVLN3\",\"indicator\":\"indicator---1ufYz\",\"increased\":\"increased---XVyFN\",\"decreased\":\"decreased---17K6K\",\"unchanged\":\"unchanged---3vOLU\",\"blankComparison\":\"blankComparison---UVjx-\",\"reversed\":\"reversed---3R1jh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"horizontalNumberContainer\":\"horizontalNumberContainer---q_dJi\",\"label\":\"label---2DLi0\",\"primaryNumberLayout\":\"primaryNumberLayout---2DjAu\",\"primaryNumber\":\"primaryNumber---1z_GW\",\"labelLayout\":\"labelLayout---20hkg\",\"secondaryVisualisationLayout\":\"secondaryVisualisationLayout---20P1r\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icon\":\"icon---3tOkS\",\"isSortable\":\"isSortable---35xb3\",\"right\":\"right---3oP2O\",\"asc\":\"asc---2cL-H\",\"desc\":\"desc---2tQXV\",\"left\":\"left---fWPRW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dotItem\":\"dotItem---FELbL\",\"dot\":\"dot---2AE1G\",\"activeDot\":\"activeDot---1iHwd\",\"pagination\":\"pagination---2gGpY\",\"textPagination\":\"textPagination---in7Ov\",\"alert\":\"alert---6ZFO1\",\"info\":\"info---kNazK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---TFYTt\",\"column\":\"column---z0ON_\",\"large\":\"large---3cjXf\",\"positive\":\"positive---kJlDP\",\"level\":\"level---34Dtc\",\"negative\":\"negative---36zWT\",\"table\":\"table---20hNy\",\"number\":\"number---3DaYy\",\"secondary\":\"secondary---1ZlzR\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toast\":\"toast---3KPho\",\"autoWidth\":\"autoWidth---xTeIh\",\"delayedAnimation\":\"delayedAnimation---2ZHAV\",\"success\":\"success---1kgmk\",\"error\":\"error---mXxUN\",\"toastIcon\":\"toastIcon---kMjze\",\"toastIconLarge\":\"toastIconLarge---YxuKW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---HyCor\",\"intercom\":\"intercom---1uKOx\",\"heading\":\"heading---30AKO\",\"content\":\"content---RlfBM\",\"description\":\"description---uj1cn\",\"button\":\"button---lB17p\",\"icon\":\"icon---3eqEf\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Dashboards\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboards\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"layoutType\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FixedLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"grid\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ClassicLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnCount\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":215}};\n    doc.loc.source = {\"body\":\"query Dashboards {\\n  dashboards {\\n    id\\n    legacyId\\n    title\\n    layoutType {\\n      __typename\\n      ... on FixedLayout {\\n        grid\\n      }\\n      ... on ClassicLayout {\\n        columnCount\\n      }\\n    }\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"Dashboards\"] = oneQuery(doc, \"Dashboards\");\n        \n","import {\n  DashboardById,\n  DashboardBySharingHash,\n} from './graphql/dashboard-query.graphql';\nimport {\n  DashboardByIdWithContainers,\n  DashboardBySharingHashWithContainers,\n  ScreenContentWithContainers,\n} from './graphql/dashboard-with-containers-query.graphql';\nimport * as customizationQueries from './graphql/dashboard-customization-queries.graphql';\nimport { getWindow } from '../../lib/global';\n\n/**\n * Returns the correct query and query props to fetch\n * a dashboard from concierge depending on if we're\n * on a screen, sharing URL or in edit mode.\n */\nexport const getDashboardQueryProps = (\n  { dashboardId, screenId, sharingHash },\n  fetchContainers = false,\n) => {\n  let query = fetchContainers ? DashboardByIdWithContainers : DashboardById;\n  let variables = { id: dashboardId };\n\n  if (screenId) {\n    // Screens only support container layout\n    // for now so we we always fetch containers.\n    query = ScreenContentWithContainers;\n    variables = { screenId };\n  } else if (sharingHash) {\n    query = fetchContainers\n      ? DashboardBySharingHashWithContainers\n      : DashboardBySharingHash;\n    variables = { sharingHash };\n  }\n\n  return {\n    query,\n    variables,\n  };\n};\n\nexport const getDashboardCustomizationQueryProps = ({\n  dashboardId,\n  screenId,\n  sharingHash,\n}) => {\n  let query = customizationQueries.ById;\n  let variables = { id: dashboardId };\n\n  if (screenId) {\n    query = customizationQueries.ByScreenId;\n    variables = { screenId };\n  } else if (sharingHash) {\n    query = customizationQueries.BySharingHash;\n    variables = { sharingHash };\n  }\n\n  return {\n    query,\n    variables,\n  };\n};\n\nexport const isGraphQLSharingDashboard = () => {\n  return getWindow().location.pathname.includes('/v5/');\n};\n\nexport const isContainerLayoutEditMode = () => {\n  return getWindow().location.pathname.includes('/dash_');\n};\n\nexport const isGraphQLDashboard = () => {\n  return isGraphQLSharingDashboard() || isContainerLayoutEditMode();\n};\n","import { includes } from 'lodash';\nimport {\n  DARK_THEME,\n  LIGHT_THEME,\n  CUSTOM_THEME,\n} from '../../dashboard/themes/theme-constants';\n\nconst starterThemes = [DARK_THEME, LIGHT_THEME];\n\nconst isThemeAllowed = ({ custom_css: customCSS }, theme) => {\n  if (customCSS && theme === CUSTOM_THEME) {\n    return true;\n  }\n\n  return includes(starterThemes, theme);\n};\n\nconst filterByAllowances = (customizeValues, allowances) => {\n  const {\n    advanced_dashboard_customization: advancedDashboardCustomization,\n    can_disable_branding: canDisableBranding,\n    custom_css: customCSS,\n  } = allowances;\n\n  if (advancedDashboardCustomization) {\n    return customizeValues;\n  }\n\n  const newCustomizeValues = {\n    ...customizeValues,\n    logoSrc: null,\n    showLogo: true,\n  };\n\n  if (!isThemeAllowed(allowances, newCustomizeValues.theme)) {\n    newCustomizeValues.theme = starterThemes[0];\n  }\n\n  if (!canDisableBranding) {\n    newCustomizeValues.showFooter = true;\n  }\n\n  if (!customCSS) {\n    newCustomizeValues.cssFile = null;\n  }\n\n  return newCustomizeValues;\n};\n\nexport default filterByAllowances;\n","import filterByAllowances from './filter-by-allowances.js';\nexport default filterByAllowances;\n","import { getWindow } from './global';\n\nconst getLoopURL = code => {\n  const {\n    SHARING_HOST,\n    location: { protocol, host },\n  } = getWindow();\n  return `${protocol}//${SHARING_HOST || host}/loop/${code}`;\n};\n\nexport { getLoopURL };\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport bodyRenderer from '../../lib/body-renderer';\n\nconst AbsolutePositioned = props => {\n  const {\n    isVisible,\n    children,\n    left,\n    top,\n    width,\n    height,\n    isFixed,\n    zIndex,\n  } = props;\n\n  if (!isVisible || !children) return null;\n\n  const position = isFixed ? 'fixed' : 'absolute';\n\n  return (\n    <div style={{ position, top: 0, left: 0, height: 0, zIndex }}>\n      <div style={{ position: 'relative', left, width, top, height }}>\n        {children}\n      </div>\n    </div>\n  );\n};\n\nAbsolutePositioned.defaultProps = {\n  isFixed: false,\n  zIndex: 10000,\n};\n\nAbsolutePositioned.propTypes = {\n  children: PropTypes.node,\n  height: PropTypes.number,\n  isFixed: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  left: PropTypes.number,\n  top: PropTypes.number,\n  width: PropTypes.number,\n  zIndex: PropTypes.number,\n};\n\nconst BodyRenderedAbsolutelyPositioned = bodyRenderer(AbsolutePositioned);\n\nexport default BodyRenderedAbsolutelyPositioned;\nexport { AbsolutePositioned };\n","import AbsolutePositionedComponent from './absolute-positioned-component';\nexport default AbsolutePositionedComponent;\n","import localForage from 'localforage';\nimport { chain, get as _get, filter, isEqual } from 'lodash';\nimport bugsnag from '../../lib/bugsnag';\n\n// Sometimes we need to know, for which integrations, the user\n// has already created mirage widgets. Eventually this will\n// probably be done via some API calls but for now we're\n// going to store this informatin in local storage.\n\nconst get = () =>\n  localForage\n    .getItem('mirageServices')\n    .then(value => (value ? JSON.parse(value) : []))\n    .catch(e => {\n      // If local forage blows up there's nothing sensible we\n      // can do so let's just report the error and move on.\n      bugsnag.send(e);\n      return [];\n    });\n\nconst set = integrations =>\n  localForage\n    .setItem('mirageServices', JSON.stringify(integrations))\n    .catch(e => {\n      // If local forage blows up there's nothing sensible we\n      // can do so let's just report the error and move on.\n      bugsnag.send(e);\n    });\n\nconst remove = async integration => {\n  const integrations = await get();\n  set(filter(integrations, v => !isEqual(v, integration))).catch(e => {\n    // If local forage blows up there's nothing sensible we\n    // can do so let's just report the error and move on.\n    bugsnag.send(e);\n  });\n};\n\nconst getFromWidgets = widgets =>\n  chain(widgets)\n    .reduce((integrations, widget) => {\n      const proxy = _get(widget, 'widget.config.mirageConfig.integration.name');\n      return proxy ? [...integrations, proxy] : integrations;\n    }, [])\n    .uniq()\n    .value();\n\nexport default {\n  get,\n  set,\n  remove,\n  getFromWidgets,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { includes } from 'lodash';\nimport classNames from 'classnames';\nimport Icon from '@UI/icon';\n\nimport styles from './preset-icon-style.scss';\n\nconst VALID_TYPES = ['text', 'icon'];\n\nconst PresetIconComponent = ({ type, value, className }) => {\n  if (includes(VALID_TYPES, type)) {\n    const isIcon = type === 'icon';\n    const wrapperClasses = classNames(styles.wrapper, className, {\n      [styles.icon]: isIcon,\n    });\n\n    return (\n      <span className={wrapperClasses}>\n        {type === 'text' && value}\n        {type === 'icon' && (\n          <Icon className=\"icon\" name={value} font={Icon.FONTS.GECKO_FONT} />\n        )}\n      </span>\n    );\n  }\n\n  return null;\n};\n\nPresetIconComponent.propTypes = {\n  className: PropTypes.string,\n  type: PropTypes.string,\n  value: PropTypes.string,\n};\n\nexport default PresetIconComponent;\n","import PresetIcon from './preset-icon-component';\nexport default PresetIcon;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ListItem from '../../list-item';\nimport PresetIcon from '../preset-icon';\nimport { Column } from '../../layout';\n\nimport styles from './preset-list-item-styles.scss';\n\nconst PresetListItemComponent = ({ preset, onClick }) => {\n  const { title, description, icon, link } = preset;\n\n  return (\n    <ListItem href={link} className={styles.item} onClick={onClick}>\n      <Column flexFill justify=\"center\" col={9}>\n        <span className={styles.title}>{title}</span>\n        <span className={styles.subtitle}>{description}</span>\n      </Column>\n      {icon && (\n        <Column justify=\"center\" col={1}>\n          <PresetIcon\n            type={icon.type}\n            value={icon.value}\n            className={styles.icon}\n          />\n        </Column>\n      )}\n    </ListItem>\n  );\n};\n\nPresetListItemComponent.defaultProps = {\n  preset: {},\n};\n\nPresetListItemComponent.propTypes = {\n  isLoading: PropTypes.bool,\n  link: PropTypes.bool,\n  preset: PropTypes.object,\n  onClick: PropTypes.func,\n};\n\nexport default PresetListItemComponent;\n","import PresetListItem from './preset-list-item-component';\nexport default PresetListItem;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dashboardFooter\":\"dashboardFooter---26l6R\",\"visible\":\"visible---1cTQw\",\"portraitSupport\":\"portraitSupport---d-kQ2\",\"absolute\":\"absolute---1tNub\",\"right\":\"right---2AsK_\",\"left\":\"left---1no1M\",\"logoContainer\":\"logoContainer---evXmq\",\"logo\":\"logo---gl4fD\",\"title\":\"title---BneFv\",\"brandingText\":\"brandingText---UFRJW\",\"brandingTextDarken\":\"brandingTextDarken---23oF5\",\"footerClock\":\"footerClock---1vmc_\",\"brandLogo\":\"brandLogo---1PAZJ\",\"plan\":\"plan---3_V39\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Dashboard\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"layoutType\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FixedLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"grid\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"customization\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fontSize\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logoSource\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showClock\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showFooter\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showLogo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"theme\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"BuiltInTheme\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"themeType\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomTheme\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"backgroundColor\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frameStyle\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frames\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"size\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"height\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"width\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"position\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"left\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"top\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"stackOrder\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"instrument\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"offCanvasInstruments\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentFragment\"},\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timezone\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardById\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardIdByLegacyId\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboardByLegacyId\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardBySharingHash\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboardBySharingHash\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardLegacyId\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardForMasthead\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DashboardTimezone\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timezone\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":1327}};\n    doc.loc.source = {\"body\":\"#import './instrument-fragment.graphql'\\n\\nfragment DashboardFragment on Dashboard {\\n  id\\n  title\\n  layoutType {\\n    __typename\\n    ... on FixedLayout {\\n      grid\\n    }\\n  }\\n  customization {\\n    fontSize\\n    logoSource\\n    showClock\\n    showFooter\\n    showLogo\\n    theme {\\n      __typename\\n      ... on BuiltInTheme {\\n        themeType\\n      }\\n      ... on CustomTheme {\\n        backgroundColor\\n        frameStyle\\n      }\\n    }\\n  }\\n  frames {\\n    id\\n    size {\\n      height\\n      width\\n    }\\n    position {\\n      left\\n      top\\n      stackOrder\\n    }\\n    instrument {\\n      ...InstrumentFragment\\n    }\\n  }\\n  offCanvasInstruments {\\n    ...InstrumentFragment\\n  }\\n  timezone { name }\\n}\\n\\nquery DashboardById($id: ID!) {\\n  dashboard(id: $id) {\\n    ...DashboardFragment\\n  }\\n}\\n\\nquery DashboardIdByLegacyId($legacyId: ID!) {\\n  dashboard: dashboardByLegacyId(legacyId: $legacyId) {\\n    id\\n  }\\n}\\n\\nquery DashboardBySharingHash($sharingHash: String!) {\\n  dashboard: dashboardBySharingHash(sharingHash: $sharingHash) {\\n    ...DashboardFragment\\n  }\\n}\\n\\nquery DashboardLegacyId($id: ID!) {\\n  dashboard(id: $id) {\\n    legacyId\\n  }\\n}\\n\\nquery DashboardForMasthead($id: ID!) {\\n  dashboard(id: $id) {\\n    id\\n    legacyId\\n    sharingHash\\n    title\\n  }\\n}\\n\\nquery DashboardTimezone($id: ID!) {\\n  dashboard(id: $id) {\\n    timezone {\\n      name\\n    }\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require('./instrument-fragment.graphql').definitions));\n\n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DashboardById\"] = oneQuery(doc, \"DashboardById\");\n        \n        module.exports[\"DashboardIdByLegacyId\"] = oneQuery(doc, \"DashboardIdByLegacyId\");\n        \n        module.exports[\"DashboardBySharingHash\"] = oneQuery(doc, \"DashboardBySharingHash\");\n        \n        module.exports[\"DashboardLegacyId\"] = oneQuery(doc, \"DashboardLegacyId\");\n        \n        module.exports[\"DashboardForMasthead\"] = oneQuery(doc, \"DashboardForMasthead\");\n        \n        module.exports[\"DashboardTimezone\"] = oneQuery(doc, \"DashboardTimezone\");\n        \n","/* eslint camelcase: 0 */\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode, render, unmountComponentAtNode } from 'react-dom';\nimport classNames from 'classnames';\nimport d3 from 'd3';\nimport {\n  zip,\n  isArray,\n  uniqWith,\n  partial,\n  max,\n  last,\n  range,\n  isEqual,\n  findIndex,\n  reduce,\n  unzip,\n  isNull,\n  filter,\n  isFinite,\n  chain,\n  isEmpty,\n  isUndefined,\n  isNil,\n  isString,\n  clone,\n} from 'lodash';\nimport {\n  WIDGET_PADDING,\n  WIDGET_PADDING_TV_MODE,\n} from '../visualisation-constants';\n\nimport ColourBrewer from '../../lib/colour-brewer';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport {\n  normalise,\n  pickFormat,\n  pickTooltipFormat,\n} from '../../lib/pretty-date-format';\nimport { getClientSize, getScaledClientSize } from '../../lib/dom-helper';\n\nimport style from './line-chart-style.scss';\n\nconst visualisationSettings = {\n  regular: {\n    idealXAxisTickSeparation: 70,\n    defaultMaxLabelWidth: 45,\n    chartRightNudge: 0,\n    chartBottomMargin: 30,\n    yAxisNudge: -14,\n    nudgeFactor: 50,\n    minYAxisTicks: 4,\n    maxYAxisTicks: 11,\n  },\n  tvMode: {\n    idealXAxisTickSeparation: 100,\n    defaultMaxLabelWidth: 70,\n    chartRightNudge: 20, // We nudge the right-hand of the chart to make room for a bigger label\n    chartBottomMargin: 37, // Add a bit more vertical space for the bigger x-axis labels\n    yAxisNudge: -16, // Move the y-axis labels slightly more away from the grid lines\n    nudgeFactor: 70, // Nudge the x-axis more for longer y-axis labels\n    minYAxisTicks: 3,\n    maxYAxisTicks: 11,\n  },\n};\n\nconst xAxisTypes = {\n  standard: 'standard',\n  datetime: 'datetime',\n};\n\nconst getDotPoints = series => {\n  // Collect all NULL values indices first then collect isolated points between\n  // NULLs like: [['x', null], ['y', 123], ['z', null]] will return [['y', 123]]\n  const nilIndices = reduce(\n    series,\n    (n, d, i) => {\n      if (isNil(d[1])) {\n        n.push(i);\n      }\n      return n;\n    },\n    [],\n  );\n\n  return reduce(\n    nilIndices,\n    (dots, i, j) => {\n      // handle second null value\n      if (j === 0 && i === 1) {\n        dots.push(series[0]);\n      }\n      if (i + 2 === nilIndices[j + 1]) {\n        dots.push(series[i + 1]);\n      }\n      // handle penultimate null value\n      if (j === nilIndices.length - 1 && i === series.length - 2) {\n        dots.push(series[series.length - 1]);\n      }\n      return dots;\n    },\n    [],\n  );\n};\n\nfunction findClosestTick(mouseX, domainX, marginLeft, scaleX, scalingFactor) {\n  const // x mouse position\n    x0 = scaleX.invert(mouseX / scalingFactor - marginLeft); // closest x value\n\n  const i = d3.bisect(domainX, x0, 1);\n\n  // Get closest tick from mouse\n  const [a, b] = [domainX[i - 1], domainX[i]];\n\n  return x0 - a > b - x0 ? b : a;\n}\n\n// Collect all [x, y] values for the x value\n// return null if no supplied point for a series\nfunction getPointsOnTick(closestTick, series, type) {\n  return unzip(\n    chain(series)\n      .map('data')\n      .map(pts => {\n        let [xs] = unzip(pts);\n        let tickValue = closestTick;\n\n        if (type === xAxisTypes.datetime) {\n          // we need to use time and not Date object here..\n          xs = xs.map(dt => dt.getTime());\n          tickValue = closestTick.getTime();\n        }\n        const index = xs.indexOf(tickValue);\n        const value = index !== -1 ? pts[index] : null;\n\n        return [index, value];\n      })\n      .value(),\n  );\n}\n\n// map given points to svg coordinates and corresponding colour\nfunction toSvgContext(points, scales, series) {\n  const { x, y } = scales;\n\n  return chain(points)\n    .map((point, j) => {\n      if (!point) {\n        return null;\n      }\n      const [xi, yi] = point;\n      const { colour } = series[j];\n      return {\n        x: x(xi),\n        y: isNil(yi) ? undefined : y(yi),\n        colour,\n      };\n    })\n    .compact()\n    .value();\n}\n\nfunction renderTooltip(\n  el,\n  closestTick,\n  points,\n  series,\n  formats,\n  dateFormat,\n  type,\n  xLabels,\n) {\n  const {\n    y: { format, unit, numberFormat = {} },\n  } = formats;\n\n  const renderSeriesValue = (p, ii) => {\n    const prefix = numberFormat.prefix;\n    const suffix = numberFormat.suffix;\n\n    const value =\n      p && !isNil(p[1])\n        ? humaniseNumber(p[1], {\n            format,\n            unit,\n            numberFormat: {\n              abbreviation: 'none',\n              precision: 'none',\n              suffix,\n              prefix,\n            },\n          })\n        : '-';\n\n    return (\n      <li key={ii} style={{ color: series[ii].colour }}>\n        {value}\n      </li>\n    );\n  };\n\n  const renderXValue = value => {\n    if (type === xAxisTypes.datetime) return dateFormat(value);\n    if (type === xAxisTypes.standard) return xLabels[value];\n    return value;\n  };\n\n  const tooltip = (\n    <ul>\n      <li>{renderXValue(closestTick)}</li>\n      {points.map(renderSeriesValue)}\n    </ul>\n  );\n\n  render(tooltip, el);\n}\n\nclass LineChartComponent extends Component {\n  componentDidMount() {\n    const el = findDOMNode(this);\n\n    this.visualisationSettings = this.props.tvMode\n      ? visualisationSettings.tvMode\n      : visualisationSettings.regular;\n\n    this.container = d3.select(el);\n\n    this.createChart();\n\n    this.createDefs();\n    this.createGrid();\n    this.createAxis();\n    this.createTooltip();\n\n    this.chart.append('g').attr('class', 'series-list');\n\n    this.afterRender();\n  }\n\n  componentDidUpdate() {\n    this.visualisationSettings = this.props.tvMode\n      ? visualisationSettings.tvMode\n      : visualisationSettings.regular;\n\n    this.afterRender();\n  }\n\n  componentWillUnmount() {\n    if (this.tooltipLabel) {\n      unmountComponentAtNode(this.tooltipLabel);\n    }\n  }\n\n  render() {\n    /* eslint camelcase: 0 */\n    const { x_axis = {} } = this.props;\n\n    if (isNull(x_axis.type)) {\n      throw new Error('X axis type can not be null');\n    }\n\n    /* eslint camelcase: 1 */\n\n    const { isPreviewMode, tvMode, style: layoutStyle } = this.props;\n\n    const wrapperClasses = classNames('chart v2', {\n      [style.previewLayout]: isPreviewMode,\n      [style.tvMode]: tvMode,\n    });\n\n    return <div className={wrapperClasses} style={layoutStyle} />;\n  }\n\n  draw(data, threshold, id) {\n    const seriesList = this.chart\n      .select('.series-list')\n      .selectAll('.series')\n      .data(data);\n\n    seriesList\n      .enter()\n      .append('g')\n      .attr({\n        class: (d, i) => `series series-${i + 1}`,\n      });\n\n    const series = this.handleIncompletePaths(seriesList, 'line');\n\n    // Enter\n    series\n      .enter()\n      .append('g')\n      .attr('class', 'line-group');\n\n    const paths = series.selectAll('.line').data(d => [d]);\n\n    const dots = series.selectAll('.dots-group').data(d => {\n      const { points } = d;\n      const dotPoints = getDotPoints(points);\n\n      // handle only one data point\n      if (points && points.length === 1) {\n        return [d];\n      } else if (dotPoints.length) {\n        // add dot between null values\n        return [{ ...d, points: dotPoints }];\n      }\n      return [];\n    });\n\n    paths\n      .enter()\n      .append('path')\n      .attr('class', 'line');\n\n    // Enter\n    dots\n      .enter()\n      .append('g')\n      .attr('class', 'dots-group');\n\n    const dot = dots.selectAll('.dots').data(d => d.points);\n    dot\n      .enter()\n      .append('circle')\n      .attr('class', 'dots');\n\n    // Updates\n    series.attr('class', d => d.classes);\n    paths.attr({\n      d: this.dPathHelper.bind(this),\n      stroke: d => d.colour,\n    });\n    dots.attr({\n      fill: d => d.colour,\n    });\n\n    dot.attr({\n      r: 4,\n      cx: d => this.x(d[0]) || 0,\n      cy: d => this.y(d[1]) || 0,\n    });\n\n    // remove\n    paths.exit().remove();\n    series.exit().remove();\n    seriesList.exit().remove();\n    dot.exit().remove();\n    dots.exit().remove();\n\n    // Handle clip paths and threshold\n    this.chart\n      .selectAll('.line')\n      .attr('clip-path', `url(#boundaries-clip-${id})`);\n\n    if (isFinite(threshold)) {\n      this.drawThreshold(series, threshold);\n\n      this.chart\n        .selectAll('.line.highlight')\n        .attr('clip-path', `url(#threshold-clip-${id})`);\n    }\n\n    return series;\n  }\n\n  createChart() {\n    this.chart = this.container\n      .append('svg')\n      .append('g')\n      .attr('class', 'graph');\n\n    this.chart.append('rect').attr('class', 'threshold');\n    this.chart.append('g').attr('class', 'legends');\n  }\n\n  createDefs() {\n    const defs = this.chart.append('svg:defs');\n\n    defs\n      .append('clipPath')\n      .attr('class', 'threshold-clip')\n      .append('rect')\n      .attr('class', 'threshold-clip-content');\n\n    defs\n      .append('clipPath')\n      .attr('class', 'boundaries-clip')\n      .append('rect')\n      .attr('class', 'boundaries-clip-content');\n  }\n\n  createGrid() {\n    const grid = this.chart.append('g').attr('class', 'grid');\n    grid.append('g').attr('class', 'grid-y');\n    grid.append('g').attr('class', 'grid-x'); // x need to be last\n    grid.append('g').attr('class', 'grid-x-threshold'); // x need to be last\n  }\n\n  createAxis() {\n    const axis = this.chart.append('g').attr('class', 'axis');\n    axis.append('g').attr('class', 'axis-x');\n    axis.append('g').attr('class', 'axis-y');\n  }\n\n  createTooltip() {\n    const overlay = this.chart.append('g').attr('class', 'tooltip');\n    const focus = overlay.append('g').attr('class', 'tooltip-focus');\n\n    const labelWrapper = this.container\n      .append('div')\n      .attr('class', 'tooltip-label-wrapper');\n\n    overlay.append('rect').attr('class', 'tooltip-overlay');\n    focus.append('line').attr('class', 'tooltip-dashed-line');\n    const tooltip = labelWrapper.append('div').attr('class', 'tooltip-label');\n    this.tooltipLabel = tooltip[0][0];\n  }\n\n  dPathHelper(data) {\n    const { points } = data;\n    const line = d3.svg\n      .line()\n      .x(d => this.x(d[0]))\n      .defined(d => !isNil(d[1]))\n      .y(d => this.y(d[1]));\n\n    return line(points);\n  }\n\n  setSvgDimensions() {\n    const el = findDOMNode(this);\n    const [clientWidth, clientHeight] = getClientSize(el);\n\n    this.margin = {\n      top: 30,\n      right: 25,\n      bottom: this.visualisationSettings.chartBottomMargin,\n      left: 60,\n    };\n\n    this.w = clientWidth - this.margin.left - this.margin.right;\n    this.h = clientHeight - this.margin.top - this.margin.bottom;\n\n    // Set svg size\n    this.container.select('svg').attr({\n      width: this.w + this.margin.left + this.margin.right,\n      height: this.h + this.margin.top + this.margin.bottom,\n    });\n\n    this.chart.select('.boundaries-clip-content').attr({\n      width: this.w,\n      height: this.h,\n    });\n\n    this.applyTransformation();\n  }\n\n  // Translate chart elements to respect d3 margin convention\n  applyTransformation() {\n    const { left, top } = this.margin;\n    this.chart.attr('transform', `translate(${left},${top})`);\n\n    this.chart\n      .selectAll('.threshold, .threshold-clip-content')\n      .attr('transform', `translate(-${left},0)`);\n\n    this.chart.select('.grid-y').attr('transform', `translate(-${left},0)`);\n    this.chart\n      .select('.grid-x, .grid-x-threshold')\n      .attr('transform', `translate(0,${this.h + 1})`);\n\n    this.chart.select('.axis-x').attr('transform', `translate(0,${this.h})`);\n  }\n\n  setYScale() {\n    this.y = d3.scale.linear().range([this.h, 0]);\n  }\n\n  setXScale(type, longestYAxisLabel = 0) {\n    // Basis is passed in based on the longest label on the y-axis\n    // We can then calculate a \"nudge\" of the x-axis, ranging between\n    // 0 - 50, allowing more room for the y-axis if needed (up to a point).\n    const nudgeThreshold = 25;\n    const nudgeFactor = 70;\n    let nudge = 0;\n    if (longestYAxisLabel > nudgeThreshold) {\n      nudge = longestYAxisLabel * 0.01 * nudgeFactor;\n    }\n\n    const maxChartWidthSpan =\n      this.w - this.visualisationSettings.chartRightNudge;\n    if (type === xAxisTypes.datetime) {\n      this.x = d3.time.scale.utc().range([nudge, maxChartWidthSpan]);\n    } else {\n      this.x = d3.scale.linear().range([nudge, maxChartWidthSpan]);\n    }\n  }\n\n  getNumberOfTicks() {\n    const IDEAL_X_AXIS_TICK_SEPARATION = this.visualisationSettings\n      .idealXAxisTickSeparation;\n\n    // Ensure that we have a minimum number of ticks on the y-axis\n    // This generally only applies for 1x1 graphs.\n    const MIN_NUM_Y_AXIS_TICKS = this.visualisationSettings.minYAxisTicks;\n\n    // Widgets of height 1 hit the min, and widgets with a height of 3 or more\n    // end up very tall and hit the max.\n    // So this ideal tick separation generally only applies to 2 height charts.\n    const IDEAL_Y_AXIS_TICK_SEPARATION = 50;\n\n    // On taller charts more than 11 ticks starts to have the y-axis\n    // tick marking overwhelm the line itself.\n    const MAX_NUM_Y_AXIS_TICKS = this.visualisationSettings.maxYAxisTicks;\n\n    // We add 1 to take into account that ticks can be at the start and end of\n    // the available space.\n    //\n    // <----------- 210px ---------->\n    // |---------|---------|--------|\n    // <- 70px -><- 70px -><- 70px ->\n    //\n    // 210 / 70 = 3, but because ticks can be at the start and end we can\n    // actually fit 4 ticks.\n    //\n    // Although because (on the x-axis) we don't *ensure* ticks are at the start\n    //  and end of the axis in the worst case this could give us the following:\n    //\n    // <---------------- 140px --------------->\n    // ----------|---------|---------|---------\n    // <- 35px -><- 35px -><- 35px -><- 35px ->\n    //\n    // In practice this doesn't happen because we don't show ticks on a 1x1\n    // widget, and the 2x1 widget has an axis width of 385 and 6 ticks which\n    // at worst would display as:\n    //\n    // <------------------------------- 385px ------------------------------>\n    // ----------|---------|---------|---------|---------|---------|---------\n    // <- 55px -><- 55px -><- 55px -><- 55px -><- 55px -><- 55px -><- 55px ->\n\n    return {\n      x:\n        Math.floor(\n          (this.w - this.visualisationSettings.chartRightNudge) /\n            IDEAL_X_AXIS_TICK_SEPARATION,\n        ) + 1,\n      y: Math.max(\n        MIN_NUM_Y_AXIS_TICKS,\n        Math.min(\n          MAX_NUM_Y_AXIS_TICKS,\n          Math.floor(this.h / IDEAL_Y_AXIS_TICK_SEPARATION) + 1,\n        ),\n      ),\n    };\n  }\n\n  getNumberOfNiceYTicks(numberOfYTicks) {\n    let maxTicks = numberOfYTicks;\n\n    if (numberOfYTicks < 3) {\n      maxTicks = 0;\n    }\n\n    // When we ask d3 to pick ticks for us `y.ticks(numTicks)` it will use\n    // `numTicks` as a *guideline*, sometimes picking many more ticks. For\n    // exmaple when asked to pick 3 ticks it may return 6.\n    // To get around this we keep reducing the number of ticks that we ask\n    // d3 to render until it no longer returns more than our maximum.\n    let numTicks = maxTicks;\n    // We need to call nice before each attempt at getting ticks to ensure\n    // that we have a tick at the start and end for the given number of ticks.\n    this.y.nice(numTicks);\n    while (this.y.ticks(numTicks).length > maxTicks && numTicks >= 1) {\n      numTicks--;\n      this.y.nice(numTicks);\n    }\n\n    return numTicks;\n  }\n\n  drawGrid(\n    xAxisType,\n    { type, formats, xLabels },\n    threshold,\n    numberOfDataPoints,\n    domainsDataX,\n    minYAxis,\n    maxYAxis,\n  ) {\n    const { y } = this;\n    const { tvMode } = this.props;\n    const nbTicks = this.getNumberOfTicks();\n    const numberOfNiceYTicks = this.getNumberOfNiceYTicks(nbTicks.y);\n    const [firstValue] = domainsDataX;\n\n    const makeXAxis = () => {\n      let maxTicks = nbTicks.x;\n\n      // Ensure we don't have more ticks than data points.\n      maxTicks = Math.min(maxTicks, numberOfDataPoints);\n\n      // When we ask d3 to pick ticks for us `x.ticks(numTicks)` it will use\n      // `numTicks` as a *guideline*, sometimes picking many more ticks. For\n      // exmaple when asked to pick 3 ticks it may return 6.\n      // To summarise, the reason is that d3 only supports certain intervals for ticks\n      // (ie. 1 week, 1 day etc) and will not create ticks that don't fit those intervals\n\n      // To get as close as possible to what we want, we keep reducing the number of ticks\n      // that we ask d3 to render until it no longer returns more than our maximum.\n      let numTicks = maxTicks;\n      while (this.x.ticks(numTicks).length > maxTicks && numTicks >= 1) {\n        numTicks--;\n      }\n\n      // For 1x1 widgets, we don't actually want any labels (there's not enough room)\n      if (this.w <= 145) {\n        numTicks = 0;\n      }\n\n      let tickFormat;\n      if (type === xAxisTypes.datetime) {\n        const format = pickFormat(this.x.ticks(numTicks));\n        tickFormat = d3.time.format.utc(format);\n      } else if (type === xAxisTypes.standard) {\n        tickFormat = i => xLabels[i] || ''; // padding missing label with empty string\n      } else {\n        tickFormat = d => humaniseNumber(d);\n      }\n\n      const axis = d3.svg\n        .axis()\n        .scale(this.x)\n        .orient('bottom')\n        .ticks(numTicks)\n        .tickFormat(tickFormat);\n\n      // If we only have 1 data point\n      // (and the chart is wide enough to have ticks)\n      // then force a tick at that data point.\n      if (numberOfDataPoints === 1 && maxTicks > 0) {\n        return axis.tickValues([firstValue]);\n      }\n\n      return axis;\n    };\n\n    const makeYAxis = () => {\n      const {\n        y: { format, unit, numberFormat, referenceValue },\n      } = formats;\n\n      return d3.svg\n        .axis()\n        .scale(y)\n        .ticks(numberOfNiceYTicks)\n        .tickFormat(d =>\n          humaniseNumber(d, { format, unit, numberFormat, referenceValue }),\n        )\n        .orient('left');\n    };\n\n    // Draw grid Y-axis\n    this.chart.select('.grid-y').call(\n      makeYAxis()\n        .tickSize(-this.w - this.margin.left - this.margin.right, 0)\n        .tickFormat(''),\n    );\n\n    const DEFAULT_MAX_WIDTH = this.visualisationSettings.defaultMaxLabelWidth;\n    const truncateText = axisLabels => {\n      const numLabels = axisLabels.size();\n      const maxLabelWidth = Math.floor(\n        (this.w - this.visualisationSettings.chartRightNudge) / numLabels,\n      );\n      axisLabels.each(function(value, index) {\n        const maxWidth =\n          index === numLabels - 1 || index === 0\n            ? DEFAULT_MAX_WIDTH\n            : maxLabelWidth;\n        const label = d3.select(this);\n\n        let textLength = label.node().getComputedTextLength();\n        let text = label.text();\n\n        while (textLength > maxWidth && text.length > 0) {\n          text = text.slice(0, -1);\n          label.text(`${text}...`);\n          textLength = label.node().getComputedTextLength();\n        }\n      });\n    };\n\n    const setXAxisScale = yLabels => {\n      let longestLabel = 0;\n\n      yLabels.each(function() {\n        const label = d3.select(this);\n        const textLength = label.node().getComputedTextLength();\n\n        if (textLength > longestLabel) {\n          longestLabel = Math.round(textLength);\n        }\n      });\n\n      this.setXScale(type, longestLabel);\n    };\n\n    const padding = tvMode ? WIDGET_PADDING_TV_MODE : WIDGET_PADDING;\n\n    // Draw y-axis\n    this.chart\n      .select('.axis-y')\n      .call(makeYAxis())\n      .selectAll('text')\n      .call(setXAxisScale)\n      .attr({\n        y: this.visualisationSettings.yAxisNudge,\n        x: -(this.margin.left - padding),\n      });\n\n    // Finds the \"zero\" tick on the y-axis, and adds an extra class\n    // This only happens if the y-axis has a mix of positive and negative values\n    // to highlight the \"zero point\"\n    if (minYAxis < 0 && maxYAxis > 0) {\n      this.chart\n        .select('.grid-y')\n        .selectAll('.tick')\n        .each(function(data) {\n          if (data === 0) {\n            const zeroTick = d3.select(this);\n            zeroTick.attr('class', 'tick zero');\n          }\n        });\n    }\n\n    // Define x domain and draw x-axis\n    this.defineXDomain(type, xLabels, domainsDataX);\n\n    this.chart.select('.grid-x').call(\n      makeXAxis()\n        .tickSize(-this.h - 2, 0)\n        .tickFormat(''), // Remove formatting for grid\n    );\n\n    this.chart\n      .select('.axis-x')\n      .call(makeXAxis())\n      .selectAll('.tick text')\n      .call(truncateText);\n\n    if (isFinite(threshold)) {\n      // Set threshold background\n      let thresholdAttributes = {\n        width: this.w + this.margin.left + this.margin.right,\n      };\n      const thresholdY = this.y(threshold);\n      let height, gridAttributes;\n\n      if (this.props.reverseGoalDirection) {\n        height = this.h - thresholdY;\n        gridAttributes = {\n          transform: `translate(0, ${thresholdY})`,\n        };\n        thresholdAttributes = {\n          ...thresholdAttributes,\n          transform: `translate(-${this.margin.left}, ${thresholdY})`,\n          height,\n        };\n      } else {\n        height = this.y(threshold);\n        gridAttributes = {\n          transform: null,\n        };\n        thresholdAttributes = {\n          ...thresholdAttributes,\n          height,\n        };\n      }\n\n      this.chart\n        .selectAll('.threshold, .threshold-clip-content')\n        .attr(thresholdAttributes);\n\n      // Add x grid for threshold to match background color\n      this.chart\n        .select('.grid-x-threshold')\n        .attr(gridAttributes)\n        .call(\n          makeXAxis()\n            .tickSize(height, 0)\n            .tickFormat(''), // Remove formatting for grid\n        );\n    } else {\n      // Set threshold background\n      this.chart\n        .selectAll('.threshold, .threshold-clip-content')\n        .attr({ width: 0, height: 0 });\n\n      this.chart\n        .select('.grid-x-threshold')\n        .selectAll('*')\n        .remove();\n    }\n  }\n\n  drawLegend(data) {\n    const legendWrap = this.chart.select('.legends');\n    const legends = legendWrap.selectAll('.legend').data(data);\n\n    // Enter\n    legends\n      .enter()\n      .append('g')\n      .attr({\n        class: 'legend',\n        visibility: 'hidden',\n      });\n\n    const legendCircles = legends.selectAll('circle').data(d => [d]);\n    const legendTexts = legends.selectAll('text').data(d => [d]);\n\n    const legendCircleRadius = this.props.tvMode ? '5' : '4';\n    const legendCircleOffset = this.props.tvMode ? '0' : '3';\n\n    legendCircles.enter().append('circle');\n    legendTexts\n      .enter()\n      .append('text')\n      .attr({ dx: '8', dy: '8' });\n\n    // Updates\n    legendCircles.attr('fill', d => d.colour);\n    legendCircles.attr('r', legendCircleRadius);\n    legendCircles.attr('cy', legendCircleOffset);\n    legendTexts.text(d => d.name);\n\n    // Exit\n    legendCircles.exit().remove();\n    legendTexts.exit().remove();\n    legends.exit().remove();\n\n    const maxWidth = this.w + this.margin.right - 16; // padding between each legend\n    const padding = 10;\n    const scalingFactor = 1 / this.getScalingFactor();\n    const legendsLength = reduce(\n      legends[0],\n      (sum, node) =>\n        sum +\n        d3\n          .select(node)\n          .node()\n          .getBoundingClientRect().width *\n          scalingFactor +\n        padding,\n      0,\n    );\n\n    // In case we are missing space let's try to overflow text that need to\n    if (legendsLength > maxWidth) {\n      // We need to compute the max for a unique element\n      const unit = maxWidth / legends[0].length;\n\n      legends.each(function() {\n        // we can't use fat arrow here and d3 set's `this` to a DOM element\n        const self = d3.select(this);\n\n        const textNode = self.select('text');\n        let currentWidth =\n          this.getBoundingClientRect().width * scalingFactor + padding;\n        let text = textNode.text();\n\n        while (currentWidth > unit && text.length > 1) {\n          text = text.slice(0, -1);\n          textNode.text(`${text}...`);\n          currentWidth =\n            this.getBoundingClientRect().width * scalingFactor + padding;\n        }\n      });\n    }\n\n    // compute translations for each item\n    const transformations = legends[0]\n      .map(\n        node =>\n          d3\n            .select(node)\n            .node()\n            .getBoundingClientRect().width *\n            scalingFactor +\n          padding,\n      )\n      .reduce(\n        (memo, x) => {\n          const lastX = last(memo);\n          memo.push(lastX + x);\n          return memo;\n        },\n        [0],\n      );\n\n    // apply translations\n    legends.attr('transform', (d, i) => `translate(${transformations[i]}, 0)`);\n\n    // Position legend far right\n    const legendTransX = maxWidth - last(transformations) + padding;\n    if (legendTransX < 0) {\n      legends.remove(); // fallback we don't have space: hide the legend\n    } else {\n      legends.attr('visibility', 'visible');\n      legendWrap.attr('transform', `translate(${legendTransX}, -18)`);\n    }\n  }\n\n  handleIncompletePaths(seriesList) {\n    const groupSelector = 'line-group';\n\n    const series = seriesList.selectAll(`.${groupSelector}`).data(s => {\n      const d = {\n        colour: s.colour,\n        classes: groupSelector,\n      };\n\n      // Tweak to display secondary line as incomplete\n      if (s.type === 'secondary') {\n        return [\n          {\n            points: s.data,\n            isSecondary: true,\n            ...d,\n            classes: `${groupSelector} secondary`,\n          },\n        ];\n      }\n\n      // Split incomplete series\n      if (isUndefined(s.incomplete_from)) {\n        return [{ points: s.data, ...d }];\n      }\n\n      let indexIncompleteFrom = findIndex(s.data, point => {\n        return isEqual(point[0], s.incomplete_from);\n      });\n      if (indexIncompleteFrom === 0) {\n        // clamp incomplete index\n        indexIncompleteFrom = 1;\n      }\n      // For line, first incomplete point needs to the same as the last complete\n      const incompletePoints = s.data.slice(indexIncompleteFrom - 1);\n      const completePoints = s.data.slice(0, indexIncompleteFrom);\n\n      const completeData = {\n        points: completePoints,\n        ...d,\n        classes: `${groupSelector} complete`,\n      };\n\n      const incompleteData = {\n        points: incompletePoints,\n        ...d,\n        classes: `${groupSelector} incomplete`,\n      };\n\n      return [completeData, incompleteData];\n    });\n\n    return series;\n  }\n\n  drawThreshold(d3series) {\n    const pathsHl = d3series.selectAll('.line.highlighted').data(d => [d]);\n\n    pathsHl\n      .enter()\n      .append('path')\n      .attr(\n        // enter highlighted\n        'class',\n        'line highlight',\n      );\n    // update highlighted\n    pathsHl.attr({\n      d: this.dPathHelper.bind(this),\n      stroke: d => {\n        // Secondary should not be highlighted\n        return !d.isSecondary ? d.colour.brighter(0.8) : d.colour;\n      },\n    });\n    pathsHl.exit().remove();\n  }\n\n  // Preprocess series as scattered\n  preprocessSeries(inputSeries, ctx, { type, xLabels }) {\n    const colourBrewer = new ColourBrewer();\n    const isScattered = isArray(inputSeries[0] && inputSeries[0].data[0]);\n    let incomplete;\n\n    return inputSeries.map(originalSeries => {\n      // eslint-disable-line no-shadow\n      const series = clone(originalSeries);\n\n      // add x coordinate to series\n      if (!isScattered) {\n        // If type is 'standard', co-ords are equally spaced\n        const xCoords =\n          type === xAxisTypes.standard ? range(xLabels.length) : xLabels;\n\n        series.data = zip(xCoords, series.data);\n\n        // x-axis and series should match length to avoid d3 printing non\n        // existing points\n        series.data = series.data.slice(0, xCoords.length);\n      }\n\n      // De-duplication is done before dates become Date objects\n      series.data = uniqWith(series.data, (x, y) => {\n        return isEqual(x[0], y[0]);\n      });\n\n      if (type === xAxisTypes.datetime) {\n        // Format datetime object\n        series.data = series.data.map(([x, y]) => {\n          let datetime = isString(x) ? x : x * 1000;\n          datetime = normalise(datetime, ctx.dashboardTz);\n          return [datetime, y];\n        });\n\n        if (series.incomplete_from) {\n          incomplete = series.incomplete_from;\n          incomplete = isString(incomplete) ? incomplete : incomplete * 1000;\n          series.incomplete_from = normalise(incomplete, ctx.dashboardTz);\n        }\n      }\n\n      if (type !== xAxisTypes.standard) {\n        series.data = series.data.sort((a, b) => a[0] - b[0]);\n      }\n\n      // Add colour\n      if (series.type === 'secondary') {\n        series.colour = d3.hsl(199, 0.1, 0.64);\n      } else {\n        series.colour = colourBrewer.getNextColour();\n      }\n\n      return series;\n    });\n  }\n\n  applyTooltip(series, { formats, type, xLabels }, domainsDataX) {\n    const seriesHaveData =\n      !isEmpty(series) && series.every(s => !isEmpty(s.data));\n\n    const domainX = domainsDataX.sort((a, b) => a - b);\n\n    if (!seriesHaveData) {\n      // Clear tooltip-related events if there's no data to show\n      this.container.on({\n        mouseenter: null,\n        mouseleave: null,\n        mousemove: null,\n      });\n\n      return;\n    }\n\n    const dateFormat =\n      type === xAxisTypes.datetime\n        ? d3.time.format.utc(pickTooltipFormat(domainsDataX))\n        : undefined;\n\n    const focus = this.chart.select('.tooltip-focus');\n    const labelWrapper = this.container.select('.tooltip-label-wrapper');\n    const tooltipLabel = this.tooltipLabel;\n\n    const allBars = this.container.selectAll('.bar-group rect');\n\n    // on mouse move render new tooltip\n    const _this = this;\n    function mousemove() {\n      const closestTick = findClosestTick(\n        d3.mouse(this)[0],\n        domainX,\n        _this.margin.left,\n        _this.x,\n        _this.getScalingFactor(),\n      );\n      const [, points] = getPointsOnTick(closestTick, series, type);\n      const pointsSVG = toSvgContext(\n        points,\n        { x: _this.x, y: _this.y },\n        series,\n      );\n      const [{ x: xCoordTooltipLine }] = pointsSVG;\n      // Render circles for given points\n      const pointsSVGWithYValue = filter(pointsSVG, point => !isNil(point.y));\n      const dots = focus.selectAll('.tooltip-dot').data(pointsSVGWithYValue);\n      const tooltipNudge = 10;\n\n      dots\n        .enter()\n        .append('circle')\n        .attr({\n          class: 'tooltip-dot',\n          r: 4.5,\n        });\n      dots.attr({\n        transform: ({ x, y }) => `translate(${x},${y})`, // eslint-disable-line no-shadow\n        fill: d => d.colour,\n      });\n      dots.exit().remove();\n\n      // move dashed line\n      focus.select('.tooltip-dashed-line').attr({\n        y2: _this.h,\n        transform: `translate(${xCoordTooltipLine}, 0)`,\n      });\n\n      // render tooltip\n      renderTooltip(\n        tooltipLabel,\n        closestTick,\n        points,\n        series,\n        formats,\n        dateFormat,\n        type,\n        xLabels,\n      );\n\n      // Position tooltip on the left / right of the point\n      const rect = labelWrapper[0][0].getBoundingClientRect();\n\n      const computedTop = _this.h / 2 - rect.height / 2 + _this.margin.top;\n      const top = computedTop < 0 ? 0 : computedTop; // Always show x value at least\n      const isRight = _this.x(closestTick) < _this.w / 2;\n\n      const left = isRight\n        ? xCoordTooltipLine + tooltipNudge + _this.margin.left\n        : xCoordTooltipLine - (rect.width + tooltipNudge) + _this.margin.left;\n\n      labelWrapper.style({\n        position: 'absolute',\n        top: `${top}px`,\n        left: `${left}px`,\n      });\n    }\n\n    // eslint-disable-next-line no-shadow\n    const toggleTooltip = (container, opacity) => {\n      const transition = container.transition();\n      transition.select('.tooltip-focus').attr('opacity', opacity);\n      transition.select('.tooltip-label-wrapper').style('opacity', opacity);\n      allBars.attr('fill-opacity', '1');\n    };\n\n    // Mount tooltip\n    this.chart\n      .select('.tooltip-overlay')\n      .attr({ width: _this.w, height: _this.h });\n    this.container.classed('tooltips-enabled', true);\n    this.container.on({\n      mouseenter: partial(toggleTooltip, _this.container, 1),\n      mouseleave: partial(toggleTooltip, _this.container, 0),\n      mousemove: mousemove, // eslint-disable-line object-shorthand\n    });\n  }\n\n  sanitiseInput(ctx) {\n    const floatValues = chain(ctx)\n      .pick('threshold', 'minYAxis', 'maxYAxis')\n      .mapValues(parseFloat)\n      .value();\n    return { size: '1x1', ...ctx, ...floatValues };\n  }\n\n  computeDomains(series, threshold, format) {\n    let domainsData = chain(series)\n      .map('data')\n      .flatten()\n      .unzip()\n      .value();\n\n    if (domainsData.length < 2) {\n      domainsData = [[], []];\n    }\n\n    const domainDataX = domainsData[0];\n    const domainDataY = this.getNudgedYDomain(\n      domainsData[1],\n      threshold,\n      format,\n    );\n\n    return [domainDataX, domainDataY];\n  }\n\n  getNudgedYDomain(domainsDataY, threshold, format) {\n    const yDomain = clone(domainsDataY);\n\n    if (isFinite(threshold)) {\n      const yDomainMax = d3.max(domainsDataY);\n      const yDomainMin = d3.min(domainsDataY);\n      const needNudge = this.props.reverseGoalDirection\n        ? threshold < yDomainMax && format !== 'duration' // Don't nudge for negative goals for durations\n        : threshold > yDomainMin;\n      let nudge = 0;\n\n      if (needNudge) {\n        // When the threshold is higher than the smallest number\n        // we nudge the threshold to be a little bit bigger\n        // so that we ensure that when we run `nice` the last tick\n        // greater than the threshold, rather than *on* the threshold.\n        // We do this because having the last tick on the threshold\n        // doesn't leave us any background to colour in to show where the\n        // threshold is.\n        // All this logic is reversed when using reverseGoalDirection\n        nudge = (yDomainMax - yDomainMin) / 10;\n        if (this.props.reverseGoalDirection) {\n          nudge = -nudge;\n        }\n      }\n\n      // Extend domain with threshold + nudge\n      yDomain.push(threshold + nudge);\n    }\n\n    return yDomain;\n  }\n\n  computeBoundaries(context, domainsDataY) {\n    // Config boundaries if any or min/max from the datasets for the domain\n    let minYAxis, maxYAxis;\n\n    if (isFinite(context.minYAxis)) {\n      minYAxis = context.minYAxis;\n    }\n\n    if (isFinite(context.maxYAxis)) {\n      maxYAxis = context.maxYAxis;\n    }\n\n    // when there is only 1 datapoint on a line chart\n    if (domainsDataY.length === 1 && isFinite(domainsDataY[0])) {\n      minYAxis = !isUndefined(minYAxis) ? minYAxis : 0;\n      maxYAxis = !isUndefined(maxYAxis) ? maxYAxis : domainsDataY * 2;\n    } else {\n      // add 0 to determining y-axis minimum\n      // so the minimum is 0 when there are only positive numbers\n      minYAxis = !isUndefined(minYAxis)\n        ? minYAxis\n        : d3.min([0, ...domainsDataY]);\n      maxYAxis = !isUndefined(maxYAxis) ? maxYAxis : d3.max(domainsDataY);\n    }\n\n    // If all the values are zero, set a maximum y axis of 10, so we at least\n    // see something in the y-axis\n    if (minYAxis === 0 && maxYAxis === 0) {\n      maxYAxis = 10;\n    }\n\n    return { minYAxis, maxYAxis };\n  }\n\n  handleLegend(series) {\n    if (series.length > 1) {\n      // if more than 1 series display legends\n      // filter series with name supplied and not secondary type line\n      let seriesWithLegend = chain(series)\n        .filter('name')\n        .reject({ type: 'secondary' })\n        .value();\n\n      // Case when 2 lines with one secondary\n      const toClear =\n        seriesWithLegend.length === 1 &&\n        series.length === 2 &&\n        filter(series, { type: 'secondary' });\n\n      if (toClear) {\n        seriesWithLegend = [];\n      }\n      this.drawLegend(seriesWithLegend);\n    } else {\n      // Clear legend if any on refresh\n      this.chart\n        .select('.legends')\n        .selectAll('*')\n        .remove();\n    }\n  }\n\n  setClipPathIds(threshold, id) {\n    // Add unique id to clipaths\n    if (isFinite(threshold)) {\n      this.chart.select('.threshold-clip').attr('id', `threshold-clip-${id}`);\n    }\n    this.chart.select('.boundaries-clip').attr('id', `boundaries-clip-${id}`);\n  }\n\n  getChartSettings(series, x_axis, y_axis) {\n    const labelsAreStrings =\n      isUndefined(x_axis.type) &&\n      !isUndefined(x_axis.labels) &&\n      x_axis.labels.some(l => typeof l === 'string');\n\n    // Get the maximum number of data points for a series on the chart\n    // in order to create an x-axis, if none is passed\n    let maxDataPoints = 0;\n    series.forEach(seriesDatum => {\n      if (seriesDatum.data.length > maxDataPoints) {\n        maxDataPoints = seriesDatum.data.length;\n      }\n    });\n\n    if (labelsAreStrings) {\n      x_axis.type = xAxisTypes.standard;\n    }\n    return {\n      type: x_axis.type,\n      xLabels: isUndefined(x_axis.labels)\n        ? range(maxDataPoints)\n        : x_axis.labels,\n      formats: { y: y_axis },\n    };\n  }\n\n  defineYDomain(minYAxis, maxYAxis) {\n    this.y.domain([minYAxis, maxYAxis]);\n  }\n\n  defineXDomain(type, xLabels, domainsDataX) {\n    if (type === xAxisTypes.standard) {\n      this.x.domain([0, xLabels.length - 1]);\n    } else {\n      this.x.domain([d3.min(domainsDataX), d3.max(domainsDataX)]);\n    }\n  }\n\n  getScalingFactor() {\n    const el = findDOMNode(this);\n    const [clientWidth] = getClientSize(el);\n    const [scaledClientWidth] = getScaledClientSize(el);\n\n    return scaledClientWidth / clientWidth;\n  }\n\n  afterRender() {\n    const context = this.sanitiseInput(this.props);\n\n    const {\n      x_axis = {},\n      y_axis = {},\n      threshold,\n      id,\n      numberFormat,\n      format,\n    } = context;\n\n    const thresholdNum = parseFloat(threshold);\n\n    let { series = [] } = context;\n    const chartSettings = this.getChartSettings(series, x_axis, y_axis);\n\n    this.setClipPathIds(thresholdNum, id);\n    this.setSvgDimensions();\n    this.setYScale();\n\n    series = this.preprocessSeries(series, context, chartSettings);\n\n    const numberOfDataPoints = max(series.map(item => item.data.length));\n\n    const [domainsDataX, domainsDataY] = this.computeDomains(\n      series,\n      thresholdNum,\n      format,\n    );\n    const { minYAxis, maxYAxis } = this.computeBoundaries(\n      context,\n      domainsDataY,\n    );\n\n    this.defineYDomain(minYAxis, maxYAxis);\n\n    // Ensure axis values are of the same magnitude\n    chartSettings.formats.y.referenceValue = chain(this.y.domain())\n      .map(Math.abs)\n      .max()\n      .value();\n    chartSettings.formats.y.numberFormat = numberFormat;\n\n    this.drawGrid(\n      x_axis.type,\n      chartSettings,\n      thresholdNum,\n      numberOfDataPoints,\n      domainsDataX,\n      minYAxis,\n      maxYAxis,\n    );\n    this.handleLegend(series);\n\n    this.draw(series, thresholdNum, id, numberOfDataPoints);\n\n    this.applyTooltip(series, chartSettings, domainsDataX);\n  }\n}\n\nLineChartComponent.defaultProps = {\n  isPreviewMode: false,\n  reverseGoalDirection: false,\n};\n\nLineChartComponent.propTypes = {\n  isPreviewMode: PropTypes.bool,\n  reverseGoalDirection: PropTypes.bool,\n  style: PropTypes.object,\n  tvMode: PropTypes.bool,\n  x_axis: PropTypes.object,\n};\n\nexport default LineChartComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { noop } from 'lodash';\nimport EditableInput from '../components/form/editable-input/editable-component';\n\nimport style from './widget-title-style.scss';\n\nconst WidgetTitleComponent = ({\n  canEdit,\n  title,\n  isSmall,\n  tvMode,\n  onUpdate,\n}) => {\n  const className = classNames(style.heading, {\n    [style.small]: isSmall && !tvMode,\n    [style.tvMode]: tvMode,\n  });\n\n  if (!canEdit) {\n    return <h1 className={className}>{title}</h1>;\n  }\n\n  return (\n    <h1 className={className}>\n      <EditableInput\n        text={title}\n        placeholder=\"Add a title\"\n        showPlaceholderOnHover\n        className={style.widgetTitle}\n        inputClassName={style.input}\n        onSubmit={newTitle => {\n          if (newTitle !== title) {\n            onUpdate(newTitle);\n          }\n        }}\n        name=\"edit-widget-title-dashboard\"\n        isMultiLine={isSmall && !tvMode}\n      />\n    </h1>\n  );\n};\n\nWidgetTitleComponent.defaultProps = {\n  onUpdate: noop,\n};\n\nWidgetTitleComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  isSmall: PropTypes.bool,\n  title: PropTypes.string,\n  tvMode: PropTypes.bool,\n  onUpdate: PropTypes.func,\n};\n\nexport default WidgetTitleComponent;\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"TrackingFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Dashboard\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"layoutType\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ClassicLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columnCount\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FixedLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"grid\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"TrackingPropsLegacyIdQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboardByLegacyId\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"legacyId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TrackingFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"TrackingPropsQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"TrackingFragment\"},\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":415}};\n    doc.loc.source = {\"body\":\"fragment TrackingFragment on Dashboard {\\n id\\n legacyId\\n layoutType {\\n   __typename\\n   ... on ClassicLayout {\\n     columnCount\\n   }\\n   ... on FixedLayout {\\n     grid\\n   }\\n }\\n}\\n\\nquery TrackingPropsLegacyIdQuery($legacyId: ID!) {\\n  dashboard: dashboardByLegacyId(legacyId: $legacyId) {\\n    ...TrackingFragment\\n  }\\n}\\n\\nquery TrackingPropsQuery($id: ID!) {\\n  dashboard: dashboard(id: $id) {\\n    ...TrackingFragment\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"TrackingPropsLegacyIdQuery\"] = oneQuery(doc, \"TrackingPropsLegacyIdQuery\");\n        \n        module.exports[\"TrackingPropsQuery\"] = oneQuery(doc, \"TrackingPropsQuery\");\n        \n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { layoutType } from '../prop-types';\nimport { findDOMNode } from 'react-dom';\nimport FramedFormattedNumber from '../../components/framed-formatted-number';\nimport Tooltip from '../../components/tooltip';\nimport classNames from 'classnames';\nimport { some, isFinite, isString, isUndefined, omit, uniqueId } from 'lodash';\nimport typeScale from '../../lib/type-scale';\nimport FormattedMessage from '../../lib/i18n';\nimport { isSmallDimension, isMediumDimension } from '../helpers';\n\nimport style from './geckometer-style.scss';\n\nconst ARC = (\n  <path\n    shapeRendering=\"geometricPrecision\"\n    d=\"M360.892957,172.497655 C360.892957,174.210419 361.267535,179.926468 353.860758,179.926468 C332.401538,179.926468 316.13787,179.65628 304.863632,179.926468 C299.090443,180.064824 297.655366,175.358779 297.249428,170.765967 C292.470332,116.694446 245.506531,62.2625042 180.307016,62.2625042 C115.107492,62.2625042 68.29152,116.088698 65.3133757,170.765967 C65.1765603,173.27775 64.1058071,179.926468 56.2137975,179.926468 C48.321798,179.926468 24.7238988,180.091914 5.0397839,179.926468 C-0.610714294,179.878976 1.15844296,172.916837 1.15844296,170.765967 C1.15844296,84.8923197 76.0004606,0 180.107189,0 C284.213917,0 360.892957,84.4731364 360.892957,172.497655 Z\"\n  />\n);\nconst MAX_WIDGET_HEADER_HEIGHT = 52 + 15;\n\nclass GeckometerVisualisationComponent extends PureComponent {\n  static canRender({ item, format }) {\n    return isFinite(item) && format !== 'datetime';\n  }\n\n  constructor() {\n    super();\n    this._id = uniqueId();\n  }\n\n  componentDidMount() {\n    this.componentDidUpdate();\n  }\n\n  componentDidUpdate() {\n    const domEl = findDOMNode(this);\n    const domNeedles = domEl.querySelectorAll(`.${style.gaugeNeedle}`);\n\n    // IE doesn't support animations in SVG.\n    const isIE = !isUndefined(domNeedles[0].style.msTransform);\n    // Firefox doesn't support animations in SVG masks:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1118710\n    const isFirefox = !isUndefined(domNeedles[0].style.MozTransform);\n    if (!isUndefined(domNeedles[0].style.transform) && !isIE && !isFirefox) {\n      let index = 0;\n      for (index = 0; index < domNeedles.length; index++) {\n        const domNeedle = domNeedles[index];\n        domNeedle.removeAttribute('transform');\n        domNeedle.style.transformOrigin = '180px 180px';\n        domNeedle.style.transform = `rotate(${this.currentNeedleRotation}deg)`;\n      }\n    }\n  }\n\n  getTypeScale() {\n    const { gridSize } = this.props;\n    const { pixels: { height, width } = {} } = this.props.layout;\n\n    // Increase the base type scale for the standard size grid\n    const scale = gridSize > 300 ? typeScale(12) : typeScale(10);\n\n    const smallestDimension = Math.min(\n      width,\n      height + MAX_WIDGET_HEADER_HEIGHT,\n    );\n\n    if (isSmallDimension(smallestDimension)) {\n      return scale.increase(2);\n    }\n\n    if (isMediumDimension(smallestDimension)) {\n      return scale.increase(6);\n    }\n\n    return scale.increase(10);\n  }\n\n  renderThresholdMask(key, name, startAngle, endAngle, reached) {\n    if (!reached) return null;\n\n    return (\n      <mask id={`${name}-${this._id}-${key}`} key={key}>\n        <rect x=\"0\" y=\"0\" width=\"360\" height=\"360\" fill=\"white\" />\n        <rect\n          x=\"-180\"\n          y=\"180\"\n          width=\"800\"\n          height=\"500\"\n          fill=\"black\"\n          transform={`rotate(${startAngle}, 180, 180)`}\n        />\n        <rect\n          x=\"-320\"\n          y=\"0\"\n          width=\"500\"\n          height=\"500\"\n          fill=\"black\"\n          transform={`rotate(${90 + endAngle}, 180, 180)`}\n        />\n      </mask>\n    );\n  }\n\n  renderThresholdMarker(\n    key,\n    [name, startAngle, endAngle, reached],\n    valueAngle,\n    allThresholds,\n  ) {\n    if (reached) return null;\n\n    // Does the marker appear within the bounds of another reached threshold?\n    if (\n      some(allThresholds, threshold => {\n        const [thresholdName, start, end, isReached] = threshold;\n        if (thresholdName === name) return false; // Don't compare it against itself\n        return (\n          isReached &&\n          ((startAngle <= end && startAngle >= start) ||\n            (endAngle >= start && endAngle <= end))\n        );\n      })\n    ) {\n      return null;\n    }\n\n    let markerAngle = startAngle;\n\n    // Ensure that we draw the marker on the opposite side of the value\n    if (valueAngle > endAngle) {\n      markerAngle = endAngle;\n    }\n\n    return (\n      <g mask={`url(#arc-${this._id})`} key={key}>\n        <rect\n          x=\"-10\"\n          y=\"180\"\n          width=\"190\"\n          height=\"4\"\n          className={`${style[name]} geckometer-threshold-${name}`}\n          transform={`rotate(${markerAngle}, 180, 182)`}\n        />\n      </g>\n    );\n  }\n\n  render() {\n    const {\n      item,\n      min: { value: min } = {},\n      max: { value: max } = {},\n      unit,\n      format,\n      numberFormat,\n      isPreviewMode,\n      indicators: { thresholds = [] } = {},\n    } = this.props;\n    const wrapperClasses = classNames('geckometer', style.wrapper, {\n      [style.previewLayout]: isPreviewMode,\n    });\n    const minMaxNumberFormat = omit(numberFormat, [\n      'abbreviation',\n      'precision',\n    ]);\n    const itemValue = parseFloat(item) || 0;\n    const [minValue, maxValue] = this.computeBounds(min, max);\n    const range = Math.abs(maxValue - minValue);\n    const calculateAngle = value => {\n      return this.clampAngle((180 * (value - minValue)) / range);\n    };\n    const valueAngle = (this.currentNeedleRotation = calculateAngle(itemValue));\n    const transform = `rotate(${valueAngle} 180 180)`;\n    let translatedThresholds = thresholds;\n    if (format === 'percent') {\n      translatedThresholds = translatedThresholds.map(value => {\n        if (!isFinite(value)) return value;\n        return value / 100;\n      });\n    }\n    translatedThresholds = translatedThresholds.reduce(\n      (memo, name, i, all) => {\n        if (!isString(name) || name === 'neutral') return memo;\n\n        const startValue = isFinite(all[i - 1]) ? all[i - 1] : minValue;\n        const endValue = isFinite(all[i + 1]) ? all[i + 1] : maxValue;\n\n        const startAngle = calculateAngle(startValue);\n        const endAngle = calculateAngle(endValue);\n        // Only the first threshold can be reached, if we overlap in any way then ignore the next threshold\n        const reached =\n          !memo.reached && valueAngle >= startAngle && valueAngle <= endAngle;\n\n        return {\n          thresholds: [\n            ...memo.thresholds,\n            [name, startAngle, endAngle, reached],\n          ],\n          reached,\n        };\n      },\n      { thresholds: [], reached: false },\n    ).thresholds;\n\n    const needleOutOfBounds = itemValue < minValue || itemValue > maxValue;\n    const warningSizeFactor = isPreviewMode ? 5 : 7;\n    const warningFontSize = this.getTypeScale()\n      .decrease(warningSizeFactor)\n      .px();\n\n    return (\n      <div className={wrapperClasses}>\n        {needleOutOfBounds && (\n          <div className={style.outOfBoundsWarning}>\n            <Tooltip\n              tooltip={\n                <FormattedMessage id=\"widget.geckometer.warning.outOfBounds\" />\n              }\n            >\n              <span style={{ fontSize: warningFontSize }} />\n            </Tooltip>\n          </div>\n        )}\n        <svg\n          className={style.svg}\n          preserveAspectRatio=\"xMidYMid\"\n          viewBox=\"0 0 416 304\"\n          version=\"1.1\"\n        >\n          <defs>\n            <mask id={`needle-cutout-${this._id}`}>\n              <rect x=\"0\" y=\"0\" width=\"416\" height=\"304\" fill=\"white\" />\n              <g className={style.gaugeNeedle} transform={transform}>\n                <path\n                  stroke=\"black\"\n                  d=\"M180,180 L6,180\"\n                  strokeWidth=\"28\"\n                  strokeLinecap=\"round\"\n                />\n              </g>\n            </mask>\n            <mask id={`arc-${this._id}`}>\n              <rect x=\"0\" y=\"0\" width=\"416\" height=\"304\" fill=\"black\" />\n              <g fill=\"white\">{ARC}</g>\n            </mask>\n            {translatedThresholds.map((threshold, i) =>\n              this.renderThresholdMask(i, ...threshold),\n            )}\n          </defs>\n          <g transform=\"translate(28, 0)\">\n            <g mask={`url(#needle-cutout-${this._id})`}>\n              <g className={style.gaugeArc}>{ARC}</g>\n              {translatedThresholds.map(([name, , , reached], key) => {\n                if (!reached) return null;\n\n                return (\n                  <g\n                    key={key}\n                    className={`${style[name]} geckometer-threshold-${name}`}\n                    mask={`url(#${name}-${this._id}-${key})`}\n                  >\n                    {ARC}\n                  </g>\n                );\n              })}\n            </g>\n            {translatedThresholds.map((m, i) =>\n              this.renderThresholdMarker(\n                i,\n                m,\n                valueAngle,\n                translatedThresholds,\n              ),\n            )}\n            <g className={style.gaugeNeedle} transform={transform}>\n              <circle\n                className={style.gaugeNeedleOval}\n                cx=\"180\"\n                cy=\"180\"\n                r=\"21\"\n                strokeWidth=\"0\"\n              />\n              <path\n                className={style.gaugeNeedleLine}\n                d=\"M180,180 L6,180\"\n                strokeWidth=\"12\"\n                strokeLinecap=\"round\"\n              />\n            </g>\n            <text className={style.min} textAnchor=\"middle\" x=\"30\" y=\"220\">\n              <FramedFormattedNumber\n                value={minValue}\n                options={{ format, unit, numberFormat: minMaxNumberFormat }}\n                isSvg\n              />\n            </text>\n            <text className={style.max} textAnchor=\"middle\" x=\"330\" y=\"220\">\n              <FramedFormattedNumber\n                value={maxValue}\n                options={{ format, unit, numberFormat: minMaxNumberFormat }}\n                isSvg\n              />\n            </text>\n            <text className={style.value} textAnchor=\"middle\" x=\"180\" y=\"290\">\n              <FramedFormattedNumber\n                value={itemValue}\n                options={{ format, unit, numberFormat }}\n                isSvg\n              />\n            </text>\n          </g>\n        </svg>\n      </div>\n    );\n  }\n\n  clampAngle(rotation) {\n    if (isNaN(rotation) || rotation < 0) {\n      return 0;\n    } else if (rotation > 180) {\n      return 180;\n    }\n    return rotation;\n  }\n\n  computeBounds(min, max) {\n    const maxValue = parseFloat(max) || 0;\n    const minValue = parseFloat(min) || 0;\n\n    return [minValue, maxValue];\n  }\n}\n\nGeckometerVisualisationComponent.defaultProps = {\n  isPreviewMode: false,\n  gridSize: 240,\n  layout: {},\n};\n\nGeckometerVisualisationComponent.propTypes = {\n  layout: layoutType.isRequired,\n  format: PropTypes.oneOf(['currency', 'decimal', 'duration', 'percent']),\n  gridSize: PropTypes.number,\n  indicators: PropTypes.shape({\n    thresholds: PropTypes.array,\n  }),\n  isPreviewMode: PropTypes.bool,\n  item: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  max: PropTypes.shape({\n    value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  }),\n  min: PropTypes.shape({\n    value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  }),\n  numberFormat: PropTypes.shape({\n    abbreviation: PropTypes.oneOf(['none', 'K', 'M', 'B']),\n    precision: PropTypes.number,\n    prefix: PropTypes.string,\n    suffix: PropTypes.string,\n  }),\n  unit: PropTypes.string,\n};\n\nexport default GeckometerVisualisationComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './label-style.scss';\n\nconst LabelComponent = ({ children, htmlFor }) => {\n  return (\n    <label className={style.label} htmlFor={htmlFor}>\n      {children}\n    </label>\n  );\n};\n\nLabelComponent.propTypes = {\n  children: PropTypes.node,\n  htmlFor: PropTypes.string,\n};\n\nexport default LabelComponent;\n","import LabelComponent from './label-component';\nexport default LabelComponent;\n","import * as importsActions from '../actions/imports-actions';\nimport { some, isEmpty, find } from 'lodash';\n\nconst initialState = {\n  activeImports: [],\n  polling: false,\n  queuedServiceAccountId: undefined,\n};\n\nexport const isPending = i => i.status.__typename === 'ImportStatusPending';\nexport const hasFailed = i => i.status.__typename === 'ImportStatusFailed';\nexport const hasCompleted = i =>\n  i.status.__typename === 'ImportStatusCompleted';\n\nconst hasRemainingTries = i => i.status.remainingRetries > 0;\n\nconst shouldPoll = i =>\n  some(i, isPending) || (some(i, hasFailed) && some(i, hasRemainingTries));\n\nconst getCurrentImports = imports =>\n  imports.filter(i => isPending(i) || hasFailed(i));\n\nconst getCompletedImports = imports => imports.filter(i => hasCompleted(i));\n\nconst getImportBySA = (imports, serviceAccountId) =>\n  imports.find(i => i.serviceAccountId === serviceAccountId);\n\nconst importsReducer = (state = initialState, action) => {\n  const { payload, type } = action;\n\n  switch (type) {\n    case importsActions.setImports.type: {\n      /*\n       * If we currently have active imports we need check to\n       * see if they have been completed in this session.\n       * If not keep polling.\n       */\n      if (!isEmpty(state.activeImports)) {\n        /*\n         *  Let's map over the old state,\n         *  Get the import ids,\n         *  Then use the import ids to return the new imports from payload\n         */\n        const oldStateActiveImports = state.activeImports.map(({ id }) =>\n          find(payload, { id }),\n        );\n\n        // Now we can accurately check if any of our old state's active imports are now complete\n        const completedImports = getCompletedImports(oldStateActiveImports);\n\n        let activeImports = getCurrentImports(payload);\n        activeImports = [...activeImports, ...completedImports];\n\n        return {\n          ...state,\n          activeImports,\n          polling: !isEmpty(activeImports) && shouldPoll(activeImports),\n        };\n      }\n\n      /*\n       * If a service account has been queued for import check to\n       * see if a pending import exists for that service account.\n       * If not, we need to keep polling until it does exist.\n       */\n      if (state.queuedServiceAccountId) {\n        const activeSaImport = getImportBySA(\n          payload,\n          state.queuedServiceAccountId,\n        );\n\n        if (!activeSaImport) {\n          return state;\n        }\n\n        const activeImports = getCurrentImports(payload);\n\n        /*\n         * If a pending import does exist for the service\n         * account we can unqueue the service account and\n         * poll for updates to the import progress.\n         */\n        return {\n          ...state,\n          activeImports,\n          polling: shouldPoll(activeImports),\n          queuedServiceAccountId: undefined,\n        };\n      }\n\n      /*\n       * Check to see if there are any pending imports in\n       * the list and if so, start polling for updates.\n       */\n      const activeImports = getCurrentImports(payload);\n\n      return {\n        ...state,\n        activeImports,\n        polling: !isEmpty(activeImports) && shouldPoll(activeImports),\n      };\n    }\n\n    case importsActions.queueServiceAccountId.type: {\n      return {\n        ...state,\n        queuedServiceAccountId: `${payload}`,\n        polling: true,\n      };\n    }\n\n    case importsActions.hideImport.type: {\n      return {\n        ...state,\n        activeImports: state.activeImports.filter(i => i.id !== payload),\n      };\n    }\n\n    default: {\n      return state;\n    }\n  }\n};\n\nexport default importsReducer;\nexport { initialState };\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar key = {\n  fullscreenEnabled: 0,\n  fullscreenElement: 1,\n  requestFullscreen: 2,\n  exitFullscreen: 3,\n  fullscreenchange: 4,\n  fullscreenerror: 5\n};\n\nvar webkit = ['webkitFullscreenEnabled', 'webkitFullscreenElement', 'webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitfullscreenchange', 'webkitfullscreenerror'];\n\nvar moz = ['mozFullScreenEnabled', 'mozFullScreenElement', 'mozRequestFullScreen', 'mozCancelFullScreen', 'mozfullscreenchange', 'mozfullscreenerror'];\n\nvar ms = ['msFullscreenEnabled', 'msFullscreenElement', 'msRequestFullscreen', 'msExitFullscreen', 'MSFullscreenChange', 'MSFullscreenError'];\n\n// so it doesn't throw if no window or document\nvar document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {};\n\nvar vendor = 'fullscreenEnabled' in document && Object.keys(key) || webkit[0] in document && webkit || moz[0] in document && moz || ms[0] in document && ms || [];\n\nexports.default = {\n  requestFullscreen: function requestFullscreen(element) {\n    return element[vendor[key.requestFullscreen]]();\n  },\n  requestFullscreenFunction: function requestFullscreenFunction(element) {\n    return element[vendor[key.requestFullscreen]];\n  },\n  get exitFullscreen() {\n    return document[vendor[key.exitFullscreen]].bind(document);\n  },\n  addEventListener: function addEventListener(type, handler, options) {\n    return document.addEventListener(vendor[key[type]], handler, options);\n  },\n  removeEventListener: function removeEventListener(type, handler, options) {\n    return document.removeEventListener(vendor[key[type]], handler, options);\n  },\n  get fullscreenEnabled() {\n    return Boolean(document[vendor[key.fullscreenEnabled]]);\n  },\n  set fullscreenEnabled(val) {},\n  get fullscreenElement() {\n    return document[vendor[key.fullscreenElement]];\n  },\n  set fullscreenElement(val) {},\n  get onfullscreenchange() {\n    return document[('on' + vendor[key.fullscreenchange]).toLowerCase()];\n  },\n  set onfullscreenchange(handler) {\n    return document[('on' + vendor[key.fullscreenchange]).toLowerCase()] = handler;\n  },\n  get onfullscreenerror() {\n    return document[('on' + vendor[key.fullscreenerror]).toLowerCase()];\n  },\n  set onfullscreenerror(handler) {\n    return document[('on' + vendor[key.fullscreenerror]).toLowerCase()] = handler;\n  }\n};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"prefix\":\"prefix---3cl3I\",\"suffix\":\"suffix---3XYqU\",\"abbreviation\":\"abbreviation---1UuY5\",\"negative\":\"negative---C0zZy\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"verticalNumberContainer\":\"verticalNumberContainer---1EAld\",\"label\":\"label---1Tc-G\",\"primaryNumberLayout\":\"primaryNumberLayout---1Vn-C\",\"primaryNumber\":\"primaryNumber---3mCVj\",\"labelLayout\":\"labelLayout---2FgLB\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mobileNumberContainer\":\"mobileNumberContainer---SQCZg\",\"primaryNumberLayout\":\"primaryNumberLayout---vv_fZ\",\"primaryNumber\":\"primaryNumber---2zHiK\",\"labelLayout\":\"labelLayout---3Rcff\"};","import SwatchComponent from './swatch-component';\nexport default SwatchComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"defaultDataSourceConnector\":\"defaultDataSourceConnector---3hOyN\",\"header\":\"header---3pL5P\",\"content\":\"content---2qg24\",\"footer\":\"footer---1tu5t\",\"protection\":\"protection---3WjjK\",\"protectionMessage\":\"protectionMessage---1IWMX\",\"protectionIcon\":\"protectionIcon---1XoD5\",\"lock\":\"lock---1MC9H\",\"error\":\"error---3X3_i\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---QvO3D\",\"row\":\"row---13dqF\",\"itemTypeSmall\":\"itemTypeSmall---2zmEL\",\"meta\":\"meta---1q6d6\",\"hasHover\":\"hasHover---3MkKa\",\"hasIcon\":\"hasIcon---3R2yq\",\"icon\":\"icon---TEmjP\",\"isHighlighted\":\"isHighlighted---974sr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"icon\":\"icon---uxE1r\",\"help\":\"help---1iyPN\",\"warning\":\"warning---1qUwi\",\"info\":\"info---17741\",\"isDark\":\"isDark---H89mP\",\"isVisible\":\"isVisible---3kaXH\"};","module.exports = (__webpack_require__(28))(90);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ServiceList\":\"ServiceList---5pV31\",\"wrapper\":\"wrapper---2LPev\",\"manageLink\":\"manageLink---3uGsr\",\"freeToConnectHeader\":\"freeToConnectHeader---34aAh\",\"cards\":\"cards---1qce9\",\"trialCard\":\"trialCard---9HtsX\",\"upgradeCard\":\"upgradeCard---3OvOX\",\"cardHeading\":\"cardHeading---3YUfh\",\"cardDescription\":\"cardDescription---16Baa\",\"cardButton\":\"cardButton---2Rxj1\",\"restrictedServices\":\"restrictedServices---1xKCE\",\"restrictedServiceList\":\"restrictedServiceList---1U1sv\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"instrument\":\"instrument---21o21\",\"useContentHeight\":\"useContentHeight---2YDNV\",\"hasBackground\":\"hasBackground---QGJHs\",\"fixedLayoutBackground\":\"fixedLayoutBackground---3rouH\",\"warningState\":\"warningState---1zhpT\",\"errorState\":\"errorState---2zQbq\",\"loadingState\":\"loadingState---2-tsj\",\"visualisation\":\"visualisation---1hKHX\",\"visualisationPositioner\":\"visualisationPositioner---1JXQn\",\"smallTitle\":\"smallTitle---RYw1d\",\"largeTitle\":\"largeTitle---1CRf9\",\"noHeader\":\"noHeader---fSZzL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"modal---30U5h\",\"heading\":\"heading---iTAMQ\",\"serviceIcon\":\"serviceIcon---qONve\",\"complete\":\"complete---1PQEw\",\"okButton\":\"okButton---3vVT4\",\"progress\":\"progress---OfLzD\",\"progressText\":\"progressText---3roxx\",\"sectionError\":\"sectionError---1aD13\"};","import { GRID_COLUMNS, GRID_ROWS } from './container-layout-constants';\nimport { chain, clamp, filter, sortBy } from 'lodash';\n\nconst hasSingleFrame = frames => frames.length === 1;\n\nconst isContainerFull = (area, frames) => {\n  // When container span is 1 in either direction or the main\n  // span is the equal to or less than the number of frames,\n  // show only one resize message instead of one on each frame.\n  return (\n    Math.min(area.columnSpan, area.rowSpan) <= 1 ||\n    Math.max(area.columnSpan, area.rowSpan) <= frames.length\n  );\n};\n\n// returns cell height and width for the current dashboard size - each cell includes one gap\nconst getCellSize = (dashboardWidth, dashboardHeight, gridGap) => {\n  const cellWidth = (dashboardWidth + gridGap) / GRID_COLUMNS;\n  const cellHeight = (dashboardHeight + gridGap) / GRID_ROWS;\n  return [cellWidth, cellHeight];\n};\n\nconst getContainerCellSize = (\n  dashboardWidth,\n  dashboardHeight,\n  isColumnLayout,\n  area,\n  numberOfCells,\n  gridGap,\n) => {\n  const [cellWidth, cellHeight] = getCellSize(\n    dashboardWidth,\n    dashboardHeight,\n    gridGap,\n  );\n\n  if (isColumnLayout) {\n    const containerWidth = cellWidth * area.columnSpan - gridGap;\n    const width = containerWidth / numberOfCells;\n    return width;\n  }\n\n  const containerHeight = cellHeight * area.rowSpan - gridGap;\n  const height = containerHeight / numberOfCells;\n  return height;\n};\n\n// Returns true when container a and b are intersecting in some way\nconst isIntersecting = (a, b) =>\n  !(\n    a.rowStart + a.rowSpan - 1 < b.rowStart ||\n    a.rowStart + 1 > b.rowStart + b.rowSpan ||\n    a.columnStart + a.columnSpan - 1 < b.columnStart ||\n    a.columnStart + 1 > b.columnStart + b.columnSpan\n  );\n\n// Returns true when container a contains container b\nconst isContainedBy = (a, b) => {\n  const rowEndA = a.rowStart + a.rowSpan;\n  const columnEndA = a.columnStart + a.columnSpan;\n  const rowEndB = b.rowStart + b.rowSpan;\n  const columnEndB = b.columnStart + b.columnSpan;\n  return (\n    a.rowStart <= b.rowStart &&\n    a.rowSpan >= b.rowSpan &&\n    a.columnStart <= b.columnStart &&\n    a.columnSpan >= b.columnSpan &&\n    rowEndA >= rowEndB &&\n    columnEndA >= columnEndB\n  );\n};\n\nconst getXAndYOverlap = (a, b) => {\n  const aColumnEnd = a.columnStart + a.columnSpan;\n  const bColumnEnd = b.columnStart + b.columnSpan;\n  const aRowEnd = a.rowStart + a.rowSpan;\n  const bRowEnd = b.rowStart + b.rowSpan;\n\n  const xOverlap = Math.max(\n    0,\n    Math.min(aColumnEnd, bColumnEnd) - Math.max(a.columnStart, b.columnStart),\n  );\n  const yOverlap = Math.max(\n    0,\n    Math.min(aRowEnd, bRowEnd) - Math.max(a.rowStart, b.rowStart),\n  );\n  return { xOverlap, yOverlap };\n};\n\nconst getOverlappedArea = (a, b) => {\n  const { xOverlap, yOverlap } = getXAndYOverlap(a, b);\n  return xOverlap * yOverlap;\n};\n\nconst getTopSection = (space, area) => {\n  const newRowSpan = Math.max(0, area.rowStart - space.rowStart);\n\n  return {\n    rowStart: space.rowStart,\n    rowSpan: newRowSpan,\n    columnStart: space.columnStart,\n    columnSpan: space.columnSpan,\n  };\n};\n\nconst getRightSection = (space, area) => {\n  const areaColumnEnd = area.columnStart + area.columnSpan;\n  const newColumnSpan = Math.max(\n    0,\n    space.columnStart + space.columnSpan - areaColumnEnd,\n  );\n\n  return {\n    rowStart: space.rowStart,\n    rowSpan: space.rowSpan,\n    columnStart: areaColumnEnd,\n    columnSpan: newColumnSpan,\n  };\n};\n\nconst getBottomSection = (space, area) => {\n  const areaRowEnd = area.rowStart + area.rowSpan;\n  const newRowSpan = Math.max(0, space.rowStart + space.rowSpan - areaRowEnd);\n\n  return {\n    rowStart: areaRowEnd,\n    rowSpan: newRowSpan,\n    columnStart: space.columnStart,\n    columnSpan: space.columnSpan,\n  };\n};\n\nconst getLeftSection = (space, area) => {\n  const newColumnSpan = Math.max(0, area.columnStart - space.columnStart);\n\n  return {\n    rowStart: space.rowStart,\n    rowSpan: space.rowSpan,\n    columnStart: space.columnStart,\n    columnSpan: newColumnSpan,\n  };\n};\n\n// Note: `getSections` is tested in the place where it's being used\nconst getSections = (space, area) => {\n  const topSection = getTopSection(space, area);\n  const rightSection = getRightSection(space, area);\n  const bottomSection = getBottomSection(space, area);\n  const leftSection = getLeftSection(space, area);\n\n  // Get new sections and remove the ones that have a\n  // row or column span of 0\n  const sections = [\n    topSection,\n    rightSection,\n    bottomSection,\n    leftSection,\n  ].filter(section => section.rowSpan !== 0 && section.columnSpan !== 0);\n\n  return sections;\n};\n\nconst getPointerArea = (\n  offset,\n  dashboardOffset,\n  dashboardWidth,\n  dashboardHeight,\n  gridGap,\n) => {\n  const [cellWidth, cellHeight] = getCellSize(\n    dashboardWidth,\n    dashboardHeight,\n    gridGap,\n  );\n  // always rounds down to find the start of the cell the pointer is over,\n  // prevents getting a pointer area that collides with a container in the next cell\n  const row = Math.floor((offset.y - dashboardOffset.top) / cellHeight) + 1;\n  const column = Math.floor((offset.x - dashboardOffset.left) / cellWidth) + 1;\n\n  return {\n    rowStart: clamp(row, 1, GRID_COLUMNS),\n    columnStart: clamp(column, 1, GRID_COLUMNS),\n    rowSpan: 1,\n    columnSpan: 1,\n  };\n};\n\nconst getSnappedArea = (\n  originalArea,\n  delta,\n  dashboardWidth,\n  dashboardHeight,\n  gridGap,\n) => {\n  const [cellWidth, cellHeight] = getCellSize(\n    dashboardWidth,\n    dashboardHeight,\n    gridGap,\n  );\n  const newRowStart = originalArea.rowStart + Math.round(delta.y / cellHeight);\n  const newColumnStart =\n    originalArea.columnStart + Math.round(delta.x / cellWidth);\n\n  return {\n    rowStart: newRowStart,\n    columnStart: newColumnStart,\n    rowSpan: originalArea.rowSpan,\n    columnSpan: originalArea.columnSpan,\n  };\n};\n\nconst getBestSpace = (spaces, pointerArea, newArea) => {\n  // First find spaces, that include the area of the pointer\n  const suitableSpaces = spaces.filter(space =>\n    isContainedBy(space, pointerArea),\n  );\n\n  if (!suitableSpaces.length) {\n    return null;\n  }\n\n  // Out of the suitableSpaces, find the one space that the new\n  // area overlaps with the most.\n  return chain(suitableSpaces)\n    .map(space => [getOverlappedArea(newArea, space), space])\n    .filter(([overlappedAreaSize]) => !!overlappedAreaSize)\n    .sort(([a], [b]) => a - b)\n    .map(([, space]) => space)\n    .last()\n    .value();\n};\n\nconst getFittedArea = (space, area) => {\n  // Span is either the size of the item area, or if the best space is smaller\n  // the span will be smaller.\n  const rowSpan = Math.min(space.rowSpan, area.rowSpan);\n  const columnSpan = Math.min(space.columnSpan, area.columnSpan);\n\n  let rowStart = space.rowStart;\n  let columnStart = space.columnStart;\n\n  // If the space has more rows than the area,\n  // ensure that the dropbox has a minimum height.\n  if (space.rowSpan > area.rowSpan) {\n    const spaceRowEnd = space.rowStart + space.rowSpan;\n    rowStart = Math.max(area.rowStart, space.rowStart);\n\n    if (rowStart + rowSpan > spaceRowEnd) {\n      rowStart = spaceRowEnd - rowSpan;\n    }\n  }\n\n  // If the space has more columns than the area,\n  // ensure that the dropbox has a minimum width.\n  if (space.columnSpan > area.columnSpan) {\n    const spaceColumnEnd = space.columnStart + space.columnSpan;\n    columnStart = Math.max(area.columnStart, space.columnStart);\n\n    if (columnStart + columnSpan > spaceColumnEnd) {\n      columnStart = spaceColumnEnd - columnSpan;\n    }\n  }\n\n  return {\n    rowStart,\n    columnStart,\n    rowSpan,\n    columnSpan,\n  };\n};\n\n// Converts the position of a frame in a container to it's position that\n// it would have on the dashboard. This enables us to display a dropzone\n// when moving a frame to the dashboard.\nconst getFrameAreaOnDashboard = (\n  frameIndex,\n  frames,\n  containerArea,\n  containerCells,\n  isColumnLayout,\n) => {\n  const getSpanOnDashboard = (containerSpan, frameSpan) =>\n    Math.round((containerSpan / containerCells) * frameSpan);\n\n  const frame = frames[frameIndex];\n  const prevFrameSpans = frames\n    .slice(0, frameIndex)\n    .reduce((acc, f) => acc + f.span, 0);\n\n  if (isColumnLayout) {\n    const containerSpan = containerArea.columnSpan;\n    const columnSpan = getSpanOnDashboard(containerSpan, frame.span);\n    const cellsTop = getSpanOnDashboard(containerSpan, prevFrameSpans);\n    return {\n      ...containerArea,\n      columnStart: containerArea.columnStart + cellsTop,\n      columnSpan,\n    };\n  }\n\n  const containerSpan = containerArea.rowSpan;\n  const frameRowSpan = getSpanOnDashboard(containerSpan, frame.span);\n  const cellsTop = getSpanOnDashboard(containerSpan, prevFrameSpans);\n  return {\n    ...containerArea,\n    rowStart: containerArea.rowStart + cellsTop,\n    rowSpan: frameRowSpan,\n  };\n};\n\nconst SMALLEST_SPANS = {\n  Bar: { column: 2, row: 3 },\n  Bullet: { column: 4, row: 3 },\n  Clock: { column: 2, row: 4 },\n  Column: { column: 2, row: 3 },\n  Feed: { column: 3, row: 3 },\n  Funnel: { column: 2, row: 3 },\n  Geckometer: { column: 2, row: 3 },\n  Highcharts: { column: 2, row: 2 },\n  Image: { column: 2, row: 2 },\n  Label: { column: 2, row: 2 },\n  Leaderboard: { column: 2, row: 2 },\n  LegacyLine: { column: 2, row: 3 },\n  Line: { column: 2, row: 3 },\n  List: { column: 2, row: 3 },\n  Map: { column: 2, row: 3 },\n  Monitoring: { column: 2, row: 3 },\n  Number: { column: 2, row: 2 },\n  PieChart: { column: 2, row: 3 },\n  Rag: { column: 2, row: 3 },\n  Table: { column: 2, row: 3 },\n  Text: { column: 2, row: 2 },\n};\nconst isFrameTooSmall = (areaOnDashboard, visualisationType) => {\n  const smallestSpans = SMALLEST_SPANS[visualisationType];\n\n  if (!smallestSpans) {\n    // For visualisations that don't have a defined smallest size,\n    // use 1 span either direction as their smallest size.\n    return Math.min(areaOnDashboard.columnSpan, areaOnDashboard.rowSpan) < 2;\n  }\n\n  return (\n    areaOnDashboard.columnSpan < smallestSpans.column ||\n    areaOnDashboard.rowSpan < smallestSpans.row\n  );\n};\n\nconst findLeftMostArea = emptySpaces => {\n  // sort empty spaces to get lowest rowStart\n  // which will be rowStart of the topmost space or spaces\n  // and use these to filter out only spaces with this\n  // rowStart\n  const [{ rowStart }] = sortBy(emptySpaces, ['rowStart']);\n  const topmostAreas = filter(emptySpaces, { rowStart });\n\n  // sort the remaining topmost spaces by lowest columnStart\n  // the first in the array will be the leftmost\n  const [leftmostArea] = sortBy(topmostAreas, ['columnStart']);\n  return leftmostArea;\n};\n\n// In certain circumstances (ie. adding a new widget or duplicating one), we need to use the\n// `emptySpaces` from Redux state to calculate what the best spot for a new widget would be. Ideally,\n// it's a 3x4 space.\nexport const findBestAreaForNewWidget = emptySpaces => {\n  let currentBiggestArea = 0;\n  let currentBiggestSpaces = [];\n\n  emptySpaces.forEach(emptySpace => {\n    const { rowStart, columnStart } = emptySpace;\n    // this would be the ideal space (3x4)\n    const newContainerArea = {\n      rowStart,\n      rowSpan: 4,\n      columnStart,\n      columnSpan: 3,\n    };\n\n    const { xOverlap, yOverlap } = getXAndYOverlap(\n      emptySpace,\n      newContainerArea,\n    );\n\n    const overlappedArea = xOverlap * yOverlap;\n\n    // if there are multiple empty spaces with the biggest area,\n    // we need to save all of these to choose the top-left-most later\n    if (overlappedArea === currentBiggestArea) {\n      currentBiggestSpaces.push({\n        rowStart,\n        rowSpan: yOverlap,\n        columnStart,\n        columnSpan: xOverlap,\n      });\n    }\n\n    // if the overlapped area is bigger than the previous biggest area, overwrite it\n    if (overlappedArea > currentBiggestArea) {\n      currentBiggestArea = overlappedArea;\n      currentBiggestSpaces = [\n        {\n          rowStart,\n          rowSpan: yOverlap,\n          columnStart,\n          columnSpan: xOverlap,\n        },\n      ];\n    }\n  });\n\n  const bestSpace =\n    currentBiggestSpaces.length > 1\n      ? findLeftMostArea(currentBiggestSpaces)\n      : currentBiggestSpaces[0];\n  return bestSpace;\n};\n\nexport {\n  hasSingleFrame,\n  isContainerFull,\n  getCellSize,\n  getSections,\n  isIntersecting,\n  isContainedBy,\n  isFrameTooSmall,\n  getOverlappedArea,\n  getPointerArea,\n  getSnappedArea,\n  getBestSpace,\n  getFittedArea,\n  getContainerCellSize,\n  getFrameAreaOnDashboard,\n  getXAndYOverlap,\n};\n","/**\n * Trick to prevent an issue in Babel6 when extending some builtin classes\n * http://stackoverflow.com/questions/33870684/why-doesnt-instanceof-work-on-instances-of-error-subclasses-under-babel-node\n * @param {class} cls a builtin class\n * @return {function} the extended class\n */\nexport default function extendableBuiltinGen(cls) {\n  function ExtendableBuiltin(...args) {\n    cls.apply(this, args);\n  }\n  ExtendableBuiltin.prototype = Object.create(cls.prototype);\n  Object.setPrototypeOf(ExtendableBuiltin, cls);\n\n  return ExtendableBuiltin;\n}\n","import { serialize, deserialize } from '../../universal/serializers';\nimport { create, update, getConfig } from '../../lib/widget-service';\nimport { redirect } from '../../lib/global';\nimport { translate } from '../../lib/config-mapper';\nimport * as SalesforceConfigConstants from '../constants/salesforce-config-constants';\nimport { getDashboard } from '../../services/management-service';\nimport { setDashboard } from '../../dashboard/actions/dashboard-actions';\nimport getVisualisationHelpers from '../get-visualisation-helpers';\nimport {\n  track,\n  trackSnowplow,\n  trackSwitchVisualisation,\n} from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { widgetCreated, widgetConfigEdited } from '@Tracking/events';\nimport { getHumanReadableName } from '../../visualisation/helpers';\nimport { getStateToSave, getStateToRestore } from '../../actions/helpers';\nimport widgetStorage from '../../lib/widget-storage';\nimport { getSeries, toRenderableState } from '../helpers';\nimport { salesforce } from '../../universal/services';\nimport { isValidInterval } from '../helpers';\nimport REFRESH_INTERVALS, {\n  ONE_HOUR,\n} from '../constants/salesforce-refresh-intervals';\nimport * as pathHelpers from '../../lib/path';\nimport DebouncePromise from '../../lib/debounce-promise';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { getLastConfigForType } from '../reducer';\nimport { TABULAR_REPORT } from '../report-types';\nimport { findIndex } from 'lodash';\nimport immutableUpdate from 'immutability-helper';\nimport * as grapqhlDashboardHelpers from '../../dashboard/graphql-dashboard-helpers';\n\nexport const DEFAULT_TYPE = 'bar';\nexport const DEFAULT_TABULAR_TYPE = 'table';\nconst CACHE_PREFIX = 'widgetData:';\n\nexport const WIDGET_CREATION_ERROR =\n  'An error occurred while we were saving your widget';\nexport const WIDGET_FETCH_ERROR =\n  'An error occurred while we were loading your widget';\nexport const ERROR = 'Salesforce Error:';\nexport const DATA_FETCH_ERROR =\n  'An error occurred while we were loading the data from Salesforce';\nexport const NO_GROUPS_OR_AGGREGATIONS_ERROR =\n  'Sorry but we are unable to create a widget using the chosen report because it is not grouped. Please edit the report in Salesforce to add a grouping.';\nexport const NO_GROUPS_OR_AGGREGATIONS_LINK =\n  'https://support.geckoboard.com/hc/en-us/articles/217321107-Salesforce-Reporting-define-and-create-a-report-in-Salesforce-and-display-it-on-Geckoboard';\nexport const NO_GROUPS_OR_AGGREGATIONS_LINK_TEXT = 'Learn more.';\n\nexport class ErrorWithLink extends Error {\n  constructor(message, link, linkText) {\n    super(message);\n    this.name = 'ErrorWithLink';\n    this.message = message;\n    this.link = link;\n    this.linkText = linkText;\n  }\n}\n\nexport const set = createAction(SalesforceConfigConstants.UPDATE_CONFIG);\nexport const setStateProps = createAction(\n  SalesforceConfigConstants.SET_STATE_PROPS,\n);\nexport const initConfigLoading = createAction(\n  SalesforceConfigConstants.INIT_CONFIG_LOADING,\n);\nexport const initConfigSuccessful = createAction(\n  SalesforceConfigConstants.INIT_CONFIG_SUCCESSFUL,\n);\nexport const initConfigError = createErrorAction(\n  SalesforceConfigConstants.INIT_CONFIG_ERROR,\n);\nexport const dataFetchStart = createAction(\n  SalesforceConfigConstants.DATA_FETCH_START,\n);\nexport const dataFetchSuccessful = createAction(\n  SalesforceConfigConstants.DATA_FETCH_SUCCESSFUL,\n);\nexport const dataFetchError = createErrorAction(\n  SalesforceConfigConstants.DATA_FETCH_ERROR,\n);\nexport const widgetConfigFetchFailed = createErrorAction(\n  SalesforceConfigConstants.WIDGET_CONFIG_FETCH_FAILED,\n);\nexport const widgetCreationStart = createErrorAction(\n  SalesforceConfigConstants.WIDGET_CREATION_START,\n);\nexport const widgetCreationFailed = createErrorAction(\n  SalesforceConfigConstants.WIDGET_CREATION_FAILED,\n);\nexport const widgetUpdateStart = createErrorAction(\n  SalesforceConfigConstants.WIDGET_UPDATE_START,\n);\nexport const doSwitchVisualisationType = createAction(\n  SalesforceConfigConstants.SWITCH_VISUALISATION_TYPE,\n);\nexport const setConfig = set; // Alias `set` to `setConfig` to maintain compatibility with the other integrations\nexport const setProgressGoal = createAction(\n  SalesforceConfigConstants.SET_PROGRESS_GOAL,\n);\nexport const toggleTableHeaders = createAction(\n  SalesforceConfigConstants.TOGGLE_TABLE_HEADERS,\n);\n\nlet debouncedFetchDataRequest;\nexport const _fetchPreviewData = () => async (dispatch, getState) => {\n  try {\n    debouncedFetchDataRequest =\n      debouncedFetchDataRequest || new DebouncePromise();\n\n    dispatch(dataFetchStart());\n\n    const {\n      salesforce: { uuid, config },\n    } = getState();\n    const data = await debouncedFetchDataRequest.push(\n      salesforce.fetchData(uuid, config),\n    );\n\n    dispatch(dataFetchSuccessful(data));\n  } catch (error) {\n    const message = `${DATA_FETCH_ERROR} (${error.message}).`;\n    dispatch(dataFetchError(error, { message }));\n  }\n};\n\nexport const _initialise = (\n  uuid,\n  configOptions,\n  { refreshInterval, refresh } = {},\n) => async dispatch => {\n  dispatch(initConfigLoading(uuid));\n\n  try {\n    const meta = await salesforce.getMeta(uuid, refresh);\n    const { groups = [], aggregations = [], type: reportType } = meta;\n    const visualisationType =\n      reportType === TABULAR_REPORT ? DEFAULT_TABULAR_TYPE : DEFAULT_TYPE;\n\n    if (\n      reportType !== TABULAR_REPORT &&\n      (!groups.length || !aggregations.length)\n    ) {\n      // we need to set the meta data to show the report title in the breadcrumbs\n      dispatch(initConfigSuccessful({ meta }));\n\n      throw new ErrorWithLink(\n        NO_GROUPS_OR_AGGREGATIONS_ERROR,\n        NO_GROUPS_OR_AGGREGATIONS_LINK,\n        NO_GROUPS_OR_AGGREGATIONS_LINK_TEXT,\n      );\n    }\n\n    await salesforce.refreshReport(uuid);\n    const config =\n      configOptions ||\n      getVisualisationHelpers(visualisationType).getDefaultConfig();\n    const validRefreshInterval = isValidInterval(\n      REFRESH_INTERVALS,\n      refreshInterval,\n    )\n      ? refreshInterval\n      : ONE_HOUR;\n\n    dispatch(\n      initConfigSuccessful({\n        meta,\n        config,\n        refreshInterval: validRefreshInterval,\n      }),\n    );\n\n    dispatch(_fetchPreviewData());\n  } catch (error) {\n    const { message, link, linkText } = error;\n    dispatch(initConfigError(error, { message, link, linkText }));\n  }\n};\n\nexport const initConfig = (uuid, dashboardId) => async dispatch => {\n  try {\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n    dispatch(_initialise(uuid));\n  } catch (error) {\n    const { message, link, linkText } = error;\n    dispatch(initConfigError(error, { message, link, linkText }));\n  }\n};\n\nexport const updateConfig = (updates = {}) => dispatch => {\n  dispatch(set(updates));\n  dispatch(_fetchPreviewData());\n};\n\nexport const enableMultiSeries = () => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const updates = { series: getSeries(state), savedSeries: undefined };\n\n  dispatch(updateConfig(updates));\n};\n\nexport const disableMultiSeries = () => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const { config: { series } = {} } = state;\n  const updates = { series: undefined, savedSeries: series };\n\n  dispatch(updateConfig(updates));\n};\n\nexport const restoreState = (paths, defaults) => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const { config = {} } = state;\n  const newConfig = getStateToRestore(config, paths, defaults);\n\n  dispatch(set(newConfig));\n};\n\nexport const saveState = paths => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const { config = {} } = state;\n  const newConfig = getStateToSave(config, paths);\n\n  dispatch(set(newConfig));\n};\n\nexport const getWidgetConfig = (widgetId, dashboardId) => async dispatch => {\n  try {\n    const json = await getConfig(widgetId);\n\n    const { template: { type = DEFAULT_TYPE } = {} } = json.config;\n    const widgetKey = json.key;\n    const data = deserialize('salesforce', type, json);\n    const { uuid, config, refreshInterval } = data;\n\n    dispatch(setStateProps({ widgetKey }));\n\n    const dashboard = await getDashboard(dashboardId);\n    dispatch(setDashboard(dashboard));\n\n    dispatch(_initialise(uuid, config, { refreshInterval, refresh: true }));\n  } catch (err) {\n    let message = `${WIDGET_FETCH_ERROR} (${err.message}).`;\n\n    if (err.type === 'ErrResourceNotFound') {\n      message = `${err.message}`;\n\n      dispatch(setStateProps({ showFilePicker: true }));\n    }\n\n    dispatch(widgetConfigFetchFailed(err, { message, type: err.type }));\n  }\n};\n\nexport const createWidget = (\n  dashboardId,\n  type,\n  service = 'salesforce',\n) => async (dispatch, getState) => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    salesforce: state,\n  } = getState();\n  const renderableState = toRenderableState(state);\n  const data = {\n    dashboard_id: dashboardId,\n    ...serialize(service, null, renderableState),\n  };\n  const visualisation = getHumanReadableName(type);\n\n  dispatch(widgetCreationStart());\n\n  track('Salesforce new - Click Add to Dashboard', {\n    properties: { visualisation },\n  });\n\n  try {\n    const widget = await create(data);\n\n    track('Widget added', {\n      properties: {\n        widget_id: widget.id,\n        widget_type_id: widget.widget_type_id,\n        service_name: widget.services[0].name,\n        service_id: widget.services[0].id,\n        widget_type_name: visualisation,\n        visualisation,\n        salesforce_version: '2016',\n      },\n    });\n\n    trackEvent(\n      widgetCreated({\n        'Integration name': widget.services[0].name,\n        'Integration slug': service,\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.configuration.type,\n        'Widget type ID': `${widget.widget_type_id}`,\n      }),\n    );\n\n    trackSnowplow('widget_add', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.services[0].id}`,\n      service_name: widget.services[0].name,\n      visualisation_type: type,\n    });\n\n    // add a delay for redirecting, to wait for mixpanel tracker to be finished\n    redirect(\n      pathHelpers.getDashboardPath(dashboardId.toString(), widget.id),\n      300,\n    );\n  } catch (err) {\n    const message = `${WIDGET_CREATION_ERROR} (${err.message}).`;\n    dispatch(widgetCreationFailed(err, { message }));\n  }\n};\n\nexport const updateWidget = (widgetId, dashboardId, type, widgetKey) => async (\n  dispatch,\n  getState,\n) => {\n  const {\n    salesforce: state,\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n  } = getState();\n  const renderableState = toRenderableState(state);\n\n  const data = serialize('salesforce', null, renderableState);\n\n  dispatch(widgetUpdateStart());\n\n  try {\n    const widget = await update(widgetId, data);\n\n    await trackEvent(\n      widgetConfigEdited({\n        'Integration name': widget.service.title,\n        'Integration slug': widget.service.name,\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.config.type,\n      }),\n    );\n\n    trackSnowplow('widget_update', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.service.id}`,\n      service_name: widget.service.title,\n      visualisation_type: type,\n    });\n\n    const graphqlDashboard =\n      grapqhlDashboardHelpers.getDashboardFromStorage(dashboardId) || {};\n    const isContainerLayout = grapqhlDashboardHelpers.isContainerLayout(\n      graphqlDashboard,\n    );\n\n    if (isContainerLayout) {\n      const instrumentId = await grapqhlDashboardHelpers.getInstrumentIdFromWidgetKey(\n        graphqlDashboard.id,\n        widgetKey,\n      );\n      widgetStorage.removeItem(`instrumentData:${instrumentId}`);\n    } else {\n      widgetStorage.removeItem(`${CACHE_PREFIX}${widgetKey}`);\n    }\n\n    redirect(pathHelpers.getDashboardPath(dashboardId.toString(), widget.id));\n  } catch (err) {\n    const message = `${WIDGET_CREATION_ERROR} (${err.message}).`;\n\n    dispatch(widgetCreationFailed(err, { message }));\n  }\n};\n\nexport const switchVisualisationType = type => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const { config: currentConfig } = state;\n\n  if (currentConfig.type === type) {\n    return;\n  }\n\n  const visualisationHelpers = getVisualisationHelpers(type);\n  const defaults = visualisationHelpers.getDefaultConfig();\n  const lastConfigForType = getLastConfigForType(state, type);\n  const mappedValues = translate(\n    visualisationHelpers.configMappingRules,\n    currentConfig,\n    lastConfigForType,\n  );\n  const config = {\n    ...defaults,\n    ...lastConfigForType,\n    ...mappedValues,\n  };\n\n  trackSwitchVisualisation('salesforce', currentConfig.type, type);\n  dispatch(doSwitchVisualisationType(config));\n  dispatch(_fetchPreviewData());\n};\n\nexport const toggleFilePicker = showFilePicker =>\n  setStateProps({ showFilePicker });\n\nexport const changeFile = uuid => dispatch => {\n  dispatch(setStateProps({ showFilePicker: false }));\n  dispatch(_initialise(uuid));\n};\n\nexport const refreshFile = () => (dispatch, getState) => {\n  const {\n    salesforce: { uuid, config, refreshInterval },\n  } = getState();\n  dispatch(_initialise(uuid, config, { refreshInterval, refresh: true }));\n};\n\nexport const updateNumberFormat = format => (dispatch, getState) => {\n  const { salesforce: state } = getState();\n  const { config: { numberFormat = {} } = {} } = state;\n  const newFormat = {\n    ...numberFormat,\n    ...format,\n  };\n\n  dispatch(set({ numberFormat: newFormat }));\n};\n\nexport const changeTableColumnField = ({ index, value }) => (\n  dispatch,\n  getState,\n) => {\n  const { config = {} } = getState().salesforce;\n  const { numberFormat = [], columns = [] } = config;\n\n  const newNumberFormat = [...numberFormat];\n  newNumberFormat[index] = null;\n\n  const newColumns = [...columns];\n  newColumns[index] = { ...columns[index], field: value };\n\n  dispatch(\n    updateConfig({ numberFormat: newNumberFormat, columns: newColumns }),\n  );\n};\n\nexport const removeTableColumn = index => (dispatch, getState) => {\n  const { config = {} } = getState().salesforce;\n  const { numberFormat = [], columns = [] } = config;\n\n  const newColumns = [...columns.slice(0, index), ...columns.slice(index + 1)];\n  let newNumberFormat;\n\n  if (numberFormat.length) {\n    // Delete numberFormat for deleted column\n    newNumberFormat = [\n      ...numberFormat.slice(0, index),\n      ...numberFormat.slice(index + 1),\n    ];\n  }\n\n  dispatch(\n    updateConfig({ numberFormat: newNumberFormat, columns: newColumns }),\n  );\n};\n\nexport const addTableColumn = () => (dispatch, getState) => {\n  const {\n    config: { columns = [] } = {},\n    meta: { columns: metaColumns = [] } = {},\n  } = getState().salesforce;\n\n  const lastColumn = columns[columns.length - 1];\n  const lastFieldIndex = findIndex(metaColumns, { name: lastColumn.field });\n  // get next field to use as columns (and go back to start if we're already at end of array)\n  const nextFieldIndex = (lastFieldIndex + 1) % metaColumns.length;\n  const nextField = metaColumns[nextFieldIndex];\n\n  const newColumns = [...columns, { field: nextField.name }];\n\n  dispatch(updateConfig({ columns: newColumns }));\n};\n\nexport const reorderTableColumn = ({ sourceIndex, targetIndex }) => (\n  dispatch,\n  getState,\n) => {\n  const { config } = getState().salesforce;\n  const { numberFormat = [], columns = [] } = config;\n  const column = columns[sourceIndex];\n  const currentFormat = numberFormat[sourceIndex] || null;\n\n  const newColumns = immutableUpdate(columns, {\n    $splice: [\n      [sourceIndex, 1],\n      [targetIndex, 0, column],\n    ],\n  });\n  const newNumberFormat = immutableUpdate(numberFormat, {\n    $splice: [\n      [sourceIndex, 1],\n      [targetIndex, 0, currentFormat],\n    ],\n  });\n\n  dispatch(\n    updateConfig({ columns: newColumns, numberFormat: newNumberFormat }),\n  );\n};\n","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\n\nclass WaitFor extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      wait: !!props.resolver,\n    };\n  }\n\n  // eslint-disable-next-line camelcase\n  async UNSAFE_componentWillMount() {\n    if (this.props.resolver) {\n      await this.props.resolver();\n      this.setState({ wait: false });\n    }\n  }\n\n  render() {\n    const { children, renderWaiting } = this.props;\n    const { wait } = this.state;\n\n    const waiting = renderWaiting ? renderWaiting() : null;\n\n    return wait ? waiting : children;\n  }\n}\nWaitFor.defaultProps = {\n  children: null,\n};\n\nWaitFor.propTypes = {\n  children: PropTypes.node,\n  renderWaiting: PropTypes.func,\n  resolver: PropTypes.func,\n};\n\nexport { WaitFor };\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { CompactConfigComponent } from './compact-config-component';\nimport { WaitFor } from '../hoc/wait-for';\n\nconst DashiesCompactConfig = ({ setEditWidget, ...props }) => (\n  <WaitFor\n    resolver={props.serviceName === 'database' ? setEditWidget : undefined}\n  >\n    <CompactConfigComponent {...props} />\n  </WaitFor>\n);\n\nDashiesCompactConfig.propTypes = {\n  setEditWidget: PropTypes.func.isRequired,\n  serviceName: PropTypes.string,\n};\n\nexport default DashiesCompactConfig;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nclass ConditionalLoadingIndicatorComponent extends Component {\n  render() {\n    const { isLoading, isDark, className, children } = this.props;\n    const theme = isDark\n      ? LoadingSpinner.THEMES.DARK\n      : LoadingSpinner.THEMES.LIGHT;\n\n    if (isLoading) {\n      return <LoadingSpinner theme={theme} />;\n    }\n\n    return <div className={className}>{children}</div>;\n  }\n}\n\nConditionalLoadingIndicatorComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  isDark: PropTypes.bool,\n  isLoading: PropTypes.bool,\n};\n\nConditionalLoadingIndicatorComponent.defaultProps = {\n  isLoading: false,\n  isDark: false,\n};\n\nexport default ConditionalLoadingIndicatorComponent;\n","import ConditionalLoadingIndicator from './conditional-loading-indicator-component';\nexport default ConditionalLoadingIndicator;\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormatFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"NumberFormat\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"abbreviation\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"decimalPlacesStyle\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"decimalPlacesPrecision\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unitPlacement\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"unitValue\"},\"arguments\":[],\"directives\":[]}]}}],\"loc\":{\"start\":0,\"end\":139}};\n    doc.loc.source = {\"body\":\"fragment NumberFormatFragment on NumberFormat {\\n  abbreviation\\n  decimalPlacesStyle\\n  decimalPlacesPrecision\\n  unitPlacement\\n  unitValue\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n      module.exports = doc;\n    \n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicatorFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"StatusIndicator\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"positiveDirection\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"lowerThreshold\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"upperThreshold\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":234}};\n    doc.loc.source = {\"body\":\"fragment StatusIndicatorFragment on StatusIndicator {\\n  positiveDirection\\n  lowerThreshold {\\n    __typename\\n    ...on FloatValue {\\n      value\\n    }\\n  }\\n  upperThreshold {\\n    __typename\\n    ...on FloatValue {\\n      value\\n    }\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n      module.exports = doc;\n    \n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport styles from './border.scss';\n\nconst Border = ({ children, className, rounded, shadow }) => (\n  <div\n    className={classnames(styles.Border, className, {\n      [styles.rounded]: rounded,\n      [styles.shadow]: shadow,\n    })}\n  >\n    {children}\n  </div>\n);\n\nBorder.defaultProps = {\n  rounded: false,\n  shadow: false,\n};\n\nBorder.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  rounded: PropTypes.bool,\n  shadow: PropTypes.bool,\n};\n\nexport default Border;\n","import Border from './border';\n\nexport default Border;\n","import { map, zipObject } from 'lodash';\n\nexport const mapSubQueryResult = (query, subQueryPayload) => {\n  if (!subQueryPayload) return null;\n  const selectPaths = map(query.select, ({ path }) => path);\n\n  return map(subQueryPayload, res => {\n    return zipObject(selectPaths, res);\n  });\n};\n","const roundToPowerOfTen = value => {\n  return Math.pow(10, Math.ceil(Math.log(value) / Math.LN10));\n};\n\nexport { roundToPowerOfTen };\n","import { once } from 'lodash';\n\n/*\n * importUniversalConfig\n *\n * Loads the entire universal \"Edit from dashboard\" experience\n * asynchronously while ensuring that the bundle is only ever\n * requested once, even if it is requested in multiple\n * places simultaneously.\n *\n * PLEASE USE THIS INSTEAD OF IMPORTING THE\n * UNIVERSAL CONFIG ENTRY FILE DIRECTLY.\n */\nconst __importUniversalCompactConfig = () => import('./entry');\nconst importUniversalCompactConfig = once(__importUniversalCompactConfig);\n\nexport default importUniversalCompactConfig;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"compactConfig\":\"compactConfig---1dDsh\",\"loadingPositioner\":\"loadingPositioner---3Vi0I\"};","import hash from 'object-hash';\nimport { isUndefined } from 'lodash';\n\nlet mirageCache = {};\n\nconst has = query => {\n  const queryHash = hash(query);\n  return !isUndefined(mirageCache[queryHash]);\n};\n\nconst get = query => {\n  const queryHash = hash(query);\n  return mirageCache[queryHash];\n};\n\nconst set = (query, data) => {\n  const queryHash = hash(query);\n  mirageCache[queryHash] = data;\n};\n\nconst clear = () => {\n  mirageCache = {};\n};\n\nexport default {\n  has,\n  get,\n  set,\n  clear,\n};\n","import ga2 from './ga2';\n\nexport default {\n  ga2,\n};\n","const data = {\n  accountSummaries: [\n    {\n      viewId: 345,\n      viewName: 'Sample view',\n      propertyId: 621,\n      propertyName: 'Sample property',\n      accountId: 91,\n      accountName: 'Sample account',\n    },\n    {\n      viewId: 2346,\n      viewName: 'Another sample view',\n      propertyId: 546,\n      propertyName: 'Another sample property',\n      accountId: 91,\n      accountName: 'Sample account',\n    },\n    {\n      viewId: 234,\n      viewName: 'Sample view',\n      propertyId: 8768,\n      propertyName: 'Sample property',\n      accountId: 27,\n      accountName: 'A second sample account',\n    },\n  ],\n  views: [{ currency: 'gbp', timezone: 'Europe/London' }],\n};\n\nexport default data;\n","import mirageCache from './mirage-cache';\nimport hardcodedResponses from './service-data';\nimport { LoremIpsum } from 'lorem-ipsum';\nimport { times, random, first, trimEnd, map } from 'lodash';\n\n/**\n * Mirage is a service that pretends to be other Universal services\n * It takes a query intended for Inquisitor and returns some coherent\n * data. It also caches query responses in order to return consistent\n * data for repeated queries.\n */\n\n// This plugin will generate random lorem ipsum words for us to return for string data\nconst lorem = new LoremIpsum({\n  wordsPerSentence: {\n    max: 3,\n    min: 1,\n  },\n});\n\nconst getHardcodedResponse = (select, integration) => {\n  const serviceSpecificResponses = hardcodedResponses[integration];\n\n  if (!serviceSpecificResponses) return undefined;\n\n  // At the moment, we only handle single resource requests (let's not overcomplicate things)\n  const resource = first(select).resource;\n  const fields = map(select, field => field.path);\n\n  const dataset = serviceSpecificResponses[resource];\n\n  if (!dataset) return undefined;\n\n  const values = map(dataset, item => map(fields, field => item[field]));\n\n  return values;\n};\n\nconst generateFakeSyncResponse = query => {\n  const {\n    source: { integration },\n  } = query;\n\n  // For some queries, we want to return some hardcoded service-specific data (ie. prerequisites)\n  const specificResponse = getHardcodedResponse(query.select, integration);\n  if (specificResponse) return Promise.resolve(specificResponse);\n\n  // If we don't have anything specific to return for this particular string query, let's just return some\n  // random lorem ipsum filler\n  const getRandomWords = () => trimEnd(lorem.generateSentences(1), '.');\n  const getValueSet = () => times(query.select.length, getRandomWords);\n\n  const response = times(random(2, 6), getValueSet); // Return a collection of random string responses\n\n  return Promise.resolve(response);\n};\n\nconst generateFakeAsyncResponse = () => {\n  return Math.round(Math.random() * 1000);\n};\n\n/**\n * Inquisitor uses a generated ID to keep track of queries / query results.\n * For our purposes, we can keep it super simple with an integer as we don't\n * need to worry about ID collisions.\n */\nlet queryId = 0;\n\nconst initialize = (query, data) => mirageCache.set(query, data);\n\n/**\n * In order to be able to return coherent data, we need to know the data\n * types being requested. The \"real\" `runQuery` takes a computed `query` object\n * but we need the full `uiQuery` in order to have access to the data types.\n */\nconst runQuery = (uiQuery, query, delivery) => {\n  queryId++;\n\n  /**\n   * Most of the queries we are handling will be async. Async queries are used whenever we\n   * are making a query for datat that will be shown on the visualisation, either when changing\n   * some options or initially loading the widget config\n   */\n  if (delivery.mode === 'async') {\n    return { queryId, response: generateFakeAsyncResponse() };\n  }\n\n  /**\n   * As a general rule, queries for getting the config ready to display (ie. loading metadata options,\n   * prerequisites, custom fields) are all done syncronously. We can use this assumption to return appropriate\n   * fake data in those cases.\n   */\n  return generateFakeSyncResponse(query);\n};\n\nexport default {\n  runQuery,\n  initialize,\n};\n","import MirageService from './mirage-service';\nexport default MirageService;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport IconBadge from '@UI/icon-badge';\n\nimport style from './widget-menu-modal-style.scss';\n\nconst WidgetMenuModalComponent = ({ title, icon, children }) => (\n  <div className={style.modal}>\n    <h3 className={style.heading}>\n      <span className={style.iconContainer}>\n        <IconBadge name={icon} background={IconBadge.BACKGROUNDS.GREY} />\n      </span>\n      {title}\n    </h3>\n    <div className={style.content}>{children}</div>\n  </div>\n);\n\nWidgetMenuModalComponent.defaultProps = {\n  icon: 'warning',\n};\n\nWidgetMenuModalComponent.propTypes = {\n  children: PropTypes.node,\n  icon: PropTypes.string,\n  title: PropTypes.node,\n  widgetKey: PropTypes.string,\n};\n\nexport default WidgetMenuModalComponent;\n","import WidgetMenuModalComponent from './widget-menu-modal-component';\nexport default WidgetMenuModalComponent;\n","import { omitBy, isUndefined } from 'lodash';\nimport * as SalesforceConfigConstants from '../constants/salesforce-config-constants';\nimport * as pickerActions from '../../file-picker/actions/picker-actions';\nimport { toValidConfig } from '../helpers';\n\nconst switchVisualisationType = (state, newConfig) => {\n  const { previousConfigs, config } = state;\n  const { title, type } = config;\n\n  return {\n    previousConfigs: { ...previousConfigs, [type]: { ...config } },\n    config: { ...newConfig, title },\n  };\n};\n\nconst initialState = {\n  meta: {},\n  data: {},\n  config: {},\n  previousConfigs: {},\n  isMetaLoading: true,\n  isInitLoading: true,\n  error: null,\n};\n\nconst salesforceReducerInner = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case SalesforceConfigConstants.INIT_CONFIG_LOADING:\n      return {\n        ...state,\n        uuid: payload,\n        meta: {},\n        data: {},\n        config: {},\n        previousConfigs: {},\n        isMetaLoading: true,\n        isInitLoading: true,\n        error: null,\n      };\n    case SalesforceConfigConstants.INIT_CONFIG_SUCCESSFUL:\n      return {\n        ...state,\n        meta: payload.meta,\n        config: payload.config,\n        refreshInterval: payload.refreshInterval,\n        isMetaLoading: false,\n        error: null,\n      };\n    case SalesforceConfigConstants.INIT_CONFIG_ERROR:\n      return {\n        ...state,\n        isMetaLoading: false,\n        isFetchingData: false,\n        isInitLoading: false,\n        error: payload,\n      };\n    case SalesforceConfigConstants.UPDATE_CONFIG:\n      return { ...state, config: { ...state.config, ...payload } };\n    case SalesforceConfigConstants.SET_STATE_PROPS:\n      return { ...state, ...payload };\n    case SalesforceConfigConstants.DATA_FETCH_START:\n      return { ...state, data: {}, isFetchingData: true, error: null };\n    case SalesforceConfigConstants.DATA_FETCH_SUCCESSFUL:\n      return {\n        ...state,\n        data: payload,\n        isFetchingData: false,\n        isInitLoading: false,\n        error: null,\n      };\n    case SalesforceConfigConstants.DATA_FETCH_ERROR:\n      return {\n        ...state,\n        isFetchingData: false,\n        isInitLoading: false,\n        error: payload,\n      };\n    case SalesforceConfigConstants.WIDGET_CONFIG_FETCH_FAILED:\n      return { ...state, error: payload };\n    case SalesforceConfigConstants.WIDGET_CREATION_START:\n    case SalesforceConfigConstants.WIDGET_UPDATE_START:\n      return { ...state, isSaving: true };\n    case SalesforceConfigConstants.WIDGET_CREATION_FAILED:\n      return { ...state, error: payload, isSaving: false };\n    case SalesforceConfigConstants.SWITCH_VISUALISATION_TYPE:\n      return { ...state, ...switchVisualisationType(state, payload) };\n    case SalesforceConfigConstants.TOGGLE_TABLE_HEADERS:\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          hasHeader: payload,\n        },\n      };\n    case SalesforceConfigConstants.SET_PROGRESS_GOAL:\n      const { progressGoal, startingValue } = action.payload;\n      const newConfig = {\n        ...state.config,\n        comparison: omitBy(\n          { type: 'goal', thresholdType: 'percentage', startingValue },\n          isUndefined,\n        ),\n        goal: isFinite(progressGoal) ? progressGoal.toString() : progressGoal,\n      };\n      return { ...state, config: { ...newConfig } };\n    case pickerActions.closeFilePicker.type:\n      return { ...state, showFilePicker: false };\n    default:\n      return state;\n  }\n};\n\nconst ensureValidConfig = state => {\n  return { ...state, config: toValidConfig(state) };\n};\n\nconst salesforceReducer = (state, action) => {\n  return ensureValidConfig(salesforceReducerInner(state, action));\n};\n\nconst getLastConfigForType = (state, type) => {\n  const { previousConfigs } = state;\n  return previousConfigs[type] || {};\n};\n\nexport default salesforceReducer;\nexport { initialState, getLastConfigForType };\n","import salesforceReducer, {\n  initialState,\n  getLastConfigForType,\n} from './salesforce-reducer.js';\nexport default salesforceReducer;\nexport { initialState, getLastConfigForType };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './panel-container-style.scss';\n\nconst PanelContainerComponent = ({ children }) => (\n  <div className={styles.panelContainer}>{children}</div>\n);\n\nPanelContainerComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default PanelContainerComponent;\n","import PanelContainer from './panel-container-component';\n\nexport default PanelContainer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Icon from '../icon';\nimport style from './icon-badge.scss';\n\nconst BACKGROUNDS = {\n  GREEN: 'green',\n  GREY: 'grey',\n};\n\nconst IconBadge = ({ name, background, font, fontWeight }) => (\n  <span className={style[`${background}-badge`]}>\n    <Icon name={name} font={font} fontWeight={fontWeight} />\n  </span>\n);\n\nIconBadge.BACKGROUNDS = BACKGROUNDS;\nIconBadge.FONTS = Icon.FONTS;\nIconBadge.FONT_WEIGHTS = Icon.FONT_WEIGHTS;\n\nIconBadge.propTypes = {\n  background: PropTypes.oneOf([BACKGROUNDS.GREEN, BACKGROUNDS.GREY]).isRequired,\n  name: PropTypes.string.isRequired,\n  font: PropTypes.oneOf([\n    IconBadge.FONTS.FONT_AWESOME,\n    IconBadge.FONTS.GECKO_FONT,\n  ]),\n  fontWeight: PropTypes.oneOf([\n    IconBadge.FONT_WEIGHTS.FA_SOLID,\n    IconBadge.FONT_WEIGHTS.FA_REGULAR,\n    IconBadge.FONT_WEIGHTS.FA_LIGHT,\n  ]),\n};\n\nexport default IconBadge;\n","import IconBadge from './icon-badge';\n\nexport default IconBadge;\n","module.exports = (__webpack_require__(28))(726);","!function(e){if(\"object\"==typeof exports)module.exports=e();else if(\"function\"==typeof define&&define.amd)define(e);else{var t;\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e()}}(function(){return function o(i,u,a){function f(n,e){if(!u[n]){if(!i[n]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(n,!0);if(s)return s(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}var r=u[n]={exports:{}};i[n][0].call(r.exports,function(e){var t=i[n][1][e];return f(t||e)},r,r.exports,o,i,u,a)}return u[n].exports}for(var s=\"function\"==typeof require&&require,e=0;e<a.length;e++)f(a[e]);return f}({1:[function(w,b,m){(function(e,t,s,n,r,o,i,u,a){\"use strict\";var f=w(\"crypto\");function c(e,t){return function(e,t){var n;n=\"passthrough\"!==t.algorithm?f.createHash(t.algorithm):new y;void 0===n.write&&(n.write=n.update,n.end=n.update);g(t,n).dispatch(e),n.update||n.end(\"\");if(n.digest)return n.digest(\"buffer\"===t.encoding?void 0:t.encoding);var r=n.read();return\"buffer\"!==t.encoding?r.toString(t.encoding):r}(e,t=h(e,t))}(m=b.exports=c).sha1=function(e){return c(e)},m.keys=function(e){return c(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},m.MD5=function(e){return c(e,{algorithm:\"md5\",encoding:\"hex\"})},m.keysMD5=function(e){return c(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var l=f.getHashes?f.getHashes().slice():[\"sha1\",\"md5\"];l.push(\"passthrough\");var d=[\"buffer\",\"hex\",\"binary\",\"base64\"];function h(e,t){t=t||{};var n={};if(n.algorithm=t.algorithm||\"sha1\",n.encoding=t.encoding||\"hex\",n.excludeValues=!!t.excludeValues,n.algorithm=n.algorithm.toLowerCase(),n.encoding=n.encoding.toLowerCase(),n.ignoreUnknown=!0===t.ignoreUnknown,n.respectType=!1!==t.respectType,n.respectFunctionNames=!1!==t.respectFunctionNames,n.respectFunctionProperties=!1!==t.respectFunctionProperties,n.unorderedArrays=!0===t.unorderedArrays,n.unorderedSets=!1!==t.unorderedSets,n.unorderedObjects=!1!==t.unorderedObjects,n.replacer=t.replacer||void 0,n.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error(\"Object argument required.\");for(var r=0;r<l.length;++r)l[r].toLowerCase()===n.algorithm.toLowerCase()&&(n.algorithm=l[r]);if(-1===l.indexOf(n.algorithm))throw new Error('Algorithm \"'+n.algorithm+'\"  not supported. supported values: '+l.join(\", \"));if(-1===d.indexOf(n.encoding)&&\"passthrough\"!==n.algorithm)throw new Error('Encoding \"'+n.encoding+'\"  not supported. supported values: '+d.join(\", \"));return n}function p(e){if(\"function\"!=typeof e)return!1;return null!=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(Function.prototype.toString.call(e))}function g(u,t,a){a=a||[];function f(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")}return{dispatch:function(e){u.replacer&&(e=u.replacer(e));var t=typeof e;return null===e&&(t=\"null\"),this[\"_\"+t](e)},_object:function(t){var e=Object.prototype.toString.call(t),n=/\\[object (.*)\\]/i.exec(e);n=(n=n?n[1]:\"unknown:[\"+e+\"]\").toLowerCase();var r;if(0<=(r=a.indexOf(t)))return this.dispatch(\"[CIRCULAR:\"+r+\"]\");if(a.push(t),void 0!==s&&s.isBuffer&&s.isBuffer(t))return f(\"buffer:\"),f(t);if(\"object\"===n||\"function\"===n){var o=Object.keys(t);u.unorderedObjects&&(o=o.sort()),!1===u.respectType||p(t)||o.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),u.excludeKeys&&(o=o.filter(function(e){return!u.excludeKeys(e)})),f(\"object:\"+o.length+\":\");var i=this;return o.forEach(function(e){i.dispatch(e),f(\":\"),u.excludeValues||i.dispatch(t[e]),f(\",\")})}if(!this[\"_\"+n]){if(u.ignoreUnknown)return f(\"[\"+n+\"]\");throw new Error('Unknown object type \"'+n+'\"')}this[\"_\"+n](t)},_array:function(e,t){t=void 0!==t?t:!1!==u.unorderedArrays;var n=this;if(f(\"array:\"+e.length+\":\"),!t||e.length<=1)return e.forEach(function(e){return n.dispatch(e)});var r=[],o=e.map(function(e){var t=new y,n=a.slice();return g(u,t,n).dispatch(e),r=r.concat(n.slice(a.length)),t.read().toString()});return a=a.concat(r),o.sort(),this._array(o,!1)},_date:function(e){return f(\"date:\"+e.toJSON())},_symbol:function(e){return f(\"symbol:\"+e.toString())},_error:function(e){return f(\"error:\"+e.toString())},_boolean:function(e){return f(\"bool:\"+e.toString())},_string:function(e){f(\"string:\"+e.length+\":\"),f(e.toString())},_function:function(e){f(\"fn:\"),p(e)?this.dispatch(\"[native]\"):this.dispatch(e.toString()),!1!==u.respectFunctionNames&&this.dispatch(\"function-name:\"+String(e.name)),u.respectFunctionProperties&&this._object(e)},_number:function(e){return f(\"number:\"+e.toString())},_xml:function(e){return f(\"xml:\"+e.toString())},_null:function(){return f(\"Null\")},_undefined:function(){return f(\"Undefined\")},_regexp:function(e){return f(\"regex:\"+e.toString())},_uint8array:function(e){return f(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return f(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return f(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return f(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return f(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return f(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return f(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return f(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return f(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return f(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return f(\"url:\"+e.toString())},_map:function(e){f(\"map:\");var t=Array.from(e);return this._array(t,!1!==u.unorderedSets)},_set:function(e){f(\"set:\");var t=Array.from(e);return this._array(t,!1!==u.unorderedSets)},_blob:function(){if(u.ignoreUnknown)return f(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return f(\"domwindow\")},_process:function(){return f(\"process\")},_timer:function(){return f(\"timer\")},_pipe:function(){return f(\"pipe\")},_tcp:function(){return f(\"tcp\")},_udp:function(){return f(\"udp\")},_tty:function(){return f(\"tty\")},_statwatcher:function(){return f(\"statwatcher\")},_securecontext:function(){return f(\"securecontext\")},_connection:function(){return f(\"connection\")},_zlib:function(){return f(\"zlib\")},_context:function(){return f(\"context\")},_nodescript:function(){return f(\"nodescript\")},_httpparser:function(){return f(\"httpparser\")},_dataview:function(){return f(\"dataview\")},_signal:function(){return f(\"signal\")},_fsevent:function(){return f(\"fsevent\")},_tlswrap:function(){return f(\"tlswrap\")}}}function y(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}m.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),g(t=h(e,t),n).dispatch(e)}}).call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_8fc94e7b.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:10}],2:[function(e,t,s){(function(e,t,n,r,o,i,u,a,f){!function(e){\"use strict\";var s=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,n=\"+\".charCodeAt(0),r=\"/\".charCodeAt(0),o=\"0\".charCodeAt(0),i=\"a\".charCodeAt(0),u=\"A\".charCodeAt(0),a=\"-\".charCodeAt(0),f=\"_\".charCodeAt(0);function c(e){var t=e.charCodeAt(0);return t===n||t===a?62:t===r||t===f?63:t<o?-1:t<o+10?t-o+26+26:t<u+26?t-u:t<i+26?t-i+26:void 0}e.toByteArray=function(e){var t,n,r,o,i;if(0<e.length%4)throw new Error(\"Invalid string. Length must be a multiple of 4\");var u=e.length;o=\"=\"===e.charAt(u-2)?2:\"=\"===e.charAt(u-1)?1:0,i=new s(3*e.length/4-o),n=0<o?e.length-4:e.length;var a=0;function f(e){i[a++]=e}for(t=0;t<n;t+=4,3)f((16711680&(r=c(e.charAt(t))<<18|c(e.charAt(t+1))<<12|c(e.charAt(t+2))<<6|c(e.charAt(t+3))))>>16),f((65280&r)>>8),f(255&r);return 2==o?f(255&(r=c(e.charAt(t))<<2|c(e.charAt(t+1))>>4)):1==o&&(f((r=c(e.charAt(t))<<10|c(e.charAt(t+1))<<4|c(e.charAt(t+2))>>2)>>8&255),f(255&r)),i},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u=\"\";function a(e){return\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)}for(t=0,r=e.length-i;t<r;t+=3)n=(e[t]<<16)+(e[t+1]<<8)+e[t+2],u+=a((o=n)>>18&63)+a(o>>12&63)+a(o>>6&63)+a(63&o);switch(i){case 1:u+=a((n=e[e.length-1])>>2),u+=a(n<<4&63),u+=\"==\";break;case 2:u+=a((n=(e[e.length-2]<<8)+e[e.length-1])>>10),u+=a(n>>4&63),u+=a(n<<2&63),u+=\"=\"}return u}}(void 0===s?this.base64js={}:s)}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:10}],3:[function(D,e,O){(function(e,t,f,n,r,o,i,u,a){var s=D(\"base64-js\"),c=D(\"ieee754\");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u=typeof e;if(\"base64\"===t&&\"string\"==u)for(e=function(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}(e);e.length%4!=0;)e+=\"=\";if(\"number\"==u)r=U(e);else if(\"string\"==u)r=f.byteLength(e,t);else{if(\"object\"!=u)throw new Error(\"First argument needs to be a number, array or string.\");r=U(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&\"number\"==typeof e.byteLength)o._set(e);else if(function(e){return x(e)||f.isBuffer(e)||e&&\"object\"==typeof e&&\"number\"==typeof e.length}(e))for(i=0;i<r;i++)f.isBuffer(e)?o[i]=e.readUInt8(i):o[i]=e[i];else if(\"string\"==u)o.write(e,0,t);else if(\"number\"==u&&!f._useTypedArrays&&!n)for(i=0;i<r;i++)o[i]=0;return o}function l(e,t,n,r){return f._charsWritten=k(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function d(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function h(e,t,n,r){r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(null!=t,\"missing offset\"),F(t+1<e.length,\"Trying to read beyond buffer length\"));var o,i=e.length;if(!(i<=t))return n?(o=e[t],t+1<i&&(o|=e[t+1]<<8)):(o=e[t]<<8,t+1<i&&(o|=e[t+1])),o}function p(e,t,n,r){r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(null!=t,\"missing offset\"),F(t+3<e.length,\"Trying to read beyond buffer length\"));var o,i=e.length;if(!(i<=t))return n?(t+2<i&&(o=e[t+2]<<16),t+1<i&&(o|=e[t+1]<<8),o|=e[t],t+3<i&&(o+=e[t+3]<<24>>>0)):(t+1<i&&(o=e[t+1]<<16),t+2<i&&(o|=e[t+2]<<8),t+3<i&&(o|=e[t+3]),o+=e[t]<<24>>>0),o}function g(e,t,n,r){if(r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(null!=t,\"missing offset\"),F(t+1<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t)){var o=h(e,t,n,!0);return 32768&o?-1*(65535-o+1):o}}function y(e,t,n,r){if(r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(null!=t,\"missing offset\"),F(t+3<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t)){var o=p(e,t,n,!0);return 2147483648&o?-1*(4294967295-o+1):o}}function w(e,t,n,r){return r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(t+3<e.length,\"Trying to read beyond buffer length\")),c.read(e,t,n,23,4)}function b(e,t,n,r){return r||(F(\"boolean\"==typeof n,\"missing or invalid endian\"),F(t+7<e.length,\"Trying to read beyond buffer length\")),c.read(e,t,n,52,8)}function m(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+1<e.length,\"trying to write beyond buffer length\"),M(t,65535));var i=e.length;if(!(i<=n))for(var u=0,a=Math.min(i-n,2);u<a;u++)e[n+u]=(t&255<<8*(r?u:1-u))>>>8*(r?u:1-u)}function v(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+3<e.length,\"trying to write beyond buffer length\"),M(t,4294967295));var i=e.length;if(!(i<=n))for(var u=0,a=Math.min(i-n,4);u<a;u++)e[n+u]=t>>>8*(r?u:3-u)&255}function _(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+1<e.length,\"Trying to write beyond buffer length\"),N(t,32767,-32768)),e.length<=n||m(e,0<=t?t:65535+t+1,n,r,o)}function E(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+3<e.length,\"Trying to write beyond buffer length\"),N(t,2147483647,-2147483648)),e.length<=n||v(e,0<=t?t:4294967295+t+1,n,r,o)}function I(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+3<e.length,\"Trying to write beyond buffer length\"),Y(t,34028234663852886e22,-34028234663852886e22)),e.length<=n||c.write(e,t,n,r,23,4)}function A(e,t,n,r,o){o||(F(null!=t,\"missing value\"),F(\"boolean\"==typeof r,\"missing or invalid endian\"),F(null!=n,\"missing offset\"),F(n+7<e.length,\"Trying to write beyond buffer length\"),Y(t,17976931348623157e292,-17976931348623157e292)),e.length<=n||c.write(e,t,n,r,52,8)}O.Buffer=f,O.SlowBuffer=f,O.INSPECT_MAX_BYTES=50,f.poolSize=8192,f._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(e){return!1}}(),f.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},f.isBuffer=function(e){return!(null==e||!e._isBuffer)},f.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=j(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=C(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},f.concat=function(e,t){if(F(x(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new f(0);if(1===e.length)return e[0];var n;if(\"number\"!=typeof t)for(n=t=0;n<e.length;n++)t+=e[n].length;var r=new f(t),o=0;for(n=0;n<e.length;n++){var i=e[n];i.copy(r,o),o+=i.length}return r},f.prototype.write=function(e,t,n,r){if(isFinite(t))isFinite(n)||(r=n,n=void 0);else{var o=r;r=t,t=n,n=o}t=Number(t)||0;var i,u=this.length-t;switch(n?u<(n=Number(n))&&(n=u):n=u,r=String(r||\"utf8\").toLowerCase()){case\"hex\":i=function(e,t,n,r){n=Number(n)||0;var o=e.length-n;r?o<(r=Number(r))&&(r=o):r=o;var i=t.length;F(i%2==0,\"Invalid hex string\"),i/2<r&&(r=i/2);for(var u=0;u<r;u++){var a=parseInt(t.substr(2*u,2),16);F(!isNaN(a),\"Invalid hex string\"),e[n+u]=a}return f._charsWritten=2*u,u}(this,e,t,n);break;case\"utf8\":case\"utf-8\":i=function(e,t,n,r){return f._charsWritten=k(j(t),e,n,r)}(this,e,t,n);break;case\"ascii\":i=l(this,e,t,n);break;case\"binary\":i=function(e,t,n,r){return l(e,t,n,r)}(this,e,t,n);break;case\"base64\":i=function(e,t,n,r){return f._charsWritten=k(C(t),e,n,r)}(this,e,t,n);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":i=function(e,t,n,r){return f._charsWritten=k(function(e){for(var t,n,r,o=[],i=0;i<e.length;i++)t=e.charCodeAt(i),n=t>>8,r=t%256,o.push(r),o.push(n);return o}(t),e,n,r)}(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return i},f.prototype.toString=function(e,t,n){var r,o=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):n=o.length)===t)return\"\";switch(e){case\"hex\":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r<n)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=S(e[i]);return o}(o,t,n);break;case\"utf8\":case\"utf-8\":r=function(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=T(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+T(o)}(o,t,n);break;case\"ascii\":r=d(o,t,n);break;case\"binary\":r=function(e,t,n){return d(e,t,n)}(o,t,n);break;case\"base64\":r=function(e,t,n){return 0===t&&n===e.length?s.fromByteArray(e):s.fromByteArray(e.slice(t,n))}(o,t,n);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":r=function(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}(o,t,n);break;default:throw new Error(\"Unknown encoding\")}return r},f.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},f.prototype.copy=function(e,t,n,r){if(n=n||0,r||0===r||(r=this.length),t=t||0,r!==n&&0!==e.length&&0!==this.length){F(n<=r,\"sourceEnd < sourceStart\"),F(0<=t&&t<e.length,\"targetStart out of bounds\"),F(0<=n&&n<this.length,\"sourceStart out of bounds\"),F(0<=r&&r<=this.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);var o=r-n;if(o<100||!f._useTypedArrays)for(var i=0;i<o;i++)e[i+t]=this[i+n];else e._set(this.subarray(n,n+o),t)}},f.prototype.slice=function(e,t){var n=this.length;if(e=L(e,n,0),t=L(t,n,n),f._useTypedArrays)return f._augment(this.subarray(e,t));for(var r=t-e,o=new f(r,void 0,!0),i=0;i<r;i++)o[i]=this[i+e];return o},f.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},f.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},f.prototype.readUInt8=function(e,t){if(t||(F(null!=e,\"missing offset\"),F(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return h(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return h(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return p(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return p(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(F(null!=e,\"missing offset\"),F(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return g(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return g(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return y(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return y(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return w(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return w(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return b(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return b(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(F(null!=e,\"missing value\"),F(null!=t,\"missing offset\"),F(t<this.length,\"trying to write beyond buffer length\"),M(e,255)),t>=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){m(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){m(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){v(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){v(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(F(null!=e,\"missing value\"),F(null!=t,\"missing offset\"),F(t<this.length,\"Trying to write beyond buffer length\"),N(e,127,-128)),t>=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){_(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){_(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){E(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){E(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){I(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){I(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){A(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){A(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(e=e||0,t=t||0,n=n||this.length,\"string\"==typeof e&&(e=e.charCodeAt(0)),F(\"number\"==typeof e&&!isNaN(e),\"value is not a number\"),F(t<=n,\"end < start\"),n!==t&&0!==this.length){F(0<=t&&t<this.length,\"start out of bounds\"),F(0<=n&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},f.prototype.inspect=function(){for(var e=[],t=this.length,n=0;n<t;n++)if(e[n]=S(this[n]),n===O.INSPECT_MAX_BYTES){e[n+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},f.prototype.toArrayBuffer=function(){if(\"undefined\"==typeof Uint8Array)throw new Error(\"Buffer.toArrayBuffer not supported in this browser\");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer};var B=f.prototype;function L(e,t,n){return\"number\"!=typeof e?n:t<=(e=~~e)?t:0<=e?e:0<=(e+=t)?e:0}function U(e){return(e=~~Math.ceil(+e))<0?0:e}function x(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function S(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function j(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else{var o=n;55296<=r&&r<=57343&&n++;for(var i=encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\"),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}}return t}function C(e){return s.toByteArray(e)}function k(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function T(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function M(e,t){F(\"number\"==typeof e,\"cannot write a non-number as a number\"),F(0<=e,\"specified a negative value for writing an unsigned value\"),F(e<=t,\"value is larger than maximum value for type\"),F(Math.floor(e)===e,\"value has a fractional component\")}function N(e,t,n){F(\"number\"==typeof e,\"cannot write a non-number as a number\"),F(e<=t,\"value larger than maximum allowed value\"),F(n<=e,\"value smaller than minimum allowed value\"),F(Math.floor(e)===e,\"value has a fractional component\")}function Y(e,t,n){F(\"number\"==typeof e,\"cannot write a non-number as a number\"),F(e<=t,\"value larger than maximum allowed value\"),F(n<=e,\"value smaller than minimum allowed value\")}function F(e,t){if(!e)throw new Error(t||\"Failed assertion\")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=B.get,e.set=B.set,e.write=B.write,e.toString=B.toString,e.toLocaleString=B.toString,e.toJSON=B.toJSON,e.copy=B.copy,e.slice=B.slice,e.readUInt8=B.readUInt8,e.readUInt16LE=B.readUInt16LE,e.readUInt16BE=B.readUInt16BE,e.readUInt32LE=B.readUInt32LE,e.readUInt32BE=B.readUInt32BE,e.readInt8=B.readInt8,e.readInt16LE=B.readInt16LE,e.readInt16BE=B.readInt16BE,e.readInt32LE=B.readInt32LE,e.readInt32BE=B.readInt32BE,e.readFloatLE=B.readFloatLE,e.readFloatBE=B.readFloatBE,e.readDoubleLE=B.readDoubleLE,e.readDoubleBE=B.readDoubleBE,e.writeUInt8=B.writeUInt8,e.writeUInt16LE=B.writeUInt16LE,e.writeUInt16BE=B.writeUInt16BE,e.writeUInt32LE=B.writeUInt32LE,e.writeUInt32BE=B.writeUInt32BE,e.writeInt8=B.writeInt8,e.writeInt16LE=B.writeInt16LE,e.writeInt16BE=B.writeInt16BE,e.writeInt32LE=B.writeInt32LE,e.writeInt32BE=B.writeInt32BE,e.writeFloatLE=B.writeFloatLE,e.writeFloatBE=B.writeFloatBE,e.writeDoubleLE=B.writeDoubleLE,e.writeDoubleBE=B.writeDoubleBE,e.fill=B.fill,e.inspect=B.inspect,e.toArrayBuffer=B.toArrayBuffer,e}}).call(this,D(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},D(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:11,lYpoI2:10}],4:[function(l,d,e){(function(e,t,u,n,r,o,i,a,f){u=l(\"buffer\").Buffer;var s=4,c=new u(s);c.fill(0);d.exports={hash:function(e,t,n,r){return u.isBuffer(e)||(e=new u(e)),function(e,t,n){for(var r=new u(t),o=n?r.writeInt32BE:r.writeInt32LE,i=0;i<e.length;i++)o.call(r,e[i],4*i,!0);return r}(t(function(e,t){if(e.length%s!=0){var n=e.length+(s-e.length%s);e=u.concat([e,c],n)}for(var r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;i<e.length;i+=s)r.push(o.call(e,i));return r}(e,r),8*e.length),n,r)}}}).call(this,l(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},l(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:10}],5:[function(w,e,b){(function(e,t,a,n,r,o,i,u,f){a=w(\"buffer\").Buffer;var s=w(\"./sha\"),c=w(\"./sha256\"),l=w(\"./rng\"),d={sha1:s,sha256:c,md5:w(\"./md5\")},h=64,p=new a(h);function g(e,r){var o=d[e=e||\"sha1\"],i=[];return o||y(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return a.isBuffer(e)||(e=new a(e)),i.push(e),e.length,this},digest:function(e){var t=a.concat(i),n=r?function(e,t,n){a.isBuffer(t)||(t=new a(t)),a.isBuffer(n)||(n=new a(n)),t.length>h?t=e(t):t.length<h&&(t=a.concat([t,p],h));for(var r=new a(h),o=new a(h),i=0;i<h;i++)r[i]=54^t[i],o[i]=92^t[i];var u=e(a.concat([r,n]));return e(a.concat([o,u]))}(o,r,t):o(t);return i=null,e?n.toString(e):n}}}function y(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}p.fill(0),b.createHash=function(e){return g(e)},b.createHmac=function(e,t){return g(e,t)},b.randomBytes=function(e,t){if(!t||!t.call)return new a(l(e));try{t.call(this,void 0,new a(l(e)))}catch(e){t(e)}},function(e,t){for(var n in e)t(e[n],n)}([\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],function(e){b[e]=function(){y(\"sorry,\",e,\"is not implemented yet\")}})}).call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:10}],6:[function(w,b,e){(function(e,t,n,r,o,i,u,a,f){var s=w(\"./helpers\");function c(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var a=n,f=r,s=o,c=i;r=g(r=g(r=g(r=g(r=p(r=p(r=p(r=p(r=h(r=h(r=h(r=h(r=d(r=d(r=d(r=d(r,o=d(o,i=d(i,n=d(n,r,o,i,e[u+0],7,-680876936),r,o,e[u+1],12,-389564586),n,r,e[u+2],17,606105819),i,n,e[u+3],22,-1044525330),o=d(o,i=d(i,n=d(n,r,o,i,e[u+4],7,-176418897),r,o,e[u+5],12,1200080426),n,r,e[u+6],17,-1473231341),i,n,e[u+7],22,-45705983),o=d(o,i=d(i,n=d(n,r,o,i,e[u+8],7,1770035416),r,o,e[u+9],12,-1958414417),n,r,e[u+10],17,-42063),i,n,e[u+11],22,-1990404162),o=d(o,i=d(i,n=d(n,r,o,i,e[u+12],7,1804603682),r,o,e[u+13],12,-40341101),n,r,e[u+14],17,-1502002290),i,n,e[u+15],22,1236535329),o=h(o,i=h(i,n=h(n,r,o,i,e[u+1],5,-165796510),r,o,e[u+6],9,-1069501632),n,r,e[u+11],14,643717713),i,n,e[u+0],20,-373897302),o=h(o,i=h(i,n=h(n,r,o,i,e[u+5],5,-701558691),r,o,e[u+10],9,38016083),n,r,e[u+15],14,-660478335),i,n,e[u+4],20,-405537848),o=h(o,i=h(i,n=h(n,r,o,i,e[u+9],5,568446438),r,o,e[u+14],9,-1019803690),n,r,e[u+3],14,-187363961),i,n,e[u+8],20,1163531501),o=h(o,i=h(i,n=h(n,r,o,i,e[u+13],5,-1444681467),r,o,e[u+2],9,-51403784),n,r,e[u+7],14,1735328473),i,n,e[u+12],20,-1926607734),o=p(o,i=p(i,n=p(n,r,o,i,e[u+5],4,-378558),r,o,e[u+8],11,-2022574463),n,r,e[u+11],16,1839030562),i,n,e[u+14],23,-35309556),o=p(o,i=p(i,n=p(n,r,o,i,e[u+1],4,-1530992060),r,o,e[u+4],11,1272893353),n,r,e[u+7],16,-155497632),i,n,e[u+10],23,-1094730640),o=p(o,i=p(i,n=p(n,r,o,i,e[u+13],4,681279174),r,o,e[u+0],11,-358537222),n,r,e[u+3],16,-722521979),i,n,e[u+6],23,76029189),o=p(o,i=p(i,n=p(n,r,o,i,e[u+9],4,-640364487),r,o,e[u+12],11,-421815835),n,r,e[u+15],16,530742520),i,n,e[u+2],23,-995338651),o=g(o,i=g(i,n=g(n,r,o,i,e[u+0],6,-198630844),r,o,e[u+7],10,1126891415),n,r,e[u+14],15,-1416354905),i,n,e[u+5],21,-57434055),o=g(o,i=g(i,n=g(n,r,o,i,e[u+12],6,1700485571),r,o,e[u+3],10,-1894986606),n,r,e[u+10],15,-1051523),i,n,e[u+1],21,-2054922799),o=g(o,i=g(i,n=g(n,r,o,i,e[u+8],6,1873313359),r,o,e[u+15],10,-30611744),n,r,e[u+6],15,-1560198380),i,n,e[u+13],21,1309151649),o=g(o,i=g(i,n=g(n,r,o,i,e[u+4],6,-145523070),r,o,e[u+11],10,-1120210379),n,r,e[u+2],15,718787259),i,n,e[u+9],21,-343485551),n=y(n,a),r=y(r,f),o=y(o,s),i=y(i,c)}return Array(n,r,o,i)}function l(e,t,n,r,o,i){return y(function(e,t){return e<<t|e>>>32-t}(y(y(t,e),y(r,i)),o),n)}function d(e,t,n,r,o,i,u){return l(t&n|~t&r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return l(t&r|n&~r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return l(t^n^r,e,t,o,i,u)}function g(e,t,n,r,o,i,u){return l(n^(t|~r),e,t,o,i,u)}function y(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return s.hash(e,c,16)}}).call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],7:[function(e,s,t){(function(e,t,n,r,o,i,u,a,f){!function(){var e,t;e=function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n},this.crypto&&crypto.getRandomValues&&(t=function(e){var t=new Uint8Array(e);return crypto.getRandomValues(t),t}),s.exports=t||e}()}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:10}],8:[function(l,d,e){(function(e,t,n,r,o,i,u,a,f){var s=l(\"./helpers\");function c(e,t){e[t>>5]|=128<<24-t%32,e[15+(t+64>>9<<4)]=t;for(var n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,a=271733878,f=-1009589776,s=0;s<e.length;s+=16){for(var c=o,l=i,d=u,h=a,p=f,g=0;g<80;g++){r[g]=g<16?e[s+g]:m(r[g-3]^r[g-8]^r[g-14]^r[g-16],1);var y=b(b(m(o,5),w(g,i,u,a)),b(b(f,r[g]),(n=g)<20?1518500249:n<40?1859775393:n<60?-1894007588:-899497514));f=a,a=u,u=m(i,30),i=o,o=y}o=b(o,c),i=b(i,l),u=b(u,d),a=b(a,h),f=b(f,p)}return Array(o,i,u,a,f)}function w(e,t,n,r){return e<20?t&n|~t&r:e<40?t^n^r:e<60?t&n|t&r|n&r:t^n^r}function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function m(e,t){return e<<t|e>>>32-t}d.exports=function(e){return s.hash(e,c,20,!0)}}).call(this,l(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},l(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],9:[function(l,d,e){(function(e,t,n,r,o,i,u,a,f){function B(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function L(e,t){return e>>>t|e<<32-t}function U(e,t){return e>>>t}function s(e,t){var n,r,o,i,u,a,f,s,c,l,d,h,p,g,y,w,b,m,v=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),_=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),E=new Array(64);e[t>>5]|=128<<24-t%32,e[15+(t+64>>9<<4)]=t;for(var I=0;I<e.length;I+=16){n=_[0],r=_[1],o=_[2],i=_[3],u=_[4],a=_[5],f=_[6],s=_[7];for(var A=0;A<64;A++)E[A]=A<16?e[A+I]:B(B(B((m=E[A-2],L(m,17)^L(m,19)^U(m,10)),E[A-7]),(b=E[A-15],L(b,7)^L(b,18)^U(b,3))),E[A-16]),c=B(B(B(B(s,L(w=u,6)^L(w,11)^L(w,25)),(y=u)&a^~y&f),v[A]),E[A]),l=B(L(g=n,2)^L(g,13)^L(g,22),(d=n)&(h=r)^d&(p=o)^h&p),s=f,f=a,a=u,u=B(i,c),i=o,o=r,r=n,n=B(c,l);_[0]=B(n,_[0]),_[1]=B(r,_[1]),_[2]=B(o,_[2]),_[3]=B(i,_[3]),_[4]=B(u,_[4]),_[5]=B(a,_[5]),_[6]=B(f,_[6]),_[7]=B(s,_[7])}return _}var c=l(\"./helpers\");d.exports=function(e){return c.hash(e,s,32,!0)}}).call(this,l(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},l(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:10}],10:[function(e,c,t){(function(e,t,n,r,o,i,u,a,f){function s(){}(e=c.exports={}).nextTick=function(){var e=\"undefined\"!=typeof window&&window.setImmediate,t=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener;if(e)return function(e){return window.setImmediate(e)};if(t){var n=[];return window.addEventListener(\"message\",function(e){var t=e.source;t!==window&&null!==t||\"process-tick\"!==e.data||(e.stopPropagation(),0<n.length&&n.shift()())},!0),function(e){n.push(e),window.postMessage(\"process-tick\",\"*\")}}return function(e){setTimeout(e,0)}}(),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=s,e.addListener=s,e.once=s,e.off=s,e.removeListener=s,e.removeAllListeners=s,e.emit=s,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:10}],11:[function(e,t,s){(function(e,t,n,r,o,i,u,a,f){s.read=function(e,t,n,r,o){var i,u,a=8*o-r-1,f=(1<<a)-1,s=f>>1,c=-7,l=n?o-1:0,d=n?-1:1,h=e[t+l];for(l+=d,i=h&(1<<-c)-1,h>>=-c,c+=a;0<c;i=256*i+e[t+l],l+=d,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=r;0<c;u=256*u+e[t+l],l+=d,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:1/0*(h?-1:1);u+=Math.pow(2,r),i-=s}return(h?-1:1)*u*Math.pow(2,i-r)},s.write=function(e,t,n,r,o,i){var u,a,f,s=8*i-o-1,c=(1<<s)-1,l=c>>1,d=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,h=r?0:i-1,p=r?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,u=c):(u=Math.floor(Math.log(t)/Math.LN2),t*(f=Math.pow(2,-u))<1&&(u--,f*=2),2<=(t+=1<=u+l?d/f:d*Math.pow(2,1-l))*f&&(u++,f/=2),c<=u+l?(a=0,u=c):1<=u+l?(a=(t*f-1)*Math.pow(2,o),u+=l):(a=t*Math.pow(2,l-1)*Math.pow(2,o),u=0));8<=o;e[n+h]=255&a,h+=p,a/=256,o-=8);for(u=u<<o|a,s+=o;0<s;e[n+h]=255&u,h+=p,u/=256,s-=8);e[n+h-p]|=128*g}}).call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/ieee754/index.js\",\"/node_modules/ieee754\")},{buffer:3,lYpoI2:10}]},{},[1])(1)});","// extracted by mini-css-extract-plugin\nmodule.exports = {\"autoBtn\":\"autoBtn---2x3ek\",\"precisionNumber\":\"precisionNumber---3Hj2c\",\"inactive\":\"inactive---ctJAM\",\"precisionGroup\":\"precisionGroup---2nX2Q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Border\":\"Border---3PVl1\",\"rounded\":\"rounded---2SZyY\",\"shadow\":\"shadow---1baez\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"notice\":\"notice---1ZQRf\",\"iconContainer\":\"iconContainer---2d-Ug\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomizationDashboardFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Dashboard\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"customization\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fontSize\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logoSource\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showClock\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showFooter\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"showLogo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"theme\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"BuiltInTheme\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"themeType\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomTheme\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"backgroundColor\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"frameStyle\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"layoutType\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"FixedLayout\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"grid\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ById\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomizationDashboardFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"BySharingHash\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"dashboardBySharingHash\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sharingHash\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomizationDashboardFragment\"},\"directives\":[]}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ByScreenId\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"dashboard\"},\"name\":{\"kind\":\"Name\",\"value\":\"screenContent\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"screenId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"CustomizationDashboardFragment\"},\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":773}};\n    doc.loc.source = {\"body\":\"fragment CustomizationDashboardFragment on Dashboard {\\n  id\\n  customization {\\n    fontSize\\n    logoSource\\n    showClock\\n    showFooter\\n    showLogo\\n    theme {\\n      __typename\\n      ... on BuiltInTheme {\\n        themeType\\n      }\\n      ... on CustomTheme {\\n        backgroundColor\\n        frameStyle\\n      }\\n    }\\n  }\\n  layoutType {\\n    __typename\\n    ... on FixedLayout {\\n      grid\\n    }\\n  }\\n}\\n\\nquery ById($id: ID!) {\\n  dashboard(id: $id) {\\n    ...CustomizationDashboardFragment\\n  }\\n}\\n\\nquery BySharingHash($sharingHash: String!) {\\n  dashboard: dashboardBySharingHash(sharingHash: $sharingHash) {\\n    ...CustomizationDashboardFragment\\n  }\\n}\\n\\nquery ByScreenId($screenId: ID!) {\\n  dashboard: screenContent(screenId: $screenId) {\\n    ...CustomizationDashboardFragment\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"ById\"] = oneQuery(doc, \"ById\");\n        \n        module.exports[\"BySharingHash\"] = oneQuery(doc, \"BySharingHash\");\n        \n        module.exports[\"ByScreenId\"] = oneQuery(doc, \"ByScreenId\");\n        \n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseConnections\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseConnections\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"engine\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":87}};\n    doc.loc.source = {\"body\":\"query DatabaseConnections {\\n  databaseConnections {\\n    id,\\n    name,\\n    engine\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DatabaseConnections\"] = oneQuery(doc, \"DatabaseConnections\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"adminModal\":\"adminModal---1X7lB\",\"adminModalImage\":\"adminModalImage---1WQpY\",\"featureGateModal\":\"featureGateModal---eZwGB\",\"featureGateCopy\":\"featureGateCopy---2qiDK\",\"inputContainer\":\"inputContainer---F49Hb\",\"muted\":\"muted---3M6zg\",\"error\":\"error---2OHVP\",\"manageLink\":\"manageLink---1VfAM\",\"manageLinkIcon\":\"manageLinkIcon---2HzZJ\",\"action\":\"action---32Pwr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"slackWrapper\":\"slackWrapper---1NKk8\",\"connectInfo\":\"connectInfo---QyREJ\",\"connectionDetails\":\"connectionDetails---nXpJj\",\"connectedIcon\":\"connectedIcon---3c_Tv\",\"disconnectLink\":\"disconnectLink---3m3ov\",\"errorAlert\":\"errorAlert---2a6SA\",\"separator\":\"separator---o2kWc\",\"sharingInfo\":\"sharingInfo---2vxLf\",\"sharingInfoText\":\"sharingInfoText---2lv-B\",\"sharingLink\":\"sharingLink---3EEXq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"footerBox\":\"footerBox---3cOMT\",\"leftHandSide\":\"leftHandSide---36oD0\",\"textContainer\":\"textContainer---3DBLa\",\"buttonContainer\":\"buttonContainer---2bQkt\",\"heading\":\"heading---36_BO\",\"subheading\":\"subheading---3DRSa\",\"suggestionsText\":\"suggestionsText---1HNf9\",\"suggestions\":\"suggestions---44myZ\",\"integration\":\"integration---LSgDO\",\"blobContainer\":\"blobContainer---YzI1k\",\"integrationText\":\"integrationText---2tIMh\",\"integrationTitle\":\"integrationTitle---3VLvW\"};","import createAction from '../../lib/redux/create-action';\n\nexport const setActive = createAction('Selection:SET_ACTIVE');\nexport const clearAll = createAction('Selection:CLEAR_ALL');\nexport const updateSelections = createAction('Selections:UPDATE');\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { isNil, isArray, negate, chain, zip, some } from 'lodash';\n\nconst notNil = negate(isNil);\n\nconst pluckDatumValue = datum => {\n  if (isArray(datum)) {\n    return datum[1];\n  }\n\n  return datum;\n};\n\nconst canRender = ({ x_axis: xAxis, series = [] }) => {\n  if (!xAxis) {\n    return false;\n  }\n\n  // We can't render when none of our series contain any values\n  return chain(series)\n    .map('data')\n    .flatten()\n    .map(pluckDatumValue)\n    .some(notNil)\n    .value();\n};\n\n// Group datums from each series for each column\n// If a column has no values then we don't render it\nconst identifyNils = series => {\n  const results = chain(series)\n    .map('data')\n    .map(data => data.map(pluckDatumValue))\n    .thru(all => zip(...all))\n    .map(data => some(data, notNil))\n    .value();\n\n  return (_, i) => results[i];\n};\n\nconst seriesPresenter = DecoratedComponent => {\n  const SeriesPresenter = ({\n    series = [],\n    x_axis: { labels, type } = {},\n    x_axis: xAxis,\n    ...props\n  }) => {\n    // DATETIME X_AXIS:\n    // If f(x) = NULL then plot a gap\n    //\n    // CATEGORICAL:\n    // If f(x) = NULL then omit x from the axis.\n    // If it's a multi-series chart, only omit x if f(x) = NULL for all series.\n    const removeNils = type !== 'datetime';\n    let filteredSeries = [...series];\n    const filteredXAxis = { ...xAxis };\n\n    if (removeNils) {\n      const filterNils = identifyNils(series);\n\n      // Walk each series and remove values for empty columns\n      filteredSeries = series.map(item => {\n        const data = item.data.filter(filterNils);\n        return { ...item, data };\n      });\n\n      // Remove labels for columns with no values\n      if (labels) {\n        filteredXAxis.labels = labels.filter(filterNils);\n      }\n    }\n\n    return (\n      <DecoratedComponent\n        {...props}\n        x_axis={filteredXAxis}\n        series={filteredSeries}\n      />\n    );\n  };\n\n  SeriesPresenter.canRender = canRender;\n  SeriesPresenter.propTypes = {\n    series: PropTypes.array,\n    x_axis: PropTypes.object,\n  };\n\n  const ComponentName =\n    DecoratedComponent.displayName || DecoratedComponent.name;\n  SeriesPresenter.displayName = `SeriesChartPresenter(${ComponentName})`;\n\n  return SeriesPresenter;\n};\n\nexport default seriesPresenter;\n","import seriesPresenter from './series-presenter';\nexport default seriesPresenter;\n","module.exports = (__webpack_require__(28))(115);","import createAction from '../../lib/redux/create-action';\n\nexport const launchInstrumentCelebration = createAction(\n  'GraphQLDashboard:LAUNCH_CELEBRATION',\n);\nexport const finishInstrumentCelebration = createAction(\n  'GraphQLDashboard:FINISH_CELEBRATION',\n);\n","const getPlaceholder = (value, format) => {\n  switch (format) {\n    case 'percent':\n    case 'percentage':\n      return `${value}%`;\n    case 'currency':\n    case 'money':\n      return `$${value}`;\n    default:\n      return `${value}`;\n  }\n};\n\nexport { getPlaceholder };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport d3 from 'd3';\nimport { getClientSize } from '../../../lib/dom-helper';\n\nimport styles from './spark-line-style.scss';\n\nclass SparkLineComponent extends Component {\n  componentDidMount() {\n    this.svg = d3.select(\n      document.createElementNS('http://www.w3.org/2000/svg', 'svg'),\n    );\n\n    this.draw();\n  }\n\n  componentDidUpdate() {\n    this.draw();\n  }\n\n  render() {\n    return <div className={`spark-line ${styles.sparkline}`} />;\n  }\n\n  draw() {\n    const el = findDOMNode(this);\n\n    // Remove the SVG before calculating the available space\n    // to enable the space to shrink\n    this.svg.remove();\n\n    const [width, height] = getClientSize(el);\n    this.width = width;\n    this.height = height;\n\n    this.svg.attr({ width, height });\n    el.appendChild(this.svg.node());\n\n    const data = this.props.data;\n    const max = d3.max(data);\n    const min = d3.min(data);\n    const x = d3.scale\n      .linear()\n      .domain([0, data.length - 1])\n      .range([0, this.width]);\n\n    // To avoid the thick stroke line from being cropped at\n    // the top and bottom by the SVG boundary, we need to\n    // add 2px padding at the top and bottom of the line\n    const yPadding = 2;\n\n    const y = d3.scale\n      .linear()\n      .domain([min, max])\n      .range([this.height - yPadding * 2, 0]);\n    const line = d3.svg\n      .line()\n      .x((d, i) => x(i))\n      .y(d => y(d) + yPadding);\n\n    // Remove any existing paths\n    this.svg.selectAll('path').remove();\n\n    // Add the primary line\n    this.svg.append('path').attr('d', line(data));\n  }\n}\n\nSparkLineComponent.propTypes = {\n  data: PropTypes.array,\n};\n\nexport default SparkLineComponent;\n","import SparkLine from './spark-line-component';\nexport default SparkLine;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport FramedFormattedNumber from '../../components/framed-formatted-number';\nimport { omit } from 'lodash';\n\nimport style from './number-goal-style.scss';\n\nconst isGoalReached = (value, threshold, startingValue, thresholdType) => {\n  switch (thresholdType) {\n    case 'lower':\n      return value <= threshold;\n    case 'upper':\n      return value >= threshold;\n    default:\n      return (value - startingValue) / (threshold - startingValue) >= 1;\n  }\n};\n\nconst renderProgress = (\n  value,\n  threshold,\n  startingValue,\n  thresholdType,\n  typeScale,\n  isHalfHeight,\n  trackWidth,\n) => {\n  if (thresholdType !== 'percentage') {\n    return null;\n  }\n  const offsetValue = value - startingValue;\n  const offsetThreshold = threshold - startingValue;\n  const progress = Math.floor((offsetValue / offsetThreshold) * 100);\n  const width = `${Math.max(0, Math.min(100, progress))}%`;\n\n  const trackClasses = classNames(\n    'goal-progress-bar-track', // used to round corners on `container-layout` dashboards\n    style.goalProgressBarTrack,\n  );\n\n  const progressClasses = classNames(\n    'goal-progress-bar', // used to round corners on `container-layout` dashboards\n    style.goalProgressBar,\n  );\n\n  return (\n    <div style={{ width: trackWidth }}>\n      {!isHalfHeight && (\n        <FramedFormattedNumber\n          value={progress / 100}\n          options={{ format: 'percent' }}\n          layoutClassName={style.goalProgress}\n          mainFontSize={typeScale.decrease(6).rem()}\n          secondaryFontSize={typeScale.decrease(10).rem()}\n        />\n      )}\n      <div className={trackClasses} />\n      <div\n        className={progressClasses}\n        style={{ width, backgroundSize: trackWidth }}\n      />\n    </div>\n  );\n};\n\nconst NumberGoalComponent = ({\n  threshold,\n  value,\n  format,\n  unit,\n  numberFormat,\n  thresholdType,\n  typeScale,\n  startingValue = 0,\n  isHalfHeight,\n  hideNumber,\n  width,\n}) => {\n  const reached = isGoalReached(value, threshold, startingValue, thresholdType);\n  const className = classNames('number-widget-secondary-stat', style.goal, {\n    [style.reached]: reached,\n  });\n  const goalNumberFormat = omit(numberFormat, ['abbreviation', 'precision']);\n  const thresholdClassNames = classNames(style.goalThreshold, {\n    [style.goalThresholdReached]: reached,\n  });\n\n  return (\n    <div className={className}>\n      {!hideNumber && !isHalfHeight && (\n        <FramedFormattedNumber\n          value={threshold}\n          options={{\n            format,\n            unit,\n            numberFormat: goalNumberFormat,\n          }}\n          layoutClassName={thresholdClassNames}\n          mainFontSize={typeScale.decrease(6).rem()}\n          secondaryFontSize={typeScale.decrease(10).rem()}\n        />\n      )}\n      {reached && isHalfHeight && (\n        <div\n          className={style.goalComplete}\n          style={{ fontSize: typeScale.decrease(10).rem() }}\n        />\n      )}\n      {renderProgress(\n        value,\n        threshold,\n        startingValue,\n        thresholdType,\n        typeScale,\n        isHalfHeight,\n        width,\n      )}\n    </div>\n  );\n};\n\nNumberGoalComponent.defaultProps = {\n  thresholdType: 'percentage',\n  isHalfHeight: false,\n};\n\nNumberGoalComponent.propTypes = {\n  value: PropTypes.number.isRequired,\n  width: PropTypes.number.isRequired,\n  format: PropTypes.string,\n  hideNumber: PropTypes.bool,\n  isHalfHeight: PropTypes.bool,\n  numberFormat: PropTypes.object,\n  startingValue: PropTypes.number,\n  threshold: PropTypes.number,\n  thresholdType: PropTypes.oneOf(['percentage', 'upper', 'lower']),\n  typeScale: PropTypes.object,\n  unit: PropTypes.string,\n};\n\nexport default NumberGoalComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { toString, isNil } from 'lodash';\nimport FormattedMessage, { formatMessage } from '../../lib/i18n';\nimport EditableInput from '../../components/form/editable-input/editable-component';\nimport style from './number-label-style.scss';\n\n/*\n * Returns true if the value is entirely whitespace or an empty string\n */\nconst isWhitespace = value => !isNil(value) && toString(value).trim() === '';\n\n/*\n * Default labels are only valid if they are a non-empty string\n */\nconst hasValidDefault = defaultLabel =>\n  toString(defaultLabel).trim().length > 0;\n\n/*\n * The labels can be any type for custom widgets so we\n * coerce it before attempting to .trim() it\n */\nconst formatLabel = label => toString(label).trim();\n\n/*\n * If there is a default label and the user has deleted\n * the label allow them to restore the default label\n */\nconst shouldRenderRestoreButton = (label, defaultLabel) => {\n  return hasValidDefault(defaultLabel) && isWhitespace(label);\n};\n\n/*\n * Only use the default label if it's valid and the label is null/undefined\n */\nconst getActiveLabel = (label, defaultLabel) => {\n  return isNil(label) && hasValidDefault(defaultLabel) ? defaultLabel : label;\n};\n\n/*\n * NumberLabelComponent\n *\n * Accepts a label and a default label and, based on their values\n * allows the user to either add a new label, edit an existing label\n * or restore the default label.\n *\n * The onChange event passes the new value if the user has edited\n * the label or added a new one. But if they have reverted back\n * to the default label then the value passed will be undefined.\n */\nconst NumberLabelComponent = props => {\n  const { label, defaultLabel, onChange, className, isEditable } = props;\n\n  const activeLabel = getActiveLabel(label, defaultLabel);\n  const formattedLabel = formatLabel(activeLabel);\n\n  if (!isEditable) {\n    return <span>{formattedLabel}</span>;\n  }\n\n  if (shouldRenderRestoreButton(label, defaultLabel)) {\n    const buttonClassName = classNames(style.restoreButton, className);\n\n    /*\n     * When the user restores the default label invoke onChange\n     * with an undefined value so that the custom label will be\n     * removed entirely from the widget config.\n     */\n    const handleRestoreButtonClick = () => onChange(undefined);\n\n    return (\n      <button className={buttonClassName} onClick={handleRestoreButtonClick}>\n        <FormattedMessage id=\"widget.number.label.show\" />\n      </button>\n    );\n  }\n\n  const inputClassName = classNames(style.input, className, {\n    [style.hasValue]: formattedLabel.length > 0,\n  });\n\n  return (\n    <EditableInput\n      text={formattedLabel}\n      placeholder={formatMessage('widget.number.label.add')}\n      inputClassName={inputClassName}\n      onSubmit={onChange}\n      name=\"number-label\"\n      isMultiLine\n    />\n  );\n};\n\nNumberLabelComponent.propTypes = {\n  className: PropTypes.string,\n  defaultLabel: PropTypes.any,\n  isEditable: PropTypes.bool,\n  label: PropTypes.any,\n  onChange: PropTypes.func,\n};\n\nexport { NumberLabelComponent as default, getActiveLabel };\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { toString, last, isFinite, omit, pick } from 'lodash';\nimport { layoutType } from '../prop-types';\nimport FramedFormattedNumber from '../../components/framed-formatted-number';\nimport SparkLine from '../shared/spark-line';\nimport ComparisonValue from '../shared/comparison-value';\nimport NumberGoalComponent from './number-goal-component';\nimport NumberLabel, { getActiveLabel } from './number-label-component';\nimport classNames from 'classnames';\nimport {\n  getComparisonValue,\n  isSmallDimension,\n  isMediumDimension,\n  isHalfHeight,\n} from '../helpers';\nimport typeScale from '../../lib/type-scale';\nimport { track } from '../../lib/tracker';\n\n// 52px for the maximum header height plus 15px for the padding\nconst MAX_WIDGET_HEADER_HEIGHT = 52 + 15;\n\nclass NumberVisualisationComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { stepsToFit: 0 };\n\n    this.handleLabelChange = this.handleLabelChange.bind(this);\n    this.handleComparisonLabelChange = this.handleComparisonLabelChange.bind(\n      this,\n    );\n  }\n\n  componentDidMount() {\n    this.fitText();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps() {\n    // Reset stepsToFit before every render\n    this.setState({ stepsToFit: 0 });\n  }\n\n  componentDidUpdate() {\n    // Check if text fits after every render\n    this.fitText();\n  }\n\n  handleLabelChange(value) {\n    this.props.onConfigChange({ label: value });\n    if (this.props.useTracking) {\n      track('Label edited', {\n        properties: { type: 'main' },\n      });\n    }\n  }\n\n  handleComparisonLabelChange(value) {\n    this.props.onConfigChange({ comparisonLabel: value });\n    if (this.props.useTracking) {\n      track('Label edited', {\n        properties: { type: 'comparison' },\n      });\n    }\n  }\n\n  getSizeClass() {\n    const {\n      layout: { pixels: { height } = {} },\n      style,\n    } = this.props;\n\n    if (isHalfHeight(height + MAX_WIDGET_HEADER_HEIGHT)) {\n      return style.slimline;\n    }\n\n    if (isSmallDimension(height + MAX_WIDGET_HEADER_HEIGHT)) {\n      return style.small;\n    }\n\n    if (isMediumDimension(height + MAX_WIDGET_HEADER_HEIGHT)) {\n      return style.medium;\n    }\n\n    return style.large;\n  }\n\n  getTypeScale() {\n    const { gridSize } = this.props;\n    const { pixels: { height, width } = {} } = this.props.layout;\n\n    // Increase the base type scale for the standard size grid\n    const scale = gridSize > 300 ? typeScale(12) : typeScale(10);\n\n    const smallestDimension = Math.min(\n      width,\n      height + MAX_WIDGET_HEADER_HEIGHT,\n    );\n\n    if (isHalfHeight(height + MAX_WIDGET_HEADER_HEIGHT)) {\n      return scale;\n    }\n\n    if (isSmallDimension(smallestDimension)) {\n      return scale.increase(2);\n    }\n\n    if (isMediumDimension(smallestDimension)) {\n      return scale.increase(6);\n    }\n\n    return scale.increase(10);\n  }\n\n  renderComparisonLabel() {\n    const {\n      isPreviewMode,\n      canEdit,\n      comparison: { label, defaultLabel } = {},\n      style,\n      isHorizontal,\n      isMobile,\n    } = this.props;\n\n    // Don't show label when there isn't enough space\n    if (!isMobile && this.isTiny()) return null;\n\n    const scale = this.getTypeScale();\n    const decreaseBy = isHorizontal ? 8 : 10;\n    const fontSize = scale.decrease(decreaseBy).rem();\n\n    return (\n      <div className={style.comparisonLabel} style={{ fontSize }}>\n        <NumberLabel\n          label={label}\n          defaultLabel={defaultLabel}\n          isEditable={canEdit && !isPreviewMode}\n          className={style.comparisonLabelInput}\n          onChange={this.handleComparisonLabelChange}\n        />\n      </div>\n    );\n  }\n\n  renderComparisonValue(data) {\n    const {\n      numberFormat,\n      format,\n      comparison: { type, reversed, valueOption } = {},\n      unit,\n      style,\n    } = this.props;\n    const comparisonNumberFormat = omit(numberFormat, [\n      'abbreviation',\n      'precision',\n    ]);\n    const absolute = type !== 'percentage';\n    const comparisonValue = getComparisonValue(data, { valueOption });\n    const scale = this.getTypeScale();\n\n    return (\n      <div className={style.comparisonValue}>\n        <div>\n          <ComparisonValue\n            value={last(data)}\n            comparisonValue={comparisonValue}\n            options={{ format, unit, numberFormat: comparisonNumberFormat }}\n            reversed={reversed}\n            absolute={absolute}\n            fontScale={scale.decrease(3)}\n          />\n          {this.renderComparisonLabel()}\n        </div>\n      </div>\n    );\n  }\n\n  renderSparkLine(sparklineValues) {\n    const { value, format, unit, numberFormat, style } = this.props;\n    const lastSparklineValue = last(sparklineValues);\n    const fontScale = this.getTypeScale().decrease(this.state.stepsToFit);\n    const mainFontSize = fontScale.decrease(8);\n    const secondaryFontSize = mainFontSize.decrease(4);\n\n    return (\n      <div className={style.sparkline}>\n        <SparkLine data={sparklineValues} />\n        {last(value) !== lastSparklineValue && (\n          <FramedFormattedNumber\n            value={lastSparklineValue}\n            options={{ format, unit, numberFormat }}\n            mainFontSize={mainFontSize.rem()}\n            secondaryFontSize={secondaryFontSize.rem()}\n            layoutClassName={style.sparklineValue}\n          />\n        )}\n      </div>\n    );\n  }\n\n  renderGoal(\n    threshold,\n    value,\n    startingValue,\n    thresholdType,\n    isHalfHeightWidget,\n  ) {\n    const props = pick(this.props, 'numberFormat', 'format', 'unit');\n\n    return (\n      <div className={this.props.style.goalContainer}>\n        <NumberGoalComponent\n          {...props}\n          threshold={threshold}\n          thresholdType={thresholdType}\n          startingValue={startingValue}\n          value={value}\n          typeScale={this.getTypeScale()}\n          isHalfHeight={isHalfHeightWidget}\n          hideNumber={this.shouldHideNumber()}\n          width={this.props.layout.pixels.width}\n        />\n      </div>\n    );\n  }\n\n  renderComparison() {\n    if (!this.hasValidComparison()) {\n      return null;\n    }\n\n    const {\n      comparison,\n      value,\n      threshold,\n      trendline,\n      startingValue = 0,\n      isMobile,\n      layout: { pixels: { height } = {} },\n    } = this.props;\n    const { type, thresholdType } = comparison;\n\n    const isHalfHeightWidget =\n      !isMobile && isHalfHeight(height + MAX_WIDGET_HEADER_HEIGHT);\n\n    if (isHalfHeightWidget && type !== 'goal') return null;\n\n    switch (type) {\n      case 'trendline':\n        return this.renderSparkLine(trendline);\n      case 'sparkline':\n        return this.renderSparkLine(value);\n      case 'goal':\n        return this.renderGoal(\n          threshold,\n          last(value),\n          startingValue,\n          thresholdType,\n          isHalfHeightWidget,\n        );\n      case 'number':\n      case 'percentage':\n        return this.renderComparisonValue(value);\n      default:\n        return null;\n    }\n  }\n\n  renderLegacyStringValue() {\n    const { legacyStringValue, hasLegacyStringValue, style } = this.props;\n    if (!hasLegacyStringValue) {\n      return null;\n    }\n    const { stepsToFit } = this.state;\n    const scale = this.getTypeScale();\n    const mainFontSize = scale.decrease(stepsToFit).rem();\n    return (\n      <div\n        ref={element => {\n          this.numberContainer = element;\n        }}\n        className={style.primaryStat}\n        style={{ fontSize: mainFontSize }}\n      >\n        {legacyStringValue}\n      </div>\n    );\n  }\n\n  renderPrimaryNumber() {\n    const {\n      value,\n      format,\n      unit,\n      numberFormat,\n      hasLegacyStringValue,\n      style,\n    } = this.props;\n    if (hasLegacyStringValue) {\n      return null;\n    }\n    const { stepsToFit } = this.state;\n    const scale = this.getTypeScale();\n    const mainFontSize = scale.decrease(stepsToFit).rem();\n    const secondaryFontSize = scale.decrease(stepsToFit + 4).rem();\n\n    return (\n      <div\n        ref={element => {\n          this.numberContainer = element;\n        }}\n        className={style.primaryStat}\n        style={{ fontSize: scale.rem() }}\n      >\n        <FramedFormattedNumber\n          value={last(value)}\n          options={{ format, unit, numberFormat }}\n          mainFontSize={mainFontSize}\n          secondaryFontSize={secondaryFontSize}\n          layoutClassName={style.primaryNumber}\n        />\n      </div>\n    );\n  }\n\n  renderLabel() {\n    const {\n      layout: {\n        pixels: { height },\n      },\n      isPreviewMode,\n      canEdit,\n      label,\n      defaultLabel,\n      style,\n      isMobile,\n    } = this.props;\n\n    // Don't show text when there isn't enough space\n    // that is when the widget is very short and there is a secondary visualisation\n    if (!isMobile && this.hasValidComparison() && this.isTiny()) return null;\n\n    const scale = this.getTypeScale();\n    let fontSize = scale.decrease(8).rem();\n\n    if (isHalfHeight(height + MAX_WIDGET_HEADER_HEIGHT)) {\n      fontSize = scale.decrease(6).rem();\n    }\n\n    return (\n      <div className={style.label} style={{ fontSize }}>\n        <NumberLabel\n          label={label}\n          defaultLabel={defaultLabel}\n          isEditable={canEdit && !isPreviewMode}\n          className={style.labelInput}\n          onChange={this.handleLabelChange}\n        />\n      </div>\n    );\n  }\n\n  render() {\n    const { style, isPreviewMode, isHorizontal } = this.props;\n    const numberWidgetClasses = classNames(\n      style.wrapper,\n      'number-widget v2',\n      {\n        [style.previewLayout]: isPreviewMode,\n        [style.hasComparison]: this.hasValidComparison(),\n        [style.hasGoalComparison]: this.hasGoalComparison(),\n        [style.hasHorizontalLabelSupport]: this.hasHorizontalLabelSupport(),\n        [style.hasAnyText]: this.hasAnyText(),\n        [style.horizontal]: isHorizontal,\n        [style.vertical]: !isHorizontal,\n      },\n      this.getSizeClass(),\n    );\n\n    return (\n      <div className={numberWidgetClasses}>\n        <div className={style.container}>\n          <div className={style.primaryContainer}>\n            <div className={style.primaryAlignment}>\n              {this.renderPrimaryNumber()}\n              {this.renderLegacyStringValue()}\n              {this.renderLabel()}\n            </div>\n          </div>\n          {this.renderComparison()}\n        </div>\n      </div>\n    );\n  }\n\n  fitText() {\n    const container = this.numberContainer;\n    const { stepsToFit } = this.state;\n\n    // Increase the permissible font-size decrease for the standard grid\n    // this ensures that the font-size will have the same minimum for both the standard and dense grids\n    const maxSteps = this.props.gridSize > 300 ? 5 : 3;\n\n    // Don't decrease more than max steps\n    if (stepsToFit >= maxSteps) {\n      return;\n    }\n\n    if (container.scrollWidth > container.clientWidth) {\n      this.setState({ stepsToFit: stepsToFit + 1 });\n    }\n  }\n\n  shouldHideNumber() {\n    const {\n      layout: {\n        pixels: { height, width },\n      },\n    } = this.props;\n    // Use 170 height threshold to show goal number\n    // on mobile but hide it on slimline widgets.\n    return height + MAX_WIDGET_HEADER_HEIGHT < 170 && width < 470;\n  }\n\n  isTiny() {\n    const {\n      layout: {\n        pixels: { height, width },\n      },\n    } = this.props;\n    return height + MAX_WIDGET_HEADER_HEIGHT < 470 && width < 470;\n  }\n\n  hasValidComparison() {\n    const {\n      comparison,\n      value,\n      threshold,\n      trendline,\n      hasLegacyStringValue,\n    } = this.props;\n\n    if (!comparison || !value) return false;\n\n    switch (comparison.type) {\n      case 'trendline':\n        return trendline && trendline.length >= 2;\n      case 'sparkline':\n        return value.length >= 2;\n      case 'number':\n      case 'percentage':\n        return !hasLegacyStringValue && value.length >= 2;\n      case 'goal':\n        return isFinite(threshold);\n      default:\n        return false;\n    }\n  }\n\n  hasGoalComparison() {\n    const { comparison: { type } = {} } = this.props;\n\n    return type === 'goal';\n  }\n\n  hasHorizontalLabelSupport() {\n    return !this.hasValidComparison() || this.hasGoalComparison();\n  }\n\n  hasAnyText() {\n    const { label, defaultLabel, comparison = {} } = this.props;\n\n    const activeLabel = getActiveLabel(label, defaultLabel);\n    const activeComparisonLabel = getActiveLabel(\n      comparison.label,\n      comparison.defaultLabel,\n    );\n\n    // We have either a label or comparison text to render or both\n    return !!(\n      toString(activeLabel).trim() || toString(activeComparisonLabel).trim()\n    );\n  }\n}\n\nNumberVisualisationComponent.defaultProps = {\n  isPreviewMode: false,\n  onConfigChange: () => {},\n  gridSize: 240,\n  useTracking: true,\n};\n\nNumberVisualisationComponent.propTypes = {\n  layout: layoutType.isRequired,\n  value: PropTypes.oneOfType([\n    PropTypes.number,\n    PropTypes.arrayOf(PropTypes.number),\n  ]).isRequired,\n  canEdit: PropTypes.bool,\n  comparison: PropTypes.shape({\n    defaultLabel: PropTypes.string,\n    label: PropTypes.string,\n    reversed: PropTypes.bool,\n    thresholdType: PropTypes.oneOf(['lower', 'upper', 'percentage']),\n    type: PropTypes.oneOf([\n      'goal',\n      'number',\n      'percentage',\n      'sparkline',\n      'trendline',\n    ]),\n    valueOption: PropTypes.oneOf(['nextValue', 'previousValue']),\n  }),\n  defaultLabel: PropTypes.string,\n  format: PropTypes.oneOf(['currency', 'decimal', 'duration', 'percent']),\n  gridSize: PropTypes.number,\n  hasLegacyStringValue: PropTypes.bool,\n  isHorizontal: PropTypes.bool,\n  isMobile: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n  label: PropTypes.string,\n  legacyStringValue: PropTypes.string,\n  numberFormat: PropTypes.shape({\n    abbreviation: PropTypes.oneOf(['none', 'K', 'M', 'B']),\n    precision: PropTypes.number,\n    prefix: PropTypes.string,\n    suffix: PropTypes.string,\n  }),\n  size: PropTypes.string,\n  startingValue: PropTypes.number,\n  style: PropTypes.object,\n  threshold: PropTypes.number,\n  trendline: PropTypes.arrayOf(PropTypes.number),\n  unit: PropTypes.string,\n  useTracking: PropTypes.bool,\n  onConfigChange: PropTypes.func,\n};\n\nexport default NumberVisualisationComponent;\n","import React from 'react';\nimport { layoutType } from '../prop-types';\nimport NumberVisualisationComponent from './number-component';\nimport { parseDurationInput } from '../../lib/humanise-number';\nimport { last, indexOf, isFinite } from 'lodash';\n\nimport style from './number-style.scss';\n\nconst pickThresholdState = (config, data) => {\n  const { indicators: { thresholds = [] } = {} } = config;\n  const { value, format, unit = 'milliseconds' } = data;\n\n  if (!thresholds.length) return false;\n\n  let visualisationValue = last(value);\n\n  // Transform durations into milliseconds\n  if ('duration' === format) {\n    visualisationValue = parseDurationInput(\n      { [unit]: visualisationValue },\n      'milliseconds',\n    );\n  }\n\n  if ('percent' === format) {\n    visualisationValue *= 100;\n  }\n\n  const neutralIndex = indexOf(thresholds, 'neutral');\n  const lowerThreshold = thresholds[neutralIndex - 1];\n  const upperThreshold = thresholds[neutralIndex + 1];\n\n  const meetsLowerThreshold =\n    isFinite(lowerThreshold) && visualisationValue <= lowerThreshold;\n  const meetsUpperThreshold =\n    isFinite(upperThreshold) && visualisationValue >= upperThreshold;\n\n  if (meetsLowerThreshold && meetsUpperThreshold) {\n    // If both thresholds have been hit, we're\n    // returning \"warning\" as it's taking priority\n    return 'warning';\n  }\n\n  if (meetsLowerThreshold) {\n    return thresholds[0];\n  }\n\n  if (meetsUpperThreshold) {\n    return last(thresholds);\n  }\n\n  return 'neutral';\n};\n\nconst OrientedNumberVisualisationComponent = props => {\n  const { pixels = {} } = props.layout;\n  const aspectRatio = pixels.width / pixels.height;\n  const isHorizontal = aspectRatio > 2;\n\n  return (\n    <NumberVisualisationComponent\n      {...props}\n      isHorizontal={isHorizontal}\n      style={style}\n    />\n  );\n};\nOrientedNumberVisualisationComponent.propTypes = {\n  layout: layoutType,\n};\nOrientedNumberVisualisationComponent.canRender = cfg => {\n  return !!cfg.value;\n};\nOrientedNumberVisualisationComponent.getVisualisationStatus = (\n  configuration = {},\n  data = {},\n) => {\n  switch (pickThresholdState(configuration, data)) {\n    case 'warning':\n      return 'warningThresholdReached';\n    case 'positive':\n      return 'positiveThresholdReached';\n    default:\n      return undefined;\n  }\n};\nexport default OrientedNumberVisualisationComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { noop, isUndefined } from 'lodash';\nimport classNames from 'classnames';\nimport Icon from '@UI/icon';\nimport style from './base-swatch-style.scss';\n\nconst getBackgroundColor = colorStops => {\n  const [colorFrom, colorTo] = colorStops;\n\n  if (isUndefined(colorTo)) {\n    return colorStops[0];\n  }\n\n  return `linear-gradient(to right, ${colorFrom} 50%, ${colorTo} 50%)`;\n};\n\nconst BaseSwatchComponent = ({\n  checked,\n  onClick,\n  value,\n  colorStops,\n  borderColor,\n  hoverIcon,\n  type,\n}) => {\n  const iconType = type === 'light' ? 'default' : 'light';\n  const className = classNames(style.swatch, style[type], {\n    [style.hoverBorder]: !checked && isUndefined(hoverIcon),\n  });\n\n  return (\n    <span\n      className={className}\n      role=\"radio\"\n      aria-checked={checked}\n      onClick={() => onClick(value)}\n      style={{ background: getBackgroundColor(colorStops), borderColor }}\n    >\n      {hoverIcon && (\n        <span className={style.hoverIcon}>\n          <Icon name={hoverIcon} color={iconType} />\n        </span>\n      )}\n    </span>\n  );\n};\n\nBaseSwatchComponent.propTypes = {\n  borderColor: PropTypes.string.isRequired,\n  colorStops: PropTypes.arrayOf(PropTypes.string).isRequired,\n  checked: PropTypes.bool,\n  hoverIcon: PropTypes.string,\n  type: PropTypes.oneOf(['light', 'dark']),\n  value: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nBaseSwatchComponent.defaultProps = {\n  type: 'dark',\n  checked: false,\n  onClick: noop,\n};\n\nexport default BaseSwatchComponent;\n","import BaseSwatch from './base-swatch-component';\n\nexport default BaseSwatch;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport color from 'color';\nimport BaseSwatch from './base-swatch';\n\nconst getBorderColor = type => {\n  return type === 'dark' ? 'rgba(255,255,255,0.4)' : 'rgba(0,0,0,0.4)';\n};\n\nconst SwatchComponent = props => {\n  const { colorStops, borderColor } = props;\n  const background = color(colorStops[0]);\n  const type = background.dark() ? 'dark' : 'light';\n\n  return (\n    <BaseSwatch\n      {...props}\n      type={type}\n      borderColor={borderColor || getBorderColor(type)}\n    />\n  );\n};\n\nSwatchComponent.propTypes = {\n  colorStops: PropTypes.arrayOf(PropTypes.string).isRequired,\n  borderColor: PropTypes.string,\n};\n\nexport default SwatchComponent;\n","import { getWindow } from '../lib/global';\n\nconst TOAST_KEY = 'toastMessage';\n\nconst storeToast = toast => {\n  getWindow().sessionStorage.setItem(TOAST_KEY, JSON.stringify(toast));\n};\n\nexport const loadToastFromStorage = () => {\n  // Loads any pending toast message state following a redirect\n  const window = getWindow();\n  const toast = window.sessionStorage.getItem(TOAST_KEY);\n\n  if (!toast) {\n    return undefined;\n  }\n\n  window.sessionStorage.removeItem(TOAST_KEY);\n\n  return JSON.parse(toast);\n};\n\n// scheduleToast() is exported to gecko-js\nexport const scheduleToast = toast => {\n  return storeToast(toast);\n};\n","import createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport * as dashboardActions from '../../dashboard/actions/dashboard-actions';\nimport * as dashboardService from '../../services/dashboard-service';\nimport { trackEvent } from '@Tracking';\nimport { dashboardRegeneratedSharingLink } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\n\nexport const regenerateSharingLinkStart = createAction(\n  'SharingMenu:REGENERATE_SHARING_LINK_START',\n);\nexport const regenerateSharingLinkSuccess = createAction(\n  'SharingMenu:REGENERATE_SHARING_LINK_SUCCESS',\n);\nexport const regenerateSharingLinkFailure = createErrorAction(\n  'SharingMenu:REGENERATE_SHARING_LINK_FAILURE',\n);\n\nexport const regenerateSharingLink = () => async (dispatch, getState) => {\n  try {\n    dispatch(regenerateSharingLinkStart());\n    const {\n      dashboard: {\n        dashboard: { id },\n      },\n    } = getState();\n    const {\n      sharing_hash: sharingHash,\n    } = await dashboardService.regenerateSharingLink(id);\n    dispatch(dashboardActions.setCurrentDashboardSharingLink(sharingHash));\n    dispatch(regenerateSharingLinkSuccess());\n\n    trackEvent(\n      dashboardRegeneratedSharingLink({\n        Location: LOCATIONS.DashboardShareMenu,\n      }),\n    );\n  } catch (error) {\n    dispatch(regenerateSharingLinkFailure(error));\n  }\n};\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"alert\":\"alert---3jjb4\",\"alertTitle\":\"alertTitle---wce3K\",\"alertIcon\":\"alertIcon---CW5ar\",\"alertContent\":\"alertContent---3OPVy\",\"info\":\"info---3PDF5\",\"error\":\"error---Fkp9Z\",\"warning\":\"warning---16R1X\",\"success\":\"success---3Nxwl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"instructions\":\"instructions---2_rY3\",\"image\":\"image---zCEcN\",\"iconContainer\":\"iconContainer---3bT5p\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"progressBar\":\"progressBar---2S_sQ\",\"success\":\"success---3ulC1\",\"error\":\"error---3CQAz\",\"indeterminate\":\"indeterminate---uAi6Y\",\"determinate\":\"determinate---2oi7-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toggleInput\":\"toggleInput---1STQR\",\"hideToggle\":\"hideToggle---1GjRe\",\"knob\":\"knob---33u_v\",\"text\":\"text---1iN5q\",\"label\":\"label---2mbsV\",\"title\":\"title---3ckMX\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"widgetTitle\":\"widgetTitle---gtpwb\",\"heading\":\"heading---32hER\",\"input\":\"input---30LFG\",\"small\":\"small---fr8lC\",\"tvMode\":\"tvMode---3T09O\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"planWrapper\":\"planWrapper---15cC-\",\"disabled\":\"disabled---1PgR-\",\"title\":\"title---147h3\",\"price\":\"price---3XAYS\",\"subPrice\":\"subPrice---3YkiM\",\"selectButton\":\"selectButton---k0oSx\",\"dashboardLimit\":\"dashboardLimit---1_CLX\",\"features\":\"features---2QMvI\",\"basic\":\"basic---1o11c\",\"basicPlanTick\":\"basicPlanTick---3gR2C\",\"disabledMessage\":\"disabledMessage---w5xkG\"};","import React, { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { DndProvider, createDndContext } from 'react-dnd';\nimport HTML5Backend from 'react-dnd-html5-backend';\n\nconst dndContext = createDndContext(HTML5Backend);\n\nconst DraggableContextComponent = props => {\n  const manager = useRef(dndContext);\n\n  if (!props.children) return null;\n\n  return (\n    <DndProvider manager={manager.current.dragDropManager}>\n      {props.children}\n    </DndProvider>\n  );\n};\n\nDraggableContextComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default DraggableContextComponent;\n","import DraggableContextComponent from './draggable-context-component';\nexport default DraggableContextComponent;\n","/**\n * Script loading is difficult thanks to IE. We need callbacks to fire\n * immediately following the script's execution, with no other scripts\n * running in between. If other scripts on the page are able to run\n * between our script and its callback, bad things can happen, such as\n * `jQuery.noConflict` not being called in time, resulting in plugins\n * latching onto our version of jQuery, etc.\n *\n * For IE<10 we use a relatively well-documented \"preloading\" strategy,\n * which ensures that the script is ready to execute *before* appending\n * it to the DOM. That way when it is finally appended, it is\n * executed immediately.\n *\n * References:\n * - http://www.html5rocks.com/en/tutorials/speed/script-loading/\n * - http://blog.getify.com/ie11-please-bring-real-script-preloading-back/\n * - https://github.com/jrburke/requirejs/issues/526\n * - https://connect.microsoft.com/IE/feedback/details/729164/\n *           ie10-dynamic-script-element-fires-loaded-readystate-prematurely\n */\n(function () {\n\n  // Global state.\n  var pendingScripts = {};\n  var scriptCounter = 0;\n\n  /**\n   * Insert script into the DOM\n   *\n   * @param {Object} script Script DOM object\n   * @returns {void}\n   */\n  var _addScript = function (script) {\n    // Get the first script element, we're just going to use it\n    // as a reference for where to insert ours. Do NOT try to do\n    // this just once at the top and then re-use the same script\n    // as a reference later. Some weird loaders *remove* script\n    // elements after the browser has executed their contents,\n    // so the same reference might not have a parentNode later.\n    var firstScript = document.getElementsByTagName(\"script\")[0];\n\n    // Append the script to the DOM, triggering execution.\n    firstScript.parentNode.insertBefore(script, firstScript);\n  };\n\n  /**\n   * Load Script.\n   *\n   * @param {String}            src       URI of script\n   * @param {Function|Object}   callback  (Optional) Called on script load completion,\n   *                                      or options object\n   * @param {Object}            context   (Optional) Callback context (`this`)\n   * @returns {void}\n   */\n  var _lload = function (src, callback, context) {\n    /*eslint max-statements: [2, 32]*/\n    var setup;\n\n    if (callback && typeof callback !== \"function\") {\n      context = callback.context || context;\n      setup = callback.setup;\n      callback = callback.callback;\n    }\n\n    var script = document.createElement(\"script\");\n    var done = false;\n    var err;\n    var _cleanup; // _must_ be set below.\n\n    /**\n     * Final handler for error or completion.\n     *\n     * **Note**: Will only be called _once_.\n     *\n     * @returns {void}\n     */\n    var _finish = function () {\n      // Only call once.\n      if (done) { return; }\n      done = true;\n\n      // Internal cleanup.\n      _cleanup();\n\n      // Callback.\n      if (callback) {\n        callback.call(context, err);\n      }\n    };\n\n    /**\n     * Error handler\n     *\n     * @returns {void}\n     */\n    var _error = function () {\n      err = new Error(src || \"EMPTY\");\n      _finish();\n    };\n\n    if (script.readyState && !(\"async\" in script)) {\n      /*eslint-disable consistent-return*/\n\n      // This section is only for IE<10. Some other old browsers may\n      // satisfy the above condition and enter this branch, but we don't\n      // support those browsers anyway.\n\n      var id = scriptCounter++;\n      var isReady = { loaded: true, complete: true };\n      var inserted = false;\n\n      // Clear out listeners, state.\n      _cleanup = function () {\n        script.onreadystatechange = script.onerror = null;\n        pendingScripts[id] = void 0;\n      };\n\n      // Attach the handler before setting src, otherwise we might\n      // miss events (consider that IE could fire them synchronously\n      // upon setting src, for example).\n      script.onreadystatechange = function () {\n        var firstState = script.readyState;\n\n        // Protect against any errors from state change randomness.\n        if (err) { return; }\n\n        if (!inserted && isReady[firstState]) {\n          inserted = true;\n\n          // Append to DOM.\n          _addScript(script);\n        }\n\n        // --------------------------------------------------------------------\n        //                       GLORIOUS IE8 HACKAGE!!!\n        // --------------------------------------------------------------------\n        //\n        // Oh IE8, how you disappoint. IE8 won't call `script.onerror`, so\n        // we have to resort to drastic measures.\n        // See, e.g. http://www.quirksmode.org/dom/events/error.html#t02\n        //\n        // As with all things development, there's a Stack Overflow comment that\n        // asserts the following combinations of state changes in IE8 indicate a\n        // script load error. And crazily, it seems to work!\n        //\n        // http://stackoverflow.com/a/18840568/741892\n        //\n        // The `script.readyState` transitions we're interested are:\n        //\n        // * If state starts as `loaded`\n        // * Call `script.children`, which _should_ change state to `complete`\n        // * If state is now `loading`, then **we have a load error**\n        //\n        // For the reader's amusement, here is HeadJS's catalog of various\n        // `readyState` transitions in normal operation for IE:\n        // https://github.com/headjs/headjs/blob/master/src/2.0.0/load.js#L379-L419\n        if (firstState === \"loaded\") {\n          // The act of accessing the property should change the script's\n          // `readyState`.\n          //\n          // And, oh yeah, this hack is so hacky-ish we need the following\n          // eslint disable...\n          /*eslint-disable no-unused-expressions*/\n          script.children;\n          /*eslint-enable no-unused-expressions*/\n\n          if (script.readyState === \"loading\") {\n            // State transitions indicate we've hit the load error.\n            //\n            // **Note**: We are not intending to _return_ a value, just have\n            // a shorter short-circuit code path here.\n            return _error();\n          }\n        }\n\n        // It's possible for readyState to be \"complete\" immediately\n        // after we insert (and execute) the script in the branch\n        // above. So check readyState again here and react without\n        // waiting for another onreadystatechange.\n        if (script.readyState === \"complete\") {\n          _finish();\n        }\n      };\n\n      // Onerror handler _may_ work here.\n      script.onerror = _error;\n\n      // Since we're not appending the script to the DOM yet, the\n      // reference to our script element might get garbage collected\n      // when this function ends, without onreadystatechange ever being\n      // fired. This has been witnessed to happen. Adding it to\n      // `pendingScripts` ensures this can't happen.\n      pendingScripts[id] = script;\n\n      // call the setup callback to mutate the script tag\n      if (setup) {\n        setup.call(context, script);\n      }\n\n      // This triggers a request for the script, but its contents won't\n      // be executed until we append it to the DOM.\n      script.src = src;\n\n      // In some cases, the readyState is already \"loaded\" immediately\n      // after setting src. It's a lie! Don't append to the DOM until\n      // the onreadystatechange event says so.\n\n    } else {\n      // This section is for modern browsers, including IE10+.\n\n      // Clear out listeners.\n      _cleanup = function () {\n        script.onload = script.onerror = null;\n      };\n\n      script.onerror = _error;\n      script.onload = _finish;\n      script.async = true;\n      script.charset = \"utf-8\";\n\n      // call the setup callback to mutate the script tag\n      if (setup) {\n        setup.call(context, script);\n      }\n\n      script.src = src;\n\n      // Append to DOM.\n      _addScript(script);\n    }\n  };\n\n  // UMD wrapper.\n  /*global define:false*/\n  if (typeof exports === \"object\" && typeof module === \"object\") {\n    // CommonJS\n    module.exports = _lload;\n\n  } else if (typeof define === \"function\" && define.amd) {\n    // AMD\n    define([], function () { return _lload; });\n\n  } else {\n    // VanillaJS\n    window._lload = _lload;\n  }\n}());\n","module.exports = (__webpack_require__(28))(1410);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport LineChart from './line-chart-component';\nimport seriesPresenter from '../series-presenter';\nimport { transformV1ToV2 } from './helpers';\n\nconst SeriesLines = seriesPresenter(LineChart);\nconst DecoratedLineComponent = ({ visualisation, ...props }) => {\n  const { version, type } = visualisation || {};\n  let finalProps = { visualisation, ...props };\n\n  if (type === 'line' && version === 1) {\n    finalProps = { ...finalProps, ...transformV1ToV2(finalProps) };\n  }\n  return <SeriesLines {...finalProps} />;\n};\n\nDecoratedLineComponent.canRender = SeriesLines.canRender;\nDecoratedLineComponent.propTypes = {\n  visualisation: PropTypes.object,\n};\n\nexport default DecoratedLineComponent;\n","export const transformV1ToV2 = v1Props => {\n  const { item, settings: { axisx } = {} } = v1Props;\n  const newProps = {};\n  newProps.series = [\n    {\n      data: item,\n    },\n  ];\n\n  if (axisx && axisx.length) {\n    newProps.x_axis = {\n      labels: axisx,\n    };\n  }\n\n  return newProps;\n};\n","import { getWindow } from './global';\n\nconst getSharingURL = sharingHash => {\n  const {\n    SHARING_HOST,\n    location: { protocol, host },\n  } = getWindow();\n  return `${protocol}//${SHARING_HOST || host}/dashboards/${sharingHash}`;\n};\n\nexport { getSharingURL };\n","import FuzzySearch from './fuzzy-search';\n\nexport default FuzzySearch;\n","import Fuse from 'fuse.js';\nimport { noop } from 'lodash';\n\nclass FuzzySearch extends Fuse {\n  static createFuzzySearch(list, config, overrideStringify) {\n    return new FuzzySearch(list, config, overrideStringify);\n  }\n\n  constructor(list, config, overrideStringify) {\n    super(list, config);\n\n    this.overrideStringify = overrideStringify;\n  }\n\n  search(searchTerm) {\n    // Fuse search tries to stringify results array to log it,\n    // in universal-ui we can't do this because of circular refs\n    let originalStringify;\n    if (this.overrideStringify) {\n      originalStringify = JSON.stringify;\n      JSON.stringify = noop;\n    }\n\n    const result = super.search(searchTerm);\n\n    if (this.overrideStringify) {\n      JSON.stringify = originalStringify;\n    }\n\n    return result;\n  }\n}\n\nexport default FuzzySearch;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './header-style.scss';\n\nconst HeaderComponent = ({ children }) => {\n  return <div className={styles.header}>{children}</div>;\n};\n\nHeaderComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default HeaderComponent;\n","import Header from './header-component';\n\nexport default Header;\n","import Separator from './separator-component';\n\nexport default Separator;\n","import React from 'react';\nimport styles from './separator-style.scss';\n\nconst SepartorComponent = () => <div className={styles.separator} />;\n\nexport default SepartorComponent;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { filter, isArray, isEqual, map, some } from 'lodash';\nimport Header from '../menu/header';\nimport DropItem from '../menu/drop-item';\nimport Separator from '../menu/separator';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './grouped-dropdown-styles.scss';\n\nexport const NoResultsComponent = () => (\n  <div className={style.noResultsMessage}>\n    <FormattedMessage id=\"config.dropdown.noResults\" />\n  </div>\n);\n\nclass GroupedDropdownListComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      expandedGroups: props.groupedOptions.map(() => false),\n    };\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillMount() {\n    if (this.props.canCollapse) {\n      this.setState({\n        expandedGroups: this.props.groupedOptions.map(() => false),\n      });\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    const { groupedOptions } = nextProps;\n\n    if (groupedOptions !== this.props.groupedOptions) {\n      this.setState({ expandedGroups: groupedOptions.map(() => false) });\n    }\n  }\n\n  render() {\n    const {\n      canCollapse,\n      canRenderHeader,\n      getIcon,\n      getLabel,\n      groupedOptions,\n      isSmall,\n      onClick,\n      searchValue,\n      useObjectFormat,\n      value,\n      renderNoResults,\n    } = this.props;\n\n    // If the search yields no results display an empty message\n    if (searchValue && groupedOptions.length === 0) {\n      return <li>{renderNoResults({ searchValue, onClick })}</li>;\n    }\n\n    return (\n      <div>\n        {map(groupedOptions, (group, index) => {\n          let visibleOptions = group.options;\n\n          const renderCollapsed =\n            canCollapse &&\n            !searchValue.length &&\n            some(visibleOptions, { show_expanded: true }) &&\n            !this.state.expandedGroups[index];\n\n          if (renderCollapsed) {\n            visibleOptions = filter(visibleOptions, o => !o.show_expanded);\n          }\n          const list = [];\n          if (useObjectFormat && canRenderHeader && group.name) {\n            list.push(<Header>{group.name}</Header>);\n          }\n\n          list.push(\n            ...map(visibleOptions, (item, j) => {\n              const selected = isArray(value)\n                ? some(value, v => isEqual(v, item))\n                : isEqual(value, item);\n\n              return (\n                <DropItem\n                  key={`${index}.${j}`}\n                  noPadding\n                  onClick={() => onClick(item)}\n                  selected={selected}\n                  color=\"white\"\n                  hasLeftIcon\n                  isSmall={isSmall}\n                  layoutClassName={style.dropItem}\n                  innerClassName={style.innerWrapper}\n                  innerIconClassName={style.innerIcon}\n                  getIcon={() => getIcon && getIcon(item)}\n                >\n                  {getLabel(item)}\n                </DropItem>\n              );\n            }),\n          );\n\n          if (renderCollapsed) {\n            list.push(\n              <div\n                className={style.showMore}\n                onClick={() => {\n                  const expandedGroups = [...this.state.expandedGroups];\n                  expandedGroups[index] = true;\n                  this.setState({ expandedGroups });\n                }}\n              >\n                <FormattedMessage id=\"groupedDropdown.showMore\" />\n              </div>,\n            );\n          }\n\n          if (index < groupedOptions.length - 1) {\n            list.push(<Separator key={index} />);\n          }\n\n          return list;\n        })}\n      </div>\n    );\n  }\n}\n\nGroupedDropdownListComponent.NoResultsComponent = NoResultsComponent;\n\nGroupedDropdownListComponent.defaultProps = {\n  searchValue: '',\n  renderNoResults: props => (\n    <GroupedDropdownListComponent.NoResultsComponent {...props} />\n  ),\n};\n\nGroupedDropdownListComponent.propTypes = {\n  canCollapse: PropTypes.bool,\n  canRenderHeader: PropTypes.bool,\n  getIcon: PropTypes.func,\n  getLabel: PropTypes.func,\n  groupedOptions: PropTypes.array,\n  isSmall: PropTypes.bool,\n  renderNoResults: PropTypes.func,\n  searchValue: PropTypes.string,\n  useObjectFormat: PropTypes.bool,\n  value: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  onClick: PropTypes.func,\n};\n\nexport default GroupedDropdownListComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classnames from 'classnames';\nimport { chain, isEqual } from 'lodash';\nimport FuzzySearch from '../../lib/fuzzy-search';\nimport DropMenu from '../menu/drop-menu';\nimport DropMenuSelectLabel from '../menu/drop-menu-select-label';\nimport GroupedDropdownList from './grouped-dropdown-list-component';\n\nimport style from './grouped-dropdown-styles.scss';\n\nclass GroupedDropdownComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      searchValue: '',\n      filteredOptions: [],\n      fuzzySearches: [],\n      open: false,\n    };\n\n    this.handleSearch = this.handleSearch.bind(this);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillMount() {\n    this.createFuzzySearch(this.props);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    const { canSearch, options, searchKeys } = nextProps;\n\n    // Create fuzzy search when we can search and either\n    // canSearch, options or searchKeys props have changed\n    if (\n      canSearch &&\n      (canSearch !== this.props.canSearch ||\n        options !== this.props.options ||\n        searchKeys !== this.props.searchKeys)\n    ) {\n      this.createFuzzySearch(nextProps);\n    }\n  }\n\n  handleSearch(value) {\n    this.setState({ searchValue: value });\n    this.searchDropdown(value);\n  }\n\n  renderDropMenuContent() {\n    const {\n      canCollapse,\n      canRenderHeader,\n      getIcon,\n      getLabel,\n      isSmall,\n      onChange,\n      options,\n      renderDropMenuContent,\n      useObjectFormat,\n      value,\n      renderNoResults,\n    } = this.props;\n    const { filteredOptions, searchValue } = this.state;\n\n    // If we're searching, show filtered options otherwise all options\n    let optionsToShow = searchValue ? filteredOptions : options;\n    optionsToShow = chain(optionsToShow)\n      .map(opts => ({\n        ...opts,\n        options: useObjectFormat ? opts.options : opts,\n      }))\n      .filter(g => g.options.length)\n      .value();\n\n    if (renderDropMenuContent) {\n      return ({ closeMenu, open }) =>\n        renderDropMenuContent({\n          groupedOptions: optionsToShow,\n          onSearch: this.handleSearch,\n          searchValue,\n          closeMenu,\n          onChange,\n          value,\n          open,\n        });\n    }\n\n    return (\n      <GroupedDropdownList\n        searchValue={searchValue}\n        canCollapse={canCollapse}\n        canRenderHeader={canRenderHeader}\n        getIcon={getIcon}\n        getLabel={getLabel}\n        groupedOptions={optionsToShow}\n        isSmall={isSmall}\n        renderNoResults={renderNoResults}\n        onClick={(closeMenu, item) => {\n          const selected = isEqual(value, item);\n          !selected && onChange(item);\n          closeMenu();\n        }}\n        useObjectFormat={useObjectFormat}\n        value={value}\n      />\n    );\n  }\n\n  render() {\n    const {\n      value,\n      dropdownType,\n      isAnchored,\n      canSearch,\n      canRenderUpwards,\n      layoutClassName,\n      listClassName,\n      getLabel,\n      getMenuLabel,\n      fuzzySearchConfig,\n      renderSearchInput,\n      renderDropMenuLabel,\n    } = this.props;\n    const { searchValue } = this.state;\n\n    const listClasses = classnames(style.list, {\n      [listClassName]: listClassName,\n    });\n\n    return (\n      <DropMenu\n        label={\n          renderDropMenuLabel ? (\n            renderDropMenuLabel\n          ) : (\n            <DropMenuSelectLabel type={dropdownType}>\n              <span className={style.menuLabel}>\n                {getMenuLabel ? getMenuLabel(value) : getLabel(value)}\n              </span>\n            </DropMenuSelectLabel>\n          )\n        }\n        origin={canRenderUpwards ? 'auto' : 'bottom left'}\n        isAnchored={isAnchored}\n        animate={false}\n        hasHover={false}\n        autoClose={false}\n        layoutClassName={layoutClassName ? layoutClassName : style.dropMenu}\n        listClassName={listClasses}\n        onClose={() => {\n          this.setState({ searchValue: '' });\n        }}\n        renderSearchInput={() => {\n          if (!canSearch || !renderSearchInput) return null;\n\n          return renderSearchInput({\n            search: this.handleSearch,\n            value: searchValue,\n            maxLength: fuzzySearchConfig.maxPatternLength,\n          });\n        }}\n      >\n        {this.renderDropMenuContent()}\n      </DropMenu>\n    );\n  }\n\n  createFuzzySearch(props) {\n    const {\n      canSearch,\n      options,\n      searchKeys,\n      fuzzySearchConfig,\n      useObjectFormat,\n    } = props;\n    if (!canSearch) return;\n\n    const fuzzySearches = options.map(optionGroup => {\n      const opts = useObjectFormat ? optionGroup.options : optionGroup;\n      return FuzzySearch.createFuzzySearch(\n        opts,\n        {\n          ...fuzzySearchConfig,\n          keys: searchKeys,\n        },\n        true,\n      );\n    });\n\n    this.setState({\n      fuzzySearches,\n    });\n\n    this.searchDropdown(this.state.searchValue, fuzzySearches);\n  }\n\n  searchDropdown(searchValue, fuzz) {\n    const fuzzySearches = fuzz || this.state.fuzzySearches;\n\n    const filteredOptions = fuzzySearches.map((fuzzySearch, i) => {\n      const res = fuzzySearch.search(searchValue);\n      if (this.props.useObjectFormat) {\n        return {\n          ...this.props.options[i],\n          options: res,\n        };\n      }\n      return res;\n    });\n\n    this.setState({\n      filteredOptions,\n    });\n  }\n}\n\nGroupedDropdownComponent.defaultProps = {\n  options: [],\n  searchKeys: ['name'],\n  dropdownType: 'standard-dropdown',\n  listClassName: '',\n  isAnchored: false,\n  alignSelected: false,\n  isSmall: false,\n  canSearch: false,\n  canRenderHeader: false,\n  canRenderUpwards: true,\n  useObjectFormat: false,\n  fuzzySearchConfig: {\n    shouldSort: true,\n    threshold: 0.3,\n    location: 0,\n    distance: 50,\n    maxPatternLength: 32,\n    minMatchCharLength: 1,\n  },\n};\n\nGroupedDropdownComponent.propTypes = {\n  getLabel: PropTypes.func.isRequired,\n  onChange: PropTypes.func.isRequired,\n  alignSelected: PropTypes.bool,\n  canCollapse: PropTypes.bool,\n  canRenderHeader: PropTypes.bool,\n  canRenderUpwards: PropTypes.bool,\n  canSearch: PropTypes.bool,\n  dropdownType: PropTypes.string,\n  fuzzySearchConfig: PropTypes.object,\n  getIcon: PropTypes.func,\n  getMenuLabel: PropTypes.func,\n  isAnchored: PropTypes.bool,\n  isSmall: PropTypes.bool,\n  layoutClassName: PropTypes.string,\n  listClassName: PropTypes.string,\n  options: PropTypes.arrayOf(\n    PropTypes.oneOfType([\n      PropTypes.arrayOf(PropTypes.object),\n      PropTypes.shape({\n        name: PropTypes.string,\n        options: PropTypes.arrayOf(PropTypes.object),\n      }),\n    ]),\n  ),\n  renderDropMenuContent: PropTypes.func,\n  renderDropMenuLabel: PropTypes.func,\n  renderNoResults: PropTypes.func,\n  renderSearchInput: PropTypes.func,\n  searchKeys: PropTypes.arrayOf(PropTypes.string),\n  useObjectFormat: PropTypes.bool,\n  value: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n};\n\nexport default GroupedDropdownComponent;\n","import GroupedDropdown from './grouped-dropdown-component';\n\nexport default GroupedDropdown;\n","import { findDOMNode } from 'react-dom';\n\nfunction dispatchEvent(element, name, detail) {\n  const event = document.createEvent('CustomEvent');\n\n  event.initCustomEvent(name, true, false, detail);\n  findDOMNode(element).dispatchEvent(event);\n}\n\nexport { dispatchEvent };\n","import React, { Component } from 'react';\nimport { bindAll } from 'lodash';\n\nconst collectParents = (domNode, memo = []) => {\n  if (!domNode) {\n    return memo;\n  }\n\n  return collectParents(domNode.parentNode, [...memo, domNode]);\n};\n\nconst collectScrollingParents = domLeaf => {\n  return collectParents(domLeaf).filter(node => {\n    return node.scrollHeight > node.clientHeight || node === document;\n  });\n};\n\nfunction tooltip(DecoratedComponent) {\n  const displayName =\n    DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n  class Tooltip extends Component {\n    static get displayName() {\n      return `tooltip(${displayName})`;\n    }\n\n    constructor(props) {\n      super(props);\n      this._scrollingParents = [];\n      this.state = {\n        isVisible: false,\n      };\n      bindAll(this, 'handleToggle', 'handleClose', 'close');\n    }\n\n    componentWillUnmount() {\n      this.cleanUp();\n    }\n\n    handleClose(evt) {\n      if (evt.target.matches('a')) {\n        return;\n      }\n      this.close();\n    }\n\n    handleToggle(state, evt) {\n      evt.preventDefault();\n      evt.stopPropagation();\n\n      if (!state) {\n        this.close();\n        return;\n      }\n\n      const {\n        top,\n        left,\n        height,\n        width,\n      } = evt.currentTarget.getBoundingClientRect();\n\n      this.setState({\n        targetPosition: {\n          top,\n          left,\n          height: 0,\n          width,\n        },\n        left: left + width / 2,\n        top: top + height / 2,\n        isVisible: true,\n      });\n\n      // Ensure that event listeners are only registered once\n      this.cleanUp();\n\n      // We listen for click, focus and scroll to remove the bubble\n      document.addEventListener('click', this.handleClose);\n      document.addEventListener('focus', this.handleClose, true);\n      this._scrollingParents = collectScrollingParents(evt.target);\n\n      // Close the help bubble whenever we start scrolling\n      this._scrollingParents.forEach(domNode => {\n        domNode.addEventListener('scroll', this.close);\n      });\n    }\n\n    render() {\n      const props = {\n        ...this.props,\n        toggleTooltip: this.handleToggle,\n      };\n\n      return <DecoratedComponent {...props} {...this.state} />;\n    }\n\n    close() {\n      this.setState({\n        isVisible: false,\n      });\n      this.cleanUp();\n    }\n\n    cleanUp() {\n      document.removeEventListener('click', this.handleClose);\n      document.removeEventListener('focus', this.handleClose, true);\n      this._scrollingParents.forEach(domNode => {\n        domNode.removeEventListener('scroll', this.close);\n      });\n    }\n  }\n\n  return Tooltip;\n}\n\nexport default tooltip;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport styles from './drop-menu-select-label-style.scss';\n\nconst DropMenuSelectLabelComponent = ({ children, type }) => {\n  return (\n    <div\n      className={classNames(styles.label, styles[type])}\n      data-acc-id=\"drop-menu-select-label\"\n    >\n      {children}\n    </div>\n  );\n};\n\nDropMenuSelectLabelComponent.defaultProps = {\n  type: 'light',\n};\n\nDropMenuSelectLabelComponent.propTypes = {\n  children: PropTypes.node,\n  type: PropTypes.oneOf([\n    'dark',\n    'light',\n    'hover-transparent',\n    'standard-dropdown',\n    'small-dropdown',\n  ]),\n};\n\nexport default DropMenuSelectLabelComponent;\n","import DropMenuSelectLabel from './drop-menu-select-label-component';\n\nexport default DropMenuSelectLabel;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { noop } from 'lodash';\nimport Modal, { ModalSection, ModalHeading, ModalText } from '../modal';\nimport { Row, Column } from '../layout';\nimport Button from '@UI/button';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './confirm-modal-style.scss';\n\nconst ConfirmModalComponent = ({\n  visible,\n  loading,\n  heading,\n  confirmButtonLabel,\n  isNegative,\n  onClose,\n  onConfirm,\n  children,\n}) => {\n  // FIXME There seems to be an issue with the visible prop not\n  // getting updated immideately after a callback trigger an\n  // action. It's probably due to CSS transitions\n  // if you want to prevent a callbakc then any connector\n  // wrapping this component should have correct props/state\n  return (\n    <Modal visible={visible} onClose={onClose}>\n      <ModalSection>\n        <div className={style.confirmModal}>\n          <ModalHeading>{heading}</ModalHeading>\n          <ModalText>{children}</ModalText>\n          <Row marginTop={2} justify=\"flex-end\">\n            <Column>\n              <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n                <FormattedMessage id=\"button.cancel\" />\n              </Button>\n            </Column>\n            <Column marginLeft={1}>\n              <Button\n                type={Button.TYPES.SUBMIT}\n                onClick={onConfirm}\n                loading={loading}\n                intent={\n                  isNegative ? Button.INTENT.NEGATIVE : Button.INTENT.PRIMARY\n                }\n              >\n                {confirmButtonLabel}\n              </Button>\n            </Column>\n          </Row>\n        </div>\n      </ModalSection>\n    </Modal>\n  );\n};\n\nConfirmModalComponent.propTypes = {\n  children: PropTypes.node.isRequired,\n  confirmButtonLabel: PropTypes.node.isRequired,\n  heading: PropTypes.node.isRequired,\n  onClose: PropTypes.func.isRequired,\n  onConfirm: PropTypes.func.isRequired,\n  isNegative: PropTypes.bool,\n  loading: PropTypes.bool,\n  visible: PropTypes.bool,\n};\n\nConfirmModalComponent.defaultProps = {\n  isNegative: false,\n  onClose: noop,\n  onConfirm: noop,\n};\n\nexport default ConfirmModalComponent;\n","import React, { Component } from 'react';\nimport { history } from '../router';\n\nconst connectToHistory = mapHistoryToProps => DecoratedComponent => {\n  const displayName =\n    DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n  class HistoryConnector extends Component {\n    static get displayName() {\n      return `connectToHistory(${displayName})`;\n    }\n\n    constructor(props) {\n      super(props);\n      this.handleHistoryChanged = this.handleHistoryChanged.bind(this);\n      this.state = mapHistoryToProps(history.location);\n    }\n\n    componentDidMount() {\n      this.unlisten = history.listen(this.handleHistoryChanged);\n    }\n\n    componentWillUnmount() {\n      this.unlisten();\n    }\n\n    handleHistoryChanged(location) {\n      this.setState(mapHistoryToProps(location));\n    }\n\n    render() {\n      return <DecoratedComponent {...this.props} {...this.state} />;\n    }\n  }\n\n  return HistoryConnector;\n};\n\nexport default connectToHistory;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport d3 from 'd3';\nimport hsl from 'hsl-to-hex';\nimport { isUndefined, zipWith, chain } from 'lodash';\n\nimport style from './pie-chart-style.scss';\n\nconst SMALL_LEGEND_WIDTH = 110;\nconst BIG_LEGEND_WIDTH = 140;\n\nconst pieColours = () => {\n  const HUE = 202;\n  const SATURATION = 78;\n  const LUMINOCITY = 35;\n\n  return i => {\n    let l = LUMINOCITY + 5 * i;\n    if (l > 100) {\n      l = LUMINOCITY;\n    }\n    return hsl(HUE, SATURATION, l);\n  };\n};\n\nconst PieSlice = ({ value, fill, innerRadius = 0, outerRadius }) => {\n  const arc = d3.svg\n    .arc()\n    .outerRadius(outerRadius)\n    .innerRadius(innerRadius);\n  const y2 = Math.sin(value.startAngle - Math.PI / 2) * outerRadius;\n  const x2 = Math.cos(value.startAngle - Math.PI / 2) * outerRadius;\n\n  return (\n    <g>\n      <path d={arc(value)} fill={fill} />,\n      <line x1={0} y1={0} x2={x2} y2={y2} className={style.arc} />\n    </g>\n  );\n};\n\nPieSlice.propTypes = {\n  fill: PropTypes.string,\n  innerRadius: PropTypes.number,\n  outerRadius: PropTypes.number,\n  value: PropTypes.object,\n};\n\nconst PieChartComponent = props => {\n  const {\n    data,\n    layout: { pixels: { width: originalWidth, height } = {} },\n  } = props;\n  // Get the length of the labels\n  const labelLengths = chain(data)\n    .map(item => item.label && item.label.length)\n    .mean()\n    .value();\n  const legendWidth = labelLengths >= 7 ? BIG_LEGEND_WIDTH : SMALL_LEGEND_WIDTH;\n  const width = originalWidth - legendWidth;\n\n  const colorScale = pieColours();\n  const pie = d3.layout.pie().value(item => item.value);\n  const radius = Math.min(width, height) / 2;\n  const diameter = radius * 2;\n\n  // Sort data so that biggest slice is first\n  const sortedData = [...data].sort((a, b) => b.value - a.value);\n  // Get pie angles from d3\n  const sliceData = pie(sortedData);\n  // Add all information together\n  const dataWithSlice = zipWith(sortedData, sliceData, (a, b) => ({\n    ...a,\n    sliceData: b,\n  }));\n\n  const pieData = dataWithSlice.map((item, i) => {\n    const color = !isUndefined(item.color) ? item.color : colorScale(i);\n    return { index: i, color, label: item.label, sliceData: item.sliceData };\n  });\n\n  return (\n    <div className={style.pie}>\n      <div className={style.chart}>\n        <svg width={diameter} height={diameter}>\n          <g transform={`translate(${radius}, ${radius})`}>\n            {pieData.map(item => (\n              <PieSlice\n                key={`${item.index}-${item.label}`}\n                value={item.sliceData}\n                fill={item.color}\n                outerRadius={radius}\n              />\n            ))}\n          </g>\n        </svg>\n      </div>\n      <div style={{ width: legendWidth }} className={style.legend}>\n        <ul className={style.legendList}>\n          {pieData.map((item, key) => (\n            <li key={`${key}-${item.label}`} className={style.label}>\n              <div\n                className={style.pill}\n                style={{ backgroundColor: item.color }}\n              />\n              <div className={style.text}>{item.label}</div>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nPieChartComponent.propTypes = {\n  data: PropTypes.arrayOf(\n    PropTypes.shape({\n      color: PropTypes.string,\n      label: PropTypes.string,\n      value: PropTypes.number,\n    }),\n  ),\n  layout: PropTypes.object,\n};\nPieChartComponent.defaultProps = {\n  data: [],\n  layout: {},\n};\n\nexport { PieChartComponent as default, PieSlice };\n","module.exports = (__webpack_require__(28))(1304);","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getWindow } from '../../lib/global';\nimport { get, isUndefined, isNull } from 'lodash';\n\nclass PricingGateProvider extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    const { name, userId } = props;\n\n    this.state = {\n      dismissed: !!getWindow().localStorage.getItem(\n        `${userId}-featureGate-${name}`,\n      ),\n    };\n  }\n\n  render() {\n    const {\n      shouldRender,\n      children,\n      name,\n      allowances,\n      usages,\n      trialist,\n      userId,\n      allowance: allowancePath,\n      usage: usagePath,\n    } = this.props;\n\n    if (!shouldRender) {\n      return null;\n    }\n\n    const allowance = get(allowances, allowancePath);\n    const usage = get(usages, usagePath);\n\n    // User is allowed to perform the action in these circumstances:\n    // 1. There is no usage involved, and the allowance is `true`\n    // 2. There is a usage involved, but it is less than the allowed amount\n\n    // If the user is a trialist, they are always shown the feature gate unless\n    // it's a \"quota\" gate (ie. users, screens), in which case they are never shown it\n    const allowed =\n      (trialist && this.state.dismissed) ||\n      (!isUndefined(usage) && trialist) ||\n      (!trialist && isUndefined(usage) && !!allowance) ||\n      isNull(allowance) ||\n      (!isUndefined(usage) && usage < allowance);\n\n    const onDismiss = () => {\n      getWindow().localStorage.setItem(`${userId}-featureGate-${name}`, true);\n      this.setState({ dismissed: true });\n    };\n\n    return children({ allowed, trialist, onDismiss });\n  }\n}\n\nPricingGateProvider.propTypes = {\n  allowance: PropTypes.string,\n  allowances: PropTypes.object,\n  children: PropTypes.func,\n  name: PropTypes.string,\n  shouldRender: PropTypes.bool,\n  trialist: PropTypes.bool,\n  usage: PropTypes.string,\n  usages: PropTypes.object,\n  userId: PropTypes.number,\n};\n\nexport default PricingGateProvider;\n","import { connect } from 'react-redux';\nimport { includes } from 'lodash';\nimport PricingGateProvider from './pricing-gate-component';\n\nconst mapStateToProps = state => {\n  const {\n    user: {\n      user: { id: userId, features = [], trialist } = {},\n      organization: {\n        id: organizationId,\n        allowances: allowancesFromState = {},\n        usages: usagesFromState = {},\n      } = {},\n    } = {},\n    manageScreens: { devices = [] } = {},\n  } = state;\n\n  if (!organizationId) {\n    return { shouldRender: false };\n  }\n\n  // Unfortunately the \"screens\" usage is not stored in the normal place, as the API\n  // endpoint doesn't return it. We have to merge it in here ourselves, for now.\n  const usages = { ...usagesFromState, screens: devices.length };\n\n  // Another special case with \"screens\", users with the \"add_screens_to_legacy_plan\"\n  // feature flag should have unlimited screens\n  const forceUnlimitedScreens = includes(\n    features,\n    'add_screens_to_legacy_plan',\n  );\n\n  // We want to be able to force-enable the Database integration with a feature flag\n  const forceDatabaseIntegrationAllowed = includes(\n    features,\n    'ff:forceAllowDatabaseIntegration',\n  );\n\n  const allowances = {\n    ...allowancesFromState,\n    max_screens: forceUnlimitedScreens ? null : allowancesFromState.max_screens,\n    database_integration:\n      forceDatabaseIntegrationAllowed ||\n      allowancesFromState.database_integration,\n  };\n\n  return { shouldRender: true, allowances, usages, trialist, userId };\n};\n\nexport default connect(mapStateToProps)(PricingGateProvider);\n","import PricingGateProvider from './pricing-gate-provider';\nexport default PricingGateProvider;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"MarketingButton\":\"MarketingButton---2a_JR\",\"intent-primary\":\"intent-primary---pGAHA\",\"intent-secondary\":\"intent-secondary---1hwJE\",\"stretched\":\"stretched---3CcUK\",\"size-extra-small\":\"size-extra-small---3-iOq\",\"spinner\":\"spinner---2Zhe7\",\"size-small\":\"size-small---3wKKx\",\"size-medium\":\"size-medium---2HIHa\",\"size-large\":\"size-large---351pW\",\"loading\":\"loading---27LgN\",\"icon\":\"icon---3akjB\",\"iconNoChildren\":\"iconNoChildren---18m5H\",\"spinnerContainer\":\"spinnerContainer---2F4Uc\",\"spinnerTransition\":\"spinnerTransition---zy3CG\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"separator\":\"separator---1tQe6\",\"inputTitle\":\"inputTitle---2dKXm\",\"dropdown\":\"dropdown---2um7P\",\"postTimeSection\":\"postTimeSection---1Tuf2\",\"postTimeDropdown\":\"postTimeDropdown---2xq_N\",\"postTimeTimezone\":\"postTimeTimezone---2oxYe\",\"buttons\":\"buttons---gxlZR\",\"removeButton\":\"removeButton---xw8R2\",\"error\":\"error---7y5C_\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './label-style.scss';\n\nconst LabelComponent = ({ children }) => (\n  <label className={styles.label}>{children}</label>\n);\n\nLabelComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default LabelComponent;\n","import Label from './label-component';\n\nexport default Label;\n","import MessageFormat from 'intl-messageformat';\nimport { isUndefined } from 'lodash';\nimport Content from '../../../content/default.json';\n\nconst formatMessage = (key, values, content = Content) => {\n  const item = content[key];\n  if (isUndefined(item)) {\n    return key;\n  }\n\n  const message = new MessageFormat(item, 'en');\n  return message.format(values);\n};\n\nexport { formatMessage };\n","import moment from 'moment';\nimport { findIndex } from 'lodash';\nimport { TIMESPAN_OPERATORS } from '../../universal-config/ui-field-options';\n\nexport const QUARTER_HINTS = [\n  '1st Jan - 31st Mar',\n  '1st Apr - 30th Jun',\n  '1st Jul - 30th Sep',\n  '1st Oct - 31st Dec',\n];\n\nconst Q4 = 10;\nconst Q3 = 7;\nconst Q2 = 4;\nconst Q1 = 1;\n\nexport const getQuarter = currentDate => {\n  // +1 because Jan is 0\n  const currentMonth = currentDate.getMonth() + 1;\n\n  // we use find with an array of the first month for each quarter and look for\n  // the first value that is greater or equal\n  const quarter = findIndex([Q4, Q3, Q2, Q1], value => currentMonth >= value);\n\n  // and reverse to get quarter number\n  return 4 - quarter - 1;\n};\n\nexport const getTimespanLabel = (unit, quantity) => {\n  switch (unit) {\n    case 'hour':\n      if (quantity === 1) return 'This hour';\n      return `Past ${quantity} hours`;\n    case 'day':\n      if (quantity === 1) return 'Today';\n      return `Past ${quantity} days`;\n    case 'week':\n      if (quantity === 1) return 'This week';\n      return `Past ${quantity} weeks`;\n    case 'month':\n      if (quantity === 1) return 'This month';\n      return `Past ${quantity} months`;\n    case 'quarter':\n      if (quantity === 1) return 'This quarter';\n      return `Past ${quantity} quarters`;\n    case 'year':\n      if (quantity === 1) return 'This year';\n      return `Past ${quantity} years`;\n    default:\n      return 'All time';\n  }\n};\n\nexport const getTimespanComparisonLabel = (unit, quantity, operator) => {\n  if (operator === TIMESPAN_OPERATORS.PREV_SAME_TIMESPAN) {\n    switch (unit) {\n      case 'day':\n        return 'same day last week';\n      case 'month':\n        return 'same month last year';\n      case 'quarter':\n        return 'same quarter last year';\n      default:\n        return null;\n    }\n  }\n\n  switch (unit) {\n    case 'hour':\n      if (quantity === 1) return 'previous hour';\n      return `previous ${quantity} hours`;\n    case 'day':\n      if (quantity === 1) return 'yesterday';\n      return `previous ${quantity} days`;\n    case 'week':\n      if (quantity === 1) return 'last week';\n      return `previous ${quantity} weeks`;\n    case 'month':\n      if (quantity === 1) return 'last month';\n      return `previous ${quantity} months`;\n    case 'quarter':\n      if (quantity === 1) return 'previous quarter';\n      return `previous ${quantity} quarters`;\n    case 'year':\n      if (quantity === 1) return 'last year';\n      return `previous ${quantity} years`;\n    default:\n      return 'All time';\n  }\n};\n\nexport const getTimespanHint = (unit, quantity) => {\n  switch (unit) {\n    case 'day':\n      if (quantity === 1) return moment().format('dddd');\n      return `Since ${moment()\n        .subtract(quantity - 1, 'days')\n        .format('ddd D MMM')}`;\n    case 'week':\n      if (quantity === 1) return 'Mon - Sun';\n      return `Since ${moment()\n        .startOf('week')\n        .subtract(quantity - 1, 'weeks')\n        .add(1, 'day') // moment weeks start on sunday (we start on monday)\n        .format('ddd D MMM')}`;\n    case 'month':\n      if (quantity === 1) return moment().format('MMMM');\n\n      return `${moment()\n        .subtract(quantity - 1, 'months')\n        .format('MMMM')} - ${moment().format('MMMM')}`;\n    case 'quarter':\n      if (quantity === 1) return QUARTER_HINTS[getQuarter(new Date())];\n      return `Q${moment()\n        .subtract(quantity - 1, 'quarters')\n        .format('Q YYYY')} - Q${moment().format('Q YYYY')}`;\n    case 'year':\n      return `Since 1st January ${moment()\n        .subtract(quantity - 1, 'years')\n        .format('YYYY')}`;\n    default:\n      return '';\n  }\n};\n","module.exports = (__webpack_require__(28))(1112);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"capitalize\", {\n  enumerable: true,\n  get: function get() {\n    return _capitalize.default;\n  }\n});\nObject.defineProperty(exports, \"isNode\", {\n  enumerable: true,\n  get: function get() {\n    return _isNode.default;\n  }\n});\nObject.defineProperty(exports, \"isReactNative\", {\n  enumerable: true,\n  get: function get() {\n    return _isReactNative.default;\n  }\n});\nObject.defineProperty(exports, \"isWindows\", {\n  enumerable: true,\n  get: function get() {\n    return _isWindows.default;\n  }\n});\nObject.defineProperty(exports, \"makeArrayOfLength\", {\n  enumerable: true,\n  get: function get() {\n    return _makeArrayOfLength.default;\n  }\n});\nObject.defineProperty(exports, \"makeArrayOfStrings\", {\n  enumerable: true,\n  get: function get() {\n    return _makeArrayOfStrings.default;\n  }\n});\n\nvar _capitalize = _interopRequireDefault(require(\"./capitalize\"));\n\nvar _isNode = _interopRequireDefault(require(\"./isNode\"));\n\nvar _isReactNative = _interopRequireDefault(require(\"./isReactNative\"));\n\nvar _isWindows = _interopRequireDefault(require(\"./isWindows\"));\n\nvar _makeArrayOfLength = _interopRequireDefault(require(\"./makeArrayOfLength\"));\n\nvar _makeArrayOfStrings = _interopRequireDefault(require(\"./makeArrayOfStrings\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNhcGl0YWxpemUgZnJvbSBcIi4vY2FwaXRhbGl6ZVwiO1xyXG5pbXBvcnQgaXNOb2RlIGZyb20gXCIuL2lzTm9kZVwiO1xyXG5pbXBvcnQgaXNSZWFjdE5hdGl2ZSBmcm9tIFwiLi9pc1JlYWN0TmF0aXZlXCI7XHJcbmltcG9ydCBpc1dpbmRvd3MgZnJvbSBcIi4vaXNXaW5kb3dzXCI7XHJcbmltcG9ydCBtYWtlQXJyYXlPZkxlbmd0aCBmcm9tIFwiLi9tYWtlQXJyYXlPZkxlbmd0aFwiO1xyXG5pbXBvcnQgbWFrZUFycmF5T2ZTdHJpbmdzIGZyb20gXCIuL21ha2VBcnJheU9mU3RyaW5nc1wiO1xyXG5cclxuZXhwb3J0IHtcclxuICBjYXBpdGFsaXplLFxyXG4gIGlzTm9kZSxcclxuICBpc1JlYWN0TmF0aXZlLFxyXG4gIGlzV2luZG93cyxcclxuICBtYWtlQXJyYXlPZkxlbmd0aCxcclxuICBtYWtlQXJyYXlPZlN0cmluZ3MsXHJcbn07XHJcbiJdfQ==","module.exports = (__webpack_require__(28))(1408);","import { hasDisabledSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\nimport { merge } from 'lodash';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'line',\n    hasHeader: true,\n    goal: undefined,\n  };\n};\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst configMappingRules = {\n  column: [\n    ['series', (newValue, lastValue = []) => merge(lastValue, newValue)],\n    'xAxis',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n    'dataRange',\n  ],\n  number: [\n    ['value', (value, series) => series || [value], 'series'],\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  text: [['value', (value, series) => series || [value], 'series']],\n  leaderboard: [\n    [\n      'values',\n      (newValue, lastValue = []) =>\n        newValue ? merge(lastValue, [newValue]) : undefined,\n      'series',\n    ],\n    ['labels', null, 'xAxis'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  geckometer: [\n    [\n      'value',\n      (newValue, lastValue = []) => merge(lastValue, [newValue]),\n      'series',\n    ],\n    ['min', min => (min ? min.value : undefined), 'minYAxis'], // eslint-disable-line no-confusing-arrow\n    ['max', max => (max ? max.value : undefined), 'maxYAxis'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n  ],\n  bar: [\n    ['series', (newValue, lastValue = []) => merge(lastValue, newValue)],\n    'xAxis',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  table: [\n    ['columns', ([value] = []) => value, 'xAxis'],\n    ['columns', ([, ...value]) => value, 'series'],\n    'hasHeader',\n    'dataRange',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import columnChartVisualisationHelpers from '../column-chart-form/helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'bar',\n    hasHeader: true,\n  };\n};\n\nconst isValid = columnChartVisualisationHelpers.isValid;\nconst headerPaths = columnChartVisualisationHelpers.headerPaths;\nconst headerColours = columnChartVisualisationHelpers.headerColours;\n\nconst configMappingRules = {\n  ...columnChartVisualisationHelpers.configMappingRules,\n  column: [\n    'xAxis',\n    ['series', value => value.slice(0, 1)],\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  line: [\n    'xAxis',\n    ['series', value => value.slice(0, 1)],\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import { isUndefined, omitBy } from 'lodash';\nimport { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'number',\n    comparison: {\n      type: 'sparkline',\n    },\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ comparison: { type } = {} }) => {\n  switch (type) {\n    case 'sparkline':\n      return [-1];\n    case 'percentage':\n    case 'number':\n      return [0, -1];\n    default:\n      return [];\n  }\n};\n\n// We map the goal direction from line, column and geckometer\n// to a sensible goal type\nconst GOAL_TO_COMPARISON = [\n  'goal',\n  (goal, lastComparison = {}) => {\n    if (!goal) return undefined;\n\n    return omitBy(\n      {\n        type: 'goal',\n        startingValue: lastComparison.startingValue,\n      },\n      isUndefined,\n    );\n  },\n  'comparison',\n];\n\nconst mapSeriesToValue = value => value[0];\n\nconst configMappingRules = {\n  column: [\n    ['series', mapSeriesToValue, 'value'],\n    'goal',\n    'numberFormat',\n    GOAL_TO_COMPARISON,\n  ],\n  line: [\n    ['series', mapSeriesToValue, 'value'],\n    'goal',\n    'numberFormat',\n    GOAL_TO_COMPARISON,\n  ],\n  leaderboard: [['values', null, 'value'], 'numberFormat'],\n  text: ['value'],\n  geckometer: ['value', 'numberFormat', 'indicators'],\n  bar: [\n    ['series', mapSeriesToValue, 'value'],\n    'goal',\n    'numberFormat',\n    GOAL_TO_COMPARISON,\n  ],\n  table: [['columns', mapSeriesToValue, 'value']],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'leaderboard',\n    hasHeader: true,\n    reverseSort: false,\n  };\n};\n\nconst isValid = ({ labels }) => {\n  return isValidSelection(labels);\n};\n\nconst headerPaths = () => {\n  return ['labels', 'values'];\n};\n\nconst mapSeriesToValue = value => value[0];\n\nconst configMappingRules = {\n  column: [\n    ['xAxis', null, 'labels'],\n    ['series', mapSeriesToValue, 'values'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  line: [\n    ['xAxis', null, 'labels'],\n    ['series', mapSeriesToValue, 'values'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  text: [['value', null, 'values']],\n  number: [['value', null, 'values'], 'numberFormat'],\n  geckometer: [['value', null, 'values'], 'numberFormat'],\n  bar: [\n    ['xAxis', null, 'labels'],\n    ['series', mapSeriesToValue, 'values'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  table: [\n    ['columns', mapSeriesToValue, 'labels'],\n    ['columns', value => value[1], 'values'],\n    'hasHeader',\n  ],\n};\n\nexport default { getDefaultConfig, isValid, headerPaths, configMappingRules };\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'geckometer',\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\nconst getSelectionTargets = (config, activeFieldPath) => {\n  switch (activeFieldPath) {\n    case 'value':\n      return [-1];\n    default:\n      return [];\n  }\n};\n\nconst mapSeriesToValue = value => value[0];\n\nconst configMappingRules = {\n  column: [['series', mapSeriesToValue, 'value'], 'numberFormat'],\n  line: [\n    ['series', mapSeriesToValue, 'value'],\n    ['minYAxis', min => (min ? { value: min } : undefined), 'min'], // eslint-disable-line no-confusing-arrow\n    ['maxYAxis', max => (max ? { value: max } : undefined), 'max'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n  ],\n  text: ['value'],\n  number: ['value', 'numberFormat', 'indicators'],\n  leaderboard: [['values', null, 'value'], 'numberFormat'],\n  bar: [['series', mapSeriesToValue, 'value'], 'numberFormat'],\n  table: [['columns', mapSeriesToValue, 'value']],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'text',\n    hasHeader: false,\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ isLoop }) => {\n  if (isLoop) {\n    return [-5, -4, -3, -2, -1];\n  }\n  return [-1];\n};\n\nconst mapSeriesToValue = value => value[0];\n\nconst configMappingRules = {\n  number: ['value'],\n  geckometer: ['value'],\n  leaderboard: [['values', null, 'value']],\n  line: [['series', mapSeriesToValue, 'value']],\n  column: [['series', mapSeriesToValue, 'value']],\n  bar: [['series', mapSeriesToValue, 'value']],\n  table: [['columns', mapSeriesToValue, 'value']],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { defaultTo } from 'lodash';\nimport LineChartHelpers from './config-forms/line-chart-form/helpers';\nimport ColumnChartHelpers from './config-forms/column-chart-form/helpers';\nimport BarChartHelpers from './config-forms/bar-chart-form/helpers';\nimport NumberHelpers from './config-forms/number-form/helpers';\nimport LeaderboardHelpers from './config-forms/leaderboard-form/helpers';\nimport GeckometerHelpers from './config-forms/geckometer-form/helpers';\nimport TextHelpers from './config-forms/text-form/helpers';\nimport TableHelpers from './config-forms/table-form/helpers';\n\nconst DATA_METHODS = {\n  line: LineChartHelpers,\n  column: ColumnChartHelpers,\n  bar: BarChartHelpers,\n  number: NumberHelpers,\n  leaderboard: LeaderboardHelpers,\n  geckometer: GeckometerHelpers,\n  text: TextHelpers,\n  table: TableHelpers,\n};\n\nconst getVisualisationHelpers = visualisation =>\n  defaultTo(DATA_METHODS[visualisation], LineChartHelpers);\n\nexport default getVisualisationHelpers;\n","import {\n  getSpreadsheet,\n  getWorksheet,\n} from '../../universal/services/spreadsheet-service';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport getVisualisationHelpers from '../helpers/get-visualisation-helpers';\nimport { translate } from '../../lib/config-mapper';\nimport {\n  convertSelectionRangesToColumns,\n  convertSelectionRangesToRows,\n} from '../helpers/selection-helpers';\n\nexport const doSwitchVisualisationType = createAction(\n  'SpreadsheetConfig:SWITCH_VISUALISATION_TYPE',\n);\n\nexport const worksheetFetched = createAction('Spreadsheet:WORKSHEET_FETCHED');\nexport const worksheetFetchFailed = createErrorAction(\n  'Spreadsheet:WORKSHEET_FETCH_FAILED',\n);\nexport const setScrolls = createAction('Spreadsheet:SET_SCROLLS');\nexport const loading = createAction('Spreadsheet:LOADING');\nexport const set = createAction('Spreadsheet:SET');\n\nexport const hydrateConfigureView = createAction(\n  'Spreadsheet:HYDRATE_CONFIGURE_VIEW',\n);\n\nexport const reorderTableColumns = createAction(\n  'Spreadsheet:REORDER_TABLE_COLUMNS',\n);\n\nexport const fetchWorksheet = (fileId, worksheetId) => async dispatch => {\n  const worksheet = await getWorksheet(fileId, worksheetId);\n  dispatch(worksheetFetched({ worksheet }));\n};\n\nexport const fetchFile = (fileId, worksheetId) => async dispatch => {\n  dispatch(loading());\n\n  try {\n    const spreadsheet = await getSpreadsheet(fileId, 0);\n\n    // if there is no worksheetId take the first from the worksheets array\n    if (!worksheetId) {\n      const { worksheets } = spreadsheet;\n      const { id } = worksheets[0];\n\n      worksheetId = id;\n    }\n\n    const worksheet = await getWorksheet(fileId, worksheetId);\n\n    dispatch(\n      worksheetFetched({\n        worksheet,\n        spreadsheet,\n      }),\n    );\n  } catch (error) {\n    dispatch(worksheetFetchFailed(error));\n  }\n};\n\nexport const refreshFile = () => (dispatch, getState) => {\n  const { fileId, worksheetId } = getState().spreadsheets;\n  dispatch(fetchFile(fileId, worksheetId));\n};\n\nexport const switchVisualisationType = type => (dispatch, getState) => {\n  const {\n    spreadsheets: {\n      config: currentConfig,\n      previousConfigs,\n      validSelections,\n      isDirectionSwapped,\n    },\n    user: { user: { features = [] } = {} } = {},\n  } = getState();\n\n  const lastConfigForType = previousConfigs[type];\n\n  if (currentConfig.type === type) return;\n\n  const visualisationHelpers = getVisualisationHelpers(type);\n\n  const selectionsArray = isDirectionSwapped\n    ? convertSelectionRangesToRows([...validSelections])\n    : convertSelectionRangesToColumns([...validSelections]);\n\n  const defaults = visualisationHelpers.getDefaultConfig([...selectionsArray]);\n\n  const mappedValues = translate(\n    visualisationHelpers.configMappingRules,\n    currentConfig,\n    lastConfigForType,\n    features,\n  );\n\n  const config = {\n    ...defaults,\n    ...lastConfigForType,\n    ...mappedValues,\n  };\n\n  dispatch(doSwitchVisualisationType(config));\n};\n\nexport const changeFile = fileId => fetchFile(fileId);\n","import React, { Component } from 'react';\nimport styles from './input-style.scss';\n\nclass InputComponent extends Component {\n  render() {\n    return (\n      <input\n        ref={el => (this.input = el)}\n        type=\"text\"\n        autoComplete=\"off\"\n        {...this.props}\n        className={styles.input}\n      />\n    );\n  }\n\n  /*\n   * A public method that parent components\n   * can use to force focus on the input.\n   */\n  focus() {\n    if (this.input) {\n      this.input.focus();\n    }\n  }\n}\n\nexport default InputComponent;\n","import Input from './input-component';\n\nexport default Input;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport styles from './sortable-cell-style.scss';\n\nconst SortableCellComponent = props => {\n  const {\n    children,\n    className,\n    isHeader,\n    isRightAligned,\n    onSort,\n    value,\n  } = props;\n  const alignmentStyles = isRightAligned ? styles.right : styles.left;\n  const containerClassName = classnames(\n    alignmentStyles,\n    { [styles.isSortable]: !!onSort },\n    className,\n  );\n  let content = children;\n\n  if (onSort) {\n    const iconClassName = value\n      ? classnames(styles.icon, styles[value])\n      : classnames(styles.icon, styles.unsorted);\n    content = <span className={iconClassName}>{children}</span>;\n  }\n\n  if (isHeader) {\n    return (\n      <th className={containerClassName} onClick={onSort}>\n        {content}\n      </th>\n    );\n  }\n\n  return (\n    <td className={containerClassName} onClick={onSort}>\n      {content}\n    </td>\n  );\n};\n\nSortableCellComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  isHeader: PropTypes.bool,\n  isRightAligned: PropTypes.bool,\n  value: PropTypes.oneOf(['asc', 'desc']),\n  onSort: PropTypes.func,\n};\n\nexport default SortableCellComponent;\n","import SortableCell from './sortable-cell-component';\n\nexport default SortableCell;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  isEmpty,\n  some,\n  isUndefined,\n  includes,\n  isObject,\n  unzip,\n  isString,\n} from 'lodash';\nimport classNames from 'classnames';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport SortableCell from './sortable-cell';\nimport RelativeTime from '../../components/relative-time';\nimport { prettyDateFormatForDuration } from '../../lib/pretty-date-format';\n\nimport styles from './table-style.scss';\n\nconst VALID_DATA_TYPES = [\n  'decimal',\n  'currency',\n  'percent',\n  'duration',\n  'datetime',\n  'text',\n];\nconst VALID_COLUMN_TYPES = [\n  'decimal',\n  'currency',\n  'percent',\n  'datetime',\n  'duration',\n];\nconst FORMATTABLE_NUMBER_TYPES = ['decimal', 'currency', 'percent', 'duration'];\n\n// Cells can come in different shapes. We have cell values\n// and cell objects, so we need to handle both here.\n// Cell values look like: 345 or 'text'.\n// Cell objects look like: { value: 234, format: 'decimal' }\nconst getCellValue = (cell, numberFormat, format, unit) => {\n  if (isUndefined(cell)) {\n    return '';\n  }\n\n  if (isObject(cell)) {\n    if (includes(FORMATTABLE_NUMBER_TYPES, cell.type)) {\n      return humaniseNumber(cell.value, {\n        numberFormat,\n        format: cell.type,\n        unit: cell.unit,\n      });\n    }\n\n    return !isUndefined(cell.human) ? cell.human : cell.value;\n  }\n\n  if (includes(FORMATTABLE_NUMBER_TYPES, format)) {\n    return humaniseNumber(cell, { numberFormat, format, unit });\n  }\n\n  return cell;\n};\n\nexport const MixedColumnCellContent = ({ children, alignment }) => {\n  const cellClass = classNames(styles.content, {\n    [styles.rightAligned]: alignment === 'right',\n  });\n\n  return (\n    <div className={styles.mixedCell}>\n      <div className={cellClass}>{children}</div>\n      <div className={styles.spacer}>{children}</div>\n      <span>&nbsp;</span>\n    </div>\n  );\n};\nMixedColumnCellContent.propTypes = {\n  alignment: PropTypes.oneOf(['left', 'right']),\n  children: PropTypes.node,\n  isLoading: PropTypes.bool,\n};\n\nexport const ColumnCellContent = ({ children }) => (\n  <span className={styles.cell}>{children}</span>\n);\nColumnCellContent.propTypes = {\n  children: PropTypes.node,\n};\n\nclass TableComponent extends PureComponent {\n  static canRender(cfg) {\n    const [row] = cfg.data || [];\n    return !isEmpty(row);\n  }\n\n  constructor(props) {\n    super(props);\n\n    this.state = { isLoading: props.isContentLoading };\n  }\n\n  componentDidUpdate(prevProps) {\n    /*\n     * If the table content is loading show\n     * a loading state immediately.\n     */\n    if (!prevProps.isContentLoading && this.props.isContentLoading) {\n      this.setState({ isLoading: true });\n    }\n\n    /*\n     * If the table content is no longer loading\n     * show a loading state for a little while\n     * longer to prevent a janky feel if content\n     * is loaded very quickly.\n     */\n    if (!this.props.isContentLoading && prevProps.isContentLoading) {\n      this.extendLoading();\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.timer) {\n      clearTimeout(this.timer);\n    }\n  }\n\n  render() {\n    const {\n      data,\n      columns,\n      numberFormat,\n      columnOffset,\n      isPreviewMode,\n      canEdit,\n      onSort,\n      dashboardTz,\n      tvMode,\n      fixedPadding,\n    } = this.props;\n    const { isLoading } = this.state;\n    const wrapperStyle = classNames(styles.tableWrapper, {\n      [styles.previewLayout]: isPreviewMode,\n      [styles.tvMode]: tvMode,\n      [styles.fixedPadding]: fixedPadding,\n    });\n    const hasData = !isEmpty(data);\n    const hasHeadings = some(columns, column => !isUndefined(column.heading));\n    const columnValues = unzip(data).map((values, columnIndex) => {\n      const columnMeta = columns[columnIndex] || {};\n      const { format, unit, useRelativeTime } = columnMeta;\n      const columnNumberFormat = numberFormat[columnIndex + columnOffset] || {};\n\n      // Present the whole column with the same contextual date format\n      if (\n        'datetime' === columnMeta.format &&\n        !useRelativeTime &&\n        values.every(isString)\n      ) {\n        return prettyDateFormatForDuration(values, dashboardTz);\n      }\n\n      return values.map(value =>\n        getCellValue(value, columnNumberFormat, format, unit),\n      );\n    });\n\n    return (\n      <div className={wrapperStyle}>\n        <table className={styles.table}>\n          {hasHeadings && (\n            <thead>\n              <tr className={styles.tr}>\n                {columns.map((column, index) => {\n                  const { heading, alignment } = column;\n                  const isRightAligned = alignment === 'right';\n                  const headingClass = classNames(styles.th, {\n                    [styles.rightAligned]: isRightAligned,\n                  });\n                  let onSortHeading;\n\n                  if (canEdit || isPreviewMode) {\n                    onSortHeading = onSort;\n                  }\n\n                  return (\n                    <SortableCell\n                      isHeader\n                      className={headingClass}\n                      value={column.sort}\n                      isRightAligned={isRightAligned}\n                      onSort={onSortHeading && (() => onSortHeading(index))}\n                      key={index}\n                    >\n                      <span className={styles.heading}>{heading}</span>\n                    </SortableCell>\n                  );\n                })}\n              </tr>\n            </thead>\n          )}\n          <tbody>\n            {hasData &&\n              data.map((row, rowIndex) => {\n                let onSortFirstRow;\n\n                // When we can sort the table but there is no header row\n                // we enable sorting from the first row of data\n                if (\n                  (canEdit || isPreviewMode) &&\n                  !isLoading &&\n                  onSort &&\n                  !hasHeadings &&\n                  rowIndex === 0\n                ) {\n                  onSortFirstRow = onSort;\n                }\n\n                return (\n                  <tr key={rowIndex} className={styles.tr}>\n                    {row.map((cell, columnIndex) => {\n                      const columnMeta = columns[columnIndex] || {};\n                      const { format, alignment, useRelativeTime } = columnMeta;\n                      const isRightAligned = alignment === 'right';\n                      const cellValue = columnValues[columnIndex][rowIndex];\n                      const cellClasses = classNames(styles.td, {\n                        [styles.rightAligned]: isRightAligned,\n                      });\n                      let content;\n\n                      if (format === undefined) {\n                        content = (\n                          <MixedColumnCellContent\n                            alignment={alignment}\n                            children={cellValue}\n                          />\n                        );\n                      } else {\n                        const children =\n                          format === 'datetime' && useRelativeTime ? (\n                            <RelativeTime datetime={cellValue} />\n                          ) : (\n                            cellValue\n                          );\n\n                        content = <ColumnCellContent children={children} />;\n                      }\n\n                      return (\n                        <SortableCell\n                          className={cellClasses}\n                          key={columnIndex}\n                          onSort={\n                            onSortFirstRow &&\n                            (() => onSortFirstRow(columnIndex))\n                          }\n                          isRightAligned={isRightAligned}\n                          value={columnMeta.sort}\n                        >\n                          <span>\n                            {isLoading ? (\n                              <span>\n                                <span className={styles.hiddenContent}>\n                                  {content}\n                                </span>\n                                <div className={styles.loadingCell} />\n                              </span>\n                            ) : (\n                              content\n                            )}\n                          </span>\n                        </SortableCell>\n                      );\n                    })}\n                  </tr>\n                );\n              })}\n          </tbody>\n        </table>\n      </div>\n    );\n  }\n\n  extendLoading() {\n    this.timer = setTimeout(() => {\n      if (!this.props.isContentLoading) {\n        this.setState({ isLoading: false });\n      }\n    }, 800);\n  }\n}\n\nTableComponent.defaultProps = {\n  columns: [],\n  numberFormat: [],\n  columnOffset: 0,\n  fixedPadding: false,\n  isContentLoading: false,\n};\n\nconst valueType = PropTypes.oneOfType([\n  PropTypes.string,\n  PropTypes.number,\n  PropTypes.shape({\n    value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n    human: PropTypes.string,\n    type: PropTypes.oneOf(VALID_DATA_TYPES),\n    unit: PropTypes.string,\n  }),\n]);\n\nTableComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  columnOffset: PropTypes.number,\n  columns: PropTypes.arrayOf(\n    PropTypes.shape({\n      alignment: PropTypes.oneOf(['left', 'right']),\n      format: PropTypes.oneOf(VALID_COLUMN_TYPES),\n      heading: PropTypes.string,\n      sort: PropTypes.oneOf(['asc', 'desc']),\n    }),\n  ),\n  dashboardTz: PropTypes.string,\n  data: PropTypes.arrayOf(PropTypes.arrayOf(valueType)),\n  fixedPadding: PropTypes.bool,\n  isContentLoading: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n  numberFormat: PropTypes.array,\n  tvMode: PropTypes.bool,\n  onSort: PropTypes.func,\n};\n\nexport default TableComponent;\n","/* eslint camelcase: 0 */\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode, render, unmountComponentAtNode } from 'react-dom';\nimport classNames from 'classnames';\nimport d3 from 'd3';\nimport {\n  zip,\n  isArray,\n  uniqWith,\n  partial,\n  max,\n  last,\n  range,\n  isEqual,\n  findIndex,\n  reduce,\n  unzip,\n  isNull,\n  filter,\n  isFinite,\n  chain,\n  isEmpty,\n  isUndefined,\n  isNil,\n  isString,\n  clone,\n} from 'lodash';\n\nimport ColourBrewer from '../../lib/colour-brewer';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport {\n  normalise,\n  pickFormat,\n  pickTooltipFormat,\n} from '../../lib/pretty-date-format';\nimport { getClientSize, getScaledClientSize } from '../../lib/dom-helper';\n\nimport style from './column-chart-style.scss';\nimport {\n  WIDGET_PADDING_TV_MODE,\n  WIDGET_PADDING,\n} from '../visualisation-constants';\n\nconst visualisationSettings = {\n  regular: {\n    minYAxisTicks: 4,\n    maxYAxisTicks: 11,\n    chartRightNudge: 20,\n  },\n  tvMode: {\n    minYAxisTicks: 3,\n    maxYAxisTicks: 11,\n    chartRightNudge: 50,\n  },\n};\n\nconst xAxisTypes = {\n  standard: 'standard',\n  datetime: 'datetime',\n};\n\nconst TV_MAX_BAR_WIDTH = 20;\nconst NON_TV_MAX_BAR_WIDTH = 10;\n\nfunction findClosestTick(mouseX, domainX, marginLeft, scaleX, scalingFactor) {\n  const // x mouse position\n    x0 = scaleX.invert(mouseX / scalingFactor - marginLeft); // closest x value\n\n  const i = d3.bisect(domainX, x0, 1);\n\n  // Get closest tick from mouse\n  const [a, b] = [domainX[i - 1], domainX[i]];\n\n  return x0 - a > b - x0 ? b : a;\n}\n\n// Collect all [x, y] values for the x value\n// return null if no supplied point for a series\nfunction getPointsOnTick(closestTick, series, type) {\n  return unzip(\n    chain(series)\n      .map('data')\n      .map(pts => {\n        let [xs] = unzip(pts);\n        let tickValue = closestTick;\n\n        if (type === xAxisTypes.datetime) {\n          // we need to use time and not Date object here..\n          xs = xs.map(dt => dt.getTime());\n          tickValue = closestTick.getTime();\n        }\n        const index = xs.indexOf(tickValue);\n        const value = index !== -1 ? pts[index] : null;\n\n        return [index, value];\n      })\n      .value(),\n  );\n}\n\n// map given points to svg coordinates and corresponding colour\nfunction toSvgContext(points, scales, series) {\n  const { x, y } = scales;\n\n  return chain(points)\n    .map((point, j) => {\n      if (!point) {\n        return null;\n      }\n      const [xi, yi] = point;\n      const { colour } = series[j];\n      return {\n        x: x(xi),\n        y: isNil(yi) ? undefined : y(yi),\n        colour,\n      };\n    })\n    .compact()\n    .value();\n}\n\nfunction renderTooltip(\n  el,\n  closestTick,\n  points,\n  series,\n  formats,\n  dateFormat,\n  type,\n  xLabels,\n) {\n  const {\n    y: { format, unit, numberFormat = {} },\n  } = formats;\n\n  const renderSeriesValue = (p, ii) => {\n    const prefix = numberFormat.prefix;\n    const suffix = numberFormat.suffix;\n\n    const value =\n      p && !isNil(p[1])\n        ? humaniseNumber(p[1], {\n            format,\n            unit,\n            numberFormat: {\n              abbreviation: 'none',\n              precision: 'none',\n              suffix,\n              prefix,\n            },\n          })\n        : '-';\n\n    return (\n      <li key={ii} style={{ color: series[ii].colour }}>\n        {value}\n      </li>\n    );\n  };\n\n  const renderXValue = value => {\n    if (type === xAxisTypes.datetime) return dateFormat(value);\n    if (type === xAxisTypes.standard) return xLabels[value];\n    return value;\n  };\n\n  const tooltip = (\n    <ul>\n      <li>{renderXValue(closestTick)}</li>\n      {points.map(renderSeriesValue)}\n    </ul>\n  );\n\n  render(tooltip, el);\n}\n\nclass ColumnChartComponent extends Component {\n  componentDidMount() {\n    const el = findDOMNode(this);\n\n    this.visualisationSettings = this.props.tvMode\n      ? visualisationSettings.tvMode\n      : visualisationSettings.regular;\n\n    this.container = d3.select(el);\n\n    this.createChart();\n\n    this.createDefs();\n    this.createGrid();\n    this.createAxis();\n    this.createTooltip();\n\n    this.chart.append('g').attr('class', 'series-list');\n\n    this.afterRender();\n  }\n\n  componentDidUpdate() {\n    this.visualisationSettings = this.props.tvMode\n      ? visualisationSettings.tvMode\n      : visualisationSettings.regular;\n\n    this.afterRender();\n  }\n\n  componentWillUnmount() {\n    if (this.tooltipLabel) {\n      unmountComponentAtNode(this.tooltipLabel);\n    }\n  }\n\n  render() {\n    /* eslint camelcase: 0 */\n    const { x_axis = {}, tvMode } = this.props;\n\n    if (isNull(x_axis.type)) {\n      throw new Error('X axis type can not be null');\n    }\n\n    /* eslint camelcase: 1 */\n\n    const { isPreviewMode, style: layoutStyle } = this.props;\n\n    const wrapperClasses = classNames('chart v2', {\n      [style.previewLayout]: isPreviewMode,\n      [style.tvMode]: tvMode,\n    });\n\n    return <div className={wrapperClasses} style={layoutStyle} />;\n  }\n\n  createChart() {\n    this.chart = this.container\n      .append('svg')\n      .append('g')\n      .attr('class', 'graph');\n\n    this.chart.append('rect').attr('class', 'threshold');\n    this.chart.append('g').attr('class', 'legends');\n  }\n\n  createDefs() {\n    const defs = this.chart.append('svg:defs');\n\n    defs\n      .append('clipPath')\n      .attr('class', 'threshold-clip')\n      .append('rect')\n      .attr('class', 'threshold-clip-content');\n\n    defs\n      .append('clipPath')\n      .attr('class', 'boundaries-clip')\n      .append('rect')\n      .attr('class', 'boundaries-clip-content');\n  }\n\n  createGrid() {\n    const grid = this.chart.append('g').attr('class', 'grid');\n    grid.append('g').attr('class', 'grid-y');\n    grid.append('g').attr('class', 'grid-x'); // x need to be last\n    grid.append('g').attr('class', 'grid-x-threshold'); // x need to be last\n  }\n\n  createAxis() {\n    const axis = this.chart.append('g').attr('class', 'axis');\n    axis.append('g').attr('class', 'axis-x');\n    axis.append('g').attr('class', 'axis-y');\n  }\n\n  createTooltip() {\n    const overlay = this.chart.append('g').attr('class', 'tooltip');\n    const focus = overlay.append('g').attr('class', 'tooltip-focus');\n\n    const labelWrapper = this.container\n      .append('div')\n      .attr('class', 'tooltip-label-wrapper');\n\n    overlay.append('rect').attr('class', 'tooltip-overlay');\n    focus.append('line').attr('class', 'tooltip-dashed-line');\n    const tooltip = labelWrapper.append('div').attr('class', 'tooltip-label');\n    this.tooltipLabel = tooltip[0][0];\n  }\n\n  dPathHelper(data) {\n    const { points } = data;\n    const line = d3.svg\n      .line()\n      .x(d => this.x(d[0]))\n      .defined(d => !isNil(d[1]))\n      .y(d => this.y(d[1]));\n\n    return line(points);\n  }\n\n  setSvgDimensions() {\n    const el = findDOMNode(this);\n    const [clientWidth, clientHeight] = getClientSize(el);\n\n    this.margin = {\n      top: 30,\n      right: 25,\n      bottom: 30,\n      left: 60,\n    };\n\n    this.w = clientWidth - this.margin.left - this.margin.right;\n    this.h = clientHeight - this.margin.top - this.margin.bottom;\n\n    // Set svg size\n    this.container.select('svg').attr({\n      width: this.w + this.margin.left + this.margin.right,\n      height: this.h + this.margin.top + this.margin.bottom,\n    });\n\n    this.chart.select('.boundaries-clip-content').attr({\n      width: this.w,\n      height: this.h,\n    });\n\n    this.applyTransformation();\n  }\n\n  // Translate chart elements to respect d3 margin convention\n  applyTransformation() {\n    const { left, top } = this.margin;\n    this.chart.attr('transform', `translate(${left},${top})`);\n\n    this.chart\n      .selectAll('.threshold, .threshold-clip-content')\n      .attr('transform', `translate(-${left},0)`);\n\n    this.chart.select('.grid-y').attr('transform', `translate(-${left},0)`);\n    this.chart\n      .select('.grid-x, .grid-x-threshold')\n      .attr('transform', `translate(0,${this.h + 1})`);\n\n    this.chart.select('.axis-x').attr('transform', `translate(0,${this.h})`);\n  }\n\n  setYScale() {\n    this.y = d3.scale.linear().range([this.h, 0]);\n  }\n\n  setXScale(type, longestYAxisLabel = 0, barChartOptions) {\n    const isSmallWidget = this.w <= 145;\n    let nudge = longestYAxisLabel - 20;\n\n    // The nudge needs to be adjusted here to account for the number of series, multiplied by the width of the bars\n    const barsToMakeSpaceFor =\n      Math.ceil(barChartOptions.numberOfSeries / 2) - 1;\n    nudge += barsToMakeSpaceFor * barChartOptions.barWidth;\n\n    // We're nudging the final column in slightly (a fraction of the chart width) to allow more\n    // room for the final label\n    // again, as above, if this is 1x1, we don't need to worry about labels and can just span\n    // the full width of the chart\n    const chartWidth = isSmallWidget ? this.w : this.w - this.w / 20;\n\n    // We set this into the current context, as we use it for calculations elsewhere\n    this.calculatedChartWidth = chartWidth;\n\n    if (type === xAxisTypes.datetime) {\n      this.x = d3.time.scale.utc().range([nudge, chartWidth]);\n    } else {\n      this.x = d3.scale.linear().range([nudge, chartWidth]);\n    }\n  }\n\n  getNumberOfTicks(xAxisType) {\n    const IDEAL_X_AXIS_TICK_SEPARATION = xAxisType === 'standard' ? 40 : 70;\n\n    // Ensure that we have a minimum number of ticks on the y-axis\n    // This generally only applies for 1x1 graphs.\n    const MIN_NUM_Y_AXIS_TICKS = this.visualisationSettings.minYAxisTicks;\n\n    // Widgets of height 1 hit the min, and widgets with a height of 3 or more\n    // end up very tall and hit the max.\n    // So this ideal tick separation generally only applies to 2 height charts.\n    const IDEAL_Y_AXIS_TICK_SEPARATION = 50;\n\n    // On taller charts more than 11 ticks starts to have the y-axis\n    // tick marking overwhelm the line itself.\n    const MAX_NUM_Y_AXIS_TICKS = this.visualisationSettings.maxYAxisTicks;\n\n    // We add 1 to take into account that ticks can be at the start and end of\n    // the available space.\n    //\n    // <----------- 210px ---------->\n    // |---------|---------|--------|\n    // <- 70px -><- 70px -><- 70px ->\n    //\n    // 210 / 70 = 3, but because ticks can be at the start and end we can\n    // actually fit 4 ticks.\n    //\n    // Although because (on the x-axis) we don't *ensure* ticks are at the start\n    //  and end of the axis in the worst case this could give us the following:\n    //\n    // <---------------- 140px --------------->\n    // ----------|---------|---------|---------\n    // <- 35px -><- 35px -><- 35px -><- 35px ->\n    //\n    // In practice this doesn't happen because we don't show ticks on a 1x1\n    // widget, and the 2x1 widget has an axis width of 385 and 6 ticks which\n    // at worst would display as:\n    //\n    // <------------------------------- 385px ------------------------------>\n    // ----------|---------|---------|---------|---------|---------|---------\n    // <- 55px -><- 55px -><- 55px -><- 55px -><- 55px -><- 55px -><- 55px ->\n\n    return {\n      x: Math.floor(this.w / IDEAL_X_AXIS_TICK_SEPARATION) + 1,\n      y: Math.max(\n        MIN_NUM_Y_AXIS_TICKS,\n        Math.min(\n          MAX_NUM_Y_AXIS_TICKS,\n          Math.floor(this.h / IDEAL_Y_AXIS_TICK_SEPARATION) + 1,\n        ),\n      ),\n    };\n  }\n\n  getNumberOfNiceYTicks(numberOfYTicks) {\n    let maxTicks = numberOfYTicks;\n\n    if (numberOfYTicks < 3) {\n      maxTicks = 0;\n    }\n\n    // When we ask d3 to pick ticks for us `y.ticks(numTicks)` it will use\n    // `numTicks` as a *guideline*, sometimes picking many more ticks. For\n    // exmaple when asked to pick 3 ticks it may return 6.\n    // To get around this we keep reducing the number of ticks that we ask\n    // d3 to render until it no longer returns more than our maximum.\n    let numTicks = maxTicks;\n    // We need to call nice before each attempt at getting ticks to ensure\n    // that we have a tick at the start and end for the given number of ticks.\n    this.y.nice(numTicks);\n    while (this.y.ticks(numTicks).length > maxTicks && numTicks >= 1) {\n      numTicks--;\n      this.y.nice(numTicks);\n    }\n\n    return numTicks;\n  }\n\n  drawGrid(\n    xAxisType,\n    { type, formats, xLabels },\n    threshold,\n    numberOfDataPoints,\n    domainsDataX,\n    minYAxis,\n    maxYAxis,\n    barChartOptions,\n  ) {\n    const { y } = this;\n    const { tvMode } = this.props;\n    const nbTicks = this.getNumberOfTicks(xAxisType);\n    const numberOfNiceYTicks = this.getNumberOfNiceYTicks(nbTicks.y);\n    const [firstValue] = domainsDataX;\n\n    const makeXAxis = () => {\n      let maxTicks = nbTicks.x;\n\n      // If we can't show a minimum number of ticks then don't show any.\n      // This should only apply to 1x1 widgets.\n      // We have a minimum of 6 for two reasons:\n      // * It is the number of ticks on a 2x1 widget.\n      // * d3 struggles to pick ticks when asked for less than 6,\n      //   picking only a single tick, or in some cases no ticks at all.\n      if (nbTicks.x < 6) {\n        maxTicks = 0;\n      }\n\n      // Ensure we don't have more ticks than data points.\n      maxTicks = Math.min(maxTicks, numberOfDataPoints);\n\n      // When we ask d3 to pick ticks for us `x.ticks(numTicks)` it will use\n      // `numTicks` as a *guideline*, sometimes picking many more ticks. For\n      // exmaple when asked to pick 3 ticks it may return 6.\n      // To get around this we keep reducing the number of ticks that we ask\n      // d3 to render until it no longer returns more than our maximum.\n      let numTicks = maxTicks;\n      while (this.x.ticks(numTicks).length > maxTicks && numTicks >= 1) {\n        numTicks--;\n      }\n\n      let tickFormat;\n      if (type === xAxisTypes.datetime) {\n        const format = pickFormat(this.x.ticks(numTicks));\n        tickFormat = d3.time.format.utc(format);\n      } else if (type === xAxisTypes.standard) {\n        tickFormat = i => xLabels[i] || ''; // padding missing label with empty string\n      } else {\n        tickFormat = d => humaniseNumber(d);\n      }\n\n      const axis = d3.svg\n        .axis()\n        .scale(this.x)\n        .orient('bottom')\n        .ticks(numTicks)\n        .tickFormat(tickFormat);\n\n      // If we only have 1 data point\n      // (and the chart is wide enough to have ticks)\n      // then force a tick at that data point.\n      if (numberOfDataPoints === 1 && maxTicks > 0) {\n        return axis.tickValues([firstValue]);\n      }\n\n      return axis;\n    };\n\n    const makeYAxis = () => {\n      const {\n        y: { format, unit, numberFormat, referenceValue },\n      } = formats;\n\n      return d3.svg\n        .axis()\n        .scale(y)\n        .ticks(numberOfNiceYTicks)\n        .tickFormat(d =>\n          humaniseNumber(d, { format, unit, numberFormat, referenceValue }),\n        )\n        .orient('left');\n    };\n\n    // Draw grid Y-axis\n    this.chart.select('.grid-y').call(\n      makeYAxis()\n        .tickSize(-this.w - this.margin.left - this.margin.right, 0)\n        .tickFormat(''),\n    );\n\n    const truncateText = axisLabels => {\n      // Due to the first label being close to the left-edge, we need to restrict it's width\n      // slightly more than the others to stop it getting cut off\n      const FIRST_LABEL_MAX_WIDTH = 120;\n\n      const numLabels = axisLabels.size();\n      const maxLabelWidth =\n        Math.floor(this.calculatedChartWidth / numLabels) - 10;\n      axisLabels.each(function(index) {\n        // The first label should be more restricted in width, but if it ends up\n        // being larger than the max width anyway, we just use the calculated max width\n        let maxWidth = index === 0 ? FIRST_LABEL_MAX_WIDTH : maxLabelWidth;\n        if (maxWidth > maxLabelWidth) {\n          maxWidth = maxLabelWidth;\n        }\n\n        const label = d3.select(this);\n\n        let textLength = label.node().getComputedTextLength();\n        let text = label.text();\n\n        while (textLength > maxWidth && text.length > 0) {\n          text = text.slice(0, -1);\n          label.text(`${text}...`);\n          textLength = label.node().getComputedTextLength();\n        }\n      });\n    };\n\n    const setXAxisScale = yLabels => {\n      let longestLabel = 0;\n\n      yLabels.each(function() {\n        const label = d3.select(this);\n        const textLength = label.node().getComputedTextLength();\n\n        if (textLength > longestLabel) {\n          longestLabel = Math.round(textLength);\n        }\n      });\n\n      this.setXScale(type, longestLabel, barChartOptions);\n    };\n\n    const padding = tvMode ? WIDGET_PADDING_TV_MODE : WIDGET_PADDING;\n\n    // Draw y-axis\n    this.chart\n      .select('.axis-y')\n      .call(makeYAxis())\n      .selectAll('text')\n      .call(setXAxisScale)\n      .attr({ y: -14, x: -(this.margin.left - padding) });\n\n    // Finds the \"zero\" tick on the y-axis, and adds an extra class\n    // This only happens if the y-axis has a mix of positive and negative values\n    // to highlight the \"zero point\"\n    if (minYAxis < 0 && maxYAxis > 0) {\n      this.chart\n        .select('.grid-y')\n        .selectAll('.tick')\n        .each(function(data) {\n          if (data === 0) {\n            const zeroTick = d3.select(this);\n            zeroTick.attr('class', 'tick zero');\n          }\n        });\n    }\n\n    // Define x domain and draw x-axis\n    this.defineXDomain(type, xLabels, domainsDataX);\n\n    this.chart.select('.grid-x').call(\n      makeXAxis()\n        .tickSize(-this.h - 2, 0)\n        .tickFormat(''), // Remove formatting for grid\n    );\n\n    this.chart\n      .select('.axis-x')\n      .call(makeXAxis())\n      .selectAll('.tick text')\n      .call(truncateText);\n\n    if (isFinite(threshold)) {\n      // Set threshold background\n      let thresholdAttributes = {\n        width: this.w + this.margin.left + this.margin.right,\n      };\n      const thresholdY = this.y(threshold);\n      let height, gridAttributes;\n\n      if (this.props.reverseGoalDirection) {\n        height = this.h - thresholdY;\n        gridAttributes = {\n          transform: `translate(0, ${thresholdY})`,\n        };\n        thresholdAttributes = {\n          ...thresholdAttributes,\n          transform: `translate(-${this.margin.left}, ${thresholdY})`,\n          height,\n        };\n      } else {\n        height = this.y(threshold);\n        gridAttributes = {\n          transform: null,\n        };\n        thresholdAttributes = {\n          ...thresholdAttributes,\n          height,\n        };\n      }\n\n      this.chart\n        .selectAll('.threshold, .threshold-clip-content')\n        .attr(thresholdAttributes);\n\n      // Add x grid for threshold to match background color\n      this.chart\n        .select('.grid-x-threshold')\n        .attr(gridAttributes)\n        .call(\n          makeXAxis()\n            .tickSize(height, 0)\n            .tickFormat(''), // Remove formatting for grid\n        );\n    } else {\n      // Set threshold background\n      this.chart\n        .selectAll('.threshold, .threshold-clip-content')\n        .attr({ width: 0, height: 0 });\n\n      this.chart\n        .select('.grid-x-threshold')\n        .selectAll('*')\n        .remove();\n    }\n  }\n\n  drawLegend(data) {\n    const legendWrap = this.chart.select('.legends');\n    const legends = legendWrap.selectAll('.legend').data(data);\n\n    // Enter\n    legends\n      .enter()\n      .append('g')\n      .attr({\n        class: 'legend',\n        visibility: 'hidden',\n      });\n\n    const legendCircles = legends.selectAll('circle').data(d => [d]);\n    const legendTexts = legends.selectAll('text').data(d => [d]);\n\n    const legendCircleRadius = this.props.tvMode ? '5' : '4';\n    const legendCircleOffset = this.props.tvMode ? '0' : '3';\n    legendCircles.enter().append('circle');\n    legendTexts\n      .enter()\n      .append('text')\n      .attr({ dx: '8', dy: '8' });\n\n    // Updates\n    legendCircles.attr('fill', d => d.colour);\n    legendCircles.attr('r', legendCircleRadius);\n    legendCircles.attr('cy', legendCircleOffset);\n    legendTexts.text(d => d.name);\n\n    // Exit\n    legendCircles.exit().remove();\n    legendTexts.exit().remove();\n    legends.exit().remove();\n\n    const maxWidth = this.w + this.margin.right - 16; // padding between each legend\n    const padding = 10;\n    const scalingFactor = 1 / this.getScalingFactor();\n    const legendsLength = reduce(\n      legends[0],\n      (sum, node) =>\n        sum +\n        d3\n          .select(node)\n          .node()\n          .getBoundingClientRect().width *\n          scalingFactor +\n        padding,\n      0,\n    );\n\n    // In case we are missing space let's try to overflow text that need to\n    if (legendsLength > maxWidth) {\n      // We need to compute the max for a unique element\n      const unit = maxWidth / legends[0].length;\n\n      legends.each(function() {\n        // we can't use fat arrow here and d3 set's `this` to a DOM element\n        const self = d3.select(this);\n\n        const textNode = self.select('text');\n        let currentWidth =\n          this.getBoundingClientRect().width * scalingFactor + padding;\n        let text = textNode.text();\n\n        while (currentWidth > unit && text.length > 1) {\n          text = text.slice(0, -1);\n          textNode.text(`${text}...`);\n          currentWidth =\n            this.getBoundingClientRect().width * scalingFactor + padding;\n        }\n      });\n    }\n\n    // compute translations for each item\n    const transformations = legends[0]\n      .map(\n        node =>\n          d3\n            .select(node)\n            .node()\n            .getBoundingClientRect().width *\n            scalingFactor +\n          padding,\n      )\n      .reduce(\n        (memo, x) => {\n          const lastX = last(memo);\n          memo.push(lastX + x);\n          return memo;\n        },\n        [0],\n      );\n\n    // apply translations\n    legends.attr('transform', (d, i) => `translate(${transformations[i]}, 0)`);\n\n    // Position legend far right\n    const legendTransX = maxWidth - last(transformations) + padding;\n    if (legendTransX < 0) {\n      legends.remove(); // fallback we don't have space: hide the legend\n    } else {\n      legends.attr('visibility', 'visible');\n      legendWrap.attr('transform', `translate(${legendTransX}, -18)`);\n    }\n  }\n\n  handleIncompletePaths(seriesList) {\n    const groupSelector = 'bar-group';\n\n    const series = seriesList.selectAll(`.${groupSelector}`).data(s => {\n      const d = {\n        colour: s.colour,\n        classes: groupSelector,\n      };\n\n      // Split incomplete series\n      if (isUndefined(s.incomplete_from)) {\n        return [{ points: s.data, ...d }];\n      }\n\n      let indexIncompleteFrom = findIndex(s.data, point => {\n        return isEqual(point[0], s.incomplete_from);\n      });\n      if (indexIncompleteFrom === 0) {\n        // clamp incomplete index\n        indexIncompleteFrom = 1;\n      }\n      // For line, first incomplete point needs to the same as the last complete\n      const incompletePoints = s.data.slice(indexIncompleteFrom);\n      const completePoints = s.data.slice(0, indexIncompleteFrom);\n\n      const completeData = {\n        points: completePoints,\n        ...d,\n        classes: `${groupSelector} complete`,\n      };\n\n      const incompleteData = {\n        points: incompletePoints,\n        ...d,\n        classes: `${groupSelector} incomplete`,\n      };\n\n      return [completeData, incompleteData];\n    });\n\n    return series;\n  }\n\n  drawThreshold(d3series) {\n    const pathsHl = d3series.selectAll('.line.highlighted').data(d => [d]);\n\n    pathsHl\n      .enter()\n      .append('path')\n      .attr(\n        // enter highlighted\n        'class',\n        'line highlight',\n      );\n    // update highlighted\n    pathsHl.attr({\n      d: this.dPathHelper.bind(this),\n      stroke: d => {\n        // Secondary should not be highlighted\n        return !d.isSecondary ? d.colour.brighter(0.8) : d.colour;\n      },\n    });\n    pathsHl.exit().remove();\n  }\n\n  // Preprocess series as scattered\n  preprocessSeries(inputSeries, ctx, { type, xLabels }) {\n    const colourBrewer = new ColourBrewer();\n    const isScattered = isArray(inputSeries[0] && inputSeries[0].data[0]);\n    let incomplete;\n\n    return inputSeries.map(originalSeries => {\n      // eslint-disable-line no-shadow\n      const series = clone(originalSeries);\n\n      // add x coordinate to series\n      if (!isScattered) {\n        // If type is 'standard', co-ords are equally spaced\n        const xCoords =\n          type === xAxisTypes.standard ? range(xLabels.length) : xLabels;\n\n        series.data = zip(xCoords, series.data);\n\n        // x-axis and series should match length to avoid d3 printing non\n        // existing points\n        series.data = series.data.slice(0, xCoords.length);\n      }\n\n      // De-duplication is done before dates become Date objects\n      series.data = uniqWith(series.data, (x, y) => {\n        return isEqual(x[0], y[0]);\n      });\n\n      if (type === xAxisTypes.datetime) {\n        // Format datetime object\n        series.data = series.data.map(([x, y]) => {\n          let datetime = isString(x) ? x : x * 1000;\n          datetime = normalise(datetime, ctx.dashboardTz);\n          return [datetime, y];\n        });\n\n        if (series.incomplete_from) {\n          incomplete = series.incomplete_from;\n          incomplete = isString(incomplete) ? incomplete : incomplete * 1000;\n          series.incomplete_from = normalise(incomplete, ctx.dashboardTz);\n        }\n      }\n\n      if (type !== xAxisTypes.standard) {\n        series.data = series.data.sort((a, b) => a[0] - b[0]);\n      }\n\n      // Add colour\n      if (series.type === 'secondary') {\n        series.colour = d3.hsl(199, 0.1, 0.64);\n      } else {\n        series.colour = colourBrewer.getNextColour();\n      }\n\n      return series;\n    });\n  }\n\n  applyTooltip(series, { formats, type, xLabels }, domainsDataX) {\n    const seriesHaveData =\n      !isEmpty(series) && series.every(s => !isEmpty(s.data));\n\n    const domainX = domainsDataX.sort((a, b) => a - b);\n\n    if (!seriesHaveData) {\n      // Clear tooltip-related events if there's no data to show\n      this.container.on({\n        mouseenter: null,\n        mouseleave: null,\n        mousemove: null,\n      });\n\n      return;\n    }\n\n    const dateFormat =\n      type === xAxisTypes.datetime\n        ? d3.time.format.utc(pickTooltipFormat(domainsDataX))\n        : undefined;\n\n    const labelWrapper = this.container.select('.tooltip-label-wrapper');\n    const tooltipLabel = this.tooltipLabel;\n\n    const [allSeries] = this.container.selectAll('.series');\n    const allBars = this.container.selectAll('.bar-group rect');\n\n    // on mouse move render new tooltip\n    const _this = this;\n    function mousemove() {\n      const closestTick = findClosestTick(\n        d3.mouse(this)[0],\n        domainX,\n        _this.margin.left,\n        _this.x,\n        _this.getScalingFactor(),\n      );\n      const [pointIndices, points] = getPointsOnTick(closestTick, series, type);\n      const pointsSVG = toSvgContext(\n        points,\n        { x: _this.x, y: _this.y },\n        series,\n      );\n      const [{ x: xCoordTooltipLine }] = pointsSVG;\n      // Render circles for given points\n      let tooltipNudge = 10;\n\n      const [[firstBar]] = allBars;\n      const barWidth = d3.select(firstBar).attr('width');\n\n      // Find and highlight the bar closest to the mouse, and fade out the rest\n      allBars.attr('fill-opacity', '0.5');\n      for (let i = 0; i < allSeries.length; i++) {\n        d3.select(allSeries[i])\n          .selectAll('rect')\n          .filter((d, j) => j === pointIndices[i])\n          .attr('fill-opacity', '1');\n      }\n\n      // Calculate tooltip position to end up 5px away from bar group\n      tooltipNudge = (series.length * barWidth + series.length - 1) / 2 + 5;\n\n      // render tooltip\n      renderTooltip(\n        tooltipLabel,\n        closestTick,\n        points,\n        series,\n        formats,\n        dateFormat,\n        type,\n        xLabels,\n      );\n\n      // Position tooltip on the left / right of the point\n      const rect = labelWrapper[0][0].getBoundingClientRect();\n\n      const computedTop = _this.h / 2 - rect.height / 2 + _this.margin.top;\n      const top = computedTop < 0 ? 0 : computedTop; // Always show x value at least\n      const isRight = _this.x(closestTick) < _this.w / 2;\n\n      const left = isRight\n        ? xCoordTooltipLine + tooltipNudge + _this.margin.left\n        : xCoordTooltipLine - (rect.width + tooltipNudge) + _this.margin.left;\n\n      labelWrapper.style({\n        position: 'absolute',\n        top: `${top}px`,\n        left: `${left}px`,\n      });\n    }\n\n    // eslint-disable-next-line no-shadow\n    const toggleTooltip = (container, opacity) => {\n      const transition = container.transition();\n      transition.select('.tooltip-focus').attr('opacity', opacity);\n      transition.select('.tooltip-label-wrapper').style('opacity', opacity);\n      allBars.attr('fill-opacity', '1');\n    };\n\n    // Mount tooltip\n    this.chart\n      .select('.tooltip-overlay')\n      .attr({ width: _this.w, height: _this.h });\n    this.container.classed('tooltips-enabled', true);\n    this.container.on({\n      mouseenter: partial(toggleTooltip, _this.container, 1),\n      mouseleave: partial(toggleTooltip, _this.container, 0),\n      mousemove: mousemove, // eslint-disable-line object-shorthand\n    });\n  }\n\n  sanitiseInput(ctx) {\n    const floatValues = chain(ctx)\n      .pick('threshold', 'minYAxis', 'maxYAxis')\n      .mapValues(parseFloat)\n      .value();\n    return { size: '1x1', ...ctx, ...floatValues };\n  }\n\n  computeDomains(series, threshold, format) {\n    let domainsData = chain(series)\n      .map('data')\n      .flatten()\n      .unzip()\n      .value();\n\n    if (domainsData.length < 2) {\n      domainsData = [[], []];\n    }\n\n    const domainDataX = domainsData[0];\n    const domainDataY = this.getNudgedYDomain(\n      domainsData[1],\n      threshold,\n      format,\n    );\n\n    return [domainDataX, domainDataY];\n  }\n\n  getNudgedYDomain(domainsDataY, threshold, format) {\n    const yDomain = clone(domainsDataY);\n\n    if (isFinite(threshold)) {\n      const yDomainMax = d3.max(domainsDataY);\n      const yDomainMin = d3.min(domainsDataY);\n      const needNudge = this.props.reverseGoalDirection\n        ? threshold < yDomainMax && format !== 'duration' // Don't nudge for negative goals for durations\n        : threshold > yDomainMin;\n      let nudge = 0;\n\n      if (needNudge) {\n        // When the threshold is higher than the smallest number\n        // we nudge the threshold to be a little bit bigger\n        // so that we ensure that when we run `nice` the last tick\n        // greater than the threshold, rather than *on* the threshold.\n        // We do this because having the last tick on the threshold\n        // doesn't leave us any background to colour in to show where the\n        // threshold is.\n        // All this logic is reversed when using reverseGoalDirection\n        nudge = (yDomainMax - yDomainMin) / 10;\n        if (this.props.reverseGoalDirection) {\n          nudge = -nudge;\n        }\n      }\n\n      // Extend domain with threshold + nudge\n      yDomain.push(threshold + nudge);\n    }\n\n    return yDomain;\n  }\n\n  computeBoundaries(context, domainsDataY) {\n    // Config boundaries if any or min/max from the datasets for the domain\n    let minYAxis, maxYAxis;\n\n    if (isFinite(context.minYAxis)) {\n      minYAxis = context.minYAxis;\n    }\n\n    if (isFinite(context.maxYAxis)) {\n      maxYAxis = context.maxYAxis;\n    }\n\n    // add 0 to determining y-axis minimum\n    // so the minimum is 0 when there are only positive numbers\n    minYAxis = !isUndefined(minYAxis) ? minYAxis : d3.min([0, ...domainsDataY]);\n    maxYAxis = !isUndefined(maxYAxis) ? maxYAxis : d3.max(domainsDataY);\n\n    // If all the values are zero, set a maximum y axis of 10, so we at least\n    // see something in the y-axis\n    if (minYAxis === 0 && maxYAxis === 0) {\n      maxYAxis = 10;\n    }\n\n    return { minYAxis, maxYAxis };\n  }\n\n  handleLegend(series) {\n    if (series.length > 1) {\n      // if more than 1 series display legends\n      // filter series with name supplied and not secondary type line\n      let seriesWithLegend = chain(series)\n        .filter('name')\n        .reject({ type: 'secondary' })\n        .value();\n\n      // Case when 2 lines with one secondary\n      const toClear =\n        seriesWithLegend.length === 1 &&\n        series.length === 2 &&\n        filter(series, { type: 'secondary' });\n\n      if (toClear) {\n        seriesWithLegend = [];\n      }\n      this.drawLegend(seriesWithLegend);\n    } else {\n      // Clear legend if any on refresh\n      this.chart\n        .select('.legends')\n        .selectAll('*')\n        .remove();\n    }\n  }\n\n  setClipPathIds(threshold, id) {\n    // Add unique id to clipaths\n    if (isFinite(threshold)) {\n      this.chart.select('.threshold-clip').attr('id', `threshold-clip-${id}`);\n    }\n    this.chart.select('.boundaries-clip').attr('id', `boundaries-clip-${id}`);\n  }\n\n  getChartSettings(series, x_axis, y_axis) {\n    const labelsAreStrings =\n      isUndefined(x_axis.type) &&\n      !isUndefined(x_axis.labels) &&\n      x_axis.labels.some(l => typeof l === 'string');\n\n    // Get the maximum number of data points for a series on the chart\n    // in order to create an x-axis, if none is passed\n    let maxDataPoints = 0;\n    series.forEach(seriesDatum => {\n      if (seriesDatum.data.length > maxDataPoints) {\n        maxDataPoints = seriesDatum.data.length;\n      }\n    });\n\n    if (labelsAreStrings) {\n      x_axis.type = xAxisTypes.standard;\n    }\n    return {\n      type: x_axis.type,\n      xLabels: isUndefined(x_axis.labels)\n        ? range(maxDataPoints)\n        : x_axis.labels,\n      formats: { y: y_axis },\n    };\n  }\n\n  defineYDomain(minYAxis, maxYAxis) {\n    this.y.domain([minYAxis, maxYAxis]);\n  }\n\n  defineXDomain(type, xLabels, domainsDataX) {\n    if (type === xAxisTypes.standard) {\n      this.x.domain([0, xLabels.length - 1]);\n    } else {\n      this.x.domain([d3.min(domainsDataX), d3.max(domainsDataX)]);\n    }\n  }\n\n  getScalingFactor() {\n    const el = findDOMNode(this);\n    const [clientWidth] = getClientSize(el);\n    const [scaledClientWidth] = getScaledClientSize(el);\n\n    return scaledClientWidth / clientWidth;\n  }\n\n  getBarOptions(numberOfSeries, numberOfDataPoints) {\n    const { tvMode } = this.props;\n    const options = {\n      numberOfSeries,\n      barSpacing: 1, // The space between each individual bar within a \"bar group\"\n      barGroupSpacing: 8, // The space between bar groups, ie. for each data point\n      maxBarWidth: tvMode ? TV_MAX_BAR_WIDTH : NON_TV_MAX_BAR_WIDTH,\n      minBarWidth: 1,\n    };\n\n    // The maximum available space for a bar group, given the maximum bar width, number of series and bar spacing\n    options.maxAvailableBarsWidth =\n      numberOfSeries * options.maxBarWidth +\n      numberOfSeries -\n      options.barSpacing;\n\n    // The potential space available based on the width of the chart and the number of data points\n    options.potentialAvailableBarsWidth =\n      Math.round(\n        this.calculatedChartWidth / (numberOfDataPoints / numberOfSeries),\n      ) - options.barGroupSpacing;\n\n    // Whichever of the above is the smallest number\n    options.availableBarsWidth = Math.min(\n      options.maxAvailableBarsWidth,\n      options.potentialAvailableBarsWidth,\n    );\n\n    // How wide each individual bar can be, given the avaialble width, bar spacing and number of series\n    options.availableBarWidth = Math.round(\n      (options.availableBarsWidth - (numberOfSeries - options.barSpacing)) /\n        numberOfSeries,\n    );\n\n    // The bar width that will be used (not smaller than the min, not bigger than the max)\n    options.barWidth = Math.max(\n      options.minBarWidth,\n      Math.min(options.maxBarWidth, options.availableBarWidth),\n    );\n\n    return options;\n  }\n\n  draw(data, threshold, barChartOptions) {\n    const seriesList = this.chart\n      .select('.series-list')\n      .selectAll('.series')\n      .data(data);\n\n    // Enter\n    seriesList\n      .enter()\n      .append('g')\n      .attr({\n        class: (d, i) => `series series-${i + 1}`,\n      });\n\n    const series = this.handleIncompletePaths(seriesList, 'bar');\n\n    series\n      .enter()\n      .append('g')\n      .attr('class', 'bar-group');\n    series.attr('class', d => d.classes);\n\n    const barsOverlapping = ([bars]) => {\n      if (!isArray(bars)) {\n        return false;\n      }\n\n      return bars.some(bar => {\n        const x = bar.x.baseVal.value;\n        const width = bar.width.baseVal.value;\n        const prevSibling = bar.previousSibling;\n\n        if (prevSibling !== null) {\n          const prevX = prevSibling.x.baseVal.value;\n\n          // Need to account for multiple series that could overlap with each other\n          return (\n            prevX !== undefined &&\n            x <\n              prevX +\n                width * barChartOptions.numberOfSeries +\n                barChartOptions.numberOfSeries * barChartOptions.barSpacing +\n                barChartOptions.barGroupSpacing\n          );\n        }\n\n        return false;\n      });\n    };\n\n    const buildBars = (aSeries, seriesDatum, seriesIndex) => {\n      // Remove existing bars\n      aSeries.selectAll('.bar').remove();\n\n      const bars = aSeries.selectAll('.bar').data(d => d.points);\n\n      bars\n        .enter()\n        .append('rect')\n        .attr('fill', () => seriesDatum.colour)\n        .attr('class', ([, y]) => {\n          const goalReached = this.props.reverseGoalDirection\n            ? y <= threshold\n            : y >= threshold;\n\n          if (goalReached) {\n            return 'bar goal';\n          }\n          return 'bar';\n        })\n        .attr(\n          'x',\n          point =>\n            this.x(point[0]) -\n            barChartOptions.availableBarsWidth / 2 +\n            seriesIndex * (barChartOptions.barWidth + 1),\n        )\n        .attr('y', point => {\n          // This calculation changes based on whether it's plotting a negative or positive number\n          // Positive = the y co-ordinate equals the y-value of the data point\n          // Negative = the y-co-ordinate equals 0 on the y-axi\n          if (isNil(point[1])) {\n            return 0;\n          }\n          if (point[1] >= 0) {\n            return this.y(point[1]);\n          }\n\n          return this.y(0);\n        })\n        .attr('height', point => {\n          // This calculation changes based on whether it's plotting a negative or a positive number\n          // Positive = the bar is as long as the 0-point minus the y-value of the data point (from 0 up)\n          // Negative = the bar is as long as the y-value of the data point minus the 0-point (from 0 down)\n          if (isNil(point[1])) {\n            return 0;\n          }\n          if (point[1] >= 0) {\n            return this.y(0) - this.y(point[1]);\n          }\n\n          return this.y(point[1]) - this.y(0);\n        })\n        .attr('width', barChartOptions.barWidth);\n\n      // If the bars are overlapping, we reduce the width of the bars by one\n      // and try again until it fits (down to a minimum of 1px)\n      if (barsOverlapping(bars) && barChartOptions.barWidth > 1) {\n        barChartOptions.barWidth = barChartOptions.barWidth - 1;\n        aSeries.selectAll('*').remove();\n        buildBars(aSeries, seriesDatum, seriesIndex);\n      }\n\n      bars.exit().remove();\n    };\n\n    series.each(function(seriesDatum, __, index) {\n      const aSeries = d3.select(this);\n      buildBars(aSeries, seriesDatum, index);\n    });\n\n    series.exit().remove();\n    seriesList.exit().remove();\n\n    return series;\n  }\n\n  afterRender() {\n    const context = this.sanitiseInput(this.props);\n\n    const {\n      x_axis = {},\n      y_axis = {},\n      threshold,\n      id,\n      numberFormat,\n      format,\n    } = context;\n\n    const thresholdNum = parseFloat(threshold);\n\n    let { series = [] } = context;\n    const chartSettings = this.getChartSettings(series, x_axis, y_axis);\n\n    this.setClipPathIds(thresholdNum, id);\n    this.setSvgDimensions();\n    this.setYScale();\n\n    series = this.preprocessSeries(series, context, chartSettings);\n\n    const numberOfDataPoints = max(series.map(item => item.data.length));\n\n    const [domainsDataX, domainsDataY] = this.computeDomains(\n      series,\n      thresholdNum,\n      format,\n    );\n    const { minYAxis, maxYAxis } = this.computeBoundaries(\n      context,\n      domainsDataY,\n    );\n\n    this.defineYDomain(minYAxis, maxYAxis);\n\n    // Ensure axis values are of the same magnitude\n    chartSettings.formats.y.referenceValue = chain(this.y.domain())\n      .map(Math.abs)\n      .max()\n      .value();\n    chartSettings.formats.y.numberFormat = numberFormat;\n\n    const isSmallWidget = this.w <= 145;\n    const chartWidth = isSmallWidget ? this.w : this.w - this.w / 20;\n    this.calculatedChartWidth = chartWidth;\n\n    const barChartOptions = this.getBarOptions(\n      series.length,\n      numberOfDataPoints,\n    );\n\n    this.drawGrid(\n      x_axis.type,\n      chartSettings,\n      thresholdNum,\n      numberOfDataPoints,\n      domainsDataX,\n      minYAxis,\n      maxYAxis,\n      barChartOptions,\n    );\n    this.handleLegend(series);\n\n    this.draw(series, thresholdNum, barChartOptions);\n\n    this.applyTooltip(series, chartSettings, domainsDataX);\n  }\n}\n\nColumnChartComponent.defaultProps = {\n  isPreviewMode: false,\n  reverseGoalDirection: false,\n};\n\nColumnChartComponent.propTypes = {\n  isPreviewMode: PropTypes.bool,\n  reverseGoalDirection: PropTypes.bool,\n  style: PropTypes.object,\n  tvMode: PropTypes.bool,\n  x_axis: PropTypes.object,\n};\n\nexport default ColumnChartComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout---3Tjb0\",\"leaderboard\":\"leaderboard---2jUw3\",\"arrow\":\"arrow---1ptV3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mapVisualisation\":\"mapVisualisation---2roLA\",\"topoSvg\":\"topoSvg---2pBdB\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---EwPJr\",\"feedWrapper\":\"feedWrapper---2p1_k\",\"previewLayout\":\"previewLayout---2dQK8\"};","module.exports = (__webpack_require__(28))(1108);","import PropTypes from 'prop-types';\nimport { Component } from 'react';\nimport { history } from '../router';\n\nclass HistoryProvider extends Component {\n  getChildContext() {\n    return { history };\n  }\n\n  render() {\n    const { children } = this.props;\n    return children;\n  }\n}\n\nHistoryProvider.childContextTypes = {\n  history: PropTypes.object,\n};\n\nHistoryProvider.propTypes = { children: PropTypes.node };\n\nexport default HistoryProvider;\n","export const ONE_SECOND = 1;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const THREE_MINUTES = 3 * ONE_MINUTE;\nexport const FIVE_MINUTES = 5 * ONE_MINUTE;\nexport const TEN_MINUTES = 10 * ONE_MINUTE;\nexport const FIFTEEN_MINUTES = 15 * ONE_MINUTE;\nexport const THIRTY_MINUTES = 30 * ONE_MINUTE;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const THREE_HOURS = 3 * ONE_HOUR;\nexport const SIX_HOURS = 6 * ONE_HOUR;\nexport const TWELVE_HOURS = 12 * ONE_HOUR;\nexport const TWENTY_FOUR_HOURS = 24 * ONE_HOUR;\n\n/*\n * Calculation of numRequests:\n * We assume that there are 4400 requests when polling every minute.\n *\n * 3m: 4400/3 = 1500 requests/minute\n * 1hr: 3600/60 = 100 requests/minute\n *\n * The requests per minute are also rounded up\n * to the nearest hundredth\n */\nconst REFRESH_INTERVALS = [\n  { label: 'minute', value: ONE_MINUTE, numRequests: 4400 },\n  { label: '3 minutes', value: THREE_MINUTES, numRequests: 1500 },\n  { label: '5 minutes', value: FIVE_MINUTES, numRequests: 900 },\n  { label: '10 minutes', value: TEN_MINUTES, numRequests: 500 },\n  { label: '15 minutes', value: FIFTEEN_MINUTES, numRequests: 350 },\n  { label: '30 minutes', value: THIRTY_MINUTES, numRequests: 200 },\n  { label: 'hour', value: ONE_HOUR, numRequests: 100 },\n  { label: '3 hours', value: THREE_HOURS, numRequests: 30 },\n  { label: '6 hours', value: SIX_HOURS, numRequests: 15 },\n  { label: '12 hours', value: TWELVE_HOURS, numRequests: 10 },\n  { label: '24 hours', value: TWENTY_FOUR_HOURS, numRequests: 5 },\n];\n\nexport default REFRESH_INTERVALS;\n","import createAction from '../../../lib/redux/create-action';\nimport createErrorAction from '../../../lib/redux/create-error-action';\n\nexport const dataReceived = createAction('InstrumentData:DATA_RECEIVED');\nexport const dataError = createErrorAction('InstrumentData:DATA_ERROR');\n","import { findIndex } from 'lodash';\nimport * as accountActions from '../actions/account-actions';\n\nconst accountReducer = (state = {}, action) => {\n  const { type, payload, error } = action;\n\n  switch (type) {\n    case accountActions.setPaymentInterval.type:\n      return {\n        ...state,\n        isAnnual: payload,\n      };\n\n    case accountActions.selectAddon.type: {\n      const { planId, addonId, quantity } = payload;\n\n      const { selectedAddons = {} } = state;\n      const addons = selectedAddons[planId] || [];\n      const index = findIndex(addons, { addonId }) || 0;\n      const updatedAddons = [\n        ...addons.slice(0, index),\n        { addonId, quantity },\n        ...addons.slice(index + 1),\n      ];\n      const updatedSelectedAddons = {\n        ...selectedAddons,\n        [planId]: updatedAddons,\n      };\n\n      return {\n        ...state,\n        selectedAddons: updatedSelectedAddons,\n      };\n    }\n\n    case accountActions.initialisePlansSuccess.type: {\n      const { plans, selectedAddons } = payload;\n\n      return {\n        ...state,\n        plans,\n        selectedAddons,\n      };\n    }\n\n    case accountActions.initialisePlansFailed.type:\n      return {\n        ...state,\n        error,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default accountReducer;\n","import accountReducer from './account-reducer';\n\nexport default accountReducer;\n","import { startsWith } from 'lodash';\n\n// Support 3 or 6 character hex codes\n// We don't support 4 or 8 character codes as we don't\n// want semi transparent colours.\nconst HEX_CODE_REGEX = /^#?[0-9A-F]{3}([0-9A-F]{3})?$/i;\n\nconst isHexCode = value => HEX_CODE_REGEX.test(value);\n\n// If the value is a valid hex code it is converted to\n// a six digit hex code with a hash prefix.\nconst toHexCode = value => {\n  if (!isHexCode(value)) {\n    return null;\n  }\n\n  let hexCode = value;\n  if (!startsWith(hexCode, '#')) {\n    hexCode = `#${hexCode}`;\n  }\n\n  if (hexCode.length === 4) {\n    hexCode = `#${hexCode[1]}${hexCode[1]}${hexCode[2]}${hexCode[2]}${hexCode[3]}${hexCode[3]}`;\n  }\n\n  return hexCode;\n};\n\nexport { isHexCode, toHexCode };\n","import { includes, isUndefined, startsWith } from 'lodash';\nimport * as customizeActions from '../actions/customize-actions';\nimport {\n  UPLOAD_LOGO_STATE_STARTED,\n  UPLOAD_LOGO_STATE_SUCCEEDED,\n  UPLOAD_LOGO_STATE_FAILED,\n  UPLOAD_CUSTOM_CSS_STATE_STARTED,\n  UPLOAD_CUSTOM_CSS_STATE_SUCCEEDED,\n  UPLOAD_CUSTOM_CSS_STATE_FAILED,\n} from '../customize-constants';\nimport { getBackgroundColor } from '../../dashboard/themes/utilities';\nimport {\n  USER_THEME,\n  DARK_THEME,\n  AUTO_WIDGET_STYLE,\n} from '../../dashboard/themes/theme-constants';\nimport { toHexCode } from '../../lib/hex-code';\nimport { FRAME_WIDTH } from '../../dashboard/box-layout/box-layout-constants';\nimport { applyRatioToWidgetLayout } from '../../dashboard/box-layout/helpers';\n\nconst initialState = {\n  originalColumnsValue: undefined,\n  isLoading: true,\n  isSaving: false,\n  uploadLogoState: null,\n  logoError: null,\n  uploadCustomCSSState: null,\n  customCSSError: null,\n  themeBackgroundColorInput: undefined,\n  showGridPreview: false,\n  values: undefined,\n};\n\nconst customizeReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case customizeActions.loading.type: {\n      return {\n        ...state,\n        isLoading: true,\n      };\n    }\n\n    case customizeActions.initialiseValues.type: {\n      const {\n        theme,\n        scale_when_fullscreen: scaleToFit,\n        tv_mode: tvMode,\n        toggles,\n        css,\n        customization = {},\n        columns,\n      } = payload.dashboard;\n\n      const {\n        showFooter = true,\n        showClock = true,\n        showLogo = true,\n        logoSrc = null,\n        themeBackgroundColor = getBackgroundColor(DARK_THEME),\n        themeWidgetStyle = AUTO_WIDGET_STYLE,\n      } = customization;\n\n      const largeTitles = includes(toggles, 'large_widget_titles');\n\n      const values = {\n        theme,\n        themeBackgroundColor,\n        themeWidgetStyle,\n        scaleToFit,\n        tvMode,\n        showFooter,\n        showClock,\n        showLogo,\n        logoSrc,\n        cssFile: css,\n        columns,\n        gridSize: FRAME_WIDTH / columns,\n        widgets: {\n          largeTitles,\n        },\n      };\n\n      return {\n        ...state,\n        originalColumnsValue: columns,\n        themeBackgroundColorInput: themeBackgroundColor,\n        isLoading: false,\n        values,\n        widgets: payload.widgets,\n      };\n    }\n\n    case customizeActions.cancel.type: {\n      return initialState;\n    }\n\n    case customizeActions.setTheme.type: {\n      const { theme, themeBackgroundColor } = state.values;\n      let newBackground = themeBackgroundColor;\n\n      if (payload === USER_THEME && isUndefined(themeBackgroundColor)) {\n        newBackground = getBackgroundColor(theme);\n      }\n\n      return {\n        ...state,\n        themeBackgroundColorInput: newBackground,\n        customCSSLoadedInPage: false,\n        values: {\n          ...state.values,\n          theme: payload,\n          themeBackgroundColor: newBackground,\n        },\n      };\n    }\n\n    case customizeActions.setThemeBackground.type: {\n      const color = startsWith(payload, '#') ? payload : `#${payload}`;\n      const {\n        values: { themeBackgroundColor },\n      } = state;\n      const newThemeBackgroundColor = toHexCode(color) || themeBackgroundColor;\n\n      return {\n        ...state,\n        themeBackgroundColorInput: color,\n        values: {\n          ...state.values,\n          themeBackgroundColor: newThemeBackgroundColor,\n        },\n      };\n    }\n\n    case customizeActions.setThemeWidgetStyle.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          themeWidgetStyle: payload,\n        },\n      };\n\n    case customizeActions.setShowGridPreview.type:\n      return {\n        ...state,\n        showGridPreview: payload,\n      };\n\n    case customizeActions.setScaleToFit.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          scaleToFit: payload,\n        },\n      };\n\n    case customizeActions.setTvMode.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          tvMode: payload,\n        },\n      };\n\n    case customizeActions.setLargeTitles.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          widgets: {\n            ...state.values.widgets,\n            largeTitles: payload,\n          },\n        },\n      };\n\n    case customizeActions.setShowFooter.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          showFooter: payload,\n        },\n      };\n\n    case customizeActions.setShowClock.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          showClock: payload,\n        },\n      };\n\n    case customizeActions.setShowLogo.type:\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          showLogo: payload,\n        },\n      };\n\n    case customizeActions.setLogoSuccessful.type:\n      return {\n        ...state,\n        logoError: null,\n        values: {\n          ...state.values,\n          logoSrc: payload,\n        },\n      };\n\n    case customizeActions.setLogoValidationFailed.type:\n    case customizeActions.setLogoFailed.type:\n      return {\n        ...state,\n        logoError: payload,\n        values: {\n          ...state.values,\n          logoSrc: null,\n        },\n      };\n\n    case customizeActions.saveStart.type:\n      return {\n        ...state,\n        isSaving: true,\n      };\n\n    case customizeActions.saveSuccessful.type:\n      return {\n        ...state,\n        values: undefined,\n        widgets: undefined,\n        isSaving: false,\n      };\n\n    case customizeActions.saveFailed.type:\n      return {\n        ...state,\n        isSaving: false,\n      };\n\n    case customizeActions.uploadLogoStart.type:\n      return {\n        ...state,\n        uploadLogoState: UPLOAD_LOGO_STATE_STARTED,\n      };\n\n    case customizeActions.uploadLogoSuccessful.type:\n      return {\n        ...state,\n        uploadLogoState: UPLOAD_LOGO_STATE_SUCCEEDED,\n        values: {\n          ...state.values,\n          logoSrc: payload,\n        },\n      };\n\n    case customizeActions.uploadLogoFailed.type:\n      return {\n        ...state,\n        uploadLogoState: UPLOAD_LOGO_STATE_FAILED,\n        logoError: 'customize.logoUploadFailed',\n        values: {\n          ...state.values,\n          logoSrc: null,\n        },\n      };\n\n    case customizeActions.setCustomCSSValidationFailed.type: {\n      return {\n        ...state,\n        customCSSError: payload,\n        values: {\n          ...state.values,\n          cssFile: null,\n        },\n      };\n    }\n\n    case customizeActions.uploadCustomCSSStart.type: {\n      return {\n        ...state,\n        customCSSError: null,\n        uploadCustomCSSState: UPLOAD_CUSTOM_CSS_STATE_STARTED,\n        customCSSLoadedInPage: false,\n      };\n    }\n\n    case customizeActions.uploadCustomCSSSuccessful.type: {\n      return {\n        ...state,\n        uploadCustomCSSState: UPLOAD_CUSTOM_CSS_STATE_SUCCEEDED,\n        values: {\n          ...state.values,\n          cssFile: payload,\n        },\n      };\n    }\n\n    case customizeActions.uploadCustomCSSFailed.type: {\n      return {\n        ...state,\n        uploadCustomCSSState: UPLOAD_CUSTOM_CSS_STATE_FAILED,\n        customCSSError: 'customize.css.uploadFailed',\n        values: {\n          ...state.values,\n          cssFile: null,\n        },\n      };\n    }\n\n    case customizeActions.setCustomCSSLoaded.type: {\n      return {\n        ...state,\n        customCSSLoadedInPage: true,\n      };\n    }\n\n    case customizeActions.setGridSize.type: {\n      const ratio = payload / state.values.gridSize;\n\n      const newWidgets = Object.keys(state.widgets).reduce((acc, widgetKey) => {\n        const widget = state.widgets[widgetKey];\n\n        acc[widgetKey] = {\n          ...widget,\n          layout: applyRatioToWidgetLayout(widget.layout, ratio),\n        };\n\n        return acc;\n      }, {});\n\n      return {\n        ...state,\n        widgets: newWidgets,\n        values: {\n          ...state.values,\n          gridSize: payload,\n        },\n      };\n    }\n\n    case customizeActions.setColumns.type: {\n      return {\n        ...state,\n        values: {\n          ...state.values,\n          columns: payload,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default customizeReducer;\nexport { initialState };\n","import customizeReducer, { initialState } from './customize-reducer';\nexport default customizeReducer;\nexport { initialState };\n","import * as dashboardActions from '../actions/dashboard-actions';\nimport * as sharingMenuActions from '../../sharing-menu/actions/sharing-menu-actions';\nimport * as widgetActions from '../../widget/actions/widget-actions';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport * as customizeActions from '../../customize/actions/customize-actions';\nimport { FRAME_WIDTH } from '../box-layout/box-layout-constants';\n\nexport const DASHBOARD_MODES = {\n  UNKNOWN: 'UNKNOWN',\n  SHARING: 'SHARING',\n  EDIT: 'EDIT',\n};\n\nconst ERRORS = {\n  error: null,\n  inviteError: null,\n  sharingError: null,\n  regenerateLinkError: null,\n};\n\nconst initialState = {\n  dashboard: undefined,\n  addressInput: {},\n  working: false,\n  dashboards: null,\n  draggingWidget: undefined,\n  areWidgetsLoaded: false,\n  isMobile: false,\n  mode: DASHBOARD_MODES.UNKNOWN,\n  ...ERRORS,\n};\n\nconst dashboardReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case dashboardActions.setSharingMode.type:\n      return {\n        ...state,\n        ...ERRORS,\n        mode: DASHBOARD_MODES.SHARING,\n      };\n    case dashboardActions.setEditMode.type:\n      return {\n        ...state,\n        ...ERRORS,\n        mode: DASHBOARD_MODES.EDIT,\n      };\n    case dashboardActions.setDashboard.type:\n      return {\n        ...state,\n        ...ERRORS,\n        dashboard: payload,\n        gridSize: FRAME_WIDTH / payload.columns,\n        scaleFactor: undefined,\n        classicboardScaleFactor: undefined,\n        dashboardWidth: undefined,\n      };\n\n    case dashboardActions.changeDashboard.type:\n      return {\n        ...state,\n        ...ERRORS,\n        dashboard: payload,\n      };\n\n    case customizeActions.saveSuccessful.type:\n      return {\n        ...state,\n        dashboard: {\n          ...state.dashboard,\n          ...payload.dashboard,\n        },\n        gridSize: FRAME_WIDTH / payload.dashboard.columns,\n      };\n\n    case dashboardActions.setAddress.type:\n      return {\n        ...state,\n        ...ERRORS,\n        addressInput: payload,\n      };\n\n    case dashboardActions.inviteUpdating.type:\n      return {\n        ...state,\n        ...ERRORS,\n        working: true,\n      };\n\n    case dashboardActions.inviteFailed.type:\n      return {\n        ...state,\n        ...ERRORS,\n        working: false,\n      };\n\n    case toastActions.showToast.type:\n    case dashboardActions.inviteSuccessful.type:\n      return {\n        ...state,\n        ...ERRORS,\n        addressInput: {},\n        working: false,\n      };\n\n    case dashboardActions.dashboardError.type:\n      return {\n        ...state,\n        ...ERRORS,\n        error: payload,\n      };\n\n    case dashboardActions.setCurrentDashboardSharingLink.type:\n      return {\n        ...state,\n        dashboard: {\n          ...state.dashboard,\n          sharing_hash: payload,\n        },\n      };\n\n    case sharingMenuActions.regenerateSharingLinkSuccess.type:\n      return {\n        ...state,\n        ...ERRORS,\n        regenerateLinkError: null,\n      };\n\n    case sharingMenuActions.regenerateSharingLinkFailure.type:\n      return {\n        ...state,\n        ...ERRORS,\n        regenerateLinkError: 'share.regenerateError',\n      };\n\n    case dashboardActions.updateSharingError.type:\n      return {\n        ...state,\n        ...ERRORS,\n        sharingError: payload,\n      };\n\n    case dashboardActions.inviteError.type:\n      return {\n        ...state,\n        ...ERRORS,\n        working: false,\n        inviteError: payload,\n      };\n\n    case dashboardActions.setDashboardTitleStart.type:\n      return {\n        ...state,\n        dashboard: {\n          ...state.dashboard,\n          title: payload,\n        },\n      };\n\n    case dashboardActions.setDashboardScaleFactor.type:\n      return {\n        ...state,\n        scaleFactor: payload.scale,\n        dashboardWidth: payload.dashboardWidth,\n      };\n\n    case dashboardActions.setClassicboardScaleFactor.type:\n      return {\n        ...state,\n        classicboardScaleFactor: payload,\n      };\n\n    case widgetActions.widgetDragStart.type:\n      return {\n        ...state,\n        draggingWidget: payload,\n      };\n\n    case widgetActions.widgetDragEnd.type:\n      return {\n        ...state,\n        draggingWidget: undefined,\n      };\n\n    case widgetActions.setWidgets.type: {\n      return {\n        ...state,\n        areWidgetsLoaded: true,\n      };\n    }\n\n    case dashboardActions.setIsMobile.type: {\n      return {\n        ...state,\n        isMobile: payload,\n      };\n    }\n\n    case dashboardActions.setImportingService.type: {\n      return {\n        ...state,\n        importingService: payload,\n        isImportingModalOpen: true,\n      };\n    }\n    case dashboardActions.toggleImportingModal.type: {\n      return {\n        ...state,\n        isImportingModalOpen: payload.open,\n        openModalService: payload.service,\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default dashboardReducer;\n","import dashboardReducer from './dashboard-reducer';\n\nexport default dashboardReducer;\n","import * as adminActions from '../../admin/actions/admin-actions';\nimport * as groupActions from '../../groups/actions/groups-actions';\nimport * as dashboardActions from '../../dashboard/actions/dashboard-actions';\nimport { omit } from 'lodash';\n\nconst initialState = {};\n\nconst allDashboardsReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case dashboardActions.setDashboards.type:\n    case groupActions.getDashboardsSuccess.type: {\n      const entities = payload.reduce(\n        (acc, dashboard) => ({\n          ...acc,\n          [dashboard.id]: dashboard,\n        }),\n        {},\n      );\n\n      return { ...entities };\n    }\n\n    case dashboardActions.addDashboard.type:\n    case dashboardActions.changeDashboard.type: {\n      return {\n        ...state,\n        [payload.id]: payload,\n      };\n    }\n\n    case dashboardActions.deleteDashboard.type: {\n      return omit(state, payload);\n    }\n\n    case adminActions.regenerateDashboardSharingLinkSuccess.type: {\n      const { dashboardId, sharingHash } = payload;\n\n      return {\n        ...state,\n        [dashboardId]: {\n          ...state[dashboardId],\n          sharing_hash: sharingHash,\n        },\n      };\n    }\n\n    case adminActions.deleteDashboardSuccess.type: {\n      return omit(state, [payload.dashboardId]);\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default allDashboardsReducer;\nexport { initialState };\n","import { mapKeys, omit } from 'lodash';\nimport * as adminActions from '../../admin/actions/admin-actions';\nimport * as loopActions from '../actions/loop-actions';\n\nconst initialState = {};\n\nconst allLoopsReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case loopActions.getLoopsSuccess.type: {\n      return mapKeys(payload.loops, loop => loop.id);\n    }\n\n    case loopActions.createLoopSuccess.type: {\n      const { id } = payload;\n      return {\n        ...state,\n        [id]: payload,\n      };\n    }\n\n    case loopActions.updateLoopSuccess.type: {\n      const { loopId, loop: updatedLoop } = payload;\n      return {\n        ...state,\n        [loopId]: {\n          ...state[loopId],\n          ...updatedLoop,\n        },\n      };\n    }\n\n    case loopActions.deleteLoopSuccess.type: {\n      return omit(state, payload);\n    }\n\n    case adminActions.regenerateLoopSharingLinkSuccess.type: {\n      const { loopId, code } = payload;\n\n      return {\n        ...state,\n        [loopId]: {\n          ...state[loopId],\n          code,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default allLoopsReducer;\nexport { initialState };\n","import { mapKeys, omit } from 'lodash';\nimport * as groupActions from '../../groups/actions/groups-actions';\n\nconst initialState = {};\n\nconst allDataSourcesReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case groupActions.getDataSourcesSuccess.type: {\n      const { dataSources } = payload;\n\n      return mapKeys(dataSources, dataSource => dataSource.id);\n    }\n\n    case groupActions.deleteDataSourceSuccess.type:\n      return omit(state, payload.dataSourceId);\n\n    case groupActions.reconnectDataSourceSuccess.type: {\n      const { dataSourceId } = payload;\n\n      return {\n        ...state,\n        [dataSourceId]: {\n          ...state[dataSourceId],\n          expired: false,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default allDataSourcesReducer;\nexport { initialState };\n","import updateById from './update-by-id';\nexport default updateById;\n","const updateById = (items, id, fn) =>\n  items.map(item => {\n    if (item.id !== id) {\n      return item;\n    }\n\n    return fn(item);\n  });\n\nexport default updateById;\n","import { reject, find, without, omit } from 'lodash';\nimport * as groupActions from '../../groups/actions/groups-actions';\nimport * as peopleActions from '../../people/actions/people-actions';\nimport updateById from '../../lib/update-by-id';\n\nconst initialState = {};\n\nconst userById = (allUsers, userId) => {\n  const users = [\n    ...(allUsers.owners || []),\n    ...(allUsers.members || []),\n    ...(allUsers.viewers || []),\n  ];\n  return find(users, { id: userId });\n};\n\nconst tidyUsers = users => {\n  return {\n    owners: users.owners,\n    members: users.members,\n    viewers: users.viewers.map(viewer => {\n      const tidied = { ...viewer };\n      // Remove these fields as this state\n      // is now managed by the `usersDashboards`\n      // reducer.\n      delete tidied.dashboards_shared;\n      delete tidied.dashboard_ids;\n      return tidied;\n    }),\n  };\n};\n\nconst makeUserAccountOwner = (users, userId) => {\n  const { owners, members, viewers } = users;\n\n  const user = userById(users, userId);\n  const newAccountOwner = {\n    ...user,\n    owner: true,\n  };\n  delete newAccountOwner.permission;\n\n  return {\n    owners: [...owners, newAccountOwner],\n    members: without(members, user),\n    viewers: without(viewers, user),\n  };\n};\n\nconst makeUserMemberViewer = (users, userId) => {\n  const { owners, members, viewers } = users;\n\n  const user = userById(users, userId);\n  const promotedUser = { ...user, permission: 'read_only' };\n\n  return {\n    owners: without(owners, user),\n    members: [...members, promotedUser],\n    viewers: without(viewers, user),\n  };\n};\n\nconst revokeAccountOwner = (users, { userId }) => {\n  const { owners, members } = users;\n  const user = userById(users, userId);\n  const newMember = {\n    ...user,\n    permission: 'admin',\n  };\n  delete newMember.owner;\n\n  return {\n    ...users,\n    owners: without(owners, user),\n    members: [...members, newMember],\n  };\n};\n\nconst allUsersReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case groupActions.getPeopleSuccess.type:\n      const { people } = payload;\n\n      return {\n        ...state,\n        ...tidyUsers(people),\n      };\n\n    case groupActions.demoteToDashboardViewOnlySuccessful.type: {\n      const { userId } = payload;\n      const { members, viewers } = state;\n\n      const user = find(members, { id: userId });\n      const dashboardViewOnlyUser = { ...user };\n      delete dashboardViewOnlyUser.permission;\n\n      return {\n        ...state,\n        members: without(members, user),\n        viewers: [...viewers, dashboardViewOnlyUser],\n      };\n    }\n\n    case peopleActions.deleteUserStart.type: {\n      const { userId } = payload;\n      const { owners, members, viewers } = state;\n\n      const updateUsers = users =>\n        updateById(users, userId, user => ({\n          ...user,\n          isBeingDeleted: true,\n        }));\n\n      return {\n        ...state,\n        owners: updateUsers(owners),\n        members: updateUsers(members),\n        viewers: updateUsers(viewers),\n      };\n    }\n\n    case peopleActions.deleteUserSuccessful.type: {\n      const { userId } = payload;\n      const { owners, members, viewers } = state;\n\n      return {\n        ...state,\n        owners: reject(owners, { id: userId }),\n        members: reject(members, { id: userId }),\n        viewers: reject(viewers, { id: userId }),\n      };\n    }\n\n    case peopleActions.deleteUserFailed.type: {\n      const { userId } = payload;\n      const { owners, members, viewers } = state;\n\n      const updateUsers = users =>\n        updateById(users, userId, user => omit(user, 'isBeingDeleted'));\n\n      return {\n        ...state,\n        owners: updateUsers(owners),\n        members: updateUsers(members),\n        viewers: updateUsers(viewers),\n      };\n    }\n\n    case groupActions.setPermissionsStart.type:\n    case groupActions.setPermissionsFailed.type: {\n      const { userId, role } = payload;\n      const { members } = state;\n\n      return {\n        ...state,\n        members: updateById(members, userId, user => ({\n          ...user,\n          permission: role,\n        })),\n      };\n    }\n\n    case groupActions.makeAccountOwnerSuccess.type:\n      return {\n        ...makeUserAccountOwner(state, payload),\n      };\n\n    case groupActions.promoteToMemberSuccess.type:\n      const { userId } = payload;\n\n      return {\n        ...makeUserMemberViewer(state, userId),\n      };\n\n    case groupActions.revokeAccountOwnerSuccess.type:\n      return {\n        ...revokeAccountOwner(state, payload),\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default allUsersReducer;\nexport { initialState, userById };\n","import * as containerLayoutActions from '../actions/container-layout-actions';\n\nconst initialState = {\n  resizingContainer: null,\n  emptySpaces: null,\n  hoveredArea: null,\n  selectedContainer: null,\n};\n\nconst containerLayoutReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case containerLayoutActions.setSelectedContainer.type:\n      return {\n        ...state,\n        selectedContainer: payload,\n      };\n\n    case containerLayoutActions.deselectContainer.type:\n      return {\n        ...state,\n        selectedContainer: null,\n      };\n    case containerLayoutActions.resizeContainerStart.type:\n      const isSelectedContainer = state.selectedContainer === payload;\n\n      return {\n        ...state,\n        resizingContainer: payload,\n        selectedContainer: isSelectedContainer ? state.selectedContainer : null,\n      };\n    case containerLayoutActions.resizeContainerEnd.type:\n      return {\n        ...state,\n        resizingContainer: null,\n      };\n    case containerLayoutActions.setEmptySpaces.type:\n      return {\n        ...state,\n        emptySpaces: payload,\n      };\n    case containerLayoutActions.removeEmptySpaces.type:\n      return {\n        ...state,\n        emptySpaces: null,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default containerLayoutReducer;\nexport { initialState };\n","import containerLayoutReducer from './container-layout-reducer';\nexport default containerLayoutReducer;\n","import datasetReducer from './dataset-reducer';\n\nexport default datasetReducer;\n","import * as dataSourceConnectorActions from '../actions/data-source-connector-actions';\nimport * as initDataSourceActions from '../actions/init-data-source-action';\nimport * as pickerActions from '../../file-picker/actions/picker-actions';\n\nconst initialState = {\n  isServiceAccountExpired: false,\n};\n\nconst dataSourceConnectorReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case initDataSourceActions.fileFetchStart.type:\n      return {\n        ...state,\n        isSwitchingService: true,\n      };\n\n    case pickerActions.fetchFilesSuccess.type:\n      return {\n        ...state,\n        isSwitchingService: false,\n        isServiceAccountExpired: false,\n        isLoading: false,\n      };\n\n    case initDataSourceActions.initDataSourceSuccessful.type:\n    case dataSourceConnectorActions.switchServiceSuccessful.type:\n      return {\n        ...state,\n        serviceName: payload.serviceName,\n        serviceAccountId: payload.serviceAccountId,\n        errorMessage: null,\n        isLoading: false,\n        isSwitchingService: false,\n        isServiceAccountExpired: false,\n      };\n\n    case dataSourceConnectorActions.switchServiceStart.type:\n      return {\n        ...state,\n        serviceName: payload.serviceName,\n        isSwitchingService: true,\n        isServiceAccountExpired: false,\n        serviceAccountId: payload.serviceAccountId,\n      };\n\n    case dataSourceConnectorActions.accountAddSuccessful.type:\n      return {\n        ...state,\n        serviceName: payload.serviceName,\n        serviceAccountId: payload.serviceAccountId,\n        errorMessage: null,\n        isSwitchingAccount: false,\n      };\n\n    case dataSourceConnectorActions.switchAccountStart.type:\n      return {\n        ...state,\n        serviceAccountId: payload.serviceAccountId,\n        isSwitchingAccount: true,\n        isServiceAccountExpired: false,\n      };\n\n    case dataSourceConnectorActions.switchAccountSuccessful.type:\n      return {\n        ...state,\n        serviceAccountId: payload.serviceAccountId,\n        errorMessage: null,\n        isSwitchingAccount: false,\n        isServiceAccountExpired: false,\n      };\n\n    case initDataSourceActions.initDataSourceFailed.type:\n    case dataSourceConnectorActions.initFailed.type:\n    case dataSourceConnectorActions.accountAddFailed.type:\n      return {\n        ...state,\n        errorMessage: payload.message,\n        isLoading: false,\n        isSwitchingService: false,\n        isSwitchingAccount: false,\n        serviceName: payload.serviceName,\n        isOauthWindowOpen: false,\n      };\n\n    case pickerActions.fetchFilesFailed.type:\n      return {\n        ...state,\n        isLoading: false,\n        isSwitchingService: false,\n        isSwitchingAccount: false,\n        isServiceAccountExpired: payload.isServiceAccountExpired,\n      };\n\n    case initDataSourceActions.initDataSourceStart.type:\n      return {\n        ...state,\n        isLoading: true,\n      };\n\n    case dataSourceConnectorActions.setState.type:\n      return {\n        ...state,\n        ...payload,\n      };\n\n    case pickerActions.closeFilePicker.type:\n    case dataSourceConnectorActions.connectionCancelled.type:\n      return {\n        ...state,\n        isInfoVisible: undefined,\n        isPanelVisible: undefined,\n        isOauthWindowOpen: false,\n      };\n\n    case dataSourceConnectorActions.togglesOAuthWindow.type:\n      return {\n        ...state,\n        isOauthWindowOpen: payload,\n      };\n\n    case dataSourceConnectorActions.createConnectionFailed.type:\n      const { payload: errorMessage } = action;\n      return {\n        ...state,\n        errorMessage,\n        isOauthWindowOpen: false,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default dataSourceConnectorReducer;\n","import dataSourceConnectorReducer from './data-source-connector-reducer';\nexport default dataSourceConnectorReducer;\n","import * as dataSourcesActions from '../actions/data-sources-actions';\nimport * as mirageActions from '../../universal-config/mirage/mirage-actions';\nimport { find } from 'lodash';\nimport { buildServiceList, transformServices } from '../data-sources-helpers';\n\nconst formatServices = (services, organizationCreated, featureFlags) => {\n  const serviceList = buildServiceList(\n    services,\n    organizationCreated,\n    featureFlags,\n  );\n  return transformServices(serviceList, featureFlags);\n};\n\nconst dataSourcesReducer = (state = {}, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case dataSourcesActions.set.type:\n      // Services are used in multiple places throughout the app.\n      // formattedServices are used for the list of integrations.\n      // Maybe refactor this in the future so service-list-connector gets it's own reducer and/or actions\n      return {\n        ...state,\n        services: payload.services,\n        formattedServices: formatServices(\n          payload.services,\n          payload.organizationCreated,\n          payload.featureFlags,\n        ),\n        recentlyConnectedIds: payload.recently_connected,\n      };\n    case dataSourcesActions.update.type:\n      const { services: current = [] } = state || {};\n      if (!current || !current.length) {\n        return {\n          ...state,\n          services: payload,\n        };\n      }\n\n      const services = current.map(s => {\n        const newService = find(payload, { id: s.id });\n        return { ...s, ...newService };\n      });\n      return {\n        ...state,\n        services,\n      };\n    case dataSourcesActions.setRecentlyConnected.type:\n      return {\n        ...state,\n        recentlyConnected: transformServices(payload),\n      };\n    case dataSourcesActions.setFiltered.type:\n      return {\n        ...state,\n        filteredServices: payload.filteredServices,\n        filterQuery: payload.filterQuery,\n      };\n    case mirageActions.setActivatedIntegrations.type:\n      return {\n        ...state,\n        activatedMirageIntegrations: payload,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default dataSourcesReducer;\n","import dataSourcesReducer from './data-sources-reducer';\n\nexport default dataSourcesReducer;\n","import * as dataSourceConnectorActions from '../../actions/data-source-connector-actions';\nimport { get } from 'lodash';\nimport { usesOAuth } from '../../../lib/service';\n\nconst USERNAME_FIELD = {\n  name: 'user',\n  label: 'Username',\n  type: 'input',\n  help: 'Username for HTTP basic authentication',\n};\nconst PASSWORD_FIELD = {\n  name: 'password',\n  label: 'Password',\n  type: 'password',\n  help: 'Password for HTTP basic authentication',\n};\n\nconst initialState = {\n  fields: null,\n};\n\nfunction determineConnectionFields(service) {\n  const { auth_type: authType, options } = service;\n  const fields = get(options, 'connectScreen.fields', []);\n\n  if ('basic' === authType && !fields.length) {\n    return [USERNAME_FIELD, PASSWORD_FIELD];\n  }\n\n  return fields;\n}\n\nconst defaultDataSourceConnectorReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case dataSourceConnectorActions.fetchServiceSuccessful.type:\n      const { service, groupId } = payload;\n      const fields = determineConnectionFields(service);\n\n      return {\n        ...state,\n        service,\n        fields,\n        usesOAuth: usesOAuth(service),\n        groupId,\n      };\n    case dataSourceConnectorActions.fetchServiceFailed.type:\n    case dataSourceConnectorActions.createConnectionFailed.type:\n      const { payload: errorMessage } = action;\n\n      return {\n        ...state,\n        errorMessage,\n        isOauthWindowOpen: false,\n      };\n    case dataSourceConnectorActions.togglesOAuthWindow.type:\n      return {\n        ...state,\n        isOauthWindowOpen: payload,\n      };\n    case dataSourceConnectorActions.createConnectionSuccessful.type:\n      return {\n        ...state,\n        errorMessage: undefined,\n        isOauthWindowOpen: false,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default defaultDataSourceConnectorReducer;\n","import defaultDataSourceConnectorReducer from './default-data-source-connector-reducer';\nexport default defaultDataSourceConnectorReducer;\n","import * as deleteDataSourceConfirmModalActions from '../actions/delete-data-source-confirm-modal-actions';\nimport * as groupsActions from '../../../../../groups/actions/groups-actions';\n\nconst initialState = {\n  isModalOpen: false,\n  connectionId: undefined,\n  widgets: undefined,\n  dashboardCount: undefined,\n  widgetCount: undefined,\n  isDeleting: false,\n};\n\nconst deleteDataSourceConfirmModalReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case deleteDataSourceConfirmModalActions.openModal.type:\n      return {\n        ...state,\n        isModalOpen: true,\n        connectionId: payload,\n      };\n\n    case groupsActions.deleteDataSourceStart.type:\n      return {\n        ...state,\n        isDeleting: true,\n      };\n\n    case groupsActions.deleteDataSourceSuccess.type:\n    case groupsActions.deleteDataSourceFailed.type:\n    case deleteDataSourceConfirmModalActions.closeModal.type:\n      return {\n        ...state,\n        isModalOpen: false,\n        connectionId: undefined,\n        widgets: undefined,\n        dashboardCount: undefined,\n        widgetCount: undefined,\n        isDeleting: false,\n      };\n\n    case deleteDataSourceConfirmModalActions.setConnectionWidgetsData.type:\n      return {\n        ...state,\n        ...payload,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default deleteDataSourceConfirmModalReducer;\nexport { initialState };\n","import deleteDataSourceConfirmModalReducer from './delete-data-source-confirm-modal-reducer';\n\nexport default deleteDataSourceConfirmModalReducer;\n","import * as editWidgetActions from '../actions/edit-widget-actions';\nimport * as widgetMenuActions from '../../../widget-menu/actions/widget-menu-actions';\nimport { transformers } from '../../../universal';\n\nconst initialState = {\n  widgetKey: undefined,\n  serviceName: undefined,\n  refresh_interval: undefined,\n  config: undefined,\n};\n\nconst getTimeStamp = () => new Date().toISOString();\nconst defaultApplyConfig = d => d;\nconst getApplyConfig = (serviceName, vizType) =>\n  transformers[serviceName][vizType].applyConfig || defaultApplyConfig;\nconst getTransformer = (serviceName, vizType) =>\n  transformers[serviceName][vizType].transform;\n\nconst editWidgetReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case widgetMenuActions.openEditWidget.type: {\n      if (!payload) return state;\n\n      const { widget, data } = payload;\n      const {\n        widgetKey,\n        refresh_interval: refreshInterval,\n        serviceName,\n        config,\n      } = widget;\n\n      return {\n        widgetKey,\n        refresh_interval: refreshInterval,\n        serviceName,\n        config,\n        transformedData: data,\n      };\n    }\n\n    case editWidgetActions.setConfig.type: {\n      const { config, serviceName, transformedData = {} } = state;\n      const newConfig = {\n        ...config,\n        ...payload,\n      };\n      const applyConfig = getApplyConfig(serviceName, newConfig.type);\n      const data = applyConfig(transformedData.data, newConfig);\n\n      return {\n        ...state,\n        config: {\n          ...config,\n          ...payload,\n        },\n        transformedData: {\n          data,\n          updatedAt: getTimeStamp(),\n        },\n      };\n    }\n\n    case editWidgetActions.setConfigAndData.type: {\n      const { config, data } = payload;\n      const { serviceName } = state;\n      const transform = getTransformer(serviceName, config.type);\n\n      return {\n        ...state,\n        config,\n        transformedData: {\n          data: transform(data, config),\n          updatedAt: getTimeStamp(),\n        },\n      };\n    }\n\n    case editWidgetActions.changeRefreshInterval.type: {\n      if (!payload) return state;\n\n      return {\n        ...state,\n        refresh_interval: payload,\n      };\n    }\n\n    case widgetMenuActions.closeMenu.type: {\n      return initialState;\n    }\n\n    default: {\n      return state;\n    }\n  }\n};\n\nexport { editWidgetReducer as default, initialState };\n","import editWidgetReducer from './edit-widget-reducer';\nexport default editWidgetReducer;\n","import { filter } from 'lodash';\nimport * as pickerActions from '../actions/picker-actions';\nimport * as dataSourceConnectorActions from '../../data-source-connector/actions/data-source-connector-actions';\nimport * as initDataSourceActions from '../../data-source-connector/actions/init-data-source-action';\n\nconst initialState = {\n  selected: null,\n  files: [],\n  _cachedFiles: [],\n  errorMessage: null,\n  folder: null,\n};\n\nconst filterFiles = (state, attribute, query) => {\n  let { _cachedFiles: files = [] } = state;\n  const { folder } = state;\n\n  if (folder) {\n    files = filter(files, { folder });\n  }\n\n  return files.filter(file => {\n    const value = file[attribute] || '';\n\n    return value.toLowerCase().indexOf(query.toLowerCase()) !== -1;\n  });\n};\n\nconst filterWithinFolder = (state, folder) => {\n  const { files, _cachedFiles } = state;\n\n  if (!folder) {\n    return _cachedFiles;\n  }\n\n  return filter(files, { folder });\n};\n\nconst filePickerReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case pickerActions.fetchFilesStart.type:\n      return {\n        ...state,\n        errorMessage: null,\n        isFetching: true,\n      };\n    case pickerActions.fetchFilesSuccess.type:\n    case initDataSourceActions.initDataSourceSuccessful.type:\n    case dataSourceConnectorActions.accountAddSuccessful.type:\n    case dataSourceConnectorActions.switchAccountSuccessful.type:\n    case dataSourceConnectorActions.switchServiceSuccessful.type:\n      const newState = {\n        ...state,\n        errorMessage: null,\n        importErrorMessage: null,\n        selected: null,\n        isFetching: false,\n        folder: null,\n        query: null,\n      };\n\n      if (payload.files) {\n        newState.files = payload.files;\n        newState._cachedFiles = newState.files;\n      }\n\n      return newState;\n    case pickerActions.fetchFilesFailed.type:\n      return {\n        ...state,\n        files: [],\n        errorMessage: payload.message,\n        isFetching: false,\n      };\n    case pickerActions.filter.type:\n      const { attribute, query } = payload;\n\n      return {\n        ...state,\n        files: filterFiles(state, attribute, query),\n        query,\n      };\n    case pickerActions.folderSelected.type:\n      const { folder } = payload;\n\n      return {\n        ...state,\n        files: filterWithinFolder(state, folder),\n        folder,\n        errorMessage: null,\n      };\n    case pickerActions.obtainUUIDError.type:\n      return {\n        ...state,\n        errorMessage: null,\n        importErrorMessage: payload.message,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default filePickerReducer;\n","import filePickerReducer from './file-picker-reducer';\n\nexport default filePickerReducer;\n","import * as graphQLDashboardActions from '../graphql-actions/graphql-dashboard-actions';\n\nconst initialState = {\n  celebrationInstrument: {},\n};\n\nconst graphQLDashboardReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case graphQLDashboardActions.launchInstrumentCelebration.type:\n      const { id, data, size } = payload;\n      return {\n        ...state,\n        celebrationInstrument: {\n          id,\n          data,\n          size,\n        },\n      };\n    case graphQLDashboardActions.finishInstrumentCelebration.type:\n      if (payload === state.celebrationInstrument.id) {\n        return {\n          ...state,\n          celebrationInstrument: {},\n        };\n      }\n      return state;\n    default:\n      return state;\n  }\n};\n\nexport default graphQLDashboardReducer;\nexport { initialState };\n","import graphQLDashboardReducer from './graphql-dashboard-reducer';\n\nexport default graphQLDashboardReducer;\n","import { reject } from 'lodash';\nimport * as manageScreensActions from '../actions/manage-screens-actions';\nimport { formatMessage } from '../../lib/i18n';\n\nconst initialState = {\n  isModalOpen: false,\n  isConnecting: false,\n  currentView: undefined,\n  isFetchingDevices: false,\n  error: undefined,\n};\n\nconst manageScreensReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  let devices;\n\n  switch (type) {\n    case manageScreensActions.setView.type:\n      return {\n        ...state,\n        currentView: payload,\n        isModalOpen: true,\n        error: undefined,\n      };\n\n    case manageScreensActions.openModal.type:\n      return {\n        ...state,\n        currentView: 'manage',\n        isModalOpen: true,\n        error: undefined,\n      };\n\n    case manageScreensActions.closeModal.type:\n      return {\n        ...state,\n        currentView: undefined,\n        isModalOpen: false,\n        error: undefined,\n      };\n\n    case manageScreensActions.openUpgradeModal.type:\n      return {\n        ...state,\n        currentView: 'upgrade',\n        isModalOpen: true,\n      };\n\n    case manageScreensActions.setDevices.type:\n      devices = payload || [];\n\n      return {\n        ...state,\n        devices,\n        currentView: devices.length === 0 ? 'add' : state.currentView,\n      };\n\n    case manageScreensActions.fetchDevicesStart.type:\n      return {\n        ...state,\n        isFetchingDevices: true,\n        error: undefined,\n      };\n\n    case manageScreensActions.fetchDevicesSuccess.type:\n      devices = payload || [];\n\n      return {\n        ...state,\n        devices,\n        isFetchingDevices: false,\n        currentView: devices.length === 0 ? 'add' : state.currentView,\n      };\n\n    case manageScreensActions.fetchDevicesFailed.type:\n      return {\n        ...state,\n        isFetchingDevices: false,\n        error: formatMessage('screens.errorFetchingDevices'),\n      };\n\n    case manageScreensActions.connectDeviceStart.type:\n      return {\n        ...state,\n        isConnecting: true,\n        error: undefined,\n      };\n\n    case manageScreensActions.connectDeviceSuccess.type:\n      return {\n        ...state,\n        isConnecting: false,\n        isModalOpen: false,\n      };\n\n    case manageScreensActions.connectDeviceFailed.type:\n      return {\n        ...state,\n        isConnecting: false,\n        error: payload.message,\n      };\n\n    case manageScreensActions.deleteDeviceStart.type:\n      devices = reject(state.devices, device => device.id === payload);\n\n      return {\n        ...state,\n        devices,\n        currentView: devices.length === 0 ? 'add' : state.currentView,\n      };\n\n    case manageScreensActions.setDeviceNameStart.type:\n      devices = state.devices.map(device => {\n        if (device.id === payload.id) {\n          return {\n            ...device,\n            name: payload.name,\n          };\n        }\n\n        return device;\n      });\n\n      return {\n        ...state,\n        devices,\n      };\n\n    case manageScreensActions.setDeviceConnectionStart.type:\n      devices = state.devices.map(device => {\n        if (device.id === payload.id) {\n          return {\n            ...device,\n            content: {\n              id: payload.dashboardId,\n              type: payload.type,\n            },\n          };\n        }\n\n        return device;\n      });\n\n      return {\n        ...state,\n        devices,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default manageScreensReducer;\n","import manageScreensReducer from './manage-screens-reducer';\n\nexport default manageScreensReducer;\n","import * as notificationActions from '../actions/notification-actions';\nimport * as spreadsheetConfigActions from '../../spreadsheet-config/actions/spreadsheet-config-actions';\nimport * as spreadsheetActions from '../../spreadsheet-config/actions/spreadsheet-actions';\n\nconst WIDGET_SAVE_ERROR = 'Sorry, we were unable to save your widget';\nconst WIDGET_FETCH_ERROR = 'Sorry, we were unable to load your widget';\nconst WORKSHEET_FETCH_ERROR = 'Sorry, we were unable to load your worksheet';\n\nconst initialState = {\n  message: null,\n  type: null,\n};\n\nconst notificationReducer = (state = initialState, action) => {\n  const { type, error } = action;\n\n  switch (type) {\n    case notificationActions.clearNotification.type:\n      return {\n        message: null,\n        type: null,\n      };\n    case spreadsheetConfigActions.widgetCreationFailed.type:\n    case spreadsheetConfigActions.widgetUpdateFailed.type:\n      return {\n        message: `${WIDGET_SAVE_ERROR} (${error.message}).`,\n        type: 'error',\n      };\n    case spreadsheetConfigActions.widgetConfigFetchFailed.type:\n      return {\n        message: `${WIDGET_FETCH_ERROR} (${error.message}).`,\n        type: 'error',\n      };\n    case spreadsheetActions.worksheetFetchFailed.type:\n      return {\n        message: `${WORKSHEET_FETCH_ERROR} (${error.message}).`,\n        type: 'error',\n      };\n    default:\n      return state;\n  }\n};\n\nexport default notificationReducer;\n","import notificationReducer from './notification-reducer';\n\nexport default notificationReducer;\n","import { unionBy, reject } from 'lodash';\nimport {\n  usersFetchSuccessful,\n  deleteUserSuccessful,\n} from '../actions/people-actions';\nimport { inviteSuccessful } from '../../dashboard/actions/dashboard-actions';\n\nconst initialState = {\n  visible: false,\n  view: null,\n  manageViewTab: null,\n  addresses: '',\n  error: null,\n  working: false,\n  users: null,\n};\n\nconst transformInviteesToUsers = users =>\n  users.map(user => ({\n    id: user.entity_id,\n    email: user.name,\n    permission: 'none',\n  }));\n\nconst peopleReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case usersFetchSuccessful.type:\n      return {\n        ...state,\n        users: payload,\n      };\n\n    case deleteUserSuccessful.type:\n      return {\n        ...state,\n        users: reject(state.users, { id: payload.userId }),\n      };\n\n    case inviteSuccessful.type:\n      const invitees = transformInviteesToUsers(payload);\n\n      return {\n        ...state,\n        users: unionBy(state.users, invitees, 'id'),\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default peopleReducer;\n","import peopleReducer from './people-reducer';\n\nexport default peopleReducer;\n","import * as presetsActions from './presets-actions';\n\nexport const initialState = {};\n\nconst presetsReducer = (state = initialState, action) => {\n  const { type } = action;\n\n  switch (type) {\n    case presetsActions.getPresetsSuccess.type:\n      const { payload: { integration, presets } = {} } = action;\n\n      return {\n        ...state,\n        [integration]: presets,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default presetsReducer;\n","import { groupBy } from 'lodash';\nimport * as dataSourceConnectorActions from '../../data-source-connector/actions/data-source-connector-actions';\nimport * as initDataSourceActions from '../../data-source-connector/actions/init-data-source-action';\n\nconst groupServiceAccounts = (serviceAccounts, state) => {\n  const newServiceAccounts = groupBy(serviceAccounts, sa => sa.service.name);\n\n  return { ...state, ...newServiceAccounts };\n};\n\nconst initialState = [];\nconst serviceAccountsReducer = (state = initialState, action) => {\n  switch (action.type) {\n    case initDataSourceActions.initDataSourceSuccessful.type:\n    case dataSourceConnectorActions.accountAddSuccessful.type:\n      return groupServiceAccounts(action.payload.serviceAccounts, state);\n    default:\n      return state;\n  }\n};\n\nexport default serviceAccountsReducer;\n","import serviceAccountsReducer from './service-accounts-reducer';\n\nexport default serviceAccountsReducer;\n","import { mapValues, reduce, isEmpty } from 'lodash';\nimport { getSelectedCells } from '../../universal/spreadsheet-helpers';\nimport {\n  getSelectionFormat,\n  getNumericCells,\n  getGeckometerValue,\n} from '../../universal/transformers/spreadsheet/helpers';\nimport { getGeckometerDefaultMinMax } from '../../lib/geckometer';\n\nconst INDEX_BASED = 1; // API returns spreadsheet cells with index = 1\n\nconst extractMeta = (worksheet, spreadsheet) => {\n  let state = { loading: false };\n\n  if (worksheet) {\n    state = {\n      ...state,\n      worksheetId: worksheet.id,\n      cells: worksheet.cells,\n      bounds: mapValues(worksheet.bounds, val => {\n        return val + INDEX_BASED; // 1-indexed backend data\n      }),\n    };\n  }\n\n  if (spreadsheet) {\n    state = {\n      ...state,\n      fileId: spreadsheet.id,\n      title: spreadsheet.title,\n      service: spreadsheet.service,\n      worksheets: new Map(\n        spreadsheet.worksheets.map(sheet => [sheet.id, sheet]),\n      ),\n    };\n  }\n\n  if (!(spreadsheet || worksheet)) {\n    state = {\n      ...state,\n      title: '',\n      isFileMissing: true,\n      worksheets: new Map(),\n    };\n  }\n\n  return state;\n};\n\nconst toValidMinMax = (config, state) => {\n  const { value, type } = config;\n  const { cells } = state;\n\n  if (isEmpty(cells) || type !== 'geckometer') {\n    return {\n      ...config,\n      _minDefault: '',\n      _maxDefault: '',\n    };\n  }\n\n  const item = getGeckometerValue(value, cells);\n  const [selectedCells] = getSelectedCells(cells, [value]);\n  const numericCells = getNumericCells(selectedCells);\n  const [format] = getSelectionFormat(numericCells);\n\n  return { ...config, ...getGeckometerDefaultMinMax(item, format) };\n};\n\nconst toValidConfig = state => {\n  const { config } = state;\n\n  // If the config is uninitialised then leave it as is.\n  if (isEmpty(config)) {\n    return config;\n  }\n\n  // Apply the toValid function in order.\n  const toValidFunctions = [toValidMinMax];\n\n  return reduce(\n    toValidFunctions,\n    (intermediateConfig, fn) => {\n      return fn.call(this, intermediateConfig, state);\n    },\n    config,\n  );\n};\n\nexport { extractMeta, toValidConfig, toValidMinMax };\n","import { get, isFinite, isArray, omit } from 'lodash';\n\nconst _sanitizeProgressGoal = config => {\n  if (get(config, 'comparison.type') !== 'goal') {\n    return config;\n  }\n\n  if (isFinite(config.goal) || isArray(config.goal)) {\n    return config;\n  }\n\n  const sanitized = { ...config };\n  delete sanitized.goal;\n  sanitized.comparison = {};\n\n  return sanitized;\n};\n\nconst _sanitizeNumberComparison = config => {\n  const type = get(config, 'comparison.type');\n\n  if (!['number', 'percentage', 'sparkline'].includes(type)) {\n    return config;\n  }\n\n  const value = get(config, 'comparison.value');\n\n  if (isFinite(value) || isArray(value)) {\n    return config;\n  }\n\n  return {\n    ...config,\n    comparison: {},\n  };\n};\n\nconst _sanitizeIndicators = config => {\n  if (!config.indicators) {\n    return config;\n  }\n\n  if (\n    !config.indicators.thresholds ||\n    config.indicators.thresholds.length === 0\n  ) {\n    return omit(config, 'indicators');\n  }\n\n  return {\n    ...config,\n    indicators: omit(config.indicators, ['_upper', '_lower']),\n  };\n};\n\nconst sanitizers = [\n  _sanitizeProgressGoal,\n  _sanitizeNumberComparison,\n  _sanitizeIndicators,\n];\n\n/**\n * sanitizeConfig takes a config object and runs it\n * through a series of sanitizer functions. Each sanitizer\n * gets applied and the return value of the first sanitizer\n * gets passed to the next sanitizer and so on.\n */\nconst sanitizeConfig = config =>\n  sanitizers.reduce((newConfig, sanitizer) => sanitizer(newConfig), config);\n\nexport default sanitizeConfig;\n","import { isEmpty, set, isString, isArray, get, cloneDeep } from 'lodash';\nimport * as spreadsheetConfigActions from '../actions/spreadsheet-config-actions';\nimport * as spreadsheetActions from '../actions/spreadsheet-actions';\nimport * as selectionActions from '../actions/selection-actions';\nimport * as selectionActionsBeta from '../../spreadsheet-config-beta/actions/selection-actions';\nimport * as spreadsheetActionsBeta from '../../spreadsheet-config-beta/actions/spreadsheet-actions';\nimport * as dynamicConfigActions from '../../spreadsheet-config-beta/actions/dynamic-config-actions';\nimport * as pickerActions from '../../file-picker/actions/picker-actions';\nimport {\n  extractMeta,\n  toValidConfig,\n} from './spreadsheet-config-reducer-helpers.js';\nimport { getSelectionSize, updateSelection } from '../helpers';\nimport update from 'immutability-helper';\nimport betaGetVisualisationHelpers from '../../spreadsheet-config-beta/helpers/get-visualisation-helpers';\nimport * as betaSelectionHelpers from '../../spreadsheet-config-beta/helpers/selection-helpers';\nimport {\n  transformFormStateToThresholds,\n  transformThresholdsToFormState,\n} from '../../universal-config/components/status-indicators-form';\nimport { MULTIPLE_INPUT_DEFAULT_SELECTION } from '../spreadsheets-config-constants';\nimport { validate } from '../../spreadsheet-config-beta/providers/validation-provider';\nimport sanitizeConfig from '../../spreadsheet-config-beta/helpers/sanitize-config';\n\nconst initialState = {\n  config: {},\n  initialConfig: {},\n  previousConfigs: {},\n  activeFieldPath: null,\n  fileId: undefined,\n  title: undefined,\n  worksheetId: '',\n  worksheets: new Map(),\n  cells: [],\n  loading: true,\n  isInitLoading: true,\n  bounds: {\n    columns: 10,\n    rows: 10,\n  },\n  scrolls: [0, 0],\n  isFileMissing: false,\n  showFilePicker: false,\n  lockedSelections: [],\n  selections: [],\n  validSelections: [],\n  isDirectionSwapped: false,\n  dynamicEditor: {\n    config: {},\n  },\n  options: {\n    restrictToSingleDimension: true,\n    maxCols: Infinity,\n    maxRows: Infinity,\n  },\n};\n\n/**\n * This is a really horrible way to test if we're in the Beta.\n * I'm doing it this way because any other way would require\n * more work and very soon the Beta will be the only version\n * so we can delete this awful awful code.\n */\nconst isBeta = () => window.location.href.includes('spreadsheetsbeta');\n\nconst setThresholds = (config, threshold, rawValue) => {\n  let value = rawValue;\n  if (isString(value)) {\n    value = parseFloat(value);\n  }\n\n  const {\n    indicators,\n    indicators: { thresholds = [], _currentUpperState } = {},\n  } = config;\n  const thresholdState = transformThresholdsToFormState(\n    thresholds,\n    _currentUpperState,\n  );\n  return {\n    ...config,\n    indicators: {\n      ...indicators,\n      [`_${threshold}`]: rawValue,\n      thresholds: transformFormStateToThresholds({\n        ...thresholdState,\n        [`${threshold}Value`]: value,\n      }),\n    },\n  };\n};\n\nconst betaInjectStatusIndicatorThresholds = (config, path, value) => {\n  switch (path) {\n    case 'indicators._upper':\n      return setThresholds(config, 'upper', value);\n    case 'indicators._lower':\n      return setThresholds(config, 'lower', value);\n    default:\n      return config;\n  }\n};\n\nconst handleSetValue = (config, path, value) => {\n  switch (path) {\n    case 'indicators._upper':\n      return setThresholds(config, 'upper', value);\n    case 'indicators._lower':\n      return setThresholds(config, 'lower', value);\n    default:\n      if (\n        (path.startsWith('series') || path.startsWith('columns')) &&\n        path !== 'series' &&\n        path !== 'columns'\n      ) {\n        // When setting `series` and `columns`, we receive a path like `series[3]`, `columns[4]`\n        // First, we slice the `[x]` off the end, so `series[3]` becomes `series`\n        const fullPath = path.slice(0, path.length - 3);\n        // Next, we pull the number out of the `[x]`, so `series[3]` becomes `3`\n        const selectionIndex = path.slice(path.length - 2, path.length - 1);\n        const currentSelections = get(config, fullPath, []);\n        const clonedSelections = cloneDeep(currentSelections);\n\n        clonedSelections[selectionIndex] = value;\n\n        return set({ ...config }, fullPath, clonedSelections);\n      }\n      return set({ ...config }, path, value);\n  }\n};\n\nconst withoutIndex = (array, index) => [\n  ...array.slice(0, index),\n  ...array.slice(index + 1),\n];\n\nconst spreadsheetConfigReducerInner = (state = initialState, action) => {\n  let newConfig;\n  const { type, payload } = action;\n\n  switch (type) {\n    case spreadsheetConfigActions.initSpreadsheetConfigStart.type:\n      return {\n        ...state,\n        isInitLoading: true,\n      };\n    case spreadsheetActions.setScrolls.type:\n      return {\n        ...state,\n        scrolls: payload,\n      };\n    case spreadsheetActions.worksheetFetched.type:\n      return {\n        ...state,\n        isFileMissing: false,\n        ...extractMeta(payload.worksheet, payload.spreadsheet),\n        isInitLoading: false,\n      };\n    case spreadsheetActions.loading.type:\n      return {\n        ...state,\n        loading: true,\n      };\n    case spreadsheetConfigActions.initSpreadsheetConfigFailed.type:\n    case spreadsheetActions.worksheetFetchFailed.type:\n      return {\n        ...state,\n        loading: false,\n        isInitLoading: false,\n      };\n    case spreadsheetActions.set.type:\n      return {\n        ...state,\n        ...payload,\n      };\n    case spreadsheetConfigActions.set.type:\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          ...payload,\n        },\n      };\n    case spreadsheetConfigActions.initSpreadsheetConfigSuccessful.type:\n      // Only apply the default config when no config\n      // has previously been applied, this prevents us getting in\n      // a state whereby config exists that can't be applied to\n      // the default visualisation\n      newConfig = state.config;\n\n      if (isEmpty(state.config)) {\n        newConfig = {\n          title: '',\n          ...payload.config,\n        };\n      }\n\n      return {\n        ...state,\n        config: newConfig,\n        isFileMissing: false,\n        ...extractMeta(payload.worksheet, payload.spreadsheet),\n        isInitLoading: false,\n      };\n    case spreadsheetConfigActions.widgetConfigFetchSuccessful.type:\n      const { key: widgetKey, spreadsheetErrorType } = payload;\n\n      newConfig = {\n        widgetKey,\n        spreadsheetErrorType,\n        ...payload.config,\n      };\n\n      return {\n        ...state,\n        config: newConfig,\n        initialConfig: newConfig,\n        isFileMissing: false,\n        ...extractMeta(payload.worksheet, payload.spreadsheet),\n        isInitLoading: false,\n      };\n    case spreadsheetConfigActions.doSetActiveField.type:\n      const {\n        options: {\n          restrictToSingleDimension = false,\n          maxCols = Infinity,\n          maxRows = Infinity,\n        },\n      } = payload;\n      let {\n        value: selectionValues = MULTIPLE_INPUT_DEFAULT_SELECTION,\n      } = payload;\n\n      let newSelections;\n\n      if (!isArray(selectionValues)) {\n        selectionValues = MULTIPLE_INPUT_DEFAULT_SELECTION;\n      }\n\n      if (!isEmpty(selectionValues)) {\n        newSelections = selectionValues.map(selection => {\n          const [start, end] = selection;\n\n          return {\n            firstCell: start,\n            start,\n            end,\n            size: getSelectionSize(selection),\n          };\n        });\n      } else {\n        newSelections = MULTIPLE_INPUT_DEFAULT_SELECTION;\n      }\n\n      const newOptions = {\n        restrictToSingleDimension,\n        maxCols,\n        maxRows,\n      };\n\n      return {\n        ...state,\n        activeFieldPath: payload.path,\n        selections: newSelections,\n        options: newOptions,\n      };\n    case selectionActionsBeta.deleteSelection.type: {\n      const { lockedSelections } = state;\n\n      return {\n        ...state,\n        lockedSelections: lockedSelections.filter(\n          (_, index) => index !== payload,\n        ),\n      };\n    }\n    case selectionActionsBeta.lockSelections.type: {\n      const { selections, lockedSelections } = state;\n\n      return {\n        ...state,\n        selections: [],\n        lockedSelections: [...lockedSelections, ...selections],\n      };\n    }\n    case selectionActionsBeta.updateSelections.type: {\n      const updatedSelections = payload.map(selection => {\n        const updatedSelection = updateSelection(selection, selection.end, {\n          ...state.options,\n          restrictToSingleDimension: false,\n        });\n\n        const {\n          start: [rowStart, colStart],\n          end: [rowEnd, colEnd],\n        } = updatedSelection;\n\n        if (rowStart === -1) {\n          // we're row-selecting\n          updatedSelection.end = [-1, colEnd];\n        } else if (colStart === -1) {\n          // column-selecting!\n          updatedSelection.end = [rowEnd, -1];\n        }\n\n        return {\n          ...updatedSelection,\n          size: getSelectionSize([\n            updatedSelection.start,\n            updatedSelection.end,\n          ]),\n        };\n      });\n\n      return {\n        ...state,\n        previousConfigs: {},\n        selections: updatedSelections,\n      };\n    }\n    case selectionActions.updateSelections.type:\n      const updatedSelections = payload.map(selection => {\n        const updatedSelection = updateSelection(\n          selection,\n          selection.end,\n          state.options,\n        );\n\n        return {\n          ...updatedSelection,\n          size: getSelectionSize([\n            updatedSelection.start,\n            updatedSelection.end,\n          ]),\n        };\n      });\n\n      let values = updatedSelections.map(selection => [\n        selection.start,\n        selection.end || selection.start,\n      ]);\n\n      if (state.options.restrictToSingleDimension) values = values[0];\n\n      return {\n        ...state,\n        selections: updatedSelections,\n        config: handleSetValue(state.config, state.activeFieldPath, values),\n      };\n\n    case selectionActionsBeta.setInitialConfig.type: {\n      const {\n        visualisationType,\n        isDirectionSwapped,\n        validationRules,\n        validSelections,\n      } = payload;\n      const convert = isDirectionSwapped\n        ? betaSelectionHelpers.convertSelectionRangesToRows\n        : betaSelectionHelpers.convertSelectionRangesToColumns;\n\n      const series = convert([...validSelections]);\n      const { getDefaultConfig } = betaGetVisualisationHelpers(\n        visualisationType,\n      );\n      const title = state.config.title ? state.config.title : '';\n      const config = { ...getDefaultConfig(series), title };\n\n      return {\n        ...state,\n        isDirectionSwapped,\n        validationRules,\n        config,\n        validSelections,\n      };\n    }\n\n    case spreadsheetConfigActions.doSetValue.type: {\n      const { path, value, activeFieldPath } = payload;\n\n      return {\n        ...state,\n        activeFieldPath: activeFieldPath || state.activeFieldPath,\n        config: handleSetValue(state.config, path, value),\n      };\n    }\n\n    case spreadsheetConfigActions.doSetValues.type:\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          ...payload.state,\n        },\n        activeFieldPath: payload.activeFieldPath || state.activeFieldPath,\n      };\n\n    case spreadsheetConfigActions.updateNumberFormat.type: {\n      const { config } = state;\n      let numberFormat = state.config.numberFormat;\n\n      if (config.type === 'table') {\n        const { index, format = {} } = payload;\n        numberFormat = numberFormat ? [...numberFormat] : [];\n        numberFormat[index] = {\n          ...numberFormat[index],\n          ...format,\n        };\n      } else {\n        numberFormat = {\n          ...numberFormat,\n          ...payload,\n        };\n      }\n\n      return {\n        ...state,\n        config: {\n          ...config,\n          numberFormat,\n        },\n      };\n    }\n\n    case spreadsheetConfigActions.toggleFilePicker.type:\n      return {\n        ...state,\n        showFilePicker: payload,\n      };\n\n    case spreadsheetConfigActions.doSwitchVisualisationType.type:\n      const { accountId, title, type: visType } = state.config;\n\n      return {\n        ...state,\n        activeFieldPath: null,\n        config: {\n          accountId,\n          title,\n          ...payload,\n        },\n        previousConfigs: {\n          ...state.previousConfigs,\n          [visType]: { ...state.config },\n        },\n        selections: isBeta() ? state.selections : [],\n      };\n    case selectionActions.clearAll.type:\n      return {\n        ...state,\n        selections: [],\n      };\n    case pickerActions.closeFilePicker.type:\n      return {\n        ...state,\n        showFilePicker: false,\n      };\n    case spreadsheetConfigActions.widgetCreationStart.type:\n    case spreadsheetConfigActions.widgetUpdateStart.type:\n      return {\n        ...state,\n        isSaving: true,\n      };\n    case spreadsheetConfigActions.widgetCreationFailed.type:\n    case spreadsheetConfigActions.widgetUpdateFailed.type:\n      return {\n        ...state,\n        isSaving: false,\n      };\n    case spreadsheetConfigActions.deleteTableColumn.type: {\n      const { columns, numberFormat = [] } = state.config;\n\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          columns: withoutIndex(columns, payload),\n          numberFormat: withoutIndex(numberFormat, payload),\n        },\n      };\n    }\n    case spreadsheetConfigActions.reorderTableColumn.type:\n    case spreadsheetActionsBeta.reorderTableColumns.type: {\n      const { sourceIndex, targetIndex } = payload;\n      const { numberFormat, columns } = state.config;\n      const column = columns[sourceIndex];\n      const currentFormat = numberFormat[sourceIndex] || null;\n\n      return update(state, {\n        config: {\n          columns: {\n            $splice: [\n              [sourceIndex, 1],\n              [targetIndex, 0, column],\n            ],\n          },\n          numberFormat: {\n            $splice: [\n              [sourceIndex, 1],\n              [targetIndex, 0, currentFormat],\n            ],\n          },\n        },\n      });\n    }\n\n    case spreadsheetActionsBeta.hydrateConfigureView.type: {\n      const config = state.config;\n      const helpers = betaGetVisualisationHelpers(config.type);\n\n      const selections = helpers.getSelectionsFromConfig(config);\n      const isDirectionSwapped = betaSelectionHelpers.isRowSelection(\n        selections[0],\n      );\n\n      const compressedSelections = betaSelectionHelpers.compressSelections(\n        selections,\n      );\n\n      const selectionObjects = compressedSelections.map(\n        betaSelectionHelpers.convertSelectionToObjectFormat,\n      );\n\n      const validSelections = selectionObjects;\n\n      return {\n        ...state,\n        selections: selectionObjects,\n        validationRules: validate(\n          compressedSelections,\n          state.cells,\n          isDirectionSwapped,\n        ),\n        validSelections,\n        isDirectionSwapped,\n      };\n    }\n\n    case dynamicConfigActions.hydrate.type: {\n      return {\n        ...state,\n        dynamicEditor: {\n          config: state.config,\n        },\n      };\n    }\n\n    case dynamicConfigActions.update.type: {\n      return {\n        ...state,\n        dynamicEditor: {\n          ...state.dynamicEditor,\n          config: {\n            ...state.dynamicEditor.config,\n            ...payload,\n          },\n        },\n      };\n    }\n\n    case dynamicConfigActions.clear.type: {\n      return {\n        ...state,\n        dynamicEditor: {\n          config: {},\n        },\n      };\n    }\n\n    case dynamicConfigActions.save.type: {\n      return {\n        ...state,\n        config: sanitizeConfig(state.dynamicEditor.config),\n        dynamicEditor: {\n          config: {},\n        },\n      };\n    }\n\n    case dynamicConfigActions.focusInput.type: {\n      return {\n        ...state,\n        dynamicEditor: {\n          ...state.dynamicEditor,\n          focusedInput: payload.path,\n        },\n      };\n    }\n\n    case dynamicConfigActions.setValue.type: {\n      const { config, focusedInput } = state.dynamicEditor;\n      newConfig = cloneDeep(config);\n      set(newConfig, focusedInput, payload);\n\n      newConfig = betaInjectStatusIndicatorThresholds(\n        newConfig,\n        focusedInput,\n        payload,\n      );\n\n      return {\n        ...state,\n        dynamicEditor: {\n          ...state.dynamicEditor,\n          config: newConfig,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nconst ensureValidConfig = state => {\n  return { ...state, config: toValidConfig(state) };\n};\n\nconst spreadsheetConfigReducer = (state, action) => {\n  return ensureValidConfig(spreadsheetConfigReducerInner(state, action));\n};\n\nexport default spreadsheetConfigReducer;\nexport { initialState };\n","import spreadsheetConfigReducer, {\n  initialState,\n} from './spreadsheet-config-reducer';\nexport default spreadsheetConfigReducer;\nexport { initialState };\n","import * as toastActions from '../actions/toast-actions';\nimport * as toastConstants from '../toast-constants';\n\nconst initialState = {\n  toast: undefined,\n};\n\nconst toastLauncherReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case toastActions.showToast.type:\n      return {\n        ...state,\n        toast: payload,\n      };\n    case toastActions.hideToast.type:\n      return {\n        ...state,\n        toast: undefined,\n      };\n    case toastActions.showSuccessToast.type:\n      return {\n        ...state,\n        toast: {\n          type: toastConstants.SUCCESS,\n          message: payload,\n        },\n      };\n    case toastActions.showErrorToast.type:\n      return {\n        ...state,\n        toast: {\n          type: toastConstants.ERROR,\n          message: payload,\n        },\n      };\n    default:\n      return state;\n  }\n};\n\nexport default toastLauncherReducer;\n","import toastReducer from './toast-reducer';\n\nexport default toastReducer;\n","import * as tvPagActions from '../actions/tv-page-actions';\n\nexport const initialState = {\n  error: undefined,\n  device: {\n    pusherChannel: undefined,\n    token: undefined,\n  },\n  code: undefined,\n};\n\nconst tvPageReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n  switch (type) {\n    case tvPagActions.setCode.type:\n      return {\n        ...state,\n        code: payload,\n        error: undefined,\n      };\n\n    case tvPagActions.setDevice.type:\n      return {\n        ...state,\n        device: payload,\n      };\n\n    case tvPagActions.setError.type:\n      return {\n        ...state,\n        code: undefined,\n        error: payload,\n      };\n\n    default:\n      return state;\n  }\n};\n\nexport default tvPageReducer;\n","import reducer from './tv-page-reducer';\n\nexport default reducer;\n","import * as queryActions from '../../actions/universal-query-actions';\nimport * as bootstrapActions from '../../actions/universal-bootstrap-actions';\nimport { MAX_NUMBER_OF_METRICS } from '../../ui-field-options';\nimport {\n  getFilterNodesFromQueries,\n  getPrerequisitesFromQueries,\n  getNodesFromQueries,\n  getBucket,\n} from './other-ui-query-reducer-methods';\nimport {\n  curry,\n  find,\n  flatten,\n  get,\n  has,\n  isNull,\n  isUndefined,\n  isEmpty,\n  omit,\n  set,\n  map,\n} from 'lodash';\n\n/**\n * [NEW] ui-query-reducer\n * This reducer is organized into chained transformers that are applied to\n * transform the full state. Each action has a corresponding chain of\n * transformation that are performed. Composing transformations this way makes\n * our complex logic between each part of the state and the current\n * visualisation more readable and easier to reason about.\n *\n * Functional helpers are functions to reduce boilerplate and help to\n * apply transformers based on condition in a functional manner.\n *\n * Core transformers are functions that handle only one part of the state with\n * an optional index when dealing with array.\n *\n * Composed transformers chain multiple core transformers (or composed\n * transformers) to make sure each action apply the correct set of\n * transformation\n **/\n\n// TODO once switched - Old ui-query-reducer is deleted.\n// 1) Remove omit call in each core transformer. We should be able to set to\n//    empty array without having to worry about removing key. We can also set\n//    undefined if necessary\n//\nconst __ = curry.placeholder;\n\nconst DEFAULT_AGGREGATION = 'sum';\n\nexport const initialState = {\n  metrics: [],\n  groupBy: [],\n  orderBy: [],\n  timespans: [],\n  filters: [],\n  splitBy: [],\n  detailsColumns: [],\n  bucket: 'day',\n  globalFilters: [],\n  vipFilters: {},\n  boundToMetricFilters: [],\n  prerequisites: [],\n};\n\n//  -------------------\n//  Functional helpers\n//  -------------------\nconst applyForVizType = (matchingViz, currentViz, transformers) => {\n  if (matchingViz.includes(currentViz)) {\n    return transformers;\n  }\n  return [];\n};\n\n// Apply transformer when the specified rule is set.\nconst applyForRule = (matchingRule, node, transformer) => {\n  if (node && node.rules && node.rules[matchingRule]) {\n    // We pass the whole matching node list but most transformers\n    // only use the first matching node. Only setFilters\n    // supports setting multiple filter nodes for now.\n    //\n    // Node contains ref to rule node straight from props\n    return transformer(node[matchingRule], node.rules[matchingRule]);\n  }\n  return [];\n};\n\n// Only check if statePath is set. If so it will return the list of\n// transformers to apply\nconst applyWhenSet = (statePath, state, transformers) => {\n  if (has(state, statePath)) {\n    return transformers;\n  }\n  return [];\n};\n\nconst applyWhenNotSet = (statePath, state, transformers) => {\n  if (!has(state, statePath)) {\n    return transformers;\n  }\n  return [];\n};\n\n// Apply exactly same element as the one specify by the statePath\nconst applyFrom = (statePath, state, transformer) => {\n  if (has(state, statePath)) {\n    const { node, extra } = get(state, statePath);\n    return transformer(node, extra);\n  }\n  return [];\n};\n\nconst applyOn = (statePath, state, callback) => {\n  if (state[statePath]) {\n    return flatten(state[statePath].map(callback));\n  }\n  return [];\n};\n\nconst applyAgainstUiOptions = (\n  statePath,\n  uiOptions,\n  element,\n  transformer,\n  isMetrics,\n) => {\n  const { node: currentNode, extra: currentExtra } = element;\n  let options;\n  if (isMetrics) {\n    options = flatten(uiOptions[statePath].map(g => g.options));\n  } else {\n    options = flatten(uiOptions[statePath]);\n  }\n\n  // If no options are available, remove from state\n  if (!options || !flatten(options).length) {\n    return transformer(null, null);\n  }\n\n  if (options.includes(currentNode)) {\n    return transformer(currentNode, currentExtra);\n  }\n  return transformer(options[0], undefined);\n};\n\nconst dropFiltersAgainstUiOptions = curry((state, uiOptions) => {\n  const { filters = [] } = state;\n\n  if (!filters.length) {\n    return state;\n  }\n\n  const options = flatten(uiOptions.filters);\n  const filtersToKeep = filters.filter(filter => options.includes(filter.node));\n\n  return {\n    ...state,\n    filters: filtersToKeep,\n  };\n});\n\n// Replace ui state part by adding, deleting or settings element (node + extra)\n// node and extra can take 3 possibles values:\n// - undefined: The current value from state is kept\n// - null: The current value will be removed (delete)\n// - {}: The current value will be replaced with the given value\nconst prepareNew = (current = [], node, extra, index) => {\n  let elements = [...current];\n\n  // Remove index\n  if (isNull(node) && isNull(extra)) {\n    elements = [...elements.slice(0, index), ...elements.slice(index + 1)];\n  } else {\n    // We apply default here to allow to create any new node like orderBy\n    // even if the state was not defined before.\n    const { node: currentNode, extra: currentExtra } = elements[index] || {};\n    // TODO can we not find a better way to set correct element here?\n    const el = {};\n    if (isUndefined(node) && !isUndefined(currentNode)) {\n      el.node = currentNode;\n    } else if (!isNull(node) && !isUndefined(node)) {\n      el.node = node;\n    }\n\n    if (isUndefined(extra) && !isUndefined(currentExtra)) {\n      el.extra = currentExtra;\n    } else if (!isNull(extra) && !isUndefined(extra)) {\n      el.extra = extra;\n    }\n    set(elements, `[${index}]`, el);\n  }\n\n  return elements;\n};\n\n//  -------------------\n//  Core transformers\n//  -------------------\n/**\n * Note that all core transformers are curried. This allow us to return\n * a function partially applied from composed transformers.\n **/\n\nconst _setMetric = curry((state, _node, _extra, index) => {\n  const { metrics: current } = state;\n  let extra;\n\n  if (isUndefined(_extra)) {\n    const {\n      type: metricType,\n      aggregated,\n      default_aggregation: defaultAggregation,\n    } = _node;\n\n    let { extra: { aggregate = DEFAULT_AGGREGATION } = {} } =\n      current[index] || [];\n\n    if (metricType === 'count') {\n      aggregate = 'count';\n    } else if (aggregated) {\n      aggregate = undefined;\n    } else if (!!defaultAggregation) {\n      aggregate = defaultAggregation;\n    } else {\n      // always go back to the default aggregation\n      aggregate = DEFAULT_AGGREGATION;\n    }\n    extra = { aggregate };\n  } else {\n    extra = _extra;\n  }\n\n  return {\n    ...state,\n    metrics: prepareNew(current, _node, extra, index),\n  };\n});\n\nconst _setGroupBy = curry((state, _node, _extra, index) => {\n  const { groupBy: current } = state;\n\n  const groupBy = prepareNew(current, _node, _extra, index);\n  if (groupBy.length) {\n    return {\n      ...state,\n      groupBy,\n    };\n  }\n  return omit(state, 'groupBy');\n});\n\nconst _setOrderBy = curry((state, _node, _extra, index) => {\n  const { orderBy: current } = state;\n\n  const orderBy = prepareNew(current, _node, _extra, index);\n  if (orderBy.length) {\n    return {\n      ...state,\n      orderBy,\n    };\n  }\n  return omit(state, 'orderBy');\n});\n\nconst _setSplitBy = curry((state, _node, _extra, index) => {\n  const { splitBy: current } = state;\n\n  const splitBy = prepareNew(current, _node, _extra, index);\n  if (splitBy.length) {\n    return {\n      ...state,\n      splitBy,\n    };\n  }\n  return omit(state, 'splitBy');\n});\n\nconst _setTimespan = curry((state, _node, _extra, index) => {\n  const { timespans } = state;\n\n  return {\n    ...state,\n    timespans: prepareNew(timespans, _node, _extra, index),\n  };\n});\n\nconst _setLimit = curry((state, limit) => {\n  if (isNull(limit)) {\n    return omit(state, 'limit');\n  }\n  return { ...state, limit };\n});\n\nconst _setBucket = curry((state, bucket) => {\n  return { ...state, bucket };\n});\n\nconst _setFilter = curry((state, _node, _extra, index) => {\n  const { filters: prevFilters } = state;\n  const isCustomFilter = _node && _node.type === 'custom';\n  const filters = prepareNew(\n    isCustomFilter ? [] : prevFilters,\n    _node,\n    _extra,\n    isCustomFilter ? 0 : index,\n  );\n\n  return {\n    ...state,\n    filters,\n  };\n});\n\nconst _setGlobalFilter = curry((state, _node, _extra, index) => {\n  const { globalFilters } = state;\n\n  return {\n    ...state,\n    globalFilters: prepareNew(globalFilters, _node, _extra, index),\n  };\n});\n\nconst _setVIPFilter = curry((state, _node, _extra, index) => {\n  const { vipFilters } = state;\n\n  return {\n    ...state,\n    vipFilters: prepareNew(vipFilters, _node, _extra, index),\n  };\n});\n\nconst _setDetailsColumn = curry((state, _node, _extra, index) => {\n  const { detailsColumns: current } = state;\n\n  return {\n    ...state,\n    detailsColumns: prepareNew(current, _node, _extra, index),\n  };\n});\n\nconst _updateBoundToMetricFilters = curry((state, node, index) => {\n  const { filters = [] } = state;\n\n  // If the new node is empty, the metric has been removed, so we remove the\n  // associated bound filters from state\n  // Alternatively, if there are no rules to apply for this metric, empty\n  // the bound filters for the relevant index\n  if (isNull(node) || !get(node, 'rules.filters.length')) {\n    const currentBoundFilters = state.boundToMetricFilters || [];\n\n    // If a filter has been removed, we want to replace the relevant index in the\n    // `boundToMetricFilters` array with an empty array so we know there aren't\n    // any applicable bound filters for that metric\n    const newBoundFilters = [...currentBoundFilters];\n    newBoundFilters[index] = [];\n\n    // If there are no rules, just empty arrays, we can just ignore or omit the\n    // `boundToMetricFilters` part of state\n    if (isEmpty(flatten(currentBoundFilters))) return state;\n    if (isEmpty(flatten(newBoundFilters))) {\n      return omit(state, 'boundToMetricFilters');\n    }\n\n    return {\n      ...state,\n      boundToMetricFilters: newBoundFilters,\n    };\n  }\n\n  const { rules = [] } = node;\n\n  let boundToMetricFilters = [];\n  const boundToMetricFilterKeys = [];\n  rules.filters &&\n    rules.filters.forEach((rule, i) => {\n      boundToMetricFilterKeys.push(rule.key);\n\n      boundToMetricFilters = prepareNew(\n        boundToMetricFilters,\n        node.filters[i],\n        {\n          bound_to_metric: true,\n          operator: rule.operator,\n          operands: rule.operands,\n        },\n        i,\n      );\n    });\n\n  // Remove any any user defined filters that clash with the new\n  // bound to metric filters\n  const filtersWithoutClashes = filters.filter(\n    filter => !boundToMetricFilterKeys.includes(filter.node.key),\n  );\n\n  const stateBoundToMetricFilters =\n    state.boundToMetricFilters || new Array(state.metrics.length).fill([]);\n  stateBoundToMetricFilters[index] = boundToMetricFilters;\n\n  return {\n    ...state,\n    filters: filtersWithoutClashes,\n    boundToMetricFilters: stateBoundToMetricFilters,\n  };\n});\n\n//  ------------------------------------------\n//  Composed transformers for each UI actions\n//  ------------------------------------------\n/* eslint-disable no-use-before-define */\n\n// This function is needed for now because getUiQueryBasedOnOptions is called from\n// config reducer and it has to pass a mainTransformer to apply()\nconst applyAllAgainstUIOptions = (state, uiOptions, extra, _index, vizType) => {\n  // TODO: Check if timespan is available in uiOptions\n  // In old reducer we only checked that first timespan is still available as (for now)\n  // it's the only one represented in the UI. This is because all Zendesk metrics\n  // are associated with only one timefield. When we add a new integration where a metric\n  // can have more than one timefield we have to do some work to support that here.\n\n  return [\n    ...applyForVizType(\n      ['line', 'column', 'bar', 'leaderboard', 'table'],\n      vizType,\n      applyOn('groupBy', state, (groupBy, index) =>\n        applyAgainstUiOptions(\n          'groupBy',\n          uiOptions,\n          groupBy,\n          setGroupByGeneric(state, __, __, index, vizType),\n        ),\n      ),\n    ),\n    ...applyForVizType(\n      ['line', 'column'],\n      vizType,\n      applyOn('splitBy', state, (splitBy, index) =>\n        applyAgainstUiOptions(\n          'splitBy',\n          uiOptions,\n          splitBy,\n          setSplitBy(state, __, __, index, vizType),\n        ),\n      ),\n    ),\n    [`dropFiltersAgainstUiOptions`, dropFiltersAgainstUiOptions(__, uiOptions)],\n  ];\n};\n\nexport const getUiQueryBasedOnOptions = (_state, uiOptions, vizType) => {\n  // TODO: Remove this function and do this inside se†Metric instead\n  let state = { ..._state };\n  state = apply(applyAllAgainstUIOptions, state, uiOptions, null, 0, vizType);\n\n  return state;\n};\n\nconst setMetric = curry((state, node, extra, index, vizType) => {\n  // TODO use the metric reverse_comparison prop here instead?\n  const { type: nodeType = '' } = node || {};\n\n  const extraForOrder = node\n    ? { order: nodeType === 'duration' ? 'asc' : 'desc' }\n    : undefined;\n  const metricExtra = nodeType === 'details' ? null : extra;\n\n  // TODO: When uiOptions are available in state, move functionality from\n  // getUiQueryBasedOnOptions here\n  // For now we expect all metric to have associated timespans. If not, we'll\n  // have to set a default timespans when switching from a null timespans rule.\n  // To do so, we need the uiOptions here to pick-up the first one available.\n  // We should also be able to set a default groupBy here for viz that require it\n  // when changing from details metric, but this is also blocked by not having\n  // access to uiOptions in here and so is handled with getUiQueryBasedOnOptions.\n  return [\n    [`setMetric_${index}`, _setMetric(__, node, metricExtra, index)],\n    ...applyWhenSet(\n      // Always remove detailsColumns when changing metric\n      'detailsColumns',\n      state,\n      applyOn('detailsColumns', state, (_, i) => [\n        ...setDetailsColumn(\n          state,\n          null,\n          null,\n          state.detailsColumns.length - (i + 1), // reverse order to delete\n          vizType,\n        ),\n      ]),\n    ),\n    ...applyWhenSet(\n      // Add\n      'defaultColumns',\n      node || {},\n      applyOn('defaultColumns', node || {}, (n, i) => [\n        ...setDetailsColumn(state, n, null, i, vizType),\n      ]),\n    ),\n    ...applyForVizType(\n      ['leaderboard'],\n      vizType,\n      setOrderBy(state, node, extraForOrder, index, vizType),\n    ),\n    ...applyForRule('time_fields', node, nodes =>\n      setTimespan(state, nodes[0], undefined, index, vizType),\n    ),\n    [\n      `updateBoundToMetricFilters`,\n      _updateBoundToMetricFilters(__, node, index),\n    ],\n    ...applyForRule('optimisation_order', node, nodes =>\n      setOrderBy(state, nodes[0], extraForOrder, index, vizType),\n    ),\n  ];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setGroupBy = curry((state, node, extra, index, vizType) => {\n  return [[`setGroupBy_${index}`, _setGroupBy(__, node, extra, index)]];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setOrderBy = curry((state, node, extra, index, vizType) => {\n  return [[`setOrderBy_${index}`, _setOrderBy(__, node, extra, index)]];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setSplitBy = curry((state, node, extra, index, vizType) => {\n  return [[`setSplitBy_${index}`, _setSplitBy(__, node, extra, index)]];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setLimit = curry((state, limit) => {\n  return [['setLimit', _setLimit(__, limit)]];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setDetailsColumn = curry((state, node, extra, index, vizType) => {\n  return [\n    [`setDetailsColumn_${index}`, _setDetailsColumn(__, node, extra, index)],\n  ];\n});\n\nconst setDetailsColumns = curry((state, nodes, extra, index, vizType) => {\n  return flatten(\n    nodes.map((node, i) => setDetailsColumn(state, node, extra, i, vizType)),\n  );\n});\n\nconst addDetailsColumn = curry((state, node, extra, index, vizType) => {\n  return setDetailsColumn(state, node, extra, index, vizType);\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setBucket = curry((state, bucket, vizType) => {\n  return [\n    ['setBucket', _setBucket(__, bucket)],\n    ...applyOn('groupBy', state, ({ node }, index) => [\n      ...applyWhenSet(`groupBy[${index}].extra.bucket_by`, state, [\n        ...setGroupByBucket(state, node, { bucket_by: bucket }, index, vizType),\n      ]),\n    ]),\n  ];\n});\n\nconst setTimespan = curry((state, node, extra, index, vizType) => {\n  const extraForOptOrder = { order: 'desc' };\n  return [\n    [`setTimespan_${index}`, _setTimespan(__, node, extra, index)],\n    ...applyWhenSet('groupBy[0].extra.bucket_by', state, [\n      // we want to sync only node not extra part here\n      ...setGroupBy(state, node, undefined, index, vizType),\n      ...applyWhenSet(\n        'orderBy',\n        state,\n        setOrderBy(state, node, undefined, index, vizType),\n      ),\n    ]),\n    ...applyForVizType(\n      ['line', 'number', 'geckometer'], // Other viz has order already specified\n      vizType,\n      [\n        ...applyWhenSet(\n          // always remove orderBy if set\n          'orderBy',\n          state,\n          setOrderBy(state, null, null, index, vizType),\n        ),\n        ...applyForRule(\n          // Apply optimisation order if set for new timespan\n          'optimisation_order',\n          node,\n          nodes =>\n            setOrderBy(state, nodes[0], extraForOptOrder, index, vizType),\n        ),\n      ],\n    ),\n  ];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setTimespanOperands = curry((state, node, operands, _index, vizType) => {\n  // Set new operands for all timespans\n  const bucket = getBucket(operands);\n\n  return [\n    ...applyOn('timespans', state, ({ extra: extraTs }, index) => [\n      [\n        `setTimespan_${index}`,\n        _setTimespan(__, undefined, { ...extraTs, operands }, index),\n      ],\n    ]),\n    ...setBucket(state, bucket, vizType),\n  ];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setFilter = curry((state, node, extra, index, vizType) => {\n  return [[`setFilter_${index}`, _setFilter(__, node, extra, index)]];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setGlobalFilter = curry((state, node, extra, index, vizType) => {\n  return [\n    [`setGlobalFilter_{index}`, _setGlobalFilter(__, node, extra, index)],\n  ];\n});\n\n// eslint-disable-next-line no-unused-vars\nconst setVIPFilter = curry((state, node, extra, index, vizType) => {\n  return [[`setVIPFilter_{index}`, _setVIPFilter(__, node, extra, index)]];\n});\n\n// Changing to GroupBy bucket means applying timespan node + selected bucket_by\nconst setGroupByBucket = curry((state, node, _extra, _index, vizType) => {\n  const extraForOrder = { order: 'asc' };\n  const extraForOptOrder = { order: 'desc' };\n  const extra = _extra || { bucket_by: 'day' };\n\n  return applyOn('timespans', state, ({ node: timespanNode }, index) => [\n    ...setGroupBy(state, timespanNode, extra, index, vizType),\n    ...applyForVizType(\n      ['column', 'bar'],\n      vizType,\n      setOrderBy(state, timespanNode, extraForOrder, index, vizType),\n    ),\n    ...applyForVizType(\n      // column, bar, leaderboard and table are already sorted\n      ['line'],\n      vizType,\n      applyForRule('optimisation_order', timespanNode, nodes =>\n        setOrderBy(state, nodes[0], extraForOptOrder, index, vizType),\n      ),\n    ),\n    ...setLimit(state, null),\n  ]);\n});\n\nconst setGroupByCategory = curry((state, node, extra, _index, vizType) => {\n  const extraForOrder = { order: 'asc' };\n  // Use groupBy to loop on all defined groupBy\n  return applyOn('groupBy', state, (_, index) => [\n    ...setGroupBy(state, node, null, index, vizType),\n    ...applyForVizType(['column', 'bar', 'table'], vizType, [\n      ...setOrderBy(state, node, extraForOrder, index, vizType),\n      ...setLimit(state, 20),\n    ]),\n  ]);\n});\n\nconst setGroupByGeneric = curry((state, node, extra, index, vizType) => {\n  if (!node) {\n    return setGroupBy(state, null, extra, index, vizType);\n  }\n  if (node.type === 'datetime') {\n    return setGroupByBucket(\n      state,\n      node,\n      { bucket_by: state.bucket },\n      index,\n      vizType,\n    );\n  }\n  return setGroupByCategory(state, node, extra, index, vizType);\n});\n\nconst addMetric = curry((state, node, extra, index, vizType) => {\n  return [\n    // Start by applying ts as metric might define timespan rules after\n    ...applyFrom(\n      'timespans[0]',\n      state,\n      setTimespan(state, __, __, index, vizType),\n    ),\n    ...applyFrom(\n      'groupBy[0]',\n      state,\n      setGroupBy(state, __, __, index, vizType),\n    ),\n    ...applyFrom(\n      'orderBy[0]',\n      state,\n      setOrderBy(state, __, __, index, vizType),\n    ),\n    ...setMetric(state, node, extra, index, vizType),\n  ];\n});\n\nconst removeMetric = curry((state, node, extra, index, vizType) => {\n  return [\n    ...setMetric(state, node, extra, index, vizType),\n    ...setTimespan(state, node, extra, index, vizType),\n    ...setGroupBy(state, node, extra, index, vizType),\n    ...setOrderBy(state, node, extra, index, vizType),\n  ];\n});\n\nconst truncateMaxMetrics = (_state, vizType) => {\n  const maxMetrics = MAX_NUMBER_OF_METRICS[vizType];\n  const state = { ..._state };\n  ['metrics', 'timespans', 'groupBy', 'orderBy'].forEach(statePath => {\n    if (state[statePath]) {\n      state[statePath] = state[statePath].slice(0, maxMetrics);\n    }\n  });\n\n  return state;\n};\n\nconst cleanStateSetMetric = curry((state, node, extra, _index, vizType) => {\n  /**\n   * Set an empty groupBy here just like we do cleanStateSetVisType so that\n   * a default will be set when getUiQueryBasedOnOptions is called (from config reducer)\n   * This is messy and can be simplified in the refactor of uiOptions state into here.\n   * Can also investigate having applyAgainstUIOptions always setting a default but it's\n   * tricky because applyOn is used everywhere and it only applies if the statePath\n   * is already defined.\n   */\n  const { type: metricType } = node;\n  if (metricType !== 'details') {\n    return [\n      ...applyWhenNotSet(\n        'groupBy',\n        state,\n        applyForVizType(\n          ['line', 'bar', 'column', 'leaderboard', 'table'],\n          vizType,\n          setGroupBy(state, {}, null, 0, vizType),\n        ),\n      ),\n    ];\n  }\n  return [];\n});\n\nconst cleanStateSetVisType = curry(\n  (state, uiOptions, extra, _index, vizType) => {\n    // This transformer allow us to clean the state before to get all the\n    // transformers from the mainTransformer. This is because we generate the\n    // transformer from the entry state.\n    return [\n      ...applyWhenNotSet(\n        'groupBy',\n        state,\n        applyForVizType(\n          ['line', 'bar', 'column', 'leaderboard', 'table'],\n          vizType,\n          setGroupBy(state, {}, null, 0, vizType),\n        ),\n      ),\n      // Remove groupBy, orderBy and limit if not supported\n      ...applyForVizType(['number', 'geckometer', 'feed'], vizType, [\n        ...setGroupBy(state, null, null, 0, vizType),\n        ...setOrderBy(state, null, null, 0, vizType),\n        ...setLimit(state, null),\n      ]),\n      ...applyForVizType(['line'], vizType, [\n        ...setOrderBy(state, null, null, 0, vizType),\n      ]),\n      ...applyForVizType(['leaderboard'], vizType, [\n        // Remove group by extra here since leaderboard does not support\n        // time based grouping.\n        ...setGroupBy(state, undefined, null, 0, vizType),\n      ]),\n      // Remove splitBy if not supported\n      ...applyForVizType(\n        ['number', 'geckometer', 'bar', 'leaderboard', 'table', 'feed'],\n        vizType,\n        setSplitBy(state, null, null, 0, vizType),\n      ),\n    ];\n  },\n);\n\nconst setVisualisationType = curry(\n  (state, uiOptions, extra, _index, vizType) => {\n    // TODO: Remove applyAgainstUiOptions and remove filters when they are\n    // handled by setMetric transformer\n    return [\n      // Re-apply all metric to make sure rules for are sync\n      ...applyOn('metrics', state, (metric, index) =>\n        applyAgainstUiOptions(\n          'metrics',\n          uiOptions,\n          metric,\n          setMetric(state, __, __, index, vizType),\n          true,\n        ),\n      ),\n      ...applyForVizType(\n        ['line', 'column', 'bar', 'leaderboard', 'table'],\n        vizType,\n        applyOn('groupBy', state, (groupBy, index) =>\n          applyAgainstUiOptions(\n            'groupBy',\n            uiOptions,\n            groupBy,\n            setGroupByGeneric(state, __, __, index, vizType),\n          ),\n        ),\n      ),\n      ...applyForVizType(['feed'], vizType, setLimit(state, 20)),\n      [\n        `dropFiltersAgainstUiOptions`,\n        dropFiltersAgainstUiOptions(__, uiOptions),\n      ],\n    ];\n  },\n);\n\n/* eslint-enable no-use-before-define */\n/**\n * Accepts a mainTransformer that returns an array of core transformers\n * based on current state which will be applied in order, transforming the state.\n */\nconst apply = (mainTransformer, state, node, extra, index, vizType) => {\n  const transformers = mainTransformer(state, node, extra, index, vizType);\n  // compact duplicated transformation\n  // TODO CHECK THIS OPTIMISATION\n  // Only ADD_METRIC fails when applying this optimisation since adding a metric\n  // rely on duplicating state in a first step. A solution might be to prefix\n  // randomly the queryActions.Transformer in that case to enforce the step.\n  // const toApply = reverse(uniqBy(reverse([...transformers]), ([name]) => name));\n\n  let tmpState = state;\n  transformers.forEach(([, transformer]) => {\n    tmpState = transformer(tmpState);\n  });\n  return tmpState;\n};\n\nconst uiQueryReducer = (state = initialState, action, vizType) => {\n  const { type, payload = {} } = action;\n\n  switch (type) {\n    case queryActions.setMetricField.type:\n      const cleaned = apply(\n        cleanStateSetMetric,\n        state,\n        payload.field,\n        undefined,\n        payload.index,\n        vizType,\n      );\n      return apply(\n        setMetric,\n        cleaned,\n        payload.field,\n        undefined,\n        payload.index,\n        vizType,\n      );\n    case queryActions.setMetricAggregate.type:\n      return apply(\n        setMetric,\n        state,\n        undefined,\n        { aggregate: payload.aggregate },\n        payload.index,\n        vizType,\n      );\n    case queryActions.addMetric.type:\n      return apply(\n        addMetric,\n        state,\n        payload,\n        undefined,\n        state.metrics.length,\n        vizType,\n      );\n    case queryActions.setDetailsColumns.type:\n      return apply(\n        setDetailsColumns,\n        state,\n        payload,\n        undefined,\n        state.detailsColumns.length,\n        vizType,\n      );\n    case queryActions.addDetailsColumn.type:\n      return apply(\n        addDetailsColumn,\n        state,\n        payload,\n        undefined,\n        state.detailsColumns.length,\n        vizType,\n      );\n    case queryActions.removeDetailsColumn.type:\n      return apply(setDetailsColumn, state, null, null, payload, vizType);\n    case queryActions.removeMetric.type:\n      return apply(removeMetric, state, null, null, payload, vizType);\n    case queryActions.setTimeField.type:\n      return apply(setTimespan, state, payload, undefined, 0, vizType);\n    case queryActions.setTimeOperands.type:\n      return apply(setTimespanOperands, state, undefined, payload, 0, vizType);\n    case queryActions.setSplitBy.type:\n      return apply(setSplitBy, state, payload, null, 0, vizType);\n    case queryActions.setOrderBy.type:\n      return apply(setOrderBy, state, payload, undefined, 0, vizType);\n    case queryActions.setOrderByExtra.type:\n      return apply(setOrderBy, state, undefined, payload, 0, vizType);\n    case queryActions.setGroupByBucket.type:\n      return apply(\n        setGroupByBucket,\n        state,\n        undefined,\n        { bucket_by: payload },\n        null,\n        vizType,\n      );\n    case queryActions.setGroupByCategory.type:\n      return apply(\n        setGroupByCategory,\n        state,\n        payload,\n        undefined,\n        null,\n        vizType,\n      );\n    case queryActions.setFilter.type:\n      return apply(\n        setFilter,\n        state,\n        payload.field,\n        payload.value,\n        payload.index,\n        vizType,\n      );\n    case bootstrapActions.setGlobalFilter.type:\n    case queryActions.setGlobalFilter.type:\n      return apply(\n        setGlobalFilter,\n        state,\n        payload.field,\n        payload.value,\n        payload.index,\n        vizType,\n      );\n    case queryActions.setVIPFilter.type:\n      return apply(\n        setVIPFilter,\n        state,\n        payload.field,\n        payload.value,\n        payload.index,\n        vizType,\n      );\n    case queryActions.removeFilter.type:\n      return apply(setFilter, state, null, null, payload, vizType);\n    case queryActions.setVisualisationType.type:\n      const cleanedState = apply(\n        cleanStateSetVisType,\n        truncateMaxMetrics(state, vizType),\n        payload.uiOptions,\n        null,\n        0,\n        vizType,\n      );\n      return apply(\n        setVisualisationType,\n        cleanedState,\n        payload.uiOptions,\n        null,\n        0,\n        vizType,\n      );\n    case bootstrapActions.setGlobalFiltersFromQueries.type:\n      return {\n        ...getFilterNodesFromQueries(payload.graph, payload.queries),\n      };\n    case bootstrapActions.setInitialQueries.type:\n      const nodesFromQuery = getNodesFromQueries(\n        payload.graph,\n        payload.queries,\n        payload.uiOptions,\n        payload.isTimespanComparisonOn,\n        payload.detailsMetricResource,\n        state.prerequisites,\n      );\n\n      const { vipFilters: allVIPNodes = [] } = payload;\n      const { vipFilters: savedVIPFilters = [] } = nodesFromQuery;\n\n      // Set vipFilters state. If filter was saved on query use that,\n      // otherwise map node and set empty extra\n      const vipFilters = allVIPNodes.map(node => {\n        const savedFilter = find(savedVIPFilters, ({ node: n }) =>\n          n.isEqualTo(node),\n        );\n        return savedFilter || { node, extra: {} };\n      });\n\n      return {\n        ...state,\n        ...nodesFromQuery,\n        vipFilters,\n      };\n    case queryActions.setPrerequisites.type:\n      return {\n        ...state,\n        prerequisites: payload,\n      };\n    case queryActions.clearPrerequisites.type: {\n      if (isUndefined(state.prerequisites)) {\n        return state;\n      }\n\n      const prerequisites = map(state.prerequisites, node => ({\n        ...node,\n        extra: omit(node.extra, 'operands'),\n      }));\n\n      return {\n        ...state,\n        prerequisites,\n      };\n    }\n    case bootstrapActions.setPrerequisitesFromQueries.type:\n      return {\n        ...state,\n        prerequisites:\n          getPrerequisitesFromQueries(\n            payload.graph,\n            payload.queries,\n            payload.serviceAccountFilters,\n          ) || state.prerequisites,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default uiQueryReducer;\n","import { setDashboard } from '../../dashboard/actions/dashboard-actions';\nimport * as queryActions from '../actions/universal-query-actions';\nimport * as configActions from '../actions/universal-config-actions';\nimport * as saveActions from '../actions/universal-config-save-actions';\nimport * as bootstrapActions from '../actions/universal-bootstrap-actions';\nimport * as socketActions from '../actions/universal-socket-actions';\nimport * as mirageActions from '../mirage/mirage-actions';\nimport { ensureConfig } from './config-helpers';\nimport {\n  flatten,\n  every,\n  includes,\n  isUndefined,\n  last,\n  omit,\n  omitBy,\n  some,\n} from 'lodash';\nimport uiQueryReducer, {\n  getUiQueryBasedOnOptions,\n  getQueryMetas,\n  getQueriesFromUiQuery,\n  resolveNodesCrossResource,\n} from './ui-query-reducer';\nimport uiOptionsReducer, {\n  appendSelectedNodes,\n  getAvailableMetrics,\n} from './ui-options-reducer';\nimport { getCompatibleMetrics, getFieldsByType } from '../graph';\nimport {\n  areMetricsTypesCompatible,\n  canTimespanCompare,\n  timespanSupportsPrevSameComparison,\n  getTSComparisonOperatorForViz,\n  getMsFromTimespan,\n  getVisualisationsForMetric,\n  MAX_NUMBER_OF_METRICS,\n  FILTER_FIELD_TYPES,\n  TIMESPAN_OPERATORS,\n} from '../ui-field-options';\nimport { transformData } from './other-universal-config-reducer-methods';\nimport { formatMessage } from '../../lib/i18n';\nimport { getInputFromDuration } from '../../lib/humanise-number';\nimport { findCustomFilter } from '../query-helpers';\n\nexport const initialState = {\n  config: {\n    type: 'number',\n    queryMetas: [],\n    timespanComparison: undefined,\n  },\n  subQueryResults: {},\n  source: {},\n  cancelledQueries: new Set(),\n  queries: [],\n  queryResults: [],\n  queryIds: [],\n  queuedData: [],\n  queryFetchCursor: 0,\n  uiQuery: {},\n  uiOptions: {},\n  transformedData: null,\n  mainGraph: [],\n  queriesFetchDone: [],\n  entryResources: [],\n  _filterModal: {},\n  // previewError handle expected error from FE state and show them inline in\n  // preview section. Whereas visualisationError are unexpected error rendered\n  // into Toast\n  error: null,\n  previewError: null,\n  showDataSourcePanel: false,\n  preset: {},\n  api: {},\n  isPusherReady: false,\n  isConfigReady: false,\n  isPreviewOpen: false,\n  hasNoServiceAccounts: false,\n  queriesEnabled: true,\n};\n\nconst setConfigComparison = config => {\n  const { comparison: { startingValue } = {} } = config;\n  const newConfig = {\n    ...omit(config, 'comparison'),\n  };\n\n  if (newConfig.type === 'number' && !isUndefined(newConfig.goal)) {\n    newConfig.comparison = omitBy(\n      {\n        type: 'goal',\n        thresholdType: 'percentage',\n        startingValue,\n      },\n      isUndefined,\n    );\n  }\n\n  return newConfig;\n};\n\nconst getTSComparisonForVisualisation = (vizType, currentOperator) => ({\n  operator: getTSComparisonOperatorForViz(vizType, currentOperator),\n  type: vizType === 'number' ? 'percentage' : undefined,\n});\n\nconst getComparisonForNewTimespan = (comparison, operands, vizType) => {\n  if (!comparison) {\n    return undefined;\n  }\n\n  const [quantity, unit] = operands;\n  const { operator } = comparison;\n\n  if (operator !== TIMESPAN_OPERATORS.PREV_SAME_TIMESPAN) {\n    return comparison;\n  }\n\n  if (timespanSupportsPrevSameComparison(unit, quantity)) {\n    return comparison;\n  }\n\n  return {\n    ...comparison,\n    operator: getTSComparisonOperatorForViz(vizType),\n  };\n};\n\nconst getConfigForVisualisation = config => {\n  // Get new config with correct goal\n  const newConfig = setConfigComparison(config);\n  const { timespanComparison, type } = newConfig;\n\n  // Time comparison\n  if (timespanComparison) {\n    if (\n      ['geckometer', 'column', 'bar', 'leaderboard', 'table'].includes(type)\n    ) {\n      newConfig.timespanComparison = undefined;\n    } else {\n      newConfig.timespanComparison = getTSComparisonForVisualisation(\n        type,\n        timespanComparison.operator,\n      );\n    }\n  }\n\n  return newConfig;\n};\n\nconst getUpdatedConfig = (\n  _config,\n  uiQuery,\n  subQueryResults,\n  queryResults,\n  queries,\n  timezone,\n) => {\n  // Compute new metadata first\n  const queryMetas = getQueryMetas(uiQuery, subQueryResults);\n  // ensure query\n  const config = ensureConfig(\n    { ..._config, queryMetas },\n    { queryResults, queries, timezone },\n    uiQuery,\n  );\n\n  /*\n   * We want to remove timespan comparison if a filter is custom\n   * Because the custom type always remove previously set filters,\n   * we can safely assume the first filter is the right one to check\n   * for its type\n   */\n  if (!!findCustomFilter(uiQuery.filters)) {\n    delete config.timespanComparison;\n  }\n\n  return config;\n};\n\nconst hasCompatibleMetricTypes = uiMetrics => {\n  if (uiMetrics.length === 1) return true;\n\n  const allNodes = uiMetrics.map(m => m.node);\n  return areMetricsTypesCompatible(allNodes);\n};\n\nconst updateVizType = (state, vizType) => {\n  const uiOptions = uiOptionsReducer(\n    state.uiOptions,\n    queryActions.setVisualisationType({\n      metric: state.uiQuery.metrics[0].node,\n    }),\n    state.mainGraph,\n    state.entryResources,\n    vizType,\n  );\n  const uiQuery = uiQueryReducer(\n    state.uiQuery,\n    queryActions.setVisualisationType({ uiOptions }),\n    vizType,\n  );\n  const entryResources = uiQuery.metrics.map(m => m.node.getRoot());\n\n  return {\n    ...state,\n    uiOptions,\n    uiQuery,\n    entryResources,\n    transformedData: initialState.transformedData,\n    config: {\n      ...state.config,\n      type: vizType,\n    },\n  };\n};\n\nconst universalConfigReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n  let uiQuery,\n    uiOptions,\n    allFetchDone,\n    transformedData,\n    entryResources,\n    queries,\n    queryResults,\n    queryIds,\n    queriesFetchDone,\n    config,\n    configWithDefaults,\n    newConfig,\n    newState,\n    previewError,\n    newQueryResults,\n    newQueriesFetchDone,\n    maxTimePeriod,\n    timespanComparison,\n    timezone,\n    title,\n    vizType,\n    numberFormat;\n\n  switch (type) {\n    case bootstrapActions.resetInitial.type:\n      return initialState;\n    case mirageActions.setProxyIntegration.type:\n      const { id, name } = payload;\n      return {\n        ...state,\n        source: {\n          ...state.source,\n          integration: name,\n          integrationMeta: { serviceId: id },\n          isMirage: true,\n        },\n      };\n    case bootstrapActions.resetGraph.type:\n      return {\n        ...state,\n        isConfigReady: false,\n        previewError: initialState.previewError,\n        error: initialState.error,\n        mainGraph: initialState.mainGraph,\n        uiOptions: initialState.uiOptions,\n        uiQuery: initialState.uiQuery,\n        subQueryResults: initialState.subQueryResults,\n        queryResults: initialState.queryResults,\n        transformedData: initialState.transformedData,\n      };\n    case bootstrapActions.setExistingDashboardContext.type:\n      return {\n        ...state,\n        timezone: payload.dashboard.timezone,\n        groupId: payload.dashboard.group_id,\n      };\n    case queryActions.setVisualisationType.type:\n      ({ vizType } = payload);\n\n      newState = updateVizType(state, vizType);\n\n      newConfig = getUpdatedConfig(\n        newState.config,\n        newState.uiQuery,\n        newState.subQueryResults,\n        initialState.queryResults,\n        newState.queries,\n        newState.timezone,\n      );\n\n      newConfig = getConfigForVisualisation(newConfig, newState.uiQuery);\n\n      return {\n        ...newState,\n        config: newConfig,\n        _filterModal: {},\n        queryResults: initialState.queryResults,\n      };\n    case bootstrapActions.setConfigReady.type:\n      return { ...state, isConfigReady: true, isPreviewOpen: true };\n    case configActions.setConfig.type:\n      ({ queries = [], queryResults = [], timezone } = state);\n      newConfig = {\n        ...state.config,\n        ...payload,\n      };\n\n      newConfig = ensureConfig(\n        newConfig,\n        {\n          queryResults,\n          queries,\n          timezone,\n        },\n        state.uiQuery,\n      );\n      // Handle special case for number goal.\n      newConfig = setConfigComparison(newConfig);\n\n      return {\n        ...state,\n        config: newConfig,\n        transformedData: transformData(\n          queries,\n          queryResults,\n          newConfig,\n          timezone,\n        ),\n      };\n    case queryActions.updateNumberFormat.type: {\n      numberFormat = state.config.numberFormat || {};\n      transformedData = state.transformedData || {};\n\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          numberFormat: { ...numberFormat, ...payload },\n        },\n        /*\n         * For some reason number formatting is stored in\n         * two places. We should look at removing this\n         * duplication and only store it in config.\n         */\n        transformedData: {\n          ...transformedData,\n          numberFormat: { ...numberFormat, ...payload },\n        },\n      };\n    }\n    case bootstrapActions.setQueryOptions.type:\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          queryOptions: payload,\n        },\n      };\n    case socketActions.setPusherChannel.type:\n      return {\n        ...state,\n        pusherChannel: payload,\n      };\n    case socketActions.setPusherReady.type:\n      return {\n        ...state,\n        isPusherReady: true,\n      };\n    case setDashboard.type:\n      return {\n        ...state,\n        timezone: payload.timezone,\n        groupId: payload.group_id,\n      };\n    case bootstrapActions.setServiceAccounts.type:\n      return {\n        ...state,\n        hasNoServiceAccounts: false,\n        serviceAccounts: payload,\n      };\n    case bootstrapActions.setService.type:\n      return {\n        ...state,\n        service: payload,\n        source: { ...state.source, integration: payload.name },\n        config: { ...state.config, integrationName: payload.name },\n      };\n    case mirageActions.setMirageProxyService.type:\n      return {\n        ...state,\n        mirageProxyService: payload,\n      };\n    case bootstrapActions.setServiceAccountId.type:\n      return {\n        ...state,\n        source: { ...state.source, service_account_id: `${payload}` },\n      };\n    case queryActions.setVisualisationError.type:\n      return {\n        ...state,\n        visualisationError: action.error,\n        visualisationNotificationType: 'error',\n      };\n    case bootstrapActions.setGraph.type:\n      return { ...state, mainGraph: payload };\n    case bootstrapActions.setAPISettings.type:\n      return { ...state, api: payload };\n    case bootstrapActions.setUiOptions.type:\n      return {\n        ...state,\n        uiOptions: uiOptionsReducer(\n          state.uiOptions,\n          action,\n          state.mainGraph,\n          state.entryResources,\n          state.config.type,\n        ),\n      };\n    case bootstrapActions.setPrerequisiteOptions.type:\n      return {\n        ...state,\n        uiOptions: uiOptionsReducer(state.uiOptions, action),\n      };\n    case configActions.setSource.type:\n      return {\n        ...state,\n        source: payload,\n        visualisationNotificationType: 'loading',\n      };\n    case bootstrapActions.setGlobalFiltersFromQueries.type:\n    case bootstrapActions.setPrerequisitesFromQueries.type:\n    case queryActions.setPrerequisites.type:\n      return {\n        ...state,\n        uiQuery: uiQueryReducer(state.uiQuery, action),\n      };\n    case bootstrapActions.setRawQueries.type:\n      return {\n        ...state,\n        queries: payload || initialState.queries,\n      };\n    case bootstrapActions.setInitialQueries.type:\n      let initialQuery = payload;\n      const {\n        config: { detailsMetricResource },\n      } = state;\n\n      if (detailsMetricResource) {\n        entryResources = [detailsMetricResource];\n      } else {\n        // Store only the first one from raw query to detect a possible necessary\n        // change of entry\n        entryResources = [initialQuery[0].select[0].resource];\n      }\n\n      const vipFilters = getFieldsByType(\n        state.mainGraph,\n        FILTER_FIELD_TYPES,\n        entryResources,\n        state.config.type,\n        n => n.is_vip,\n      );\n\n      uiQuery = uiQueryReducer(state.uiQuery, {\n        ...action,\n        payload: {\n          queries: payload,\n          graph: state.mainGraph,\n          uiOptions: state.uiOptions,\n          isTimespanComparisonOn: !isUndefined(state.config.timespanComparison),\n          detailsMetricResource,\n          vipFilters,\n        },\n      });\n\n      const needChange =\n        entryResources[0] !== uiQuery.metrics[0].node.getRoot();\n      if (needChange) {\n        entryResources[0] = uiQuery.metrics[0].node.getRoot();\n      }\n      // Reuse parsed value from uiQuery to get correct entryResources\n      entryResources = uiQuery.metrics.map(m => m.node.getRoot());\n\n      uiOptions = uiOptionsReducer(\n        state.uiOptions,\n        {\n          ...action,\n          payload: uiQuery.metrics[0].node,\n        },\n        state.mainGraph,\n        entryResources,\n        state.config.type,\n      );\n\n      // Keep retro-compatibility with forced entryResources by switching\n      if (needChange) {\n        uiQuery = resolveNodesCrossResource(\n          uiQuery,\n          state.mainGraph,\n          entryResources[0],\n        );\n        initialQuery = getQueriesFromUiQuery(\n          uiQuery,\n          state.mainGraph,\n          entryResources,\n          state.config.timespanComparison,\n        );\n      }\n      uiOptions = appendSelectedNodes(uiOptions, uiQuery);\n\n      return {\n        ...state,\n        uiQuery,\n        queries: initialQuery,\n        entryResources,\n        uiOptions,\n        config: getUpdatedConfig(\n          state.config,\n          uiQuery,\n          state.subQueryResults,\n          state.queryResults,\n          state.queries,\n          state.timezone,\n        ),\n      };\n    case configActions.updateSubQueryResults.type:\n      const { subQueryResults } = state;\n      const newSubQueryResults = { ...subQueryResults, ...payload };\n\n      return {\n        ...state,\n        subQueryResults: newSubQueryResults,\n        isLoadingSuggestions: false,\n        config: getUpdatedConfig(\n          state.config,\n          state.uiQuery,\n          newSubQueryResults,\n          state.queryResults,\n          state.queries,\n          state.timezone,\n        ),\n      };\n    case queryActions.setFilterForm.type:\n      const { _filterModal: { field = {} } = {}, isLoadingSuggestions } = state;\n      let loading = isLoadingSuggestions;\n      if (isLoadingSuggestions && field !== payload.field) {\n        // Reset loading when changing field\n        loading = false;\n      }\n\n      return {\n        ...state,\n        _filterModal: payload,\n        isLoadingSuggestions: loading,\n      };\n    case configActions.recomputeQueries.type:\n      queries = getQueriesFromUiQuery(\n        state.uiQuery,\n        state.mainGraph,\n        state.entryResources,\n        state.config.timespanComparison,\n      );\n      return { ...state, queries };\n    case configActions.fetchVizDataStart.type:\n      queries = getQueriesFromUiQuery(\n        state.uiQuery,\n        state.mainGraph,\n        state.entryResources,\n        state.config.timespanComparison,\n      );\n      return {\n        ...state,\n        queryFetchCursor: state.queryFetchCursor + 1,\n        queryResults: [[]],\n        queryIds: [],\n        queries,\n        queriesFetchDone: queries.map(() => false),\n        isVisualisationDataComplete: false,\n        visualisationNotificationType: 'loading',\n      };\n    case configActions.clearQueryResults.type:\n      return {\n        ...state,\n        queryResults: [],\n      };\n    case configActions.setQueryIds.type:\n      return {\n        ...state,\n        queryIds: payload,\n      };\n    case configActions.fetchVizDataSuccess.type:\n      ({\n        config,\n        queries = [],\n        queryResults = [],\n        queriesFetchDone = [],\n        queryIds,\n        timezone,\n        uiQuery,\n      } = state);\n      const i = queryIds.indexOf(payload.queryId);\n\n      newQueryResults = [...queryResults];\n      newQueriesFetchDone = [...queriesFetchDone];\n\n      newQueryResults[i] = payload.data;\n      newQueriesFetchDone[i] = payload.done;\n      allFetchDone = every(newQueriesFetchDone, f => f === true);\n\n      configWithDefaults = ensureConfig(\n        config,\n        {\n          queryResults: newQueryResults,\n          queries: state.queries,\n          timezone: state.timezone,\n        },\n        uiQuery,\n      );\n      transformedData = transformData(\n        queries,\n        newQueryResults,\n        configWithDefaults,\n        timezone,\n      );\n\n      return {\n        ...state,\n        queryResults: newQueryResults,\n        transformedData,\n        config: configWithDefaults,\n        queriesFetchDone: newQueriesFetchDone,\n        isVisualisationDataComplete: allFetchDone,\n        visualisationNotificationType: allFetchDone ? 'complete' : 'loading',\n        visualisationError: null,\n      };\n    case socketActions.clearQueuedData.type:\n      return {\n        ...state,\n        queuedData: initialState.queuedData,\n      };\n    case socketActions.queueFetchedData.type:\n      return {\n        ...state,\n        queuedData: [...state.queuedData, payload],\n      };\n    case saveActions.isSaving.type:\n      return {\n        ...state,\n        isSaving: payload,\n      };\n    case configActions.universalSetError.type:\n      return {\n        ...state,\n        error: action.error,\n        isConfigReady: true,\n      };\n    case queryActions.setMetricField.type:\n      const { field: metricField, index, featureFlags = [] } = payload;\n\n      let baseState = { ...state };\n      // Switch visualisation type if current type is not supported and we've\n      // got only one metric selected\n      if (state.uiQuery.metrics.length === 1) {\n        const availableVisualisations = getVisualisationsForMetric(\n          metricField,\n          featureFlags,\n        );\n        if (!includes(availableVisualisations, state.config.type)) {\n          const newType = availableVisualisations[0];\n\n          baseState = updateVizType(state, newType);\n        }\n      }\n\n      newConfig = { ...baseState.config };\n\n      // Reset the widget title when the metric changes\n      delete newConfig.title;\n\n      entryResources = [...baseState.entryResources];\n      uiQuery = uiQueryReducer(baseState.uiQuery, action, newConfig.type);\n\n      uiOptions = baseState.uiOptions;\n      entryResources[index] = metricField.getRoot();\n      // Possibly a new entryResources when switching main metric\n      uiOptions = uiOptionsReducer(\n        baseState.uiOptions,\n        {\n          ...action,\n          payload: metricField,\n        },\n        baseState.mainGraph,\n        entryResources,\n        newConfig.type,\n      );\n\n      if (index === 0) {\n        // Swap selected nodes with nodes from new MAIN resource (e.g. index 0)\n        if (baseState.entryResources[0] !== entryResources[0]) {\n          uiQuery = resolveNodesCrossResource(\n            uiQuery,\n            baseState.mainGraph,\n            entryResources[0],\n          );\n        }\n\n        // We need to filter out nodes that are not available anymore\n        uiQuery = getUiQueryBasedOnOptions(uiQuery, uiOptions, newConfig.type);\n\n        // Metric with null timespans need to disable any timespan comparison\n        if (!uiQuery.timespans || !uiQuery.timespans[0].node) {\n          newConfig.timespanComparison = undefined;\n        }\n      }\n\n      return {\n        ...baseState,\n        uiQuery,\n        uiOptions,\n        config: getUpdatedConfig(\n          newConfig,\n          uiQuery,\n          baseState.subQueryResults,\n          baseState.queryResults,\n          baseState.queries,\n          baseState.timezone,\n        ),\n        entryResources,\n      };\n    case queryActions.setTimeField.type:\n    case queryActions.setGroupByCategory.type:\n    case queryActions.setSplitBy.type:\n    case queryActions.setOrderBy.type:\n    case queryActions.setOrderByExtra.type:\n    case queryActions.setMetricAggregate.type:\n    case queryActions.removeFilter.type:\n    case queryActions.setGroupByBucket.type:\n    case queryActions.setFilter.type:\n    case queryActions.setVIPFilter.type:\n    case bootstrapActions.setGlobalFilter.type:\n    case queryActions.setDetailsColumns.type:\n    case queryActions.addDetailsColumn.type:\n    case queryActions.removeDetailsColumn.type:\n      uiQuery = uiQueryReducer(state.uiQuery, action, state.config.type);\n      config = getUpdatedConfig(\n        state.config,\n        uiQuery,\n        state.subQueryResults,\n        state.queryResults,\n        state.queries,\n        state.timezone,\n      );\n\n      return {\n        ...state,\n        uiQuery,\n        config,\n      };\n    case queryActions.setGlobalFilter.type:\n    case queryActions.clearPrerequisites.type:\n      uiQuery = uiQueryReducer(state.uiQuery, action, state.config.type);\n      queries = getQueriesFromUiQuery(\n        uiQuery,\n        state.mainGraph,\n        state.entryResources,\n        state.config.timespanComparison,\n      );\n\n      return {\n        ...state,\n        uiQuery,\n        queries,\n      };\n    case queryActions.setTimeOperands.type:\n      uiQuery = uiQueryReducer(state.uiQuery, action, state.config.type);\n      newConfig = getUpdatedConfig(\n        state.config,\n        uiQuery,\n        state.subQueryResults,\n        state.queryResults,\n        state.queries,\n        state.timezone,\n      );\n      ({ api: { max_time_period: maxTimePeriod } = {} } = state);\n      ({ timespanComparison, type: vizType } = state.config);\n\n      // Turn off comparison if time span is too big\n      // otherwise ensure the operator is still valid\n      timespanComparison = canTimespanCompare(maxTimePeriod, payload)\n        ? getComparisonForNewTimespan(timespanComparison, payload, vizType)\n        : undefined;\n\n      return {\n        ...state,\n        uiQuery,\n        config: {\n          ...newConfig,\n          timespanComparison,\n        },\n      };\n    case queryActions.removeMetric.type:\n      uiQuery = uiQueryReducer(state.uiQuery, action, state.config.type);\n\n      return {\n        ...state,\n        uiQuery,\n        config: getUpdatedConfig(\n          state.config,\n          uiQuery,\n          state.subQueryResults,\n          state.queryResults,\n          state.queries,\n          state.timezone,\n        ),\n        entryResources: [\n          ...state.entryResources.slice(0, payload),\n          ...state.entryResources.slice(payload + 1),\n        ],\n      };\n    case queryActions.addMetric.type:\n      newState = { ...state };\n\n      if (MAX_NUMBER_OF_METRICS[state.config.type] <= 1) {\n        newState = updateVizType(state, 'line');\n      }\n\n      const {\n        uiOptions: { metrics },\n        uiQuery: { metrics: uiQueryMetrics },\n      } = newState;\n      const availableMetrics = flatten(\n        getAvailableMetrics(metrics).map(g => g.options),\n      );\n      const { node: lastMetric } = last(uiQueryMetrics);\n      let compatibleMetrics;\n      if (state.config.type !== 'table') {\n        const { type: metricType } = lastMetric;\n        compatibleMetrics = getCompatibleMetrics(\n          availableMetrics,\n          metricType,\n          newState.config.type,\n          newState.entryResources[0],\n        );\n      } else {\n        compatibleMetrics = availableMetrics;\n      }\n\n      const cursor = compatibleMetrics.indexOf(lastMetric);\n      const nextMetric =\n        compatibleMetrics[(cursor + 1) % compatibleMetrics.length]; // Take first if end of list\n      newState.entryResources = [...state.entryResources, nextMetric.getRoot()];\n\n      uiQuery = uiQueryReducer(\n        newState.uiQuery,\n        {\n          ...action,\n          payload: nextMetric,\n        },\n        newState.config.type,\n      );\n\n      return {\n        ...newState,\n        uiQuery,\n        config: getUpdatedConfig(\n          newState.config,\n          uiQuery,\n          newState.subQueryResults,\n          newState.queryResults,\n          newState.queries,\n          newState.timezone,\n        ),\n      };\n    case queryActions.fetchFilterSuggestionsStart.type:\n      return {\n        ...state,\n        isLoadingSuggestions: true,\n      };\n    case queryActions.toggleDataSourcePanel.type:\n      const { showDataSourcePanel, addingNewConnection } = payload;\n      return {\n        ...state,\n        showDataSourcePanel,\n        addingNewConnection,\n      };\n\n    case bootstrapActions.setNoServiceAccounts.type:\n      return {\n        ...state,\n        hasNoServiceAccounts: true,\n      };\n    case configActions.setPreset.type:\n      ({ queries, type: vizType, title, config = {} } = payload);\n\n      return {\n        ...state,\n        config: { ...state.config, ...config, type: vizType, title },\n        preset: { queries, type: vizType, title, config },\n      };\n    case configActions.setCancelledQueries.type:\n      return {\n        ...state,\n        cancelledQueries: new Set([...state.cancelledQueries, ...payload]),\n      };\n    case queryActions.setTimespanComparisonOn.type:\n      timespanComparison = getTSComparisonForVisualisation(state.config.type);\n\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          timespanComparison,\n        },\n      };\n    case queryActions.setTimespanComparisonOff.type:\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          timespanComparison: undefined,\n        },\n      };\n    case queryActions.setTimespanComparisonOperator.type: {\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          timespanComparison: {\n            ...state.config.timespanComparison,\n            operator: payload,\n          },\n        },\n      };\n    }\n    case queryActions.setTimespanComparisonType.type:\n      newConfig = ensureConfig(\n        {\n          ...state.config,\n          timespanComparison: {\n            ...state.config.timespanComparison,\n            type: payload,\n          },\n        },\n        {\n          queryResults: state.queryResults,\n          queries: state.queries,\n          timezone: state.timezone,\n        },\n        state.uiQuery,\n      );\n      return {\n        ...state,\n        transformedData: transformData(\n          state.queries,\n          state.queryResults,\n          newConfig,\n          state.timezone,\n        ),\n        config: newConfig,\n      };\n    case queryActions.validate.type:\n      ({\n        api: { max_time_period: maxTimePeriod } = {},\n        entryResources,\n        config: { type: vizType },\n      } = state);\n      const {\n        serviceAccounts: [\n          {\n            service: { title: serviceTitle },\n          },\n        ],\n      } = state;\n\n      // Clear existing error state on revalidate\n      previewError = null;\n\n      // Check for incompatible metric types\n      if (\n        vizType !== 'table' &&\n        !hasCompatibleMetricTypes(state.uiQuery.metrics)\n      ) {\n        previewError = new Error(\n          formatMessage('universal.error.yAxisTypeMismatch'),\n        );\n      } else if (\n        vizType !== 'table' &&\n        state.uiQuery.metrics.length > 1 &&\n        some(state.uiQuery.metrics, ({ node: { primary_resource: pm } }) => {\n          return pm !== entryResources[0];\n        })\n      ) {\n        // Check for resources not matching entryResources\n        previewError = new Error(\n          formatMessage('universal.error.incompatibleResources'),\n        );\n      }\n\n      // Check for not supported metrics for current visualisation\n      if (\n        some(\n          state.uiQuery.metrics,\n          ({ node: { supported_visualisations: sv } }) =>\n            sv && !sv.includes(vizType),\n        )\n      ) {\n        previewError = new Error(\n          formatMessage('universal.error.incompatibleMetricForViz'),\n        );\n      }\n\n      // Check if multiple metrics and details type\n      if (\n        state.uiQuery.metrics.length > 1 &&\n        !previewError &&\n        some(\n          state.uiQuery.metrics,\n          ({ node: { type: nt } }) => nt === 'details',\n        )\n      ) {\n        previewError = new Error(\n          formatMessage('universal.error.detailsMetricIncompatible'),\n        );\n      }\n\n      // Check for timespans that exceed the API data limit\n      if (\n        maxTimePeriod &&\n        state.uiQuery.timespans.some(\n          timespan =>\n            getMsFromTimespan(timespan.extra.operands) > maxTimePeriod,\n        )\n      ) {\n        const timeLimit = getInputFromDuration(\n          maxTimePeriod,\n          'milliseconds',\n          1,\n          'days',\n        );\n        previewError = new Error(\n          formatMessage('universal.error.timespanTooLarge', {\n            service: serviceTitle,\n            timeLimit: timeLimit.days,\n          }),\n        );\n      }\n\n      return {\n        ...state,\n        previewError,\n        queryResults: previewError ? [] : state.queryResults,\n        visualisationNotificationType: previewError\n          ? null\n          : state.visualisationNotificationType,\n      };\n    case configActions.updateColumnNumberFormat.type:\n      const { index: formatIndex, format } = action.payload;\n      ({ config, queries = [], queryResults = [], timezone } = state);\n\n      numberFormat = state.config.numberFormat\n        ? [...state.config.numberFormat]\n        : [];\n      numberFormat[formatIndex] = {\n        ...numberFormat[formatIndex],\n        ...format,\n      };\n      newConfig = {\n        ...config,\n        numberFormat,\n      };\n\n      return {\n        ...state,\n        config: newConfig,\n        transformedData: transformData(\n          queries,\n          queryResults,\n          newConfig,\n          timezone,\n        ),\n      };\n\n    case configActions.disableQueries.type:\n      return {\n        ...state,\n        queriesEnabled: false,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default universalConfigReducer;\n","import universalConfigReducer from './universal-config-reducer';\nexport default universalConfigReducer;\n","import * as userActions from '../actions/user-actions';\nimport * as whatsNewActions from '../../whats-new/whats-new-actions/whats-new-actions';\nimport * as manageScreensActions from '../../manage-screens/actions/manage-screens-actions';\nimport moment from 'moment';\nimport { union, difference } from 'lodash';\n\nconst initialState = {};\n\nconst userReducer = (state = initialState, action) => {\n  const { type, payload, error } = action;\n\n  switch (type) {\n    case userActions.getCurrentUserSuccess.type:\n    case whatsNewActions.markAsReadAction.type: {\n      const { trial_end: trialEnd, ...userProps } = payload;\n      const trialDaysRemaining = moment\n        .utc(trialEnd)\n        .diff(moment.utc(), 'days');\n\n      return {\n        ...state,\n        user: {\n          ...userProps,\n          trialDaysRemaining,\n        },\n      };\n    }\n    case userActions.getCurrentUserFailed.type:\n    case userActions.setCheckpointFailed.type:\n      return { ...state, error };\n\n    case userActions.setCheckpointStart.type: {\n      const { user } = state;\n      return { ...state, user: { ...user, checkpoints: payload } };\n    }\n\n    case userActions.setUserGroups.type:\n      return {\n        ...state,\n        groups: payload,\n      };\n\n    case userActions.getUserOrganizationSuccess.type:\n    case userActions.setUserOrganization.type: {\n      if (!state.user) {\n        return {\n          ...state,\n          organization: payload,\n        };\n      }\n\n      return {\n        ...state,\n        organization: payload,\n      };\n    }\n    case manageScreensActions.toggleLiteStart.type: {\n      const { user } = state;\n      const { toggles = [] } = user;\n\n      const operation = payload ? union : difference;\n\n      return {\n        ...state,\n        user: { ...user, toggles: operation(toggles, ['lite']) },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default userReducer;\n","import userReducer from './user-reducer';\n\nexport default userReducer;\n","import * as whatsNewActions from '../whats-new-actions/whats-new-actions';\n\nconst initialState = {\n  items: null,\n  error: null,\n  visible: false,\n  loading: false,\n  showNotification: false,\n  etag: null,\n};\n\nconst whatsNewReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case whatsNewActions.toggleModalAction.type:\n      return {\n        ...state,\n        visible: payload,\n      };\n    case whatsNewActions.toggleNotification.type:\n      return {\n        ...state,\n        showNotification: payload,\n      };\n    case whatsNewActions.fetchDataStart.type:\n      return {\n        ...state,\n        loading: true,\n      };\n    case whatsNewActions.fetchDataSuccess.type:\n      return {\n        ...state,\n        items: payload.items,\n        error: null,\n        loading: false,\n        etag: payload.etag,\n      };\n    case whatsNewActions.fetchDataFailed.type:\n      return {\n        ...state,\n        error: payload,\n        loading: false,\n      };\n    default:\n      return state;\n  }\n};\n\nexport default whatsNewReducer;\n","import reducer from './whats-new-reducer';\nexport default reducer;\n","import { omit, first, pick, get } from 'lodash';\nimport * as widgetActions from '../actions/widget-actions';\nimport * as widgetDataActions from '../../widget-data/actions/widget-data-actions';\nimport * as widgetMenuActions from '../../widget-menu/actions/widget-menu-actions';\nimport * as customizeActions from '../../customize/actions/customize-actions';\nimport * as editWidgetActions from '../../widget/edit-widget/actions/edit-widget-actions';\nimport * as universalConfigSaveActions from '../../universal-config/actions/universal-config-save-actions';\nimport { find, mapValues } from 'lodash';\nimport update from 'immutability-helper';\n\nconst initialState = {};\n\nconst getVisualisationDetails = (widgetType = {}) => {\n  const template = widgetType.template || {};\n  // Clock, text and image don't use template data so we get their\n  // type from the legacy `widget` attribute\n  // then set the version to a default of 1\n  const type = widgetType.widget;\n\n  return {\n    type: template.type || type,\n    version: template.version || 1,\n  };\n};\n\nconst getVisualisationClassName = visualisation => {\n  switch (visualisation.type) {\n    case 'bullet':\n      return 'bulletchart-widget';\n    case 'image':\n      return 'image-widget';\n    case 'clock':\n      return 'clock-widget';\n    case 'text':\n      return 'polymorphic-widget text-widget';\n    case 'map':\n      return 'polymorphic-widget map-widget';\n    case 'monitoring':\n      return 'monitoring-widget';\n    case 'pie':\n      return 'piechart-widget';\n    case 'rag':\n      return 'polymorphic-widget rag-widget';\n    case 'ragcolumn':\n      return 'ragcolumn-widget';\n    case 'funnel':\n      return 'funnelchart-widget';\n    case 'highcharts':\n      return 'highchart-widget';\n    case 'line':\n    case 'polymorphic':\n    case 'number':\n    case 'geckometer':\n    case 'leaderboard':\n    case 'bar':\n    case 'column':\n    case 'table':\n      return 'polymorphic-widget';\n    default:\n      return undefined;\n  }\n};\n\nconst addWidgetType = (item, widgetType) => {\n  const visualisation = getVisualisationDetails(widgetType);\n  const bodyClassName = getVisualisationClassName(visualisation);\n\n  // Unfortunately the visualisation type is not in a consistent place for different types of\n  // widgets, so we're pulling it from certain places depending on whether it's polymorphic /\n  // non-polymorphic, also Spreadsheets also has it stored somewhere different.\n  const getVisualisationType = () => {\n    if (visualisation.type === 'polymorphic') {\n      if (widgetType.service_name === 'spreadsheets') {\n        return get(item, 'widget.config.template.type');\n      }\n      return get(item, 'widget.config.type');\n    }\n    return visualisation.type;\n  };\n\n  const visualisationType = getVisualisationType(item, visualisation);\n\n  return {\n    ...item.widget,\n    id: item.id,\n    widgetKey: item.key,\n    serviceName: widgetType.service_name,\n    serviceTitle: widgetType.service_title,\n    widgetType: {\n      id: widgetType.id,\n      title: widgetType.title,\n    },\n    serviceId: first(widgetType.services),\n    visualisation: {\n      ...visualisation,\n      vizType: visualisationType,\n    },\n    bodyClassName,\n    isDataRequired: !widgetType.no_data,\n  };\n};\n\nconst widgetsReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case widgetActions.setWidgets.type: {\n      const { widgets, widgetTypes } = payload;\n\n      return widgets.reduce((newState, item) => {\n        const widgetType = find(widgetTypes, { id: item.widget.widget_type });\n        const widgetWithProps = addWidgetType(item, widgetType);\n\n        newState[item.key] = widgetWithProps;\n        return newState;\n      }, {});\n    }\n\n    case widgetActions.widgetChanged.type: {\n      const { widget, widgetType } = payload;\n      const widgetWithProps = addWidgetType(widget, widgetType);\n\n      return {\n        ...state,\n        [widget.key]: widgetWithProps,\n      };\n    }\n\n    case widgetActions.widgetRemoved.type:\n      return omit(state, payload);\n\n    case widgetActions.widgetAdded.type: {\n      const { widget, widgetType } = payload;\n\n      return {\n        ...state,\n        [widget.key]: addWidgetType(widget, widgetType),\n      };\n    }\n\n    case widgetActions.widgetConfigChanged.type: {\n      return update(state, {\n        [payload.key]: { config: { $set: payload.config } },\n      });\n    }\n\n    case widgetMenuActions.saveNewNumberFormat.type: {\n      const { widgetKey, numberFormat } = payload;\n\n      return {\n        ...state,\n        [widgetKey]: {\n          ...state[widgetKey],\n          config: {\n            ...state[widgetKey].config,\n            numberFormat,\n          },\n        },\n      };\n    }\n\n    case widgetMenuActions.saveNewIndicator.type: {\n      const { widgetKey, indicators } = payload;\n\n      return {\n        ...state,\n        [widgetKey]: {\n          ...state[widgetKey],\n          config: {\n            ...state[widgetKey].config,\n            indicators,\n          },\n        },\n      };\n    }\n\n    case customizeActions.saveSuccessful.type: {\n      return Object.keys(payload.widgets).reduce((widgets, widgetKey) => {\n        widgets[widgetKey] = {\n          ...state[widgetKey],\n          layout: payload.widgets[widgetKey].layout,\n        };\n\n        return widgets;\n      }, {});\n    }\n\n    case widgetActions.widgetLocationChanged.type: {\n      return {\n        ...state,\n        [payload.widgetKey]: {\n          ...state[payload.widgetKey],\n          location: payload.location,\n          layout: payload.layout,\n          stableOrder: payload.stableOrder,\n        },\n      };\n    }\n\n    case widgetActions.locationChangeStart.type: {\n      return {\n        ...state,\n        [payload]: {\n          ...state[payload],\n          anticipateHide: true,\n        },\n      };\n    }\n\n    case widgetActions.locationChangeAccomplished.type: {\n      return {\n        ...state,\n        [payload]: {\n          ...state[payload],\n          anticipateHide: false,\n          anticipateShow: true,\n        },\n      };\n    }\n\n    case widgetActions.locationChangeEnd.type: {\n      return {\n        ...state,\n        [payload]: {\n          ...state[payload],\n          anticipateShow: false,\n        },\n      };\n    }\n\n    case widgetActions.finishCelebration.type: {\n      return {\n        ...state,\n        [payload]: {\n          ...state[payload],\n          isCelebrating: undefined,\n        },\n      };\n    }\n\n    case widgetActions.launchCelebration.type: {\n      return {\n        ...mapValues(state, widget => {\n          return { ...widget, isCelebrating: undefined };\n        }),\n        [payload]: {\n          ...state[payload],\n          isCelebrating: true,\n        },\n      };\n    }\n\n    case widgetDataActions.dataReceived.type:\n      return {\n        ...state,\n        [payload.key]: omit(\n          state[payload.key],\n          'isAwaitingInitialServerSideRefresh',\n        ),\n      };\n\n    case widgetDataActions.dataError.type:\n      return {\n        ...state,\n        [payload]: omit(state[payload], 'isAwaitingInitialServerSideRefresh'),\n      };\n\n    case widgetActions.setAwaitingInitialServerSideRefresh.type: {\n      return {\n        ...state,\n        [payload]: {\n          ...state[payload],\n          isAwaitingInitialServerSideRefresh: true,\n        },\n      };\n    }\n\n    case editWidgetActions.configUpdated.type:\n    case universalConfigSaveActions.configUpdated.type: {\n      const { widgetKey } = payload;\n      const newWidgetAttributes = pick(payload, [\n        'config',\n        'refresh_interval',\n        'service_account_id',\n      ]);\n\n      return {\n        ...state,\n        [widgetKey]: {\n          ...state[widgetKey],\n          ...newWidgetAttributes,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default widgetsReducer;\n","import widgetsReducer from './widgets-reducer';\n\nexport default widgetsReducer;\n","import { omit } from 'lodash';\nimport * as widgetDataActions from '../actions/widget-data-actions';\nimport * as widgetActions from '../../widget/actions/widget-actions';\nimport * as editWidgetActions from '../../widget/edit-widget/actions/edit-widget-actions';\nimport * as universalConfigSaveActions from '../../universal-config/actions/universal-config-save-actions';\nimport { isUndefined } from 'lodash';\n\nconst initialState = {};\n\nconst getDataPerService = (service, config) => {\n  switch (service) {\n    case 'universal-demo':\n      return config.mirageConfig.data;\n\n    default:\n      return undefined;\n  }\n};\n\nconst getWidgetService = (widget, widgetTypes) =>\n  widgetTypes.find(type => type.id === widget.widget_type).service_name;\n\nconst widgetDataReducer = (state = initialState, action) => {\n  const { type, payload, error } = action;\n\n  switch (type) {\n    case widgetDataActions.dataReceived.type:\n      return {\n        ...state,\n        [payload.key]: {\n          data: payload.data,\n          updatedAt: payload.updatedAt,\n        },\n      };\n\n    case widgetDataActions.dataError.type: {\n      const widget = state[payload] || {};\n\n      return {\n        ...state,\n        [payload]: {\n          ...widget,\n          error,\n        },\n      };\n    }\n\n    case editWidgetActions.configUpdated.type:\n    case universalConfigSaveActions.configUpdated.type: {\n      const { widgetKey, data } = payload;\n      const cleanError = !isUndefined(data)\n        ? undefined\n        : state[widgetKey].error;\n\n      return {\n        ...state,\n        [widgetKey]: {\n          ...state[widgetKey],\n          error: cleanError,\n          data,\n        },\n      };\n    }\n\n    case widgetActions.setWidgets.type:\n      const { widgets, widgetTypes } = payload;\n\n      const newData = widgets.reduce((acc, w) => {\n        const data = getDataPerService(\n          getWidgetService(w.widget, widgetTypes),\n          w.widget.config,\n        );\n\n        return data ? { ...acc, [w.key]: { data } } : acc;\n      }, {});\n\n      return { ...initialState, ...newData };\n\n    case widgetDataActions.clearData.type:\n    case widgetActions.widgetRemoved.type:\n      return omit(state, payload);\n\n    default:\n      return state;\n  }\n};\n\nexport default widgetDataReducer;\n","import widgetDataReducer from './widget-data-reducer';\n\nexport default widgetDataReducer;\n","import * as widgetMenuActions from '../actions/widget-menu-actions';\nimport WidgetMenu from '../widget-menu-component';\nimport { isUndefined } from 'lodash';\n\nconst initialState = {\n  indicators: undefined,\n  numberFormat: undefined,\n  view: WidgetMenu.VIEWS.CLOSED,\n  isEditingQuery: false,\n  widgetKey: undefined,\n};\n\nconst widgetMenuReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case widgetMenuActions.openMenu.type: {\n      return {\n        ...state,\n        widgetKey: payload.widgetKey,\n        view: payload.view || WidgetMenu.VIEWS.MENU,\n      };\n    }\n    case widgetMenuActions.toggleQueryEditor.type: {\n      return {\n        ...state,\n        isEditingQuery: payload,\n      };\n    }\n    case widgetMenuActions.closeMenu.type: {\n      return initialState;\n    }\n    case widgetMenuActions.doOpenWidgetStatusIndicator.type: {\n      return {\n        ...state,\n        indicators: payload,\n        view: WidgetMenu.VIEWS.STATUS_INDICATORS,\n      };\n    }\n    case widgetMenuActions.doOpenNumberFormatter.type: {\n      return {\n        ...state,\n        numberFormat: payload,\n        view: WidgetMenu.VIEWS.NUMBER_FORMAT,\n      };\n    }\n    case widgetMenuActions.openDeleteModal.type: {\n      return {\n        ...state,\n        view: WidgetMenu.VIEWS.DELETE,\n      };\n    }\n    case widgetMenuActions.updateNumberFormat.type: {\n      const { index, format = {} } = action.payload;\n      let { numberFormat } = state;\n\n      // When there is an index, we know the numberFormat is an array\n      // otherwise the numberFormat is a simple object\n      if (!isUndefined(index)) {\n        numberFormat = numberFormat ? [...numberFormat] : [];\n\n        numberFormat[index] = {\n          ...numberFormat[index],\n          ...format,\n        };\n      } else {\n        numberFormat = numberFormat ? { ...numberFormat } : {};\n\n        numberFormat = {\n          ...numberFormat,\n          ...format,\n        };\n      }\n\n      return {\n        ...state,\n        numberFormat,\n      };\n    }\n    case widgetMenuActions.updateStatusIndicatorValue.type: {\n      return {\n        ...state,\n        indicators: payload,\n      };\n    }\n    case widgetMenuActions.saveNewNumberFormat.type: {\n      return initialState;\n    }\n\n    case widgetMenuActions.openCopyModal.type: {\n      return {\n        ...state,\n        view: WidgetMenu.VIEWS.COPY,\n      };\n    }\n    case widgetMenuActions.openEditWidget.type: {\n      return {\n        ...state,\n        view: WidgetMenu.VIEWS.EDIT,\n      };\n    }\n\n    default: {\n      return state;\n    }\n  }\n};\n\nexport { widgetMenuReducer as default, initialState };\n","import reducer from './widget-menu-reducer';\n\nexport default reducer;\n","import * as instrumentMenuActions from '../actions/instrument-menu-actions';\nimport { VIEWS } from '../instrument-menu-constants';\nimport { isUndefined } from 'lodash';\n\nconst initialState = {\n  view: VIEWS.CLOSED,\n  instrumentId: undefined,\n  numberFormat: undefined,\n};\n\nconst instrumentMenuReducer = (state = initialState, action) => {\n  const { type, payload } = action;\n\n  switch (type) {\n    case instrumentMenuActions.openMenu.type: {\n      return {\n        ...state,\n        instrumentId: payload.instrumentId,\n        view: payload.view || VIEWS.MENU,\n      };\n    }\n    case instrumentMenuActions.closeMenu.type: {\n      return initialState;\n    }\n    case instrumentMenuActions.openUniversalConfig.type: {\n      return {\n        ...state,\n        legacyWidgetKey: payload.legacyWidgetKey,\n        view: VIEWS.EDIT,\n      };\n    }\n    case instrumentMenuActions.openDeleteModal.type: {\n      return {\n        ...state,\n        view: VIEWS.DELETE,\n      };\n    }\n    case instrumentMenuActions.closeDeleteModal.type: {\n      return {\n        ...state,\n        view: VIEWS.CLOSED,\n      };\n    }\n    case instrumentMenuActions.openInstrumentStatusIndicator.type: {\n      return {\n        ...state,\n        view: VIEWS.STATUS_INDICATORS,\n      };\n    }\n    case instrumentMenuActions.setStatusIndicators.type: {\n      return {\n        ...state,\n        statusIndicators: payload,\n      };\n    }\n    case instrumentMenuActions.openInstrumentNumberFormatting.type: {\n      return {\n        ...state,\n        view: VIEWS.NUMBER_FORMATTING,\n      };\n    }\n    case instrumentMenuActions.setNumberFormat.type: {\n      return {\n        ...state,\n        numberFormat: payload,\n      };\n    }\n    case instrumentMenuActions.updateNumberFormat.type: {\n      const { format = {}, index } = action.payload;\n      const { numberFormat: currentNumberFormat } = state;\n\n      let numberFormat;\n\n      // If index is defined, we're dealing with an array\n      // of number formats (e.g. in case of a table visualisation)\n      if (!isUndefined(index)) {\n        numberFormat = [...(currentNumberFormat || [])];\n        numberFormat[index] = {\n          ...numberFormat[index],\n          ...format,\n        };\n      } else {\n        numberFormat = { ...(currentNumberFormat || {}), ...format };\n      }\n\n      return {\n        ...state,\n        numberFormat,\n      };\n    }\n\n    default: {\n      return state;\n    }\n  }\n};\n\nexport { instrumentMenuReducer as default, initialState };\n","import reducer from './instrument-menu-reducer';\n\nexport default reducer;\n","import * as instrumentDataActions from '../actions/instrument-data-actions';\nimport * as universalConfigSaveActions from '../../../universal-config/actions/universal-config-save-actions';\n\nconst initialState = {};\n\nconst instrumentDataReducer = (state = initialState, action) => {\n  const { type, payload, error } = action;\n\n  switch (type) {\n    case instrumentDataActions.dataReceived.type:\n      return {\n        ...state,\n        [payload.instrumentId]: {\n          payload: payload.data,\n          dataUpdatedAt: payload.dataUpdatedAt,\n          isDataFromCache: payload.isDataFromCache,\n          dataError: null,\n        },\n      };\n\n    case instrumentDataActions.dataError.type: {\n      const instrument = state[payload] || {};\n\n      return {\n        ...state,\n        [payload]: {\n          ...instrument,\n          payload: null,\n          dataError: error,\n        },\n      };\n    }\n\n    // Update instrument data when the config has been updated in the universal UI.\n    // That way the instrument can show the fresh data, that was fetched while\n    // editing the widget.\n    case universalConfigSaveActions.configUpdated.type: {\n      const instrument = state[payload.instrumentId] || {};\n\n      return {\n        ...state,\n        [payload.instrumentId]: {\n          ...instrument,\n          payload: payload.data,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default instrumentDataReducer;\n","import instrumentDataReducer from './instrument-data-reducer';\n\nexport default instrumentDataReducer;\n","import { combineReducers } from 'redux';\nimport accountReducer from '../account/reducer';\nimport adminReducer from '../admin/reducer';\nimport usersDashboardsreducer from '../admin/reducer/users-dashboards-reducer';\nimport customizeReducer from '../customize/reducer';\nimport dashboardReducer from '../dashboard/reducer';\nimport allDashboardsReducer from '../admin/reducer/all-dashboards-reducer';\nimport allLoopsReducer from '../admin/reducer/all-loops-reducer';\nimport allDataSourcesReducer from '../admin/reducer/all-data-sources-reducer';\nimport allUsersReducer from '../admin/reducer/all-users-reducer';\nimport containerLayoutReducer from '../dashboard/container-layout/reducer';\nimport datasetReducer from '../dataset-config/reducer';\nimport dataSourceConnectorReducer from '../data-source-connector/reducer';\nimport dataSourcesReducer from '../data-sources/reducer';\nimport defaultDataSourceConnectorReducer from '../data-source-connector/default-data-source-connector/reducer';\nimport deleteDataSourceConfirmModalReducer from '../admin/components/modals/delete-data-source-confirm-modal/reducer';\nimport editWidgetReducer from '../widget/edit-widget/reducer';\nimport filePickerReducer from '../file-picker/reducer';\nimport graphQLDashboardReducer from '../dashboard/graphql-reducer';\nimport importsReducer from '../imports/reducer/imports-reducer';\nimport manageScreensReducer from '../manage-screens/reducer';\nimport notificationReducer from '../notification-bar/reducer';\nimport peopleReducer from '../people/reducer';\nimport presetsReducer from '../components/presets/presets-reducer';\nimport salesforceReducer from '../salesforce-config/reducer';\nimport serviceAccountsReducer from '../reducers/service-accounts-reducer';\nimport spreadsheetReducer from '../spreadsheet-config/reducer';\nimport toastLauncherReducer from '../toast/reducer';\nimport tvPageReducer from '../tv-page/reducer';\nimport universalReducer from '../universal-config/reducer';\nimport userReducer from '../user/reducer';\nimport whatsNewReducer from '../whats-new/whats-new-reducer';\nimport widgetsReducer from '../widget/reducer';\nimport widgetDataReducer from '../widget-data/reducer';\nimport widgetMenuReducer from '../widget-menu/reducer';\nimport instrumentMenuReducer from '../instrument-menu/reducer';\nimport instrumentDataReducer from '../components/instrument/reducer';\n\nconst rootReducer = combineReducers({\n  account: accountReducer,\n  admin: adminReducer,\n  allDashboards: allDashboardsReducer,\n  allLoops: allLoopsReducer,\n  allDataSources: allDataSourcesReducer,\n  allUsers: allUsersReducer,\n  containerLayout: containerLayoutReducer,\n  customize: customizeReducer,\n  dashboard: dashboardReducer,\n  datasets: datasetReducer,\n  dataSourceConnector: dataSourceConnectorReducer,\n  dataSources: dataSourcesReducer,\n  defaultDataSourceConnector: defaultDataSourceConnectorReducer,\n  deleteDataSourceConfirmModal: deleteDataSourceConfirmModalReducer,\n  editWidget: editWidgetReducer,\n  filePicker: filePickerReducer,\n  graphQLDashboard: graphQLDashboardReducer,\n  imports: importsReducer,\n  manageScreens: manageScreensReducer,\n  notification: notificationReducer,\n  people: peopleReducer,\n  presets: presetsReducer,\n  salesforce: salesforceReducer,\n  serviceAccounts: serviceAccountsReducer,\n  spreadsheets: spreadsheetReducer,\n  toastLauncher: toastLauncherReducer,\n  tvPage: tvPageReducer,\n  universal: universalReducer,\n  user: userReducer,\n  usersDashboards: usersDashboardsreducer,\n  whatsNew: whatsNewReducer,\n  widgets: widgetsReducer,\n  widgetData: widgetDataReducer,\n  widgetMenu: widgetMenuReducer,\n  instrumentMenu: instrumentMenuReducer,\n  instrumentData: instrumentDataReducer,\n});\n\nexport default rootReducer;\n","import { getNodeEnv } from './global';\nimport { attempt } from 'lodash';\nimport bugsnag from './bugsnag';\n\nconst actionErrorHandler = (isDevelopment, error) => {\n  const isTest = attempt(getNodeEnv) === 'test';\n\n  // `instanceof` is not supported in Babel when extending built-in classes\n  if ('FetchError' === error.name || isTest) {\n    return;\n  }\n\n  if (isDevelopment && console) {\n    console.error(error);\n  }\n\n  attempt(() => bugsnag.send(error));\n};\n\nexport default actionErrorHandler;\n","import actionErrorHandler from '../../action-error-handler';\n\nconst handleError = () => next => action => {\n  const { error } = action;\n\n  if (error) {\n    actionErrorHandler(__DEV__, error);\n  }\n\n  return next(action);\n};\n\nexport default handleError;\n","import { compose, applyMiddleware } from 'redux';\nimport thunk from 'redux-thunk';\nimport handleError from './middleware/handle-error-middleware';\n\nconst composeEnhancers =\n  __DEV__ &&\n  typeof window === 'object' &&\n  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n        name: 'Geckoboard',\n      })\n    : compose;\n\nconst enhancer = composeEnhancers(applyMiddleware(thunk, handleError));\n\nexport default enhancer;\n","import { createStore } from 'redux';\nimport { once } from 'lodash';\nimport rootReducer from './root-reducer';\nimport enhancer from '../lib/redux/enhancer';\n\nexport const getReduxStore = () =>\n  createStore(rootReducer, undefined, enhancer);\n\nexport default once(getReduxStore);\n","import getReduxStore from './get-redux-store';\nimport * as toastActions from '../toast/actions';\nimport * as userActions from '../user/actions/user-actions';\nimport { isGraphQLDashboard } from '../services/concierge-service/graphql-helpers';\nimport * as Tracking from '@Tracking';\n\nconst initApp = () => {\n  const store = getReduxStore();\n  Tracking.setReduxStore(store);\n\n  // On GraphQL dashboards we're loading the user and organization\n  // in the actions when initializing the page.\n  if (!isGraphQLDashboard()) {\n    store.dispatch(userActions.initialiseNonGraphQLPage());\n    store.dispatch(toastActions.showScheduledToast());\n  }\n\n  return {\n    getStore: () => store,\n  };\n};\n\nexport default initApp;\n","import { once } from 'lodash';\nimport initApp from './init-app';\n\nexport default once(initApp);\n","import idempotentInitApp from './idempotent-init-app';\nimport getReduxStore from './get-redux-store';\n\nexport default idempotentInitApp;\nexport { getReduxStore };\n","const getDefaultConfig = () => {\n  return {\n    type: 'line',\n  };\n};\n\nconst isValid = cfg => {\n  const { config: { xAxis, yAxis } = {} } = cfg;\n\n  return !!(xAxis && yAxis);\n};\n\nconst configMappingRules = {\n  column: [\n    'xAxis',\n    'yAxis',\n    'series',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n  ],\n  bar: ['xAxis', 'yAxis', 'goal', 'reverseGoalDirection', 'numberFormat'],\n  number: [\n    'yAxis',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  leaderboard: ['xAxis', 'yAxis', 'numberFormat'],\n  geckometer: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","const getDefaultConfig = () => {\n  return {\n    type: 'number',\n    numberToDisplay: 'grandTotal',\n  };\n};\n\nconst isValid = cfg => {\n  const { config: { yAxis } = {} } = cfg;\n\n  return !!yAxis;\n};\n\n// We map the goal direction from line, column and geckometer\n// to a sensible goal type\nconst GOAL_DIRECTION_TO_THRESHOLD_TYPE = [\n  'reverseGoalDirection',\n  isReversed => {\n    if (isReversed) {\n      return { type: 'goal', thresholdType: 'lower' };\n    }\n\n    return { type: 'goal', thresholdType: 'percentage' };\n  },\n  'comparison',\n];\n\nconst configMappingRules = {\n  line: ['yAxis', 'goal', 'numberFormat', GOAL_DIRECTION_TO_THRESHOLD_TYPE],\n  column: ['yAxis', 'goal', 'numberFormat', GOAL_DIRECTION_TO_THRESHOLD_TYPE],\n  bar: ['yAxis', 'goal', 'numberFormat', GOAL_DIRECTION_TO_THRESHOLD_TYPE],\n  leaderboard: ['yAxis', 'numberFormat'],\n  geckometer: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","import { defaultTo } from 'lodash';\nimport LineChartHelpers from './components/line-chart-form/helpers';\nimport ColumnChartHelpers from './components/column-chart-form/helpers';\nimport BarChartHelpers from './components/bar-chart-form/helpers';\nimport NumberHelpers from './components/number-form/helpers';\nimport LeaderboardHelpers from './components/leaderboard-form/helpers';\nimport GeckometerHelpers from './components/geckometer-form/helpers';\nimport TableHelpers from './components/table-form/helpers';\n\nconst DATA_METHODS = {\n  line: LineChartHelpers,\n  column: ColumnChartHelpers,\n  bar: BarChartHelpers,\n  number: NumberHelpers,\n  leaderboard: LeaderboardHelpers,\n  geckometer: GeckometerHelpers,\n  table: TableHelpers,\n};\n\nconst getVisualisationHelpers = visualisation =>\n  defaultTo(DATA_METHODS[visualisation], LineChartHelpers);\n\nexport default getVisualisationHelpers;\n","const getDefaultConfig = () => {\n  return {\n    type: 'column',\n  };\n};\n\nconst isValid = cfg => {\n  const { config: { xAxis, yAxis } = {} } = cfg;\n\n  return !!(xAxis && yAxis);\n};\n\nconst configMappingRules = {\n  line: [\n    'xAxis',\n    'yAxis',\n    'series',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n  ],\n  bar: ['xAxis', 'yAxis', 'goal', 'reverseGoalDirection', 'numberFormat'],\n  number: [\n    'yAxis',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  leaderboard: ['xAxis', 'yAxis', 'numberFormat'],\n  geckometer: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","const getDefaultConfig = () => {\n  return {\n    type: 'bar',\n  };\n};\n\nconst isValid = cfg => {\n  const { config: { xAxis, yAxis } = {} } = cfg;\n\n  return !!(xAxis && yAxis);\n};\n\nconst configMappingRules = {\n  line: ['xAxis', 'yAxis', 'goal', 'reverseGoalDirection', 'numberFormat'],\n  column: ['xAxis', 'yAxis', 'goal', 'reverseGoalDirection', 'numberFormat'],\n  number: [\n    'yAxis',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  leaderboard: ['xAxis', 'yAxis', 'numberFormat'],\n  geckometer: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","const getDefaultConfig = () => {\n  return {\n    type: 'leaderboard',\n    reverseSort: false,\n  };\n};\n\nconst isValid = cfg => {\n  const { config: { xAxis, yAxis } = {} } = cfg;\n\n  return !!(xAxis && yAxis);\n};\n\nconst configMappingRules = {\n  line: ['xAxis', 'yAxis', 'numberFormat'],\n  column: ['xAxis', 'yAxis', 'numberFormat'],\n  bar: ['xAxis', 'yAxis', 'numberFormat'],\n  number: ['yAxis', 'numberFormat'],\n  geckometer: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","const getDefaultConfig = () => {\n  return {\n    type: 'geckometer',\n    numberToDisplay: 'grandTotal',\n  };\n};\n\nconst isValid = cfg => {\n  const {\n    config: { yAxis },\n  } = cfg;\n  return !!yAxis;\n};\n\nconst configMappingRules = {\n  line: ['yAxis', 'numberFormat'],\n  column: ['yAxis', 'numberFormat'],\n  bar: ['yAxis', 'numberFormat'],\n  number: ['yAxis', 'numberFormat'],\n  leaderboard: ['yAxis', 'numberFormat'],\n};\n\nexport default { getDefaultConfig, isValid, configMappingRules };\n","const isValid = () => true;\n\nconst getDefaultConfig = () => ({\n  type: 'table',\n  hasHeader: true,\n});\n\nconst configMappingRules = {};\n\nexport default { isValid, getDefaultConfig, configMappingRules };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { isEqual } from 'lodash';\nimport classNames from 'classnames';\nimport { globalClearTimeout } from '../../lib/global';\n\nimport style from './slider-style.scss';\n\nclass SliderComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      currentSlide: 0,\n    };\n  }\n\n  componentDidMount() {\n    this.startLoopSlides(this.props.values);\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    const isValueEqual = isEqual(this.props.values, nextProps.values);\n    const isStateEqual = isEqual(this.state, nextState);\n\n    if (!isValueEqual || !isStateEqual) {\n      return true;\n    }\n\n    return false;\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (!isEqual(this.props.values, nextProps.values)) {\n      this.startLoopSlides(nextProps.values);\n    }\n  }\n\n  componentWillUnmount() {\n    this.stopLoopSlides();\n  }\n\n  startLoopSlides(values) {\n    this.stopLoopSlides();\n\n    // Only loop if there is more than one slide\n    if (values && values.length > 1) {\n      this.loopSlides();\n    }\n  }\n\n  stopLoopSlides() {\n    globalClearTimeout(this.timeout);\n    this.timeout = null;\n    this.setState({ currentSlide: 0 });\n  }\n\n  nextSlide() {\n    const { values } = this.props;\n    const { currentSlide } = this.state;\n\n    const nextSlide = (currentSlide + 1) % values.length;\n    this.setState({ currentSlide: nextSlide });\n  }\n\n  // Always use startLoopSlides to start looping\n  loopSlides() {\n    // Make sure element is still attached to the dom before setting timeout\n    const node = findDOMNode(this);\n\n    this.timeout = setTimeout(() => {\n      this.timeout = null;\n\n      if (document.body.contains(node)) {\n        this.nextSlide();\n        this.loopSlides();\n      }\n    }, this.props.speed);\n  }\n\n  handleChangeSlide(slideIndex, e) {\n    e.preventDefault();\n    this.startLoopSlides(this.props.values);\n    this.setState({ currentSlide: slideIndex });\n  }\n\n  renderDots() {\n    const { values, paginationClassName, dotClassName } = this.props;\n\n    const { currentSlide } = this.state;\n    const dots = values.map((value, i) => {\n      const dotClasses = classNames(style.dot, dotClassName, `page-${i + 1}`, {\n        [style.activeDot]: i === currentSlide,\n        activeSlide: i === currentSlide,\n      });\n\n      return (\n        <li key={`dot-${i}`} className={style.dotItem}>\n          <button\n            className={dotClasses}\n            onClick={this.handleChangeSlide.bind(this, i)}\n          />\n        </li>\n      );\n    });\n\n    const paginationClasses = classNames(style.pagination, 'slide-pagination');\n    const paginationInnerClasses = classNames(paginationClassName, 'inner');\n\n    return (\n      <div className={paginationClasses}>\n        <ul className={paginationInnerClasses}>{dots}</ul>\n      </div>\n    );\n  }\n\n  renderTextPagination() {\n    const { values, paginationClassName } = this.props;\n    const { currentSlide } = this.state;\n\n    const paginationClasses = classNames(style.pagination, 'slide-pagination');\n    const textClasses = classNames(\n      paginationClassName,\n      style.textPagination,\n      'inner',\n    );\n    const text = `${currentSlide + 1} of ${values.length}`;\n\n    return (\n      <div className={paginationClasses}>\n        <div className={textClasses}>{text}</div>\n      </div>\n    );\n  }\n\n  renderPagination() {\n    const { values } = this.props;\n\n    if (!values || values.length < 2) return null;\n\n    if (values.length <= 5) {\n      return this.renderDots();\n    }\n\n    return this.renderTextPagination();\n  }\n\n  render() {\n    const {\n      values,\n      slideClassName,\n      sliderClassName,\n      iconClassName,\n      icons,\n    } = this.props;\n    const slideClasses = classNames(slideClassName, 'slide', 't-main');\n    const sliderClasses = classNames(sliderClassName, 'slides');\n\n    if (!values || !values.length) return null;\n\n    const { currentSlide } = this.state;\n    const currentIcon = icons[currentSlide];\n    const iconClasses = classNames(\n      iconClassName,\n      style[currentIcon],\n      'slide-ribbon',\n      {\n        warning: currentIcon === 'alert',\n        info: currentIcon === 'info',\n        none: currentIcon === 'none',\n      },\n    );\n\n    return (\n      <div className={sliderClasses}>\n        {currentIcon && <i className={iconClasses} />}\n        <div className={slideClasses}>{values[currentSlide]}</div>\n        {this.renderPagination()}\n      </div>\n    );\n  }\n}\n\nSliderComponent.defaultProps = {\n  speed: 10000,\n  icons: [],\n};\n\nSliderComponent.propTypes = {\n  dotClassName: PropTypes.string,\n  iconClassName: PropTypes.string,\n  icons: PropTypes.arrayOf(PropTypes.oneOf([undefined, 'alert', 'info'])),\n  paginationClassName: PropTypes.string,\n  slideClassName: PropTypes.string,\n  sliderClassName: PropTypes.string,\n  speed: PropTypes.number,\n  values: PropTypes.arrayOf(PropTypes.node),\n};\n\nexport default SliderComponent;\n","import Slider from './slider-component';\nexport default Slider;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { getClientSize } from '../../../lib/dom-helper';\nimport { last } from 'lodash';\n\nclass VariableFontSizeComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.handleResize = this.handleResize.bind(this);\n  }\n\n  componentDidMount() {\n    window.addEventListener('resize', this.handleResize);\n    this.afterRender();\n  }\n\n  componentDidUpdate() {\n    this.afterRender();\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.handleResize);\n  }\n\n  handleResize() {\n    this.afterRender();\n  }\n\n  render() {\n    const { className, children } = this.props;\n\n    return <div className={className} children={children} />;\n  }\n\n  pickFontSize(height) {\n    const { sizes, heights } = this.props;\n\n    if (!height || !sizes || !heights) {\n      return 0;\n    }\n\n    let finalSize;\n\n    // choose font size depending on height\n    for (let i = 0; i <= heights.length; i++) {\n      if (height <= heights[i] && !finalSize) {\n        finalSize = sizes[i];\n      }\n    }\n\n    return finalSize || last(sizes);\n  }\n\n  afterRender() {\n    const domNode = findDOMNode(this);\n\n    if (domNode) {\n      const // height of parent\n        [, height] = getClientSize(domNode);\n\n      const fontSize = this.pickFontSize(height);\n\n      domNode.style.fontSize = `${fontSize}px`;\n    }\n  }\n}\n\nVariableFontSizeComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  heights: PropTypes.array,\n  sizes: PropTypes.array,\n};\n\nexport default VariableFontSizeComponent;\n","import VariableFontSize from './variable-font-size-component';\nexport default VariableFontSize;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { slice, last } from 'lodash';\nimport Slider from '../../components/slider';\nimport VariableFontSize from '../shared/variable-font-size';\nimport classNames from 'classnames';\n\nimport style from './text-style.scss';\n\nconst SMALL_HEADING_BREAKPOINT = 60;\nconst LARGE_HEADING_BREAKPOINT = 146;\nconst SLIDER_SPEED = 10000;\n\nconst isMobile = () =>\n  document.querySelector('html').classList.contains('is-mobile');\n\nclass TextComponent extends Component {\n  static canRender(cfg) {\n    return !!cfg.value;\n  }\n\n  getHeadingClass() {\n    const { noHeading, layout: { pixels: { height } = {} } = {} } = this.props;\n\n    if (!height || isMobile() || noHeading) {\n      return undefined;\n    }\n\n    // For classicboards\n    if (height < SMALL_HEADING_BREAKPOINT) {\n      return style.smallHeading;\n    }\n\n    // For fixieboards\n    if (height < LARGE_HEADING_BREAKPOINT) {\n      return style.largeHeading;\n    }\n\n    return undefined;\n  }\n\n  renderSlider() {\n    const {\n      isPreviewMode,\n      value,\n      icons: allIcons,\n      isLoop,\n      maxSlides,\n      allowHTML,\n    } = this.props;\n    const lastMaxSlidesValues = slice(value, -maxSlides);\n    let values = isLoop ? lastMaxSlidesValues : [last(value)];\n    const icons = isLoop ? slice(allIcons, -maxSlides) : [last(allIcons)];\n\n    if (allowHTML) {\n      values = values.map(html => (\n        <span dangerouslySetInnerHTML={{ __html: html }} />\n      ));\n    }\n\n    if (isPreviewMode) {\n      return (\n        <VariableFontSize\n          className={style.variableFontSize}\n          sizes={[24, 40, 60]}\n          heights={[240, 400]}\n        >\n          <Slider\n            values={values}\n            icons={icons}\n            speed={SLIDER_SPEED}\n            sliderClassName={style.slider}\n            slideClassName={style.slidePreview}\n            paginationClassName={style.paginationPreview}\n            dotClassName={style.dotPreview}\n          />\n        </VariableFontSize>\n      );\n    }\n\n    return (\n      <Slider\n        values={values}\n        icons={icons}\n        speed={SLIDER_SPEED}\n        sliderClassName={style.slider}\n        slideClassName={style.slideDashboard}\n        iconClassName={style.icon}\n        paginationClassName={style.paginationDashboard}\n      />\n    );\n  }\n\n  render() {\n    const { isPreviewMode, canEdit } = this.props;\n    const classes = classNames(\n      'text-visualisation',\n      style.textWrapper,\n      {\n        [style.previewLayout]: isPreviewMode,\n        editable: canEdit,\n      },\n      this.getHeadingClass(),\n    );\n\n    return <div className={classes}>{this.renderSlider()}</div>;\n  }\n}\n\nTextComponent.defaultProps = {\n  allowHTML: false,\n  icons: [],\n  isPreviewMode: false,\n  maxSlides: 5,\n  noHeading: false,\n};\n\nTextComponent.propTypes = {\n  allowHTML: PropTypes.bool,\n  canEdit: PropTypes.bool,\n  icons: PropTypes.array,\n  isLoop: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n  layout: PropTypes.object,\n  maxSlides: PropTypes.number,\n  noHeading: PropTypes.bool,\n  value: PropTypes.array,\n};\n\nexport default TextComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\n\nimport styles from './external-link-style.scss';\n\nconst ExternalLinkComponent = ({ href, className, onClick, children }) => {\n  const classes = classNames(styles.externalLink, className);\n\n  return (\n    <a\n      href={href}\n      target=\"_blank\"\n      rel=\"external\"\n      className={classes}\n      onClick={onClick}\n    >\n      {children}\n    </a>\n  );\n};\n\nExternalLinkComponent.propTypes = {\n  href: PropTypes.string.isRequired,\n  onClick: PropTypes.func.isRequired,\n  children: PropTypes.node,\n  className: PropTypes.string,\n};\n\nexport default ExternalLinkComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ExternalLinkComponent from './external-link-component';\nimport { track } from '../../lib/tracker';\n\nconst ExternalTrackableLink = props => {\n  const { eventName } = props;\n\n  const onClick = () => {\n    if (eventName) {\n      track(eventName);\n    }\n  };\n\n  return <ExternalLinkComponent {...props} onClick={onClick} />;\n};\n\nExternalTrackableLink.propTypes = {\n  eventName: PropTypes.string,\n};\n\nexport default ExternalTrackableLink;\n","import ExternalLinkConnector from './external-link-connector';\nexport default ExternalLinkConnector;\n","/*!\n    localForage -- Offline Storage, Improved\n    Version 1.7.3\n    https://localforage.github.io/localForage\n    (c) 2013-2017 Mozilla, Apache License 2.0\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.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\n{\n  if (Mutation) {\n    var called = 0;\n    var observer = new Mutation(nextTick);\n    var element = global.document.createTextNode('');\n    observer.observe(element, {\n      characterData: true\n    });\n    scheduleDrain = function () {\n      element.data = (called = ++called % 2);\n    };\n  } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n    var channel = new global.MessageChannel();\n    channel.port1.onmessage = nextTick;\n    scheduleDrain = function () {\n      channel.port2.postMessage(0);\n    };\n  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n    scheduleDrain = function () {\n\n      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n      var scriptEl = global.document.createElement('script');\n      scriptEl.onreadystatechange = function () {\n        nextTick();\n\n        scriptEl.onreadystatechange = null;\n        scriptEl.parentNode.removeChild(scriptEl);\n        scriptEl = null;\n      };\n      global.document.documentElement.appendChild(scriptEl);\n    };\n  } else {\n    scheduleDrain = function () {\n      setTimeout(nextTick, 0);\n    };\n  }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n  draining = true;\n  var i, oldQueue;\n  var len = queue.length;\n  while (len) {\n    oldQueue = queue;\n    queue = [];\n    i = -1;\n    while (++i < len) {\n      oldQueue[i]();\n    }\n    len = queue.length;\n  }\n  draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n  if (queue.push(task) === 1 && !draining) {\n    scheduleDrain();\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n  if (typeof resolver !== 'function') {\n    throw new TypeError('resolver must be a function');\n  }\n  this.state = PENDING;\n  this.queue = [];\n  this.outcome = void 0;\n  if (resolver !== INTERNAL) {\n    safelyResolveThenable(this, resolver);\n  }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n  return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n  if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n    typeof onRejected !== 'function' && this.state === REJECTED) {\n    return this;\n  }\n  var promise = new this.constructor(INTERNAL);\n  if (this.state !== PENDING) {\n    var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n    unwrap(promise, resolver, this.outcome);\n  } else {\n    this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n  }\n\n  return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n  this.promise = promise;\n  if (typeof onFulfilled === 'function') {\n    this.onFulfilled = onFulfilled;\n    this.callFulfilled = this.otherCallFulfilled;\n  }\n  if (typeof onRejected === 'function') {\n    this.onRejected = onRejected;\n    this.callRejected = this.otherCallRejected;\n  }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n  handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n  unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n  handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n  unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n  immediate(function () {\n    var returnValue;\n    try {\n      returnValue = func(value);\n    } catch (e) {\n      return handlers.reject(promise, e);\n    }\n    if (returnValue === promise) {\n      handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n    } else {\n      handlers.resolve(promise, returnValue);\n    }\n  });\n}\n\nhandlers.resolve = function (self, value) {\n  var result = tryCatch(getThen, value);\n  if (result.status === 'error') {\n    return handlers.reject(self, result.value);\n  }\n  var thenable = result.value;\n\n  if (thenable) {\n    safelyResolveThenable(self, thenable);\n  } else {\n    self.state = FULFILLED;\n    self.outcome = value;\n    var i = -1;\n    var len = self.queue.length;\n    while (++i < len) {\n      self.queue[i].callFulfilled(value);\n    }\n  }\n  return self;\n};\nhandlers.reject = function (self, error) {\n  self.state = REJECTED;\n  self.outcome = error;\n  var i = -1;\n  var len = self.queue.length;\n  while (++i < len) {\n    self.queue[i].callRejected(error);\n  }\n  return self;\n};\n\nfunction getThen(obj) {\n  // Make sure we only access the accessor once as required by the spec\n  var then = obj && obj.then;\n  if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n    return function appyThen() {\n      then.apply(obj, arguments);\n    };\n  }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n  // Either fulfill, reject or reject with error\n  var called = false;\n  function onError(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.reject(self, value);\n  }\n\n  function onSuccess(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.resolve(self, value);\n  }\n\n  function tryToUnwrap() {\n    thenable(onSuccess, onError);\n  }\n\n  var result = tryCatch(tryToUnwrap);\n  if (result.status === 'error') {\n    onError(result.value);\n  }\n}\n\nfunction tryCatch(func, value) {\n  var out = {};\n  try {\n    out.value = func(value);\n    out.status = 'success';\n  } catch (e) {\n    out.status = 'error';\n    out.value = e;\n  }\n  return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n  if (value instanceof this) {\n    return value;\n  }\n  return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n  var promise = new this(INTERNAL);\n  return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var values = new Array(len);\n  var resolved = 0;\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    allResolver(iterable[i], i);\n  }\n  return promise;\n  function allResolver(value, i) {\n    self.resolve(value).then(resolveFromAll, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n    function resolveFromAll(outValue) {\n      values[i] = outValue;\n      if (++resolved === len && !called) {\n        called = true;\n        handlers.resolve(promise, values);\n      }\n    }\n  }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    resolver(iterable[i]);\n  }\n  return promise;\n  function resolver(value) {\n    self.resolve(value).then(function (response) {\n      if (!called) {\n        called = true;\n        handlers.resolve(promise, response);\n      }\n    }, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n  }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n  global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n    /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n    try {\n        if (typeof indexedDB !== 'undefined') {\n            return indexedDB;\n        }\n        if (typeof webkitIndexedDB !== 'undefined') {\n            return webkitIndexedDB;\n        }\n        if (typeof mozIndexedDB !== 'undefined') {\n            return mozIndexedDB;\n        }\n        if (typeof OIndexedDB !== 'undefined') {\n            return OIndexedDB;\n        }\n        if (typeof msIndexedDB !== 'undefined') {\n            return msIndexedDB;\n        }\n    } catch (e) {\n        return;\n    }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n    try {\n        // Initialize IndexedDB; fall back to vendor-prefixed versions\n        // if needed.\n        if (!idb) {\n            return false;\n        }\n        // We mimic PouchDB here;\n        //\n        // We test for openDatabase because IE Mobile identifies itself\n        // as Safari. Oh the lulz...\n        var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n        var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n        // Safari <10.1 does not meet our requirements for IDB support (#5572)\n        // since Safari 10.1 shipped with fetch, we can use that to detect it\n        return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n        // some outdated implementations of IDB that appear on Samsung\n        // and HTC Android devices <4.4 are missing IDBKeyRange\n        // See: https://github.com/mozilla/localForage/issues/128\n        // See: https://github.com/mozilla/localForage/issues/272\n        typeof IDBKeyRange !== 'undefined';\n    } catch (e) {\n        return false;\n    }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n    /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n    parts = parts || [];\n    properties = properties || {};\n    try {\n        return new Blob(parts, properties);\n    } catch (e) {\n        if (e.name !== 'TypeError') {\n            throw e;\n        }\n        var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n        var builder = new Builder();\n        for (var i = 0; i < parts.length; i += 1) {\n            builder.append(parts[i]);\n        }\n        return builder.getBlob(properties.type);\n    }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n    // In the \"nopromises\" build this will just throw if you don't have\n    // a global promise object, but it would throw anyway later.\n    _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n    if (callback) {\n        promise.then(function (result) {\n            callback(null, result);\n        }, function (error) {\n            callback(error);\n        });\n    }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n    if (typeof callback === 'function') {\n        promise.then(callback);\n    }\n\n    if (typeof errorCallback === 'function') {\n        promise[\"catch\"](errorCallback);\n    }\n}\n\nfunction normalizeKey(key) {\n    // Cast the key to a string, as that's all we can set as a key.\n    if (typeof key !== 'string') {\n        console.warn(key + ' used as a key, but it is not a string.');\n        key = String(key);\n    }\n\n    return key;\n}\n\nfunction getCallback() {\n    if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n        return arguments[arguments.length - 1];\n    }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n    var length = bin.length;\n    var buf = new ArrayBuffer(length);\n    var arr = new Uint8Array(buf);\n    for (var i = 0; i < length; i++) {\n        arr[i] = bin.charCodeAt(i);\n    }\n    return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n    return new Promise$1(function (resolve) {\n        var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n        var blob = createBlob(['']);\n        txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n        txn.onabort = function (e) {\n            // If the transaction aborts now its due to not being able to\n            // write to the database, likely due to the disk being full\n            e.preventDefault();\n            e.stopPropagation();\n            resolve(false);\n        };\n\n        txn.oncomplete = function () {\n            var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n            var matchedEdge = navigator.userAgent.match(/Edge\\//);\n            // MS Edge pretends to be Chrome 42:\n            // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n            resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n        };\n    })[\"catch\"](function () {\n        return false; // error, so assume unsupported\n    });\n}\n\nfunction _checkBlobSupport(idb) {\n    if (typeof supportsBlobs === 'boolean') {\n        return Promise$1.resolve(supportsBlobs);\n    }\n    return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n        supportsBlobs = value;\n        return supportsBlobs;\n    });\n}\n\nfunction _deferReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Create a deferred object representing the current database operation.\n    var deferredOperation = {};\n\n    deferredOperation.promise = new Promise$1(function (resolve, reject) {\n        deferredOperation.resolve = resolve;\n        deferredOperation.reject = reject;\n    });\n\n    // Enqueue the deferred operation.\n    dbContext.deferredOperations.push(deferredOperation);\n\n    // Chain its promise to the database readiness.\n    if (!dbContext.dbReady) {\n        dbContext.dbReady = deferredOperation.promise;\n    } else {\n        dbContext.dbReady = dbContext.dbReady.then(function () {\n            return deferredOperation.promise;\n        });\n    }\n}\n\nfunction _advanceReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Resolve its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.resolve();\n        return deferredOperation.promise;\n    }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Reject its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.reject(err);\n        return deferredOperation.promise;\n    }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n    return new Promise$1(function (resolve, reject) {\n        dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n        if (dbInfo.db) {\n            if (upgradeNeeded) {\n                _deferReadiness(dbInfo);\n                dbInfo.db.close();\n            } else {\n                return resolve(dbInfo.db);\n            }\n        }\n\n        var dbArgs = [dbInfo.name];\n\n        if (upgradeNeeded) {\n            dbArgs.push(dbInfo.version);\n        }\n\n        var openreq = idb.open.apply(idb, dbArgs);\n\n        if (upgradeNeeded) {\n            openreq.onupgradeneeded = function (e) {\n                var db = openreq.result;\n                try {\n                    db.createObjectStore(dbInfo.storeName);\n                    if (e.oldVersion <= 1) {\n                        // Added when support for blob shims was added\n                        db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n                    }\n                } catch (ex) {\n                    if (ex.name === 'ConstraintError') {\n                        console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n                    } else {\n                        throw ex;\n                    }\n                }\n            };\n        }\n\n        openreq.onerror = function (e) {\n            e.preventDefault();\n            reject(openreq.error);\n        };\n\n        openreq.onsuccess = function () {\n            resolve(openreq.result);\n            _advanceReadiness(dbInfo);\n        };\n    });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n    return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n    return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n    if (!dbInfo.db) {\n        return true;\n    }\n\n    var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n    var isDowngrade = dbInfo.version < dbInfo.db.version;\n    var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n    if (isDowngrade) {\n        // If the version is not the default one\n        // then warn for impossible downgrade.\n        if (dbInfo.version !== defaultVersion) {\n            console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n        }\n        // Align the versions to prevent errors.\n        dbInfo.version = dbInfo.db.version;\n    }\n\n    if (isUpgrade || isNewStore) {\n        // If the store is new then increment the version (if needed).\n        // This will trigger an \"upgradeneeded\" event which is required\n        // for creating a store.\n        if (isNewStore) {\n            var incVersion = dbInfo.db.version + 1;\n            if (incVersion > dbInfo.version) {\n                dbInfo.version = incVersion;\n            }\n        }\n\n        return true;\n    }\n\n    return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n    return new Promise$1(function (resolve, reject) {\n        var reader = new FileReader();\n        reader.onerror = reject;\n        reader.onloadend = function (e) {\n            var base64 = btoa(e.target.result || '');\n            resolve({\n                __local_forage_encoded_blob: true,\n                data: base64,\n                type: blob.type\n            });\n        };\n        reader.readAsBinaryString(blob);\n    });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n    var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n    return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n    return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n    var self = this;\n\n    var promise = self._initReady().then(function () {\n        var dbContext = dbContexts[self._dbInfo.name];\n\n        if (dbContext && dbContext.dbReady) {\n            return dbContext.dbReady;\n        }\n    });\n\n    executeTwoCallbacks(promise, callback, callback);\n    return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n    _deferReadiness(dbInfo);\n\n    var dbContext = dbContexts[dbInfo.name];\n    var forages = dbContext.forages;\n\n    for (var i = 0; i < forages.length; i++) {\n        var forage = forages[i];\n        if (forage._dbInfo.db) {\n            forage._dbInfo.db.close();\n            forage._dbInfo.db = null;\n        }\n    }\n    dbInfo.db = null;\n\n    return _getOriginalConnection(dbInfo).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        // store the latest db reference\n        // in case the db was upgraded\n        dbInfo.db = dbContext.db = db;\n        for (var i = 0; i < forages.length; i++) {\n            forages[i]._dbInfo.db = db;\n        }\n    })[\"catch\"](function (err) {\n        _rejectReadiness(dbInfo, err);\n        throw err;\n    });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n    if (retries === undefined) {\n        retries = 1;\n    }\n\n    try {\n        var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n        callback(null, tx);\n    } catch (err) {\n        if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n            return Promise$1.resolve().then(function () {\n                if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n                    // increase the db version, to create the new ObjectStore\n                    if (dbInfo.db) {\n                        dbInfo.version = dbInfo.db.version + 1;\n                    }\n                    // Reopen the database for upgrading.\n                    return _getUpgradedConnection(dbInfo);\n                }\n            }).then(function () {\n                return _tryReconnect(dbInfo).then(function () {\n                    createTransaction(dbInfo, mode, callback, retries - 1);\n                });\n            })[\"catch\"](callback);\n        }\n\n        callback(err);\n    }\n}\n\nfunction createDbContext() {\n    return {\n        // Running localForages sharing a database.\n        forages: [],\n        // Shared database.\n        db: null,\n        // Database readiness (promise).\n        dbReady: null,\n        // Deferred operations on the database.\n        deferredOperations: []\n    };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    // Get the current context of the database;\n    var dbContext = dbContexts[dbInfo.name];\n\n    // ...or create a new context.\n    if (!dbContext) {\n        dbContext = createDbContext();\n        // Register the new context in the global container.\n        dbContexts[dbInfo.name] = dbContext;\n    }\n\n    // Register itself as a running localForage in the current context.\n    dbContext.forages.push(self);\n\n    // Replace the default `ready()` function with the specialized one.\n    if (!self._initReady) {\n        self._initReady = self.ready;\n        self.ready = _fullyReady;\n    }\n\n    // Create an array of initialization states of the related localForages.\n    var initPromises = [];\n\n    function ignoreErrors() {\n        // Don't handle errors here,\n        // just makes sure related localForages aren't pending.\n        return Promise$1.resolve();\n    }\n\n    for (var j = 0; j < dbContext.forages.length; j++) {\n        var forage = dbContext.forages[j];\n        if (forage !== self) {\n            // Don't wait for itself...\n            initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n        }\n    }\n\n    // Take a snapshot of the related localForages.\n    var forages = dbContext.forages.slice(0);\n\n    // Initialize the connection process only when\n    // all the related localForages aren't pending.\n    return Promise$1.all(initPromises).then(function () {\n        dbInfo.db = dbContext.db;\n        // Get the connection or open a new one without upgrade.\n        return _getOriginalConnection(dbInfo);\n    }).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        dbInfo.db = dbContext.db = db;\n        self._dbInfo = dbInfo;\n        // Share the final connection amongst related localForages.\n        for (var k = 0; k < forages.length; k++) {\n            var forage = forages[k];\n            if (forage !== self) {\n                // Self is already up-to-date.\n                forage._dbInfo.db = dbInfo.db;\n                forage._dbInfo.version = dbInfo.version;\n            }\n        }\n    });\n}\n\nfunction getItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.get(key);\n\n                    req.onsuccess = function () {\n                        var value = req.result;\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (_isEncodedBlob(value)) {\n                            value = _decodeBlob(value);\n                        }\n                        resolve(value);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openCursor();\n                    var iterationNumber = 1;\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (cursor) {\n                            var value = cursor.value;\n                            if (_isEncodedBlob(value)) {\n                                value = _decodeBlob(value);\n                            }\n                            var result = iterator(value, cursor.key, iterationNumber++);\n\n                            // when the iterator callback retuns any\n                            // (non-`undefined`) value, then we stop\n                            // the iteration immediately\n                            if (result !== void 0) {\n                                resolve(result);\n                            } else {\n                                cursor[\"continue\"]();\n                            }\n                        } else {\n                            resolve();\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n\n    return promise;\n}\n\nfunction setItem(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        var dbInfo;\n        self.ready().then(function () {\n            dbInfo = self._dbInfo;\n            if (toString.call(value) === '[object Blob]') {\n                return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n                    if (blobSupport) {\n                        return value;\n                    }\n                    return _encodeBlob(value);\n                });\n            }\n            return value;\n        }).then(function (value) {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n\n                    // The reason we don't _save_ null is because IE 10 does\n                    // not support saving the `null` type in IndexedDB. How\n                    // ironic, given the bug below!\n                    // See: https://github.com/mozilla/localForage/issues/161\n                    if (value === null) {\n                        value = undefined;\n                    }\n\n                    var req = store.put(value, key);\n\n                    transaction.oncomplete = function () {\n                        // Cast to undefined so the value passed to\n                        // callback/promise is the same as what one would get out\n                        // of `getItem()` later. This leads to some weirdness\n                        // (setItem('foo', undefined) will return `null`), but\n                        // it's not my fault localStorage is our baseline and that\n                        // it's weird.\n                        if (value === undefined) {\n                            value = null;\n                        }\n\n                        resolve(value);\n                    };\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction removeItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    // We use a Grunt task to make this safe for IE and some\n                    // versions of Android (including those used by Cordova).\n                    // Normally IE won't like `.delete()` and will insist on\n                    // using `['delete']()`, but we have a build step that\n                    // fixes this for us now.\n                    var req = store[\"delete\"](key);\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onerror = function () {\n                        reject(req.error);\n                    };\n\n                    // The request will be also be aborted if we've exceeded our storage\n                    // space.\n                    transaction.onabort = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction clear(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.clear();\n\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction length(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.count();\n\n                    req.onsuccess = function () {\n                        resolve(req.result);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction key(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        if (n < 0) {\n            resolve(null);\n\n            return;\n        }\n\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var advanced = false;\n                    var req = store.openCursor();\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n                        if (!cursor) {\n                            // this means there weren't enough keys\n                            resolve(null);\n\n                            return;\n                        }\n\n                        if (n === 0) {\n                            // We have the first key, return it if that's what they\n                            // wanted.\n                            resolve(cursor.key);\n                        } else {\n                            if (!advanced) {\n                                // Otherwise, ask the cursor to skip ahead n\n                                // records.\n                                advanced = true;\n                                cursor.advance(n);\n                            } else {\n                                // When we get here, we've got the nth key.\n                                resolve(cursor.key);\n                            }\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openCursor();\n                    var keys = [];\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (!cursor) {\n                            resolve(keys);\n                            return;\n                        }\n\n                        keys.push(cursor.key);\n                        cursor[\"continue\"]();\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n        var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n            var dbContext = dbContexts[options.name];\n            var forages = dbContext.forages;\n            dbContext.db = db;\n            for (var i = 0; i < forages.length; i++) {\n                forages[i]._dbInfo.db = db;\n            }\n            return db;\n        });\n\n        if (!options.storeName) {\n            promise = dbPromise.then(function (db) {\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                }\n\n                var dropDBPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.deleteDatabase(options.name);\n\n                    req.onerror = req.onblocked = function (err) {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        reject(err);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        resolve(db);\n                    };\n                });\n\n                return dropDBPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var i = 0; i < forages.length; i++) {\n                        var _forage = forages[i];\n                        _advanceReadiness(_forage._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        } else {\n            promise = dbPromise.then(function (db) {\n                if (!db.objectStoreNames.contains(options.storeName)) {\n                    return;\n                }\n\n                var newVersion = db.version + 1;\n\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                    forage._dbInfo.version = newVersion;\n                }\n\n                var dropObjectPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.open(options.name, newVersion);\n\n                    req.onerror = function (err) {\n                        var db = req.result;\n                        db.close();\n                        reject(err);\n                    };\n\n                    req.onupgradeneeded = function () {\n                        var db = req.result;\n                        db.deleteObjectStore(options.storeName);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        db.close();\n                        resolve(db);\n                    };\n                });\n\n                return dropObjectPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var j = 0; j < forages.length; j++) {\n                        var _forage2 = forages[j];\n                        _forage2._dbInfo.db = db;\n                        _advanceReadiness(_forage2._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        }\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar asyncStorage = {\n    _driver: 'asyncStorage',\n    _initStorage: _initStorage,\n    _support: isIndexedDBValid(),\n    iterate: iterate,\n    getItem: getItem,\n    setItem: setItem,\n    removeItem: removeItem,\n    clear: clear,\n    length: length,\n    key: key,\n    keys: keys,\n    dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n    return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n    // Fill the string into a ArrayBuffer.\n    var bufferLength = serializedString.length * 0.75;\n    var len = serializedString.length;\n    var i;\n    var p = 0;\n    var encoded1, encoded2, encoded3, encoded4;\n\n    if (serializedString[serializedString.length - 1] === '=') {\n        bufferLength--;\n        if (serializedString[serializedString.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n\n    var buffer = new ArrayBuffer(bufferLength);\n    var bytes = new Uint8Array(buffer);\n\n    for (i = 0; i < len; i += 4) {\n        encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n        encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n        encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n        encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n        /*jslint bitwise: true */\n        bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n        bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n        bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n    }\n    return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n    // base64-arraybuffer\n    var bytes = new Uint8Array(buffer);\n    var base64String = '';\n    var i;\n\n    for (i = 0; i < bytes.length; i += 3) {\n        /*jslint bitwise: true */\n        base64String += BASE_CHARS[bytes[i] >> 2];\n        base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n        base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n        base64String += BASE_CHARS[bytes[i + 2] & 63];\n    }\n\n    if (bytes.length % 3 === 2) {\n        base64String = base64String.substring(0, base64String.length - 1) + '=';\n    } else if (bytes.length % 3 === 1) {\n        base64String = base64String.substring(0, base64String.length - 2) + '==';\n    }\n\n    return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n    var valueType = '';\n    if (value) {\n        valueType = toString$1.call(value);\n    }\n\n    // Cannot use `value instanceof ArrayBuffer` or such here, as these\n    // checks fail when running the tests using casper.js...\n    //\n    // TODO: See why those tests fail and use a better solution.\n    if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n        // Convert binary arrays to a string and prefix the string with\n        // a special marker.\n        var buffer;\n        var marker = SERIALIZED_MARKER;\n\n        if (value instanceof ArrayBuffer) {\n            buffer = value;\n            marker += TYPE_ARRAYBUFFER;\n        } else {\n            buffer = value.buffer;\n\n            if (valueType === '[object Int8Array]') {\n                marker += TYPE_INT8ARRAY;\n            } else if (valueType === '[object Uint8Array]') {\n                marker += TYPE_UINT8ARRAY;\n            } else if (valueType === '[object Uint8ClampedArray]') {\n                marker += TYPE_UINT8CLAMPEDARRAY;\n            } else if (valueType === '[object Int16Array]') {\n                marker += TYPE_INT16ARRAY;\n            } else if (valueType === '[object Uint16Array]') {\n                marker += TYPE_UINT16ARRAY;\n            } else if (valueType === '[object Int32Array]') {\n                marker += TYPE_INT32ARRAY;\n            } else if (valueType === '[object Uint32Array]') {\n                marker += TYPE_UINT32ARRAY;\n            } else if (valueType === '[object Float32Array]') {\n                marker += TYPE_FLOAT32ARRAY;\n            } else if (valueType === '[object Float64Array]') {\n                marker += TYPE_FLOAT64ARRAY;\n            } else {\n                callback(new Error('Failed to get type for BinaryArray'));\n            }\n        }\n\n        callback(marker + bufferToString(buffer));\n    } else if (valueType === '[object Blob]') {\n        // Conver the blob to a binaryArray and then to a string.\n        var fileReader = new FileReader();\n\n        fileReader.onload = function () {\n            // Backwards-compatible prefix for the blob type.\n            var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n            callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n        };\n\n        fileReader.readAsArrayBuffer(value);\n    } else {\n        try {\n            callback(JSON.stringify(value));\n        } catch (e) {\n            console.error(\"Couldn't convert value into a JSON string: \", value);\n\n            callback(null, e);\n        }\n    }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n    // If we haven't marked this string as being specially serialized (i.e.\n    // something other than serialized JSON), we can just return it and be\n    // done with it.\n    if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n        return JSON.parse(value);\n    }\n\n    // The following code deals with deserializing some kind of Blob or\n    // TypedArray. First we separate out the type of data we're dealing\n    // with from the data itself.\n    var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n    var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n    var blobType;\n    // Backwards-compatible blob type serialization strategy.\n    // DBs created with older versions of localForage will simply not have the blob type.\n    if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n        var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n        blobType = matcher[1];\n        serializedString = serializedString.substring(matcher[0].length);\n    }\n    var buffer = stringToBuffer(serializedString);\n\n    // Return the right type based on the code/type set during\n    // serialization.\n    switch (type) {\n        case TYPE_ARRAYBUFFER:\n            return buffer;\n        case TYPE_BLOB:\n            return createBlob([buffer], { type: blobType });\n        case TYPE_INT8ARRAY:\n            return new Int8Array(buffer);\n        case TYPE_UINT8ARRAY:\n            return new Uint8Array(buffer);\n        case TYPE_UINT8CLAMPEDARRAY:\n            return new Uint8ClampedArray(buffer);\n        case TYPE_INT16ARRAY:\n            return new Int16Array(buffer);\n        case TYPE_UINT16ARRAY:\n            return new Uint16Array(buffer);\n        case TYPE_INT32ARRAY:\n            return new Int32Array(buffer);\n        case TYPE_UINT32ARRAY:\n            return new Uint32Array(buffer);\n        case TYPE_FLOAT32ARRAY:\n            return new Float32Array(buffer);\n        case TYPE_FLOAT64ARRAY:\n            return new Float64Array(buffer);\n        default:\n            throw new Error('Unkown type: ' + type);\n    }\n}\n\nvar localforageSerializer = {\n    serialize: serialize,\n    deserialize: deserialize,\n    stringToBuffer: stringToBuffer,\n    bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n    t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n        }\n    }\n\n    var dbInfoPromise = new Promise$1(function (resolve, reject) {\n        // Open the database; the openDatabase API will automatically\n        // create it for us if it doesn't exist.\n        try {\n            dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n        } catch (e) {\n            return reject(e);\n        }\n\n        // Create our key/value table if it doesn't exist.\n        dbInfo.db.transaction(function (t) {\n            createDbTable(t, dbInfo, function () {\n                self._dbInfo = dbInfo;\n                resolve();\n            }, function (t, error) {\n                reject(error);\n            });\n        }, reject);\n    });\n\n    dbInfo.serializer = localforageSerializer;\n    return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n    t.executeSql(sqlStatement, args, callback, function (t, error) {\n        if (error.code === error.SYNTAX_ERR) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n                if (!results.rows.length) {\n                    // if the table is missing (was deleted)\n                    // re-create it table and retry\n                    createDbTable(t, dbInfo, function () {\n                        t.executeSql(sqlStatement, args, callback, errorCallback);\n                    }, errorCallback);\n                } else {\n                    errorCallback(t, error);\n                }\n            }, errorCallback);\n        } else {\n            errorCallback(t, error);\n        }\n    }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).value : null;\n\n                    // Check to see if this is serialized content we need to\n                    // unpack.\n                    if (result) {\n                        result = dbInfo.serializer.deserialize(result);\n                    }\n\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var rows = results.rows;\n                    var length = rows.length;\n\n                    for (var i = 0; i < length; i++) {\n                        var item = rows.item(i);\n                        var result = item.value;\n\n                        // Check to see if this is serialized content\n                        // we need to unpack.\n                        if (result) {\n                            result = dbInfo.serializer.deserialize(result);\n                        }\n\n                        result = iterator(result, item.key, i + 1);\n\n                        // void(0) prevents problems with redefinition\n                        // of `undefined`.\n                        if (result !== void 0) {\n                            resolve(result);\n                            return;\n                        }\n                    }\n\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            // The localStorage API doesn't return undefined values in an\n            // \"expected\" way, so undefined is always cast to null in all\n            // drivers. See: https://github.com/mozilla/localForage/pull/42\n            if (value === undefined) {\n                value = null;\n            }\n\n            // Save the original value to pass to the callback.\n            var originalValue = value;\n\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    dbInfo.db.transaction(function (t) {\n                        tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n                            resolve(originalValue);\n                        }, function (t, error) {\n                            reject(error);\n                        });\n                    }, function (sqlError) {\n                        // The transaction failed; check\n                        // to see if it's a quota error.\n                        if (sqlError.code === sqlError.QUOTA_ERR) {\n                            // We reject the callback outright for now, but\n                            // it's worth trying to re-run the transaction.\n                            // Even if the user accepts the prompt to use\n                            // more storage on Safari, this error will\n                            // be called.\n                            //\n                            // Try to re-run the transaction.\n                            if (retriesLeft > 0) {\n                                resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n                                return;\n                            }\n                            reject(sqlError);\n                        }\n                    });\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n    return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                // Ahhh, SQL makes this one soooooo easy.\n                tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var result = results.rows.item(0).c;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).key : null;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var keys = [];\n\n                    for (var i = 0; i < results.rows.length; i++) {\n                        keys.push(results.rows.item(i).key);\n                    }\n\n                    resolve(keys);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n    return new Promise$1(function (resolve, reject) {\n        db.transaction(function (t) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n                var storeNames = [];\n\n                for (var i = 0; i < results.rows.length; i++) {\n                    storeNames.push(results.rows.item(i).name);\n                }\n\n                resolve({\n                    db: db,\n                    storeNames: storeNames\n                });\n            }, function (t, error) {\n                reject(error);\n            });\n        }, function (sqlError) {\n            reject(sqlError);\n        });\n    });\n}\n\nfunction dropInstance$1(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            var db;\n            if (options.name === currentConfig.name) {\n                // use the db reference of the current instance\n                db = self._dbInfo.db;\n            } else {\n                db = openDatabase(options.name, '', '', 0);\n            }\n\n            if (!options.storeName) {\n                // drop all database tables\n                resolve(getAllStoreNames(db));\n            } else {\n                resolve({\n                    db: db,\n                    storeNames: [options.storeName]\n                });\n            }\n        }).then(function (operationInfo) {\n            return new Promise$1(function (resolve, reject) {\n                operationInfo.db.transaction(function (t) {\n                    function dropTable(storeName) {\n                        return new Promise$1(function (resolve, reject) {\n                            t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n                                resolve();\n                            }, function (t, error) {\n                                reject(error);\n                            });\n                        });\n                    }\n\n                    var operations = [];\n                    for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n                        operations.push(dropTable(operationInfo.storeNames[i]));\n                    }\n\n                    Promise$1.all(operations).then(function () {\n                        resolve();\n                    })[\"catch\"](function (e) {\n                        reject(e);\n                    });\n                }, function (sqlError) {\n                    reject(sqlError);\n                });\n            });\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar webSQLStorage = {\n    _driver: 'webSQLStorage',\n    _initStorage: _initStorage$1,\n    _support: isWebSQLValid(),\n    iterate: iterate$1,\n    getItem: getItem$1,\n    setItem: setItem$1,\n    removeItem: removeItem$1,\n    clear: clear$1,\n    length: length$1,\n    key: key$1,\n    keys: keys$1,\n    dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n    try {\n        return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n        // in IE8 typeof localStorage.setItem === 'object'\n        !!localStorage.setItem;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n    var keyPrefix = options.name + '/';\n\n    if (options.storeName !== defaultConfig.storeName) {\n        keyPrefix += options.storeName + '/';\n    }\n    return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n    var localStorageTestKey = '_localforage_support_test';\n\n    try {\n        localStorage.setItem(localStorageTestKey, true);\n        localStorage.removeItem(localStorageTestKey);\n\n        return false;\n    } catch (e) {\n        return true;\n    }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n    return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n    var self = this;\n    var dbInfo = {};\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n    if (!_isLocalStorageUsable()) {\n        return Promise$1.reject();\n    }\n\n    self._dbInfo = dbInfo;\n    dbInfo.serializer = localforageSerializer;\n\n    return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var keyPrefix = self._dbInfo.keyPrefix;\n\n        for (var i = localStorage.length - 1; i >= 0; i--) {\n            var key = localStorage.key(i);\n\n            if (key.indexOf(keyPrefix) === 0) {\n                localStorage.removeItem(key);\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n        // If a result was found, parse it from the serialized\n        // string into a JS object. If result isn't truthy, the key\n        // is likely undefined and we'll pass it straight to the\n        // callback.\n        if (result) {\n            result = dbInfo.serializer.deserialize(result);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n    var self = this;\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var keyPrefix = dbInfo.keyPrefix;\n        var keyPrefixLength = keyPrefix.length;\n        var length = localStorage.length;\n\n        // We use a dedicated iterator instead of the `i` variable below\n        // so other keys we fetch in localStorage aren't counted in\n        // the `iterationNumber` argument passed to the `iterate()`\n        // callback.\n        //\n        // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n        var iterationNumber = 1;\n\n        for (var i = 0; i < length; i++) {\n            var key = localStorage.key(i);\n            if (key.indexOf(keyPrefix) !== 0) {\n                continue;\n            }\n            var value = localStorage.getItem(key);\n\n            // If a result was found, parse it from the serialized\n            // string into a JS object. If result isn't truthy, the\n            // key is likely undefined and we'll pass it straight\n            // to the iterator.\n            if (value) {\n                value = dbInfo.serializer.deserialize(value);\n            }\n\n            value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n            if (value !== void 0) {\n                return value;\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result;\n        try {\n            result = localStorage.key(n);\n        } catch (error) {\n            result = null;\n        }\n\n        // Remove the prefix from the key, if a key is found.\n        if (result) {\n            result = result.substring(dbInfo.keyPrefix.length);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var length = localStorage.length;\n        var keys = [];\n\n        for (var i = 0; i < length; i++) {\n            var itemKey = localStorage.key(i);\n            if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n                keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n            }\n        }\n\n        return keys;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n    var self = this;\n    var promise = self.keys().then(function (keys) {\n        return keys.length;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        localStorage.removeItem(dbInfo.keyPrefix + key);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        // Convert undefined values to null.\n        // https://github.com/mozilla/localForage/pull/42\n        if (value === undefined) {\n            value = null;\n        }\n\n        // Save the original value to pass to the callback.\n        var originalValue = value;\n\n        return new Promise$1(function (resolve, reject) {\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    try {\n                        localStorage.setItem(dbInfo.keyPrefix + key, value);\n                        resolve(originalValue);\n                    } catch (e) {\n                        // localStorage capacity exceeded.\n                        // TODO: Make this a specific error/event.\n                        if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n                            reject(e);\n                        }\n                        reject(e);\n                    }\n                }\n            });\n        });\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        var currentConfig = this.config();\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            if (!options.storeName) {\n                resolve(options.name + '/');\n            } else {\n                resolve(_getKeyPrefix(options, self._defaultConfig));\n            }\n        }).then(function (keyPrefix) {\n            for (var i = localStorage.length - 1; i >= 0; i--) {\n                var key = localStorage.key(i);\n\n                if (key.indexOf(keyPrefix) === 0) {\n                    localStorage.removeItem(key);\n                }\n            }\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar localStorageWrapper = {\n    _driver: 'localStorageWrapper',\n    _initStorage: _initStorage$2,\n    _support: isLocalStorageValid(),\n    iterate: iterate$2,\n    getItem: getItem$2,\n    setItem: setItem$2,\n    removeItem: removeItem$2,\n    clear: clear$2,\n    length: length$2,\n    key: key$2,\n    keys: keys$2,\n    dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n    return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n    var len = array.length;\n    var i = 0;\n    while (i < len) {\n        if (sameValue(array[i], searchElement)) {\n            return true;\n        }\n        i++;\n    }\n\n    return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n    return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n    INDEXEDDB: asyncStorage,\n    WEBSQL: webSQLStorage,\n    LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n    description: '',\n    driver: DefaultDriverOrder.slice(),\n    name: 'localforage',\n    // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n    // we can use without a prompt.\n    size: 4980736,\n    storeName: 'keyvaluepairs',\n    version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n    localForageInstance[libraryMethod] = function () {\n        var _args = arguments;\n        return localForageInstance.ready().then(function () {\n            return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n        });\n    };\n}\n\nfunction extend() {\n    for (var i = 1; i < arguments.length; i++) {\n        var arg = arguments[i];\n\n        if (arg) {\n            for (var _key in arg) {\n                if (arg.hasOwnProperty(_key)) {\n                    if (isArray(arg[_key])) {\n                        arguments[0][_key] = arg[_key].slice();\n                    } else {\n                        arguments[0][_key] = arg[_key];\n                    }\n                }\n            }\n        }\n    }\n\n    return arguments[0];\n}\n\nvar LocalForage = function () {\n    function LocalForage(options) {\n        _classCallCheck(this, LocalForage);\n\n        for (var driverTypeKey in DefaultDrivers) {\n            if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n                var driver = DefaultDrivers[driverTypeKey];\n                var driverName = driver._driver;\n                this[driverTypeKey] = driverName;\n\n                if (!DefinedDrivers[driverName]) {\n                    // we don't need to wait for the promise,\n                    // since the default drivers can be defined\n                    // in a blocking manner\n                    this.defineDriver(driver);\n                }\n            }\n        }\n\n        this._defaultConfig = extend({}, DefaultConfig);\n        this._config = extend({}, this._defaultConfig, options);\n        this._driverSet = null;\n        this._initDriver = null;\n        this._ready = false;\n        this._dbInfo = null;\n\n        this._wrapLibraryMethodsWithReady();\n        this.setDriver(this._config.driver)[\"catch\"](function () {});\n    }\n\n    // Set any config values for localForage; can be called anytime before\n    // the first API call (e.g. `getItem`, `setItem`).\n    // We loop through options so we don't overwrite existing config\n    // values.\n\n\n    LocalForage.prototype.config = function config(options) {\n        // If the options argument is an object, we use it to set values.\n        // Otherwise, we return either a specified config value or all\n        // config values.\n        if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n            // If localforage is ready and fully initialized, we can't set\n            // any new configuration values. Instead, we return an error.\n            if (this._ready) {\n                return new Error(\"Can't call config() after localforage \" + 'has been used.');\n            }\n\n            for (var i in options) {\n                if (i === 'storeName') {\n                    options[i] = options[i].replace(/\\W/g, '_');\n                }\n\n                if (i === 'version' && typeof options[i] !== 'number') {\n                    return new Error('Database version must be a number.');\n                }\n\n                this._config[i] = options[i];\n            }\n\n            // after all config options are set and\n            // the driver option is used, try setting it\n            if ('driver' in options && options.driver) {\n                return this.setDriver(this._config.driver);\n            }\n\n            return true;\n        } else if (typeof options === 'string') {\n            return this._config[options];\n        } else {\n            return this._config;\n        }\n    };\n\n    // Used to define a custom driver, shared across all instances of\n    // localForage.\n\n\n    LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n        var promise = new Promise$1(function (resolve, reject) {\n            try {\n                var driverName = driverObject._driver;\n                var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n                // A driver name should be defined and not overlap with the\n                // library-defined, default drivers.\n                if (!driverObject._driver) {\n                    reject(complianceError);\n                    return;\n                }\n\n                var driverMethods = LibraryMethods.concat('_initStorage');\n                for (var i = 0, len = driverMethods.length; i < len; i++) {\n                    var driverMethodName = driverMethods[i];\n\n                    // when the property is there,\n                    // it should be a method even when optional\n                    var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n                    if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n                        reject(complianceError);\n                        return;\n                    }\n                }\n\n                var configureMissingMethods = function configureMissingMethods() {\n                    var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n                        return function () {\n                            var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n                            var promise = Promise$1.reject(error);\n                            executeCallback(promise, arguments[arguments.length - 1]);\n                            return promise;\n                        };\n                    };\n\n                    for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n                        var optionalDriverMethod = OptionalDriverMethods[_i];\n                        if (!driverObject[optionalDriverMethod]) {\n                            driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n                        }\n                    }\n                };\n\n                configureMissingMethods();\n\n                var setDriverSupport = function setDriverSupport(support) {\n                    if (DefinedDrivers[driverName]) {\n                        console.info('Redefining LocalForage driver: ' + driverName);\n                    }\n                    DefinedDrivers[driverName] = driverObject;\n                    DriverSupport[driverName] = support;\n                    // don't use a then, so that we can define\n                    // drivers that have simple _support methods\n                    // in a blocking manner\n                    resolve();\n                };\n\n                if ('_support' in driverObject) {\n                    if (driverObject._support && typeof driverObject._support === 'function') {\n                        driverObject._support().then(setDriverSupport, reject);\n                    } else {\n                        setDriverSupport(!!driverObject._support);\n                    }\n                } else {\n                    setDriverSupport(true);\n                }\n            } catch (e) {\n                reject(e);\n            }\n        });\n\n        executeTwoCallbacks(promise, callback, errorCallback);\n        return promise;\n    };\n\n    LocalForage.prototype.driver = function driver() {\n        return this._driver || null;\n    };\n\n    LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n        var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n        executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n        return getDriverPromise;\n    };\n\n    LocalForage.prototype.getSerializer = function getSerializer(callback) {\n        var serializerPromise = Promise$1.resolve(localforageSerializer);\n        executeTwoCallbacks(serializerPromise, callback);\n        return serializerPromise;\n    };\n\n    LocalForage.prototype.ready = function ready(callback) {\n        var self = this;\n\n        var promise = self._driverSet.then(function () {\n            if (self._ready === null) {\n                self._ready = self._initDriver();\n            }\n\n            return self._ready;\n        });\n\n        executeTwoCallbacks(promise, callback, callback);\n        return promise;\n    };\n\n    LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n        var self = this;\n\n        if (!isArray(drivers)) {\n            drivers = [drivers];\n        }\n\n        var supportedDrivers = this._getSupportedDrivers(drivers);\n\n        function setDriverToConfig() {\n            self._config.driver = self.driver();\n        }\n\n        function extendSelfWithDriver(driver) {\n            self._extend(driver);\n            setDriverToConfig();\n\n            self._ready = self._initStorage(self._config);\n            return self._ready;\n        }\n\n        function initDriver(supportedDrivers) {\n            return function () {\n                var currentDriverIndex = 0;\n\n                function driverPromiseLoop() {\n                    while (currentDriverIndex < supportedDrivers.length) {\n                        var driverName = supportedDrivers[currentDriverIndex];\n                        currentDriverIndex++;\n\n                        self._dbInfo = null;\n                        self._ready = null;\n\n                        return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n                    }\n\n                    setDriverToConfig();\n                    var error = new Error('No available storage method found.');\n                    self._driverSet = Promise$1.reject(error);\n                    return self._driverSet;\n                }\n\n                return driverPromiseLoop();\n            };\n        }\n\n        // There might be a driver initialization in progress\n        // so wait for it to finish in order to avoid a possible\n        // race condition to set _dbInfo\n        var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n            return Promise$1.resolve();\n        }) : Promise$1.resolve();\n\n        this._driverSet = oldDriverSetDone.then(function () {\n            var driverName = supportedDrivers[0];\n            self._dbInfo = null;\n            self._ready = null;\n\n            return self.getDriver(driverName).then(function (driver) {\n                self._driver = driver._driver;\n                setDriverToConfig();\n                self._wrapLibraryMethodsWithReady();\n                self._initDriver = initDriver(supportedDrivers);\n            });\n        })[\"catch\"](function () {\n            setDriverToConfig();\n            var error = new Error('No available storage method found.');\n            self._driverSet = Promise$1.reject(error);\n            return self._driverSet;\n        });\n\n        executeTwoCallbacks(this._driverSet, callback, errorCallback);\n        return this._driverSet;\n    };\n\n    LocalForage.prototype.supports = function supports(driverName) {\n        return !!DriverSupport[driverName];\n    };\n\n    LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n        extend(this, libraryMethodsAndProperties);\n    };\n\n    LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n        var supportedDrivers = [];\n        for (var i = 0, len = drivers.length; i < len; i++) {\n            var driverName = drivers[i];\n            if (this.supports(driverName)) {\n                supportedDrivers.push(driverName);\n            }\n        }\n        return supportedDrivers;\n    };\n\n    LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n        // Add a stub for each driver API method that delays the call to the\n        // corresponding driver method until localForage is ready. These stubs\n        // will be replaced by the driver methods as soon as the driver is\n        // loaded, so there is no performance impact.\n        for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n            callWhenReady(this, LibraryMethods[i]);\n        }\n    };\n\n    LocalForage.prototype.createInstance = function createInstance(options) {\n        return new LocalForage(options);\n    };\n\n    return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inlineSettings\":\"inlineSettings---K3lU5\",\"label\":\"label---FP1MZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---1ojrW\",\"standard-dropdown\":\"standard-dropdown---2qVGd\",\"small-dropdown\":\"small-dropdown---Bqi1g\",\"light\":\"light---2EfgT\",\"dark\":\"dark---3HlD-\",\"hover-transparent\":\"hover-transparent---1JOf3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---2_aK0\",\"select\":\"select---2BVtD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modalOpen\":\"modalOpen---X_y2f\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"editable\":\"editable---1lthu\",\"isDashboardTitle\":\"isDashboardTitle---1oZAf\",\"showPlaceholderOnHover\":\"showPlaceholderOnHover---mJVcK\",\"multiLines\":\"multiLines---2tUyr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1GPqM\",\"sharingMode\":\"sharingMode---3imiU\",\"hiddenColumnsFade\":\"hiddenColumnsFade---1w8PJ\",\"tooltip\":\"tooltip---2912t\",\"hiddenRowsFade\":\"hiddenRowsFade---25bpN\"};","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { omit } from 'lodash';\nimport Swatch from '../swatch-component';\nimport styles from './labelled-swatch-style.scss';\n\nconst LabelledSwatchComponent = props => {\n  const { label, onClick } = props;\n  const swatchProps = omit(props, ['label', 'onClick']);\n\n  return (\n    <div className={styles.container} onClick={onClick}>\n      <span className={styles.swatch}>\n        <Swatch {...swatchProps} />\n      </span>\n      <span>{label}</span>\n    </div>\n  );\n};\n\nLabelledSwatchComponent.propTypes = {\n  borderColor: PropTypes.string.isRequired,\n  colorStops: PropTypes.arrayOf(PropTypes.string).isRequired,\n  label: PropTypes.node.isRequired,\n  onClick: PropTypes.func.isRequired,\n  checked: PropTypes.bool,\n  type: PropTypes.oneOf(['light', 'dark']),\n  value: PropTypes.string,\n};\n\nexport default LabelledSwatchComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---3EIfB\",\"icon\":\"icon---Mt9n1\",\"title\":\"title---QHK4W\",\"subtitle\":\"subtitle---AXdQS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"promoCard\":\"promoCard---3OYKk\",\"promoCardHeader\":\"promoCardHeader---3UumI\",\"promoCardFooter\":\"promoCardFooter---3YoVT\",\"link\":\"link---3cqmm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---nK8un\",\"handle\":\"handle---aIQHW\",\"sortable\":\"sortable---2jYce\",\"innerItem\":\"innerItem---5HzMh\",\"previewItem\":\"previewItem---3Xd44\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"swatch\":\"swatch---3nRHE\",\"hoverBorder\":\"hoverBorder---3NT_2\",\"light\":\"light---WmRYY\",\"hoverIcon\":\"hoverIcon---16VSj\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"colorPicker\":\"colorPicker---1get2\",\"saturation\":\"saturation---1fUQo\",\"hue\":\"hue---_0qpq\",\"pointer\":\"pointer---1U5q2\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"presetPanel\":\"presetPanel---Ld0rr\",\"scrollHidden\":\"scrollHidden---KHz6Q\",\"logo\":\"logo---Q2cIS\",\"presetPanelHeader\":\"presetPanelHeader---2UAoa\",\"presetPanelContentOuter\":\"presetPanelContentOuter---29q31\",\"presetPanelContentInner\":\"presetPanelContentInner---2G963\",\"presetPanelButton\":\"presetPanelButton---2XP2p\",\"presetPanelFooter\":\"presetPanelFooter---3gw0v\",\"loadingOverlay\":\"loadingOverlay---2gYd5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mobileMenuPage\":\"mobileMenuPage---n_cb2\",\"heading\":\"heading---b_G_Q\",\"closeButtonWrapper\":\"closeButtonWrapper---tIU_K\",\"closeButton\":\"closeButton---1H9Cg\",\"menuItem\":\"menuItem---3uw2f\",\"menuItemActive\":\"menuItemActive---FaA_G\",\"dashboardList\":\"dashboardList---1oNzK\",\"scrollWrapper\":\"scrollWrapper---kZzts\",\"settings\":\"settings---1_Ren\",\"logoutLink\":\"logoutLink---3jVeP\"};","module.exports = (__webpack_require__(28))(99);","import AuthStrategy from './auth-strategy';\nimport config from '../universal/config';\nimport { getCSRFToken } from '../universal/lib/csrf';\n\nconst pusherAdapter = (Pusher, useTurnstile) => {\n  const { ChannelAuthHost, AuthBaseURL, pusher = {} } = config.get();\n  const { applicationKey, host } = pusher;\n\n  if (!applicationKey) {\n    throw new Error('Pusher application key not found');\n  }\n  // we need this to conditionally be this based whether\n  // we're using turnstile or not\n  let authEndpoint = `${\n    useTurnstile ? ChannelAuthHost : AuthBaseURL\n  }/pusher/auth`;\n\n  const authQueryString = AuthStrategy.getInstance().getQueryParam();\n  if (authQueryString) {\n    authEndpoint += `?${authQueryString}`;\n  }\n\n  const options = {\n    authEndpoint,\n  };\n\n  if (host) {\n    const [wsHost, wssPort] = host.split(':');\n    options.wsHost = wsHost;\n    options.wssPort = wssPort;\n  }\n\n  const csrfToken = getCSRFToken();\n  if (csrfToken) {\n    options.auth = {\n      headers: {\n        'X-CSRF-Token': csrfToken,\n      },\n    };\n  }\n\n  return new Pusher(applicationKey, options);\n};\n\nexport default pusherAdapter;\n","import Pusher from 'vendors/pusher';\nimport PusherAdapter from './pusher-adapter';\nimport { partial, without, memoize } from 'lodash';\n\nclass PushManager {\n  constructor(socket) {\n    this.socket = socket;\n    this.subscriptions = [];\n  }\n\n  bind(...args) {\n    this.socket.connection.bind(...args);\n  }\n\n  unbind(...args) {\n    this.socket.connection.unbind(...args);\n  }\n\n  subscribe(channelName, onPush) {\n    let channel;\n    if (this.subscriptions.indexOf(channelName) === -1) {\n      this.subscriptions.push(channelName);\n      channel = this.socket.subscribe(channelName);\n      // console.log({ channel });\n      channel.bind_all(partial(onPush, channelName));\n    }\n  }\n\n  unsubscribe(channelName) {\n    this.socket.unsubscribe(channelName);\n    this.subscriptions = without(this.subscriptions, channelName);\n  }\n}\n\nPushManager.getInstance = memoize(useTurnstile => {\n  const socket = new PusherAdapter(Pusher, useTurnstile);\n  return new PushManager(socket);\n});\n\nexport default PushManager;\n","const SERVICES_WITH_IMPORTS = ['intercom3', 'zendesk2'];\n\n/**\n * Returns wether the service name passed requires\n * an import step before we can query any data.\n *\n * @param {String} serviceName - The unique id string for the service\n * @returns {Boolean}\n */\nexport const requiresImport = serviceName =>\n  SERVICES_WITH_IMPORTS.includes(serviceName);\n","import { Component } from 'react';\n\nclass EmptyComponent extends Component {\n  render() {\n    return null;\n  }\n}\n\nexport default function componentPicker(\n  components,\n  name,\n  DefaultComponent = EmptyComponent,\n) {\n  if (components[name]) {\n    return components[name];\n  }\n\n  return DefaultComponent;\n}\n\nexport { EmptyComponent };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { bindAll } from 'lodash';\nimport { getActiveElement } from '../lib/dom-helper';\n\nexport const MenuPropTypes = {\n  onFocus: PropTypes.func.isRequired,\n  onClose: PropTypes.func.isRequired,\n  onToggle: PropTypes.func.isRequired,\n  open: PropTypes.bool.isRequired,\n};\n\nclass Menu extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, ['handleClose', 'handleKeyDown', 'focus', 'close', 'toggle']);\n    this.state = { open: false };\n  }\n\n  componentDidUpdate(_nextProps, nextState) {\n    const { open } = this.state;\n\n    if (open === nextState.open) return;\n\n    // Bind the keydown and click handlers if the menu transitioned to visible\n    if (open) {\n      document.addEventListener('keydown', this.handleKeyDown, true);\n      document.addEventListener('click', this.handleClose, true);\n      document.addEventListener('focus', this.handleClose, true);\n      // otherwise unbind the handlers\n    } else {\n      const activeElement = getActiveElement();\n      // to prevent focus event getting re-triggered and menu re-opening,\n      // we blur the active element if it belongs to the menu\n      if (findDOMNode(this).contains(activeElement)) {\n        activeElement.blur();\n      }\n      document.removeEventListener('keydown', this.handleKeyDown, true);\n      document.removeEventListener('click', this.handleClose, true);\n      document.removeEventListener('focus', this.handleClose, true);\n    }\n  }\n\n  componentWillUnmount() {\n    // make sure we unbind these listeners - at the very least\n    // twas messing up the tests\n    document.removeEventListener('keydown', this.handleKeyDown, true);\n    document.removeEventListener('click', this.handleClose, true);\n    document.removeEventListener('focus', this.handleClose, true);\n  }\n\n  handleClose(e) {\n    const clickedOutsideMenu = !findDOMNode(this).contains(e.target);\n    // There are a few cases where our menu components are opening modals\n    // if this is the case we do not want the menu in the background to close\n    // when interacting with modals\n    const isModalClosed = !document.getElementById('modal');\n\n    if (clickedOutsideMenu && isModalClosed) {\n      e.stopPropagation();\n      this.setState({ open: false });\n      this.props.onClose();\n    }\n  }\n\n  handleKeyDown(e) {\n    // Handle escape key\n    if (e.key === 'Escape' || e.keyCode === 27) {\n      // When the dropdown is inside a modal\n      // prevent the modal from closing as well\n      e.stopPropagation();\n      this.setState({ open: false });\n      this.props.onClose();\n    }\n  }\n\n  render() {\n    const { DecoratedComponent, ...props } = this.props;\n\n    return (\n      <DecoratedComponent\n        {...props}\n        onFocus={this.focus}\n        onClose={this.close}\n        onToggle={this.toggle}\n        open={this.state.open}\n      />\n    );\n  }\n\n  focus() {\n    this.setState({ open: true });\n  }\n\n  toggle() {\n    const open = !this.state.open;\n    this.setState({ open });\n    if (!open) {\n      this.props.onClose();\n    }\n  }\n\n  close() {\n    this.setState({ open: false });\n    this.props.onClose();\n  }\n}\n\nMenu.defaultProps = {\n  onClose: () => {},\n};\n\nMenu.propTypes = {\n  DecoratedComponent: PropTypes.func.isRequired,\n  onClose: PropTypes.func,\n};\n\nconst menu = DecoratedComponent => {\n  class DecoratedMenu extends Component {\n    render() {\n      return (\n        <Menu\n          ref=\"menu\"\n          {...this.props}\n          DecoratedComponent={DecoratedComponent}\n        />\n      );\n    }\n\n    toggle() {\n      this.refs.menu.toggle();\n    }\n  }\n\n  return DecoratedMenu;\n};\n\nexport default menu;\n","const DEFAULTS = {\n  chart: {\n    backgroundColor: 'transparent',\n  },\n  title: {\n    text: '',\n    style: {\n      fontWeight: 'normal',\n    },\n  },\n  xAxis: {\n    labels: {\n      style: {\n        fontWeight: 'normal',\n      },\n    },\n  },\n  yAxis: {\n    labels: {\n      style: {\n        fontWeight: 'normal',\n      },\n    },\n    title: {\n      style: {\n        fontWeight: 'normal',\n      },\n    },\n  },\n  plotOptions: {\n    line: {\n      dataLabels: {\n        enabled: false,\n      },\n      animation: false,\n      groupPadding: 0,\n      marker: {\n        enabled: false,\n      },\n      lineWidth: 1.5,\n    },\n    area: {\n      animation: false,\n      marker: {\n        enabled: false,\n      },\n      lineWidth: 1.5,\n    },\n  },\n  legend: {\n    enabled: false,\n  },\n  credits: {\n    enabled: false,\n  },\n};\nconst DARK_DEFAULTS = {\n  colors: [\n    '#9AA7AC', // Comparison\n    '#3EB4F9', // Primary\n    '#A2DBFC', // Primary (goal achieved)\n    '#39393b', // Goal plot band color\n  ],\n  title: {\n    style: {\n      color: '#E0E0E0',\n    },\n  },\n  xAxis: {\n    lineColor: '#454545',\n    tickColor: '#454545',\n    labels: {\n      style: {\n        color: '#E0E0E0',\n      },\n    },\n  },\n  yAxis: {\n    gridLineColor: '#454545',\n    lineColor: '#454545',\n    tickColor: '#454545',\n    plotBandColor: '#39393b',\n    labels: {\n      style: {\n        color: '#E0E0E0',\n      },\n    },\n    title: {\n      style: {\n        color: '#E0E0E0',\n      },\n    },\n  },\n};\nconst LIGHT_DEFAULTS = {\n  colors: [\n    '#9AA7AC', // Comparison\n    '#3EB4F9', // Primary\n    '#A2DBFC', // Primary (goal achieved)\n    '#F5F5F5', // Goal plot band color\n  ],\n  title: {\n    style: {\n      color: '#666666',\n    },\n  },\n  xAxis: {\n    lineColor: '#DFDFDF',\n    tickColor: '#DFDFDF',\n    labels: {\n      style: {\n        color: '#666666',\n      },\n    },\n  },\n  yAxis: {\n    gridLineColor: '#DFDFDF',\n    lineColor: '#DFDFDF',\n    tickColor: '#DFDFDF',\n    labels: {\n      style: {\n        color: '#666666',\n      },\n    },\n    title: {\n      style: {\n        color: '#666666',\n      },\n    },\n  },\n};\nconst LIGHT = { ...DEFAULTS, ...LIGHT_DEFAULTS };\nconst DARK = { ...DEFAULTS, ...DARK_DEFAULTS };\n\nconst getDefaults = theme => {\n  if (theme === 'light') return LIGHT;\n  return DARK;\n};\n\nexport default getDefaults;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { isString } from 'lodash';\nimport getDefaults from './defaults';\n\n// Highchart payloads can take several forms:\n\n// • A string of JavaScript which we eval as the payload\n// • A string of JavaScript which we eval and if that is an object with a key `highchart` with a value that is a string we eval that and take it as the payload\n// • A string of JavaScript which we eval and if that is an object with a key `highchart` that is also an object we take that as the payload\n// • JSON\n// • JSON with a key `highchart` with a string value which we eval and take as the payload\n// • JSON with a key `highchart` with an object value which we take as the payload\n\nfunction evil(js) {\n  return Function(`return ${js.trim()};`)(); // eslint-disable-line no-new-func\n}\n\nclass HighchartVisualisationComponent extends PureComponent {\n  componentDidMount() {\n    this.renderHighchart();\n  }\n\n  componentDidUpdate() {\n    this.renderHighchart();\n  }\n\n  renderHighchart() {\n    if (this.chart) {\n      this.chart.destroy();\n    }\n\n    const { Highcharts, isCustomWidget, theme } = this.props;\n    let errorMessage = 'Failed to render chart';\n\n    // change message if it's a custom widget\n    if (isCustomWidget) {\n      errorMessage = \"Chart data couldn't be parsed\";\n    }\n\n    try {\n      let { data } = this.props;\n\n      if (!data) return;\n\n      if (data.highchart) {\n        data = data.highchart;\n      }\n\n      if (isString(data)) {\n        data = evil(data);\n        // Because apparently people can put the payload in the payload\n        if (isString(data.highchart)) {\n          data = evil(data.highchart);\n        }\n\n        if (data.highchart) {\n          data = data.highchart;\n        }\n      }\n\n      if (data.optInToGeckoboardDefaults) {\n        data = { ...getDefaults(theme), ...data };\n      }\n\n      data = {\n        ...data,\n        chart: {\n          ...data.chart,\n          renderTo: this.domNode,\n          height: this.domNode.clientHeight,\n        },\n      };\n\n      this.chart = new Highcharts.Chart(data);\n    } catch (error) {\n      console.error(error.toString());\n      throw new Error(errorMessage);\n    }\n  }\n\n  render() {\n    return (\n      <div\n        className=\"highchart-visualisation\"\n        style={{ height: '100%' }}\n        ref={domNode => (this.domNode = domNode)}\n      />\n    );\n  }\n}\nHighchartVisualisationComponent.defaultProps = {\n  isCustomWidget: false,\n};\nHighchartVisualisationComponent.propTypes = {\n  Highcharts: PropTypes.shape({\n    Chart: PropTypes.func,\n  }).isRequired,\n  data: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.shape({\n      highchart: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n    }),\n  ]),\n  isCustomWidget: PropTypes.bool,\n  theme: PropTypes.string,\n};\n\nexport default HighchartVisualisationComponent;\n","/* global BARRIER_HOST */\nimport React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getWindow } from '../../lib/global';\n\nclass HighchartIframeComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = { visibility: 'hidden' };\n  }\n\n  componentDidUpdate() {\n    this.domIframe.contentWindow.postMessage(\n      JSON.stringify({\n        type: 'highchartPayload',\n        payload: this.props.data,\n      }),\n      '*',\n    );\n  }\n\n  render() {\n    const { visibility } = this.state;\n    const src = `${getWindow().BARRIER_HOST}/sharing-iframe`;\n\n    return (\n      <iframe\n        ref={ref => (this.domIframe = ref)}\n        src={src}\n        style={{ height: '100%', width: '100%', visibility }}\n        onLoad={() => this.setState({ visibility: 'visible' })}\n      />\n    );\n  }\n}\nHighchartIframeComponent.propTypes = {\n  data: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.shape({\n      highchart: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n    }),\n  ]),\n};\n\nexport default HighchartIframeComponent;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { getWindow } from '../../lib/global';\n\nconst HIGHCHARTS_SRC =\n  'https://d1iac3m7xufrx4.cloudfront.net/vendor/highcharts.js';\n\nconst loadHighcharts = load =>\n  new Promise((resolve, reject) => {\n    load(HIGHCHARTS_SRC, err => {\n      if (err) {\n        reject(err);\n        return;\n      }\n\n      resolve();\n    });\n  });\nlet highchartResult;\n\nclass HighchartLoader extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = { Highcharts: getWindow().Highcharts };\n  }\n\n  async componentDidMount() {\n    if (this.state.Highcharts) return;\n\n    await this.handleLoad();\n  }\n\n  async handleLoad() {\n    try {\n      // Only load Highcharts once\n      if (!highchartResult) {\n        highchartResult = loadHighcharts(this.props.load);\n      }\n\n      await highchartResult;\n\n      this.setState({ Highcharts: getWindow().Highcharts });\n    } catch (error) {\n      this.setState({ error });\n    }\n  }\n\n  render() {\n    const { Highcharts, error } = this.state;\n\n    if (error) {\n      throw error;\n    }\n\n    if (!Highcharts) {\n      return <div />; // If we have no loaded chart, return an empty placeholder\n    }\n\n    return this.props.children(Highcharts);\n  }\n}\nHighchartLoader.propTypes = {\n  children: PropTypes.func.isRequired,\n  load: PropTypes.func.isRequired,\n};\n\nexport default HighchartLoader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport HighchartComponent from './highchart-component';\nimport HighchartIframe from './highchart-iframe-component';\nimport HighchartLoader from './highchart-loader-component';\nimport load from 'little-loader';\n\nconst HighchartRenderer = props => (\n  <HighchartLoader load={load}>\n    {Highcharts => {\n      return <HighchartComponent Highcharts={Highcharts} {...props} />;\n    }}\n  </HighchartLoader>\n);\n\nconst Highchart = props => {\n  if (props.isPublic) {\n    return <HighchartIframe {...props} />;\n  }\n\n  return <HighchartRenderer {...props} />;\n};\nHighchart.defaultProps = {\n  isPublic: true,\n};\nHighchart.propTypes = {\n  isPublic: PropTypes.bool,\n};\n\nexport { Highchart as default, HighchartRenderer };\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport AdvancedSettings from '../../components/form/advanced-settings';\nimport AdvancedSettingsTable from '../../components/form/advanced-settings-table';\nimport FormattedMessage from '../../lib/i18n';\nimport { Row, Column } from '../../components/layout';\nimport Button from '@UI/button';\nimport { isUndefined } from 'lodash';\nimport WidgetMenuModal from '../widget-menu-modal';\n\nclass WidgetNumberFormatComponent extends PureComponent {\n  renderColumnNumberFormat() {\n    const {\n      numberFormat,\n      formattableColumns,\n      onNumberFormatUpdate,\n    } = this.props;\n\n    return (\n      <AdvancedSettingsTable\n        columns={formattableColumns}\n        numberFormat={numberFormat}\n        onNumberFormatUpdate={(index, format) =>\n          onNumberFormatUpdate({ index, format })\n        }\n        lightButtons\n        labelMargin={2}\n        isSmall\n      />\n    );\n  }\n\n  renderRegularNumberFormat() {\n    const { numberFormat, onNumberFormatUpdate } = this.props;\n\n    return (\n      <AdvancedSettings\n        onNumberFormatUpdate={format => onNumberFormatUpdate({ format })}\n        numberFormat={numberFormat}\n        labelMargin={2}\n      />\n    );\n  }\n\n  render() {\n    const { formattableColumns, onClose, onSave } = this.props;\n\n    return (\n      <WidgetMenuModal\n        title={<FormattedMessage id=\"widget.menu.formatNumber\" />}\n        icon=\"dollar-sign\"\n      >\n        <Row marginBottom={1}>\n          {!isUndefined(formattableColumns)\n            ? this.renderColumnNumberFormat()\n            : this.renderRegularNumberFormat()}\n        </Row>\n        <Row justify=\"flex-end\" flexFill>\n          <Column>\n            <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n              Cancel\n            </Button>\n          </Column>\n          <Column marginLeft={1}>\n            <Button type={Button.TYPES.SUBMIT} onClick={onSave}>\n              Save\n            </Button>\n          </Column>\n        </Row>\n      </WidgetMenuModal>\n    );\n  }\n}\n\nWidgetNumberFormatComponent.propTypes = {\n  formattableColumns: PropTypes.arrayOf(\n    PropTypes.shape({\n      hint: PropTypes.string,\n      index: PropTypes.number,\n      label: PropTypes.string,\n    }),\n  ),\n  numberFormat: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n  onClose: PropTypes.func,\n  onNumberFormatUpdate: PropTypes.func,\n  onSave: PropTypes.func,\n};\n\nexport default WidgetNumberFormatComponent;\n","import PropTypes from 'prop-types';\nimport { zip } from 'lodash';\n\n// 0 and 3 are reserved for no icon states — 0 is used by custom widgets and 3 is used by the no-data text widget ¯\\_(ツ)_/¯\nconst ICON_TYPES = [undefined, 'alert', 'info', undefined];\n\nconst LegacyTextTransformerComponent = ({ children, item = [], ...props }) => {\n  let value = item.map(({ text }) => text);\n  let icons = item.map(({ type }) => ICON_TYPES[type]);\n  const { configuration = {} } = props;\n  const text = configuration.text || configuration['text[]'];\n  const iconTypes = configuration.type || configuration['type[]'] || [];\n\n  // The static no-data text widget supports both `text` and `text[]` as the source of the strings to use as values\n  // Similarly this is joined by `type` and `type[]` for the icon type ¯\\_(ツ)_/¯\n  if (text) {\n    [value, icons] = zip(text, iconTypes)\n      .filter(([t]) => !!t) // Omit empty strings\n      .map(([t, icon]) => [t, parseInt(icon, 10) || 3]) // Map the magic type number to an icon\n      .map(([t, icon]) => [t, ICON_TYPES[icon]])\n      .reduce(\n        ([allText, allIcons], [t, icon]) => {\n          return [\n            [...allText, t],\n            [...allIcons, icon],\n          ]; // Unzip\n        },\n        [[], []],\n      );\n  }\n\n  return children({\n    ...props,\n    value,\n    icons,\n    isLoop: true,\n    maxSlides: Infinity,\n    allowHTML: true,\n  });\n};\nLegacyTextTransformerComponent.propTypes = {\n  children: PropTypes.func.isRequired,\n  item: PropTypes.arrayOf(\n    PropTypes.shape({\n      text: PropTypes.string,\n      type: PropTypes.oneOf([0, 1, 2]),\n    }),\n  ),\n};\n\nexport default LegacyTextTransformerComponent;\n","import React from 'react';\nimport Text from './text-component';\nimport PropTypes from 'prop-types';\nimport LegacyTextTransformer from './legacy-text-transformer-component';\n\nconst TextPicker = props => {\n  const { item, configuration = {} } = props;\n\n  // Old text widgets use `item` while `configuration.text` or `configuration.text[]` is for the static no-data text widget\n  if (item || configuration.text || configuration['text[]']) {\n    return (\n      <LegacyTextTransformer {...props}>\n        {transformedProps => <Text {...transformedProps} />}\n      </LegacyTextTransformer>\n    );\n  }\n\n  return <Text {...props} />;\n};\nTextPicker.canRender = Text.canRender;\nTextPicker.propTypes = {\n  configuration: PropTypes.object,\n  item: PropTypes.array,\n};\n\nexport default TextPicker;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport GroupedDropdown from '../../../components/grouped-dropdown';\n\nimport styles from './universal-dropdown-style.scss';\n\nconst UniversalDropdownComponent = props => {\n  const { value, getSearchPlaceholderText } = props;\n\n  return (\n    <GroupedDropdown\n      renderSearchInput={({ search, value: searchValue, maxLength }) => (\n        <input\n          name=\"search-dropdown\"\n          type=\"text\"\n          autoComplete=\"off\"\n          autoFocus\n          className={styles.searchInput}\n          value={searchValue}\n          placeholder={\n            getSearchPlaceholderText\n              ? getSearchPlaceholderText(value)\n              : value.name\n          }\n          maxLength={maxLength}\n          onChange={e => search(e.target.value)}\n          tabIndex={0}\n        />\n      )}\n      {...props}\n    />\n  );\n};\n\nUniversalDropdownComponent.defaultProps = {\n  options: [],\n  canSearch: true,\n  onChange: () => {},\n  getLabel: ({ name }) => name,\n};\n\nUniversalDropdownComponent.propTypes = {\n  canCollapse: PropTypes.bool,\n  canRenderHeader: PropTypes.bool,\n  canSearch: PropTypes.bool,\n  dropdownType: PropTypes.string,\n  getLabel: PropTypes.func,\n  getMenuLabel: PropTypes.func,\n  getSearchPlaceholderText: PropTypes.func,\n  options: PropTypes.arrayOf(\n    PropTypes.oneOfType([\n      PropTypes.shape({\n        name: PropTypes.string,\n        options: PropTypes.arrayOf(\n          PropTypes.shape({\n            key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n            name: PropTypes.string,\n            uid: PropTypes.string,\n          }),\n        ),\n      }),\n      PropTypes.arrayOf(\n        PropTypes.shape({\n          key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n          name: PropTypes.string,\n          uid: PropTypes.string,\n        }),\n      ),\n    ]),\n  ),\n  renderDropMenuLabel: PropTypes.func,\n  renderSearchInput: PropTypes.func,\n  searchKeys: PropTypes.arrayOf(PropTypes.string),\n  useObjectFormat: PropTypes.bool,\n  value: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  onChange: PropTypes.func,\n};\nexport default UniversalDropdownComponent;\n","import UniversalDropdown from './universal-dropdown-component';\nexport default UniversalDropdown;\n","import moment from 'moment';\n\nconst LAUNCH_DATE = moment('2020-04-30').unix();\n\n/**\n * Returns true if a user has the feature flag\n * or if the user's org was created recently\n */\nconst canUserBeta = (user, org) =>\n  org.date > LAUNCH_DATE || user.features.includes('ff:spreadsheetsBeta');\n\nexport default canUserBeta;\n","// Inspired by https://github.com/jxnblk/reflexbox\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { range, memoize } from 'lodash';\n\nimport style from './layout-style.scss';\n\nconst toSuffix = memoize((v = '') => v.toString().replace('.', '-'));\n\nconst Layout = props => {\n  const {\n    DecoratedComponent,\n    flex,\n    inlineFlex,\n    flexWrap,\n    flexAuto,\n    flexNone,\n    flexShrink,\n    flexFill,\n    flexEqualWidth,\n    flexColumn,\n    align,\n    justify,\n    col,\n    sm,\n    md,\n    lg,\n    gutter,\n    margin,\n    marginTop,\n    marginRight,\n    marginBottom,\n    marginLeft,\n    marginX,\n    marginY,\n    padding,\n    paddingTop,\n    paddingRight,\n    paddingBottom,\n    paddingLeft,\n    paddingX,\n    paddingY,\n    ...rest\n  } = props;\n\n  const classes = classNames({\n    [style.flex]: flex,\n    [style.inlineFlex]: inlineFlex,\n    [style.flexAuto]: flexAuto,\n    [style.flexNone]: flexNone,\n    [style.flexShrink]: flexShrink,\n    [style.flexFill]: flexFill,\n    [style.flexEqualWidth]: flexEqualWidth,\n    [style.flexWrap]: flexWrap,\n    [style.directionColumn]: flexColumn,\n    [style[`align-${align}`]]: align,\n    [style[`justify-${justify}`]]: justify,\n    [style[`col-${col}`]]: col,\n    [style[`sm-${sm}`]]: sm,\n    [style[`md-${md}`]]: md,\n    [style[`lg-${lg}`]]: lg,\n    [style[`margin-${toSuffix(margin)}`]]: margin,\n    [style[`margin-left-${toSuffix(marginX)}`]]: marginX,\n    [style[`margin-right-${toSuffix(marginX)}`]]: marginX,\n    [style[`margin-top-${toSuffix(marginY)}`]]: marginY,\n    [style[`margin-bottom-${toSuffix(marginY)}`]]: marginY,\n    [style[`margin-left-${toSuffix(marginLeft)}`]]: marginLeft,\n    [style[`margin-right-${toSuffix(marginRight)}`]]: marginRight,\n    [style[`margin-top-${toSuffix(marginTop)}`]]: marginTop,\n    [style[`margin-bottom-${toSuffix(marginBottom)}`]]: marginBottom,\n    [style[`padding-${toSuffix(padding)}`]]: padding,\n    [style[`padding-left-${toSuffix(paddingX)}`]]: paddingX,\n    [style[`padding-right-${toSuffix(paddingX)}`]]: paddingX,\n    [style[`padding-top-${toSuffix(paddingY)}`]]: paddingY,\n    [style[`padding-bottom-${toSuffix(paddingY)}`]]: paddingY,\n    [style[`padding-left-${toSuffix(paddingLeft)}`]]: paddingLeft,\n    [style[`padding-right-${toSuffix(paddingRight)}`]]: paddingRight,\n    [style[`padding-top-${toSuffix(paddingTop)}`]]: paddingTop,\n    [style[`padding-bottom-${toSuffix(paddingBottom)}`]]: paddingBottom,\n    [style[`gutter-${toSuffix(gutter)}`]]: gutter,\n  });\n\n  return <DecoratedComponent {...rest} layoutClasses={classes} />;\n};\n\nconst columns = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];\nconst spaceScale = range(0, 4.25, 0.25); // 0 to 4\n\nLayout.propTypes = {\n  DecoratedComponent: PropTypes.func,\n  align: PropTypes.oneOf([\n    'stretch',\n    'center',\n    'baseline',\n    'flex-start',\n    'flex-end',\n  ]),\n  children: PropTypes.node,\n  col: PropTypes.oneOf(columns),\n  flex: PropTypes.bool,\n  flexAuto: PropTypes.bool,\n  flexColumn: PropTypes.bool,\n  flexEqualWidth: PropTypes.bool,\n  flexFill: PropTypes.bool,\n  flexNone: PropTypes.bool,\n  flexShrink: PropTypes.bool,\n  flexWrap: PropTypes.bool,\n  gutter: PropTypes.oneOf(spaceScale),\n  inlineFlex: PropTypes.bool,\n  justify: PropTypes.oneOf([\n    'center',\n    'space-around',\n    'space-between',\n    'flex-start',\n    'flex-end',\n  ]),\n  lg: PropTypes.oneOf(columns),\n  margin: PropTypes.oneOf(spaceScale),\n  marginBottom: PropTypes.oneOf(spaceScale),\n  marginLeft: PropTypes.oneOf(spaceScale),\n  marginRight: PropTypes.oneOf(spaceScale),\n  marginTop: PropTypes.oneOf(spaceScale),\n  marginX: PropTypes.oneOf(spaceScale),\n  marginY: PropTypes.oneOf(spaceScale),\n  md: PropTypes.oneOf(columns),\n  padding: PropTypes.oneOf(spaceScale),\n  paddingBottom: PropTypes.oneOf(spaceScale),\n  paddingLeft: PropTypes.oneOf(spaceScale),\n  paddingRight: PropTypes.oneOf(spaceScale),\n  paddingTop: PropTypes.oneOf(spaceScale),\n  paddingX: PropTypes.oneOf(spaceScale),\n  paddingY: PropTypes.oneOf(spaceScale),\n  sm: PropTypes.oneOf(columns),\n};\n\nconst layout = DecoratedComponent => props => (\n  <Layout {...props} DecoratedComponent={DecoratedComponent} />\n);\n\nexport default layout;\n","import { chain } from 'lodash';\nimport createAction from '../../lib/redux/create-action';\nimport createErrorAction from '../../lib/redux/create-error-action';\nimport { getServiceWidgetTypes } from '../../services/management-service';\nimport universalService from '../../universal/services/universal-service';\n\nexport const getPresetsStart = createAction('Presets:GET_PRESETS_START');\nexport const getPresetsSuccess = createAction('Presets:GET_PRESETS_SUCCESS');\nexport const getPresetsFailed = createErrorAction('Presets:GET_PRESETS_FAILED');\n\n/**\n * Creates a relative link to the old\n * config page for an heirloom widget\n */\nconst __getHeirloomLink = (dashboardId, serviceId, widgetTypeId) =>\n  `/v4/dashboards/${dashboardId}/widgets/new?serviceId=${serviceId}&widgetTypeId=${widgetTypeId}`;\n\n/**\n * For an array of service Ids, returns an\n * array of widget types for each service.\n */\nconst __fetchWidgetTypes = serviceIds =>\n  Promise.all(serviceIds.map(id => getServiceWidgetTypes(id)));\n\n/**\n * Finds all the heirloom presets, fetches all the widget\n * types for the service defined in each preset. The\n * array of widget types will be indexed by the\n * service name.\n * e.g. { [service_name]: widgetTypes }\n */\nconst __getWidgetTypes = async (presets, services) => {\n  const uniqueServiceNames = chain(presets)\n    .filter(preset => preset.heirloom)\n    .map(preset => preset.service_name)\n    .uniq()\n    .value();\n\n  const uniqueServiceIds = uniqueServiceNames.map(\n    name => services.find(service => service.name === name).id,\n  );\n\n  const widgetTypesPerService = await __fetchWidgetTypes(uniqueServiceIds);\n\n  return widgetTypesPerService.reduce(\n    (acc, widgetTypes, i) => ({\n      ...acc,\n      [uniqueServiceNames[i]]: widgetTypes,\n    }),\n    {},\n  );\n};\n\n/**\n * For every heirloom preset in the preset list\n * injects a relative link to the config page\n * for the preset's widget type.\n */\nconst __injectLinksIntoHeirloomPresets = (presets, widgetTypes, dashboardId) =>\n  presets.map(preset => {\n    if (!preset.heirloom) {\n      return preset;\n    }\n\n    const widgetType = widgetTypes[preset.service_name].find(\n      type => type.widget === preset.widget_type,\n    );\n\n    return {\n      ...preset,\n      link: __getHeirloomLink(\n        dashboardId,\n        widgetType.services[0],\n        widgetType.id,\n      ),\n    };\n  });\n\n/**\n * Gets the preset list for a given universal integration\n *\n * Warning: This action assumes you already have the dashboard\n * and list of services stored in the Redux state.\n */\nexport const getPresets = integration => async (dispatch, getState) => {\n  if (!integration) {\n    throw new Error('No integration name contained in payload');\n  }\n\n  dispatch(getPresetsStart(integration));\n\n  try {\n    const state = getState();\n    const dashboardId = state.dashboard.dashboard.id;\n    const services = state.dataSources.services;\n\n    let presets = await universalService.fetchPresets(integration);\n    const widgetTypes = await __getWidgetTypes(presets, services);\n\n    presets = __injectLinksIntoHeirloomPresets(\n      presets,\n      widgetTypes,\n      dashboardId,\n    );\n\n    dispatch(getPresetsSuccess({ integration, presets }));\n  } catch (error) {\n    dispatch(getPresetsFailed(error));\n  }\n};\n","function createThunkMiddleware(extraArgument) {\n  return function (_ref) {\n    var dispatch = _ref.dispatch,\n        getState = _ref.getState;\n    return function (next) {\n      return function (action) {\n        if (typeof action === 'function') {\n          return action(dispatch, getState, extraArgument);\n        }\n\n        return next(action);\n      };\n    };\n  };\n}\n\nvar thunk = createThunkMiddleware();\nthunk.withExtraArgument = createThunkMiddleware;\n\nexport default thunk;","// Expose as a module so that we can mock it despite the way the module has been authored\nimport copy from 'copy-to-clipboard';\nexport default copy;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { max, round } from 'lodash';\nimport { layoutType } from '../prop-types';\nimport { isSmallDimension } from '../helpers';\nimport FramedFormattedNumber from '../../components/framed-formatted-number';\nimport styles from './funnel-style.scss';\n\nexport const BAR_COLOURS = [\n  '#13699c',\n  '#167ab6',\n  '#198acd',\n  '#1c99e3',\n  '#32a3e6',\n  '#49ade9',\n  '#60b8ec',\n  '#77c2ee',\n  '#8ecdf1',\n  '#a4d7f4',\n];\n\nconst getMaxValue = items => max(items.map(i => parseFloat(i.value)));\n\nconst FunnelComponent = ({ items, percentage, numberFormat, layout }) => {\n  const isSmall = isSmallDimension(layout.pixels.width);\n  const maxBarWidth = isSmall ? 0.3 : 0.6;\n  const showPercentage = percentage !== 'hide';\n  const maxValue = getMaxValue(items);\n\n  const getPercentage = value => round((value / maxValue) * 100, 1);\n  const getBarWidth = value => round((value / maxValue) * maxBarWidth * 100, 1);\n  const getBarColor = index => {\n    const step = (BAR_COLOURS.length - 1) / (items.length - 1);\n    return BAR_COLOURS[Math.round(index * step)];\n  };\n\n  const containerClasses = classNames(styles.container, {\n    [styles.small]: isSmall,\n  });\n\n  return (\n    <div className={containerClasses}>\n      <div className={styles.tablePositioner}>\n        <table className={styles.table}>\n          <tbody>\n            {items.map(({ value, label }, index) => {\n              const barWidth = getBarWidth(value);\n\n              return (\n                <tr key={index}>\n                  <td className={styles.funnelCell}>\n                    <div className={styles.funnel}>\n                      <div\n                        className={styles.labelContainer}\n                        style={{\n                          width: `${100 - barWidth}%`,\n                        }}\n                      >\n                        <span className={styles.label}>{label}</span>\n                      </div>\n                      <div\n                        className={styles.bar}\n                        style={{\n                          width: `${barWidth}%`,\n                          background: getBarColor(index),\n                        }}\n                      />\n                    </div>\n                  </td>\n                  <td className={styles.values}>\n                    <div className={styles.value}>\n                      <FramedFormattedNumber\n                        value={parseFloat(value)}\n                        options={{ numberFormat }}\n                        secondaryFontSize=\"inherit\"\n                      />\n                    </div>\n                    {showPercentage && (\n                      <div className={styles.percent}>\n                        {getPercentage(value)}%\n                      </div>\n                    )}\n                  </td>\n                </tr>\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n\nFunnelComponent.propTypes = {\n  items: PropTypes.arrayOf(\n    PropTypes.shape({\n      value: PropTypes.oneOfType([PropTypes.string, PropTypes.number])\n        .isRequired,\n      label: PropTypes.string,\n    }),\n  ).isRequired,\n  layout: layoutType.isRequired,\n  numberFormat: PropTypes.object,\n  percentage: PropTypes.string,\n};\n\nexport default FunnelComponent;\n","import PropTypes from 'prop-types';\nimport { layoutType } from '../prop-types';\n\nconst ROW_HEIGHT = 52;\n\nconst FunnelDataLimiter = ({ children, layout, item }) => {\n  const {\n    pixels: { height },\n  } = layout;\n\n  const maxItems = Math.floor(height / ROW_HEIGHT);\n\n  return children(item.slice(0, maxItems));\n};\n\nFunnelDataLimiter.propTypes = {\n  children: PropTypes.func.isRequired,\n  layout: layoutType.isRequired,\n  item: PropTypes.array,\n};\n\nexport default FunnelDataLimiter;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---1HpUg\",\"extendedItem\":\"extendedItem---gwFMM\",\"imgWrapper\":\"imgWrapper---KAjQI\",\"notConnected\":\"notConnected---1DDoW\",\"connectBtn\":\"connectBtn---3u0Ih\",\"detail\":\"detail---bhf68\",\"serviceName\":\"serviceName---1bQcp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mastheadTopWrapper\":\"mastheadTopWrapper---3lkTB\",\"mastheadButton\":\"mastheadButton---30QeA\",\"help\":\"help---Vaw4k\",\"closeHelp\":\"closeHelp---1e7SK\",\"switchToMobileView\":\"switchToMobileView---Tg99i\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"plansModal\":\"plansModal---1ojJD\",\"plansModalInner\":\"plansModalInner---1kVeO\",\"title\":\"title---mdGa6\",\"header\":\"header---3qIii\",\"plansWrapper\":\"plansWrapper---26O1o\",\"readMoreBreak\":\"readMoreBreak---2NAZj\",\"intervalAndUsage\":\"intervalAndUsage---3pgqE\",\"paymentInterval\":\"paymentInterval---1DvDj\",\"annualHint\":\"annualHint---3sGlb\",\"customThemeingMessageWrapper\":\"customThemeingMessageWrapper---18T43\",\"usage\":\"usage---1ayWm\",\"footer\":\"footer---1Qn8q\",\"cancel\":\"cancel---1nmrf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spreadsheetsConnector\":\"spreadsheetsConnector---3suMf\",\"header\":\"header---2Vmul\",\"serviceIcon\":\"serviceIcon---3r4Dd\",\"body\":\"body---3ogEx\",\"lSidebar\":\"lSidebar---3rJRr\",\"lSwitchingService\":\"lSwitchingService---22Fle\",\"content\":\"content---3crj3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"accountMenu\":\"accountMenu---aUNEM\",\"userInitialsCircle\":\"userInitialsCircle---1zpn3\",\"userInitials\":\"userInitials---1gZu2\",\"item\":\"item---2t5Vw\",\"link\":\"link---1SorS\"};","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport ResizeObserver from 'resize-observer-polyfill';\n\nclass DimensionsComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = { width: undefined, height: undefined };\n\n    this.animationFrameID = null;\n\n    this.handleResize = this.handleResize.bind(this);\n    this.resizeObserver = new ResizeObserver(this.handleResize);\n  }\n\n  componentDidMount() {\n    this.resizeObserver.observe(this.element);\n  }\n\n  componentWillUnmount() {\n    this.resizeObserver.unobserve(this.element);\n    if (this.animationFrameID) {\n      window.cancelAnimationFrame(this.animationFrameID);\n    }\n  }\n\n  handleResize(entries) {\n    entries.forEach(entry => {\n      const { width, height } = entry.contentRect;\n      const notifyWidth = this.state.width !== width;\n      const notifyHeight = this.state.height !== height;\n      if (notifyWidth || notifyHeight) {\n        this.animationFrameID = window.requestAnimationFrame(() => {\n          this.setState({ width, height });\n        });\n      }\n    });\n  }\n\n  render() {\n    const { children } = this.props;\n    const { width, height } = this.state;\n\n    return (\n      <div\n        style={{ width: '100%', height: '100%' }}\n        ref={element => {\n          this.element = element;\n        }}\n      >\n        {children({ width, height })}\n      </div>\n    );\n  }\n}\n\nDimensionsComponent.propTypes = {\n  children: PropTypes.func.isRequired,\n};\n\nexport default DimensionsComponent;\n","import Dimensions from './dimensions-component';\n\nexport default Dimensions;\n","import React, { useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport { getBoundingClientRect } from '../../lib/dom-helper';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { DragPreviewImage } from 'react-dnd';\nimport { useDragHelper, useDropHelper } from '@Hooks';\n\nimport style from './sortable-style.scss';\n\nconst SortableComponent = props => {\n  const {\n    isDragging,\n    children,\n    className,\n    drag,\n    drop,\n    sortableRef,\n    preview,\n  } = props;\n  const wrapperClassName = classnames(className, { isDragging });\n  return (\n    <>\n      <DragPreviewImage connect={preview(getEmptyImage())} src={''} />\n      <div className={wrapperClassName} ref={drag(drop(sortableRef))}>\n        {children}\n      </div>\n    </>\n  );\n};\n\nSortableComponent.propTypes = {\n  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  index: PropTypes.number.isRequired,\n  isDragging: PropTypes.bool.isRequired,\n  onMove: PropTypes.func.isRequired,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  drag: PropTypes.func,\n  drop: PropTypes.func,\n  preview: PropTypes.func,\n  sortableRef: PropTypes.oneOfType([\n    PropTypes.func,\n    PropTypes.shape({ current: PropTypes.instanceOf(HTMLDivElement) }),\n  ]),\n  onBeginDrag: PropTypes.func,\n  onDrop: PropTypes.func,\n};\n\nconst DragAndDroppableSortableComponent = props => {\n  const { index, id, onBeginDrag, onDrop, onMove } = props;\n  const sortableRef = useRef(null);\n\n  const [{ isBeingDragged }, drag, preview] = useDragHelper({\n    item: { id, index, type: 'card' },\n    begin: () => {\n      if (onBeginDrag) {\n        onBeginDrag(index);\n      }\n    },\n    collect: monitor => ({\n      isBeingDragged: monitor.isDragging(),\n    }),\n    end: () => {\n      if (onDrop) {\n        onDrop(index);\n      }\n    },\n  });\n\n  const [, drop] = useDropHelper({\n    accept: 'card',\n    hover: (item, monitor) => {\n      const dragIndex = item.index;\n      const hoverIndex = index;\n      if (dragIndex === hoverIndex) {\n        return;\n      }\n      // determine rectangle on screen\n      const hoverBoundingRect = getBoundingClientRect(sortableRef.current);\n      // Get vertical middle\n      const hoverMiddleY =\n        (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n\n      // Determine mouse position\n      const clientOffset = monitor.getClientOffset();\n\n      // Get pixels to the top\n      const hoverClientY = clientOffset.y - hoverBoundingRect.top;\n\n      // Only perform the move when the mouse has crossed half of the items height\n      // When dragging downwards, only move when the cursor is below 50%\n      // When dragging upwards, only move when the cursor is above 50%\n      // Dragging downwards\n      if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {\n        return;\n      }\n\n      // Dragging upwards\n      if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {\n        return;\n      }\n\n      // Time to actually perform the action\n      onMove(dragIndex, hoverIndex);\n      // Note: we're mutating the monitor item here!\n      // Generally it's better to avoid mutations,\n      // but it's good here for the sake of performance\n      // to avoid expensive index searches.\n      item.index = hoverIndex;\n    },\n  });\n  const isDragging = isBeingDragged;\n\n  return (\n    <SortableComponent\n      {...props}\n      sortableRef={sortableRef}\n      isDragging={isDragging}\n      drop={drop}\n      drag={drag}\n      preview={preview}\n    />\n  );\n};\n\nDragAndDroppableSortableComponent.propTypes = {\n  id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  index: PropTypes.number.isRequired,\n  onBeginDrag: PropTypes.func,\n  onDrop: PropTypes.func,\n  onMove: PropTypes.func,\n};\n\nconst SortableHandle = () => <i className={style.handle} />;\n\nexport {\n  DragAndDroppableSortableComponent as default,\n  SortableComponent,\n  SortableHandle,\n};\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { findDOMNode } from 'react-dom';\nimport { useDragLayerHelper } from '@Hooks';\n\nimport style from './sortable-style.scss';\n\nclass SortablePreviewComponent extends PureComponent {\n  componentDidUpdate() {\n    const domNode = findDOMNode(this);\n\n    if (!domNode) return;\n\n    domNode.style.width = `${domNode.parentNode.clientWidth}px`;\n  }\n\n  render() {\n    const { currentOffset, activeItem, id, children } = this.props;\n\n    if (!currentOffset) {\n      return null;\n    }\n\n    if (activeItem) {\n      if (activeItem.id !== id) {\n        return null;\n      }\n    }\n\n    const { x, y } = currentOffset;\n    const transform = `translate(${x}px, ${y}px)`;\n\n    return (\n      <div className={style.preview} style={{ transform }} aria-hidden>\n        {children}\n      </div>\n    );\n  }\n}\n\nconst idType = PropTypes.oneOfType([PropTypes.string, PropTypes.number]);\n\nSortablePreviewComponent.propTypes = {\n  activeItem: PropTypes.shape({\n    id: idType,\n  }),\n  children: PropTypes.node,\n  currentOffset: PropTypes.shape({\n    x: PropTypes.number,\n    y: PropTypes.number,\n  }),\n  id: idType,\n};\n\nconst SortablePreviewLayer = props => {\n  const { activeItem, currentOffset, isDragging } = useDragLayerHelper(\n    monitor => ({\n      activeItem: monitor.getItem(),\n      currentOffset: monitor.getSourceClientOffset(),\n      isDragging: monitor.isDragging(),\n    }),\n  );\n\n  return (\n    <SortablePreviewComponent\n      {...props}\n      activeItem={activeItem}\n      currentOffset={currentOffset}\n      isDragging={isDragging}\n    />\n  );\n};\n\nexport { SortablePreviewLayer as default, SortablePreviewComponent };\n","import SortableComponent, { SortableHandle } from './sortable-component';\nimport SortablePreview from './sortable-preview-component';\n\nexport { SortableComponent as default, SortablePreview, SortableHandle };\n","require('../es');\nrequire('../web');\n\nmodule.exports = require('../internals/path');\n","module.exports = (__webpack_require__(28))(738);","module.exports = (__webpack_require__(28))(1086);","module.exports = (__webpack_require__(28))(131);","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"preview\":\"preview---3Br2t\",\"handle\":\"handle---3D8MB\"};","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment-timezone';\n\nclass RelativeTime extends Component {\n  constructor(props) {\n    super(props);\n\n    this.date = moment(props.datetime);\n    this.state = {\n      fromNow: this.date.fromNow(),\n    };\n\n    this.updateTime = this.updateTime.bind(this);\n  }\n\n  componentDidMount() {\n    this.interval = setInterval(this.updateTime, 1000 * 44);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (this.props.datetime !== nextProps.datetime) {\n      this.date = moment(nextProps.datetime);\n      this.updateTime();\n    }\n  }\n\n  componentWillUnmount() {\n    clearInterval(this.interval);\n  }\n\n  render() {\n    const { fromNow } = this.state;\n\n    return <div>{fromNow}</div>;\n  }\n\n  updateTime() {\n    const fromNow = this.date.fromNow();\n\n    if (fromNow !== this.state.fromNow) {\n      this.setState({ fromNow });\n    }\n  }\n}\n\nRelativeTime.propTypes = {\n  datetime: PropTypes.string.isRequired,\n};\n\nexport default RelativeTime;\n","import RelativeTime from './relative-time-component';\n\nexport default RelativeTime;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport FramedFormattedNumber from '../../../components/framed-formatted-number';\nimport { isNaN, isNil } from 'lodash';\n\nimport style from './comparison-value-style.scss';\n\nconst getPercentageChange = change => {\n  const absChange = Math.abs(change);\n\n  if (absChange < 0.1) {\n    // Round up to 3 decimal places\n    const newChange = Math.round(absChange * 1000) / 1000;\n    return {\n      change: newChange,\n      options: { format: 'percent', numberFormat: { precision: 1 } },\n    };\n  }\n\n  const newChange = Math.round(absChange * 100) / 100;\n  return { change: newChange, options: { format: 'percent' } };\n};\n\nclass ComparisonValueComponent extends Component {\n  getClassNames(change, reversed, showBlankComparison) {\n    // returns base class plus the appropriate colour class\n    if (showBlankComparison && change !== 0) {\n      return style.blankComparison;\n    }\n    return classNames({\n      [style.increased]: change > 0,\n      [style.decreased]: change < 0,\n      [style.unchanged]: change === 0,\n      [style.reversed]: reversed,\n    });\n  }\n\n  render() {\n    const {\n      value,\n      comparisonValue,\n      absolute = false,\n      reversed = false,\n      fontScale,\n    } = this.props;\n\n    let { options } = this.props;\n\n    // if the value is not a number, do not render component\n    if (isNaN(value) || isNil(value)) {\n      return null;\n    }\n\n    const absoluteValue = Math.abs(comparisonValue);\n    const isZero = absoluteValue === 0;\n\n    // If we're trying to compare a percentage against 0, or we're comparing against a null\n    // comparison, we show a blank comparison instead\n    const showBlankComparison = (isZero && !absolute) || isNil(comparisonValue);\n\n    const difference = value - comparisonValue;\n\n    // when change is zero take the absolute value instead\n    let change = isZero ? value : difference / absoluteValue;\n    const className = this.getClassNames(change, reversed, showBlankComparison);\n\n    if (absolute) {\n      change = Math.abs(difference);\n    } else if (!isZero) {\n      ({ change, options } = getPercentageChange(change));\n    }\n\n    return (\n      <span className={className}>\n        <span\n          className={style.indicator}\n          style={!!fontScale ? { fontSize: fontScale.decrease(3).rem() } : {}}\n        />\n        {!showBlankComparison && (\n          <FramedFormattedNumber\n            value={change}\n            options={options}\n            layoutClassName={style.value}\n            mainFontSize={fontScale && fontScale.rem()}\n            secondaryFontSize={fontScale && fontScale.decrease(4).rem()}\n          />\n        )}\n      </span>\n    );\n  }\n}\n\nComparisonValueComponent.propTypes = {\n  absolute: PropTypes.bool,\n  comparisonValue: PropTypes.number,\n  fontScale: PropTypes.shape({\n    decrease: PropTypes.func,\n    increase: PropTypes.func,\n    px: PropTypes.func,\n    rem: PropTypes.func,\n  }),\n  options: PropTypes.shape({\n    format: PropTypes.string,\n    unit: PropTypes.string,\n  }),\n  reversed: PropTypes.bool,\n  value: PropTypes.number,\n};\n\nexport default ComparisonValueComponent;\n","import ComparisonValue from './comparison-value-component';\nexport default ComparisonValue;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { some, isUndefined } from 'lodash';\nimport classnames from 'classnames';\nimport { layoutType } from '../prop-types';\nimport { FormattedHTMLMessage } from '../../lib/i18n';\nimport styles from './table-data-limiter-style.scss';\n\nconst ROW_HEIGHT = 40;\nconst ROW_HEIGHT_TV_MODE = 54;\n\nconst HEADING_HEIGHT = 36;\n\nconst COLUMN_WIDTH = 230;\n\nconst pixelWidth = noOfColumns => {\n  return COLUMN_WIDTH * noOfColumns + 10 * (noOfColumns - 1);\n};\n\nconst getMaxColumns = width => {\n  if (width < pixelWidth(2)) {\n    return 2;\n  }\n  if (width < pixelWidth(3)) {\n    return 4;\n  }\n  if (width < pixelWidth(4)) {\n    return 6;\n  }\n  if (width < pixelWidth(5)) {\n    return 8;\n  }\n  return 10;\n};\n\nconst getMaxRows = (height, hasHeadings, tvMode) => {\n  if (!height) {\n    return 0;\n  }\n\n  const availableHeight = hasHeadings ? height - HEADING_HEIGHT : height;\n  const rowHeight = tvMode ? ROW_HEIGHT_TV_MODE : ROW_HEIGHT;\n\n  return Math.floor(availableHeight / rowHeight);\n};\n\n// Get the length of the longest row\nconst getColumnCount = data => Math.max(0, ...data.map(row => row.length));\n\nconst renderShowMoreHint = (showMoreHint, columns) => {\n  if (!showMoreHint) {\n    return null;\n  }\n  return (\n    <div className={styles.tooltip}>\n      <FormattedHTMLMessage\n        id=\"widget.table.showMoreHtml\"\n        values={{ columns }}\n      />\n    </div>\n  );\n};\n\nconst TableDataLimiter = props => {\n  const {\n    hideHints,\n    layout: {\n      pixels: { width, height },\n    },\n    children,\n    canEdit,\n  } = props;\n  const { tvMode } = props;\n  let { data = [], columns = [] } = props;\n\n  const maxColumns = getMaxColumns(width);\n  const columnCount = getColumnCount(data);\n  const hasHiddenColumns = columnCount > maxColumns;\n  const showMoreHint = hasHiddenColumns && !hideHints;\n\n  const hasHeadings =\n    columns && some(columns, column => !isUndefined(column.heading));\n  const maxRows = getMaxRows(height, hasHeadings, tvMode);\n\n  if (hasHiddenColumns) {\n    data = data.map(row => row.slice(0, maxColumns));\n    columns = columns.slice(0, maxColumns);\n  }\n\n  data = data.slice(0, maxRows);\n\n  const containerClasses = classnames(styles.container, {\n    [styles.sharingMode]: !canEdit,\n  });\n\n  return (\n    <div className={containerClasses}>\n      {children(data, columns)}\n      {hasHiddenColumns && (\n        <div>\n          <div className={styles.hiddenColumnsFade} />\n          {renderShowMoreHint(showMoreHint, columnCount - maxColumns)}\n        </div>\n      )}\n    </div>\n  );\n};\n\nTableDataLimiter.propTypes = {\n  canEdit: PropTypes.bool,\n  children: PropTypes.func,\n  columns: PropTypes.array,\n  data: PropTypes.arrayOf(PropTypes.array),\n  hideHints: PropTypes.bool,\n  layout: layoutType,\n  tvMode: PropTypes.bool,\n};\n\nexport default TableDataLimiter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { updateSortTableQuery } from '../dataset-config/actions/dataset-action-helpers';\n\nconst tableWrapper = DecoratedComponent => {\n  const TableWrapper = props => {\n    const { serviceName, isPreviewMode } = props;\n    if (!isPreviewMode && serviceName === 'datasets') {\n      const onSort = columnIndex => {\n        const {\n          onConfigChange,\n          configuration: { query },\n        } = props;\n        const newQuery = updateSortTableQuery(query, columnIndex);\n        onConfigChange({ query: newQuery }, true);\n      };\n      return <DecoratedComponent {...props} onSort={onSort} />;\n    }\n    return <DecoratedComponent {...props} />;\n  };\n  TableWrapper.canRender = (...args) => DecoratedComponent.canRender(...args);\n  TableWrapper.propTypes = {\n    configuration: PropTypes.object,\n    isPreviewMode: PropTypes.bool,\n    serviceName: PropTypes.string,\n    onConfigChange: PropTypes.func,\n  };\n  return TableWrapper;\n};\n\nexport default tableWrapper;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport BaseTable from './table-component';\nimport TableDataLimiter from './table-data-limiter-component';\nimport TableAlignmentInjector from './table-alignment-injector-component';\nimport tableWrapper from '../../widget/table-wrapper';\n\nconst TableVisualisation = props => {\n  if (props.isPreviewMode) {\n    return (\n      <TableAlignmentInjector data={props.data} columns={props.columns}>\n        {alignedColumns => (\n          <BaseTable {...props} data={props.data} columns={alignedColumns} />\n        )}\n      </TableAlignmentInjector>\n    );\n  }\n\n  return (\n    <TableDataLimiter {...props} hideHints={props.hideHints}>\n      {(data, columns) => (\n        <TableAlignmentInjector data={data} columns={columns}>\n          {alignedColumns => (\n            <BaseTable {...props} data={data} columns={alignedColumns} />\n          )}\n        </TableAlignmentInjector>\n      )}\n    </TableDataLimiter>\n  );\n};\n\nTableVisualisation.canRender = cfg => {\n  const [row] = cfg.data || [];\n  return !isEmpty(row);\n};\n\nTableVisualisation.propTypes = {\n  columns: PropTypes.array,\n  data: PropTypes.array,\n  hideHints: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n};\nconst WrappedTableVisualisation = tableWrapper(TableVisualisation);\nexport { WrappedTableVisualisation as default, BaseTable };\n","import PropTypes from 'prop-types';\n\nconst TvModeComponent = ({ children, tvMode, isMobile }) =>\n  children(isMobile ? false : tvMode);\n\nTvModeComponent.defaultPropTypes = {\n  tvMode: false,\n};\n\nTvModeComponent.propTypes = {\n  children: PropTypes.func.isRequired,\n  isMobile: PropTypes.bool,\n  tvMode: PropTypes.bool,\n};\n\nexport default TvModeComponent;\n","import { connect } from 'react-redux';\nimport TvMode from './tv-mode-component';\nimport { getCustomizeValues } from '../../customize/helpers';\n\nconst mapStateToProps = state => {\n  const { customize, dashboard } = state;\n  const { isMobile } = dashboard;\n\n  const { tvMode } = getCustomizeValues(dashboard.dashboard, customize);\n\n  return {\n    tvMode,\n    isMobile,\n  };\n};\n\nconst TvModeConnector = connect(mapStateToProps)(TvMode);\n\nexport default TvModeConnector;\n","import TvMode from './tv-mode-connector';\n\nexport default TvMode;\n","import _ from 'lodash';\nimport d3 from 'd3';\n\nconst ZERO_TICK_WIDTH = 2;\nlet instance = 0;\n\nfunction getNextClipId() {\n  return `zero-clip-${instance++}`;\n}\n\nfunction applyLabels(container, data, canvas, labelScale, formatter) {\n  const labels = container\n    .selectAll('.labels')\n    .data(data, ({ label = '' }, i) => `${label}${i}`);\n\n  // Enter\n  const newLabels = labels\n    .enter()\n    .append('div')\n    .attr('class', 'labels')\n    .style('position', 'relative');\n\n  newLabels.append('div').attr('class', 'label');\n  newLabels.append('div').attr('class', 'value');\n\n  // Update\n  labels.style({\n    position: 'absolute',\n    left: `${canvas.left}px`,\n    right: `${canvas.right}px`,\n    top: (_d, i) => `${Math.round(labelScale(i) + canvas.top)}px`,\n  });\n\n  labels.select('.label').text(d => d.label);\n  labels.select('.value').text(d => formatter(d.value));\n\n  // Exit\n  labels.exit().remove();\n}\n\nfunction clipZeroTick(chart, canvas, zeroX) {\n  const clipId = getNextClipId();\n\n  const clipPath = chart.selectAll('.zero-clip');\n\n  const zeroClip = clipPath.data([\n    [\n      -canvas.width + zeroX + canvas.left - ZERO_TICK_WIDTH,\n      ZERO_TICK_WIDTH + zeroX + canvas.left,\n    ],\n  ]);\n\n  // Enter\n  const clipEnter = zeroClip\n    .enter()\n    .insert('defs', ':first-child')\n    .append('clipPath')\n    .attr({ class: 'zero-clip', id: clipId });\n\n  clipEnter.append('rect').attr('class', 'zero-clip-left');\n\n  clipEnter.append('rect').attr('class', 'zero-clip-right');\n\n  // Update\n  clipPath.attr('id', clipId);\n\n  zeroClip.select('.zero-clip-left').attr({\n    x: d => d[0],\n    y: canvas.top,\n    width: canvas.width,\n    height: canvas.height,\n  });\n\n  zeroClip.select('.zero-clip-right').attr({\n    x: d => d[1],\n    y: canvas.top,\n    width: canvas.width,\n    height: canvas.height,\n  });\n\n  return clipId;\n}\n\nexport function barChartLayout(\n  container,\n  chart,\n  data,\n  extent,\n  canvas,\n  threshold,\n  formatter,\n  isPreviewMode,\n  tvMode,\n  reverseGoalDirection,\n) {\n  let valueScale, labelScale, bars, newBars, zeroClipId;\n\n  const MAX_ITEMS = Math.floor(canvas.height / (tvMode ? 50 : 30));\n  const BAR_HEIGHT = tvMode ? 8 : 4;\n  const BAR_Y_OFFSET_FACTOR = tvMode ? 24 : 12;\n  const SEPARATOR_Y_POS = tvMode ? 12 : 10;\n\n  data = data.slice(0, MAX_ITEMS);\n\n  // Scales\n  valueScale = d3.scale\n    .linear()\n    .domain(extent)\n    .range([0, canvas.width]);\n\n  valueScale.nice(10);\n\n  labelScale = d3.scale\n    .linear()\n    .domain([0, data.length])\n    .range([0, canvas.height]);\n\n  // Clip bars and separators at zero\n  zeroClipId = clipZeroTick(chart, canvas, valueScale(0));\n\n  // Rows\n  bars = chart\n    .select('.items')\n    .attr('clip-path', `url(#${zeroClipId})`)\n    .selectAll('.item')\n    .data(data);\n\n  // Enter\n  newBars = bars\n    .enter()\n    .append('g')\n    .attr('class', 'item');\n\n  newBars.append('line').attr({\n    class: 'separator',\n    y1: SEPARATOR_Y_POS,\n    y2: SEPARATOR_Y_POS,\n  });\n\n  newBars.append('rect').attr({\n    class: 'bar',\n    height: BAR_HEIGHT,\n    y: 8,\n  });\n\n  // Update\n  bars.attr({\n    transform: (_d, i) => {\n      const barY = Math.round(labelScale(i) + canvas.top + BAR_Y_OFFSET_FACTOR);\n      return `translate(${canvas.left}, ${barY})`;\n    },\n  });\n\n  bars.select('.separator').attr({\n    x2: canvas.width,\n    y1: SEPARATOR_Y_POS,\n    y2: SEPARATOR_Y_POS,\n  });\n\n  bars\n    .select('.bar')\n    .attr('class', ({ value }) => {\n      const goalReached = reverseGoalDirection\n        ? value <= threshold\n        : value >= threshold;\n\n      if (goalReached) {\n        return 'bar goal';\n      }\n      return 'bar';\n    })\n    .transition()\n    .duration(() => (isPreviewMode ? 0 : 500)) // eslint-disable-line no-confusing-arrow\n    .attr({\n      x: d => valueScale(Math.min(0, d.value)),\n      width: d => valueScale(Math.abs(d.value)) - valueScale(0),\n      height: BAR_HEIGHT,\n    });\n\n  // Apply the goal threshold area\n  if (!_.isNaN(threshold)) {\n    const thresholdX = Math.round(valueScale(threshold));\n    let thresholdAttributes = {\n      height: canvas.height + canvas.top + canvas.bottom,\n    };\n\n    if (reverseGoalDirection) {\n      thresholdAttributes = {\n        ...thresholdAttributes,\n        x: 0,\n        width: thresholdX + canvas.left,\n      };\n    } else {\n      thresholdAttributes = {\n        ...thresholdAttributes,\n        x: thresholdX + canvas.right,\n        width: canvas.width - thresholdX + canvas.right,\n      };\n    }\n\n    chart\n      .select('.threshold')\n      .transition()\n      .attr(thresholdAttributes);\n  }\n\n  // Exit\n  bars.exit().remove();\n\n  applyLabels(container, data, canvas, labelScale, formatter);\n}\n","/* eslint camelcase: 0 */\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport d3 from 'd3';\nimport { isNaN, extend, zip } from 'lodash';\nimport classNames from 'classnames';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport prettyDateFormat from '../../lib/pretty-date-format';\nimport { barChartLayout } from '../layouts/bar-chart-layout';\nimport { WIDGET_PADDING_TV_MODE } from '../visualisation-constants';\n\nimport style from './bar-chart-style.scss';\n\nfunction formatLabels(labels, format, timezone) {\n  switch (format) {\n    case 'datetime':\n      return prettyDateFormat(labels, timezone);\n    default:\n      return labels;\n  }\n}\n\nclass BarChartComponent extends Component {\n  componentDidMount() {\n    const el = findDOMNode(this);\n    const container = (this.container = d3.select(el));\n    const chart = (this.chart = container.append('svg'));\n\n    chart.append('rect').attr('class', 'threshold');\n    chart.append('g').attr('class', 'value-axis');\n    chart.append('g').attr('class', 'items');\n\n    this.afterRender(this.props);\n  }\n\n  render() {\n    const { style: layoutStyle, isPreviewMode, tvMode } = this.props;\n    const classes = classNames('barchart', 'horizontal', style.container, {\n      [style.previewLayout]: isPreviewMode,\n      [style.tvMode]: tvMode,\n    });\n\n    return <div className={classes} style={layoutStyle} />;\n  }\n\n  componentDidUpdate() {\n    this.afterRender(this.props);\n  }\n\n  afterRender(context) {\n    const ctx = this.sanitiseInput(context);\n    const reverseGoalDirection = this.props.reverseGoalDirection;\n    const orientation = ctx.orientation;\n\n    const {\n      series = [],\n      x_axis = {},\n      y_axis = {},\n      threshold,\n      isPreviewMode,\n      tvMode,\n      dashboardTz,\n      layout: { pixels },\n    } = ctx;\n\n    const { width, height } = pixels;\n    const padding = tvMode ? WIDGET_PADDING_TV_MODE : 16;\n\n    const canvas = {\n      top: padding,\n      right: padding,\n      bottom: padding,\n      left: padding,\n      width: width - padding * 2,\n      height: height - padding * 2,\n    };\n\n    const layout = barChartLayout;\n    const labels = formatLabels(x_axis.labels || [], x_axis.type, dashboardTz);\n    const referenceValue = Math.max(...series.map(Math.abs));\n    const { numberFormat } = ctx;\n\n    this.chart.attr('width', width).attr('height', height);\n\n    function valueFormatter(d) {\n      return humaniseNumber(d, {\n        format: y_axis.format,\n        unit: y_axis.unit,\n        numberFormat,\n        referenceValue,\n      });\n    }\n\n    // Hide the threshold region when no valid threshold is supplied\n    this.chart\n      .select('.threshold')\n      .attr('visibility', isNaN(threshold) ? 'hidden' : 'visible');\n    const extent = [d3.min([0, ...series]), d3.max([0, threshold, ...series])];\n\n    const data = zip(series, labels).map(([value, label]) => {\n      if (isNaN(value)) {\n        return { label, value: null };\n      }\n      return { label, value };\n    });\n\n    // If our orientation has changed then we need to clean up\n    if (this._orientation !== orientation) {\n      this.container.selectAll('.item, .labels, .label').remove();\n    }\n    this._orientation = orientation;\n\n    layout(\n      this.container,\n      this.chart,\n      data,\n      extent,\n      canvas,\n      threshold,\n      valueFormatter,\n      isPreviewMode,\n      tvMode,\n      reverseGoalDirection,\n    );\n  }\n\n  sanitiseInput(ctx) {\n    return extend({}, ctx, {\n      series: ctx.series && ctx.series[0] ? ctx.series[0].data : [],\n      threshold: parseFloat(ctx.threshold),\n    });\n  }\n}\n\nBarChartComponent.defaultProps = {\n  isPreviewMode: false,\n  orientation: 'horizontal',\n};\n\nBarChartComponent.propTypes = {\n  isPreviewMode: PropTypes.bool,\n  orientation: PropTypes.string,\n  reverseGoalDirection: PropTypes.bool,\n  style: PropTypes.object,\n  tvMode: PropTypes.bool,\n};\n\nexport default BarChartComponent;\n","import PropTypes from 'prop-types';\nimport { zip, countBy, merge, includes, isObject, chain } from 'lodash';\n\nconst RIGHT_ALIGNED = ['decimal', 'duration', 'currency', 'percent'];\n\nconst isRightAligned = format => includes(RIGHT_ALIGNED, format);\n\nconst addAlignmentToTableMeta = (columns, data = []) => {\n  const hasCellObjects = chain(data)\n    .flatten()\n    .some(isObject)\n    .value();\n\n  const metaWithDefaults = columns.map(column => ({\n    ...column,\n    alignment: isRightAligned(column.format) ? 'right' : 'left',\n  }));\n\n  if (!hasCellObjects) {\n    return metaWithDefaults;\n  }\n\n  /* Determine column alignments:\n   * Align mixed columns according to the majority of their contents\n   * If a column (ignoring header) contains MORE THAN 50% numbers\n   * (decimals, currencies, percentages), then align the whole column right.\n   * Otherwise, align the whole column left.\n   */\n  const dataColumns = zip(...data);\n  const columnsAlignment = dataColumns.reduce((formats, column) => {\n    const alignCount = countBy(column, cell => {\n      if (!cell || !isObject(cell)) {\n        return undefined;\n      }\n      return isRightAligned(cell.type) ? 'right' : 'left';\n    });\n\n    const { right = 0, left = 0 } = alignCount;\n    const columnAlignment = right >= left ? 'right' : 'left';\n    return [...formats, columnAlignment];\n  }, []);\n\n  return merge(\n    metaWithDefaults,\n    columnsAlignment.map(alignment => ({ alignment })),\n  );\n};\n\nconst TableAlignmentInjector = ({ columns, data, children }) => {\n  const injectedColumns = addAlignmentToTableMeta(columns, data);\n\n  return children(injectedColumns);\n};\n\nTableAlignmentInjector.defaultProps = {\n  columns: [],\n};\n\nTableAlignmentInjector.propTypes = {\n  children: PropTypes.func,\n  columns: PropTypes.array,\n  data: PropTypes.array,\n};\n\nexport default TableAlignmentInjector;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"withCaret\":\"withCaret---ftWAw\",\"dropdownList\":\"dropdownList---2t4Au\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout---v99Rm\",\"container\":\"container---3oGdv\",\"tvMode\":\"tvMode---3cd4V\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"input\":\"input---MB4I0\",\"hasValue\":\"hasValue---1jX8Y\",\"restoreButton\":\"restoreButton---2L00m\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---3lqJM\",\"input\":\"input---2g8wn\",\"hasValue\":\"hasValue---3aXAm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"comparisonContainer\":\"comparisonContainer---18qF-\",\"value\":\"value---2hgwk\",\"label\":\"label---3BSuu\"};","module.exports = (__webpack_require__(28))(1303);","class PromiseWorker {\n  constructor(url) {\n    this.messageIds = 1;\n    this.promiseCallbacks = [];\n    this.createWorker(url);\n  }\n\n  createWorker(url) {\n    this.worker = this.newWorker(url);\n\n    this.worker.onmessage = event => {\n      this.messageReceived(event);\n    };\n  }\n\n  newWorker(url) {\n    return new Worker(url);\n  }\n\n  messageReceived(event) {\n    const [messageId, type, message] = event.data;\n    const callbacks = this.promiseCallbacks[messageId];\n    if (callbacks) {\n      if (type === 'ERROR') {\n        const error = new Error(message);\n        callbacks.error(error);\n      } else {\n        callbacks.success({ type, message });\n      }\n\n      delete this.promiseCallbacks[messageId];\n    }\n  }\n\n  postMessage(message) {\n    const self = this;\n    const messageId = this.messageIds++;\n    const messageToSend = [messageId, ...message];\n\n    const promise = new Promise((resolve, reject) => {\n      self.promiseCallbacks[messageId] = {\n        error: error => reject(error),\n        success: data => resolve(data),\n      };\n    });\n\n    this.worker.postMessage(messageToSend);\n\n    return promise;\n  }\n}\nconst createWebWorker = url => new PromiseWorker(url);\n\nexport default PromiseWorker;\nexport { createWebWorker };\n","import 'isomorphic-fetch';\nimport PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { createWebWorker } from '../../lib/web-worker/promise-worker/promise-worker';\nimport { getWindow } from '../../lib/global';\n\nclass CSSWorkerComponent extends PureComponent {\n  componentDidMount() {\n    this.worker = createWebWorker(getWindow().CSS_WEB_WORKER);\n    this.initStyles();\n\n    this.updateCSS(this.props.variables);\n  }\n\n  componentDidUpdate() {\n    this.updateCSS(this.props.variables);\n  }\n\n  render() {\n    return <div>{this.props.children}</div>;\n  }\n\n  initStyles() {\n    this.styleNode = getWindow().document.createElement('style');\n    const head = getWindow().document.head;\n    head.appendChild(this.styleNode);\n\n    const linkTag = getWindow().document.getElementById('polecat-css');\n\n    // Add a query string param to avoid a cache hit for the existing css.\n    // This is because the existing CSS doesn't have allow origin headers set.\n    // And IE and Safari will then block loading it through a fetch.\n    this.cssRequest = fetch(`${linkTag.href}?avoidCache=true`).then(response =>\n      response.text(),\n    );\n  }\n\n  updateCSS(variables) {\n    this.cssRequest\n      .then(cssText =>\n        this.worker.postMessage(['UPDATE_CSS', variables, cssText]),\n      )\n      .then(response => {\n        const { message } = response;\n        this.receivedCSS(message);\n      })\n      .catch(() => {\n        // Swallow the error, this should only happen when multiple\n        // CSS updates occur before the CSS is loaded, in this\n        // case we just want to silently fail.\n      });\n  }\n\n  receivedCSS(css) {\n    this.styleNode.innerHTML = css;\n  }\n}\n\nCSSWorkerComponent.propTypes = {\n  children: PropTypes.node,\n  variables: PropTypes.object,\n};\n\nCSSWorkerComponent.defaultProps = {\n  variables: {},\n};\n\nexport default CSSWorkerComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component, PureComponent } from 'react';\nimport { forEach, attempt } from 'lodash';\nimport themes from '../themes';\nimport { getWindow } from '../../lib/global';\nimport { getUserThemeVariables } from '../themes/utilities/';\nimport {\n  USER_THEME,\n  VALID_THEMES_INCLUDING_DASHIES,\n  VALID_WIDGET_STYLES,\n  CUSTOM_THEME,\n  DARK_THEME,\n} from '../themes/theme-constants';\nimport CSSWorker from './css-worker-component';\nimport config from '../../universal/config';\n\nclass CSSVariables extends PureComponent {\n  componentDidMount() {\n    this.updateCSSVariables(this.props.variables);\n  }\n\n  componentDidUpdate() {\n    this.updateCSSVariables(this.props.variables);\n  }\n\n  render() {\n    return this.props.children;\n  }\n\n  updateCSSVariables(variables) {\n    const style = getWindow().document.documentElement.style;\n    forEach(variables, (value, prop) => style.setProperty(prop, value));\n  }\n}\n\nCSSVariables.propTypes = {\n  children: PropTypes.node,\n  variables: PropTypes.object,\n};\n\nCSSVariables.defaultProps = {\n  children: null,\n  variables: {},\n};\n\nclass CustomCSSComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.onLoad = this.onLoad.bind(this);\n  }\n\n  componentDidMount() {\n    this.addLoadListener();\n  }\n\n  componentDidUpdate() {\n    this.addLoadListener();\n  }\n\n  onLoad() {\n    const { onLoad } = this.props;\n    if (onLoad) {\n      onLoad();\n    }\n  }\n\n  render() {\n    const { theme, cssFile } = this.props;\n    if (CUSTOM_THEME !== theme || !cssFile) {\n      return null;\n    }\n\n    return (\n      <link\n        rel=\"stylesheet\"\n        ref=\"link\"\n        key={cssFile}\n        href={`${config.get().CustomCSSURL}${cssFile}`}\n      />\n    );\n  }\n\n  addLoadListener() {\n    // React doesn't support adding onLoad to the link-tag, so we have to use addEventListener\n    if (this.refs.link) {\n      this.refs.link.addEventListener('load', this.onLoad);\n    }\n  }\n}\n\nCustomCSSComponent.propTypes = {\n  cssFile: PropTypes.string,\n  theme: PropTypes.string,\n  onLoad: PropTypes.func,\n};\n\nconst getThemingComponent = () => {\n  // We need to use the `supportCondition` form of CSS.supports\n  // to correctly test for support on iOS\n  // https://developer.mozilla.org/en/docs/Web/API/CSS/supports\n  const supportsCSSVars =\n    attempt(() => getWindow().CSS.supports('(--foo: red)')) === true;\n\n  if (!supportsCSSVars && getWindow().Worker) {\n    return CSSWorker;\n  }\n\n  return CSSVariables;\n};\n\nclass CustomizationApplicatorComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.themingComponent = getThemingComponent();\n  }\n\n  render() {\n    const {\n      theme,\n      themeBackgroundColor,\n      themeWidgetStyle,\n      children,\n      cssFile,\n      onCustomCSSLoad,\n    } = this.props;\n\n    const variables =\n      theme === USER_THEME\n        ? getUserThemeVariables(themeBackgroundColor, themeWidgetStyle)\n        : themes[theme];\n\n    // TODO: Remove this conditional once the webworker has been through QA\n    const ThemingComponent = this.themingComponent;\n\n    return (\n      <ThemingComponent variables={variables}>\n        <CustomCSSComponent\n          theme={theme}\n          cssFile={cssFile}\n          onLoad={onCustomCSSLoad}\n        />\n        {children}\n      </ThemingComponent>\n    );\n  }\n}\n\nCustomizationApplicatorComponent.defaultProps = {\n  theme: DARK_THEME,\n};\n\nCustomizationApplicatorComponent.propTypes = {\n  theme: PropTypes.oneOf(VALID_THEMES_INCLUDING_DASHIES).isRequired,\n  children: PropTypes.node,\n  cssFile: PropTypes.string,\n  themeBackgroundColor: PropTypes.string,\n  themeWidgetStyle: PropTypes.oneOf(VALID_WIDGET_STYLES),\n  onCustomCSSLoad: PropTypes.func,\n};\n\nexport default CustomizationApplicatorComponent;\nexport { CSSVariables, CustomCSSComponent };\n","const contextReducers = {\n  bar: (config, data) => {\n    // This re-introduces a quirk the Mixpanel retention chart is dependent on (whereby the orientation can be sent in the data as well as the widget configuration)\n    // We can remove this fix once https://app.clubhouse.io/geckoboard/story/14063/mixpanel-retention-bar-chart-should-be-a-column-chart is shipped.\n    if (data.orientation === 'vertical' || config.orientation === 'vertical') {\n      return { type: 'column' };\n    }\n\n    return {};\n  },\n  funnel: (config, data) => ({\n    items: data.item,\n  }),\n  line: (config, data) => ({\n    // Apparently the min and max Y-axis values can come\n    // in the configuration or data :(\n    minYAxis: data.minYAxis !== undefined ? data.minYAxis : config.min_y_axis,\n    maxYAxis: data.maxYAxis !== undefined ? data.maxYAxis : config.max_y_axis,\n  }),\n  map: (config, data) => {\n    const { points: { point: points = [] } = {} } = data;\n    const { map = '', region } = config;\n\n    // It's a world map\n    if (map === 'World') {\n      return {\n        mapType: 'world',\n        points,\n      };\n    }\n\n    // It's a continent map\n    if (!region) {\n      return {\n        mapType: 'continent',\n        value: map.toLowerCase().replace(' ', '_'),\n        points,\n      };\n    }\n\n    if (region.includes('REGION')) {\n      // It's a region map\n      return {\n        mapType: 'region',\n        value: region,\n        points,\n      };\n    }\n\n    // It's a country map\n    return {\n      mapType: 'country',\n      value: region,\n      points,\n    };\n  },\n  number: (config, data) => ({\n    comparison: {\n      ...data.comparison,\n      label: config.comparisonLabel,\n    },\n  }),\n};\n\nexport const getSpecificContext = (type, config = {}, data = {}) => {\n  if (!contextReducers[type]) {\n    return {};\n  }\n\n  return contextReducers[type](config, data);\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { VISUALISATIONS } from '../../visualisation';\nimport { getSpecificContext } from './helpers';\nimport { isHalfHeight } from '../../visualisation/helpers';\nimport WidgetTitle from '../../widget-title/widget-title-component';\nimport { includes } from 'lodash';\n\nimport widgetStyle from '../widget-style.scss';\n\nconst WIDGET_HEADER_HEIGHT = 52;\n\nconst ControlledWidget = props => {\n  const { id, type, width, height, data, configuration } = props;\n  const { title = '' } = configuration;\n  const visualisationProps = {\n    type,\n    id,\n    layout: { pixels: { width, height: height - WIDGET_HEADER_HEIGHT } },\n    data,\n    ...configuration,\n    ...data,\n    ...getSpecificContext(type, configuration, data),\n  };\n  const Visualisation = VISUALISATIONS[visualisationProps.type];\n  const className = classNames(\n    widgetStyle.widget,\n    'widget tv-mode',\n    Visualisation.getVisualisationStatus &&\n      Visualisation.getVisualisationStatus(configuration, data),\n  );\n\n  // The `polymorphic-widget` class removes padding, but we still need it\n  // for some of the older visualisations, so this avoids adding that class\n  // for those.\n  const widgetBodyClasses = classNames(\n    'widget-body',\n    'visualisation-positioner',\n    {\n      ['polymorphic-widget']: !includes(\n        ['pie', 'monitoring', 'bullet'],\n        visualisationProps.type,\n      ),\n    },\n  );\n\n  return (\n    <div className={className} style={{ width, height, position: 'relative' }}>\n      <div className={classNames('widget-inner', widgetStyle.widgetInner)}>\n        {!isHalfHeight(height) && <WidgetTitle title={title} tvMode />}\n        <div className={widgetBodyClasses}>\n          <div className=\"visualisation-container\">\n            <Visualisation {...visualisationProps} tvMode />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nControlledWidget.defaultProps = {\n  configuration: {},\n  data: {},\n  dashboard: {},\n};\n\nControlledWidget.propTypes = {\n  height: PropTypes.number.isRequired,\n  type: PropTypes.oneOf(Object.keys(VISUALISATIONS)).isRequired,\n  width: PropTypes.number.isRequired,\n  configuration: PropTypes.object,\n  data: PropTypes.object,\n  id: PropTypes.number,\n};\n\nexport default ControlledWidget;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport DropItem from '../drop-item';\nimport classnames from 'classnames';\nimport { noop } from 'lodash';\n\nimport styles from './drop-item-with-description-style.scss';\n\nexport const tick = String.fromCharCode(0xf00c);\n\nclass DropItemWithDescriptionComponent extends Component {\n  render() {\n    const {\n      label,\n      description,\n      value,\n      selected,\n      hasBottomDivider,\n      isLink,\n      linkClass,\n      linkHref,\n      handleClick,\n    } = this.props;\n\n    if (isLink) {\n      const classes = classnames({\n        [styles.dropItem]: true,\n        [linkClass]: isLink,\n      });\n\n      return (\n        <DropItem isSmall dividerBottom={!!hasBottomDivider}>\n          <a href={linkHref} rel=\"nofollow\" className={classes}>\n            {selected && `${tick}   `}\n            {label}\n            <div className={styles.metaInfo}>{description}</div>\n          </a>\n        </DropItem>\n      );\n    }\n\n    return (\n      <DropItem\n        isSmall\n        dividerBottom={!!hasBottomDivider}\n        onClick={() => handleClick(value)}\n      >\n        <div className={styles.dropItem}>\n          {selected && `${String.fromCharCode(0xf00c)}   `}\n          {label}\n          <div className={styles.metaInfo}>{description}</div>\n        </div>\n      </DropItem>\n    );\n  }\n}\n\nDropItemWithDescriptionComponent.defaultProps = {\n  handleClick: noop,\n};\n\nDropItemWithDescriptionComponent.propTypes = {\n  description: PropTypes.node,\n  handleClick: PropTypes.func,\n  hasBottomDivider: PropTypes.bool,\n  isLink: PropTypes.bool,\n  label: PropTypes.node,\n  linkClass: PropTypes.string,\n  linkHref: PropTypes.string,\n  selected: PropTypes.bool,\n  value: PropTypes.string,\n};\n\nexport default DropItemWithDescriptionComponent;\n","import DropItemWithDescription from './drop-item-with-description-component';\nexport default DropItemWithDescription;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport List from '../../list';\n\nimport styles from './preset-list-styles.scss';\n\nconst PresetListComponent = ({ header, children }) => (\n  <div className={styles.wrapper}>\n    <span className={styles.header}>{header}</span>\n    <List>{children}</List>\n  </div>\n);\n\nPresetListComponent.propTypes = {\n  children: PropTypes.node,\n  header: PropTypes.string,\n};\n\nexport default PresetListComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"default\":\"default---1fD9i\",\"preview\":\"preview---3kCL2 default---1fD9i\",\"right\":\"right---2oPDr default---1fD9i\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"editableInput\":\"editableInput---3CpqU\",\"editableContainer\":\"editableContainer---giWRx\",\"selectContainer\":\"selectContainer---1y6u7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"bubble\":\"bubble---2R39J\",\"isLight\":\"isLight---23V2_\",\"isWide\":\"isWide---1EYN0\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"table\":\"table---3f_8L\",\"description\":\"description---fjtkQ\",\"numeric\":\"numeric---2cTca\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"widgetFooter\":\"widgetFooter---1h5ae\",\"serviceIcon\":\"serviceIcon---2dHZ8\",\"logo\":\"logo---3iPd6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"frame\":\"frame---1HqAK\",\"fullSize\":\"fullSize---TE4-V\",\"scaled\":\"scaled---28UNr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---qZdcv\",\"content\":\"content---3nqqO\",\"active\":\"active---2RpV3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"basicCrumb\":\"basicCrumb---1nZDP\",\"crumb\":\"crumb---3s407 basicCrumb---1nZDP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---3kReP\",\"enabled\":\"enabled---3Htyb item---3kReP\",\"isTabular\":\"isTabular---wTDfM\",\"disabled\":\"disabled---1ytwQ item---3kReP\",\"title\":\"title---33-rS\",\"info\":\"info---3eEXm\",\"folder\":\"folder---2YIHH info---3eEXm\",\"tooltip\":\"tooltip---21j11\",\"isDemo\":\"isDemo---3uZFI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"modal---18AcH\",\"header\":\"header---3O0W8\",\"instructions\":\"instructions---2RGJw\",\"errorText\":\"errorText---1VckI\",\"featureGate\":\"featureGate---2aZz5\",\"featureGateTitle\":\"featureGateTitle---1dw6Q\",\"featureGateContent\":\"featureGateContent---vjkE6\",\"featureGateAction\":\"featureGateAction---3uUFb\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---2SiG6\",\"dropMenu\":\"dropMenu---pTuFF\",\"dropItem\":\"dropItem---25cs9\",\"link\":\"link---3AF02\",\"divider\":\"divider---3XAR5\",\"logo\":\"logo---1H7Jc\",\"title\":\"title---i9ysF\",\"dropMenuHeading\":\"dropMenuHeading---3f3dN\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1z__p\",\"header\":\"header---3NF-z\",\"content\":\"content---1GPBu\",\"list\":\"list---3a0m2\",\"footer\":\"footer---3crfK\",\"title\":\"title---2IrKB\",\"groupName\":\"groupName---3OLPY\",\"infoMessage\":\"infoMessage---2Jv62\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"instrumentHeader\":\"instrumentHeader---26pON\",\"hasBackground\":\"hasBackground----1LwG\",\"bringToBack\":\"bringToBack---AtJTO\",\"title\":\"title---3DzD_\",\"options\":\"options---2vpho\",\"lastUpdated\":\"lastUpdated---v9MiB\",\"reloadButton\":\"reloadButton---2YYvY\",\"rotateButton\":\"rotateButton---dfdfQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"celebrationWidgetWrapper\":\"celebrationWidgetWrapper---3QwxK\",\"contentWrapper\":\"contentWrapper---1ZQoo\",\"widget\":\"widget---3YoRD\",\"frame\":\"frame---8tBuD\",\"swirl\":\"swirl---3XrAc\",\"confetti\":\"confetti---22TIp\",\"message\":\"message---1dJ7X\"};","import React from 'react';\nimport DashiesCompactConfig from './dashies-compact-config-component';\nimport { useCurrentDashboard } from '@Hooks';\n\nexport default props => {\n  const { data, loading, error } = useCurrentDashboard();\n  if (loading || error) {\n    return null;\n  }\n\n  const {\n    dashboard: {\n      timezone: { name },\n    },\n  } = data;\n\n  return <DashiesCompactConfig {...props} dashboardTimezone={name} />;\n};\n","import { connect } from 'react-redux';\nimport { getConfig } from '../lib/widget-service';\nimport DashiesCompactConfigQuery from './dashies-compact-config-query';\nimport * as widgetMenuActions from '../widget-menu/actions/widget-menu-actions';\n\nconst transformWidget = widget => ({\n  ...widget,\n  serviceName: widget.service.name,\n});\n\nconst transformInstrumentData = ({ payload: data, ...instrumentData }) => ({\n  ...instrumentData,\n  data,\n});\n\nconst mapDispatchToProps = (\n  dispatch,\n  { widgetKey, instrumentData = null },\n) => ({\n  setEditWidget: async () => {\n    const widget = await getConfig(widgetKey);\n\n    dispatch(\n      widgetMenuActions.openEditWidget({\n        widget: transformWidget(widget),\n        data: instrumentData && transformInstrumentData(instrumentData),\n      }),\n    );\n  },\n});\n\nconst DashiesCompactConfigConnector = connect(\n  null,\n  mapDispatchToProps,\n)(DashiesCompactConfigQuery);\n\nexport default DashiesCompactConfigConnector;\nexport { mapDispatchToProps, transformInstrumentData, transformWidget };\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WORDS = void 0;\nvar WORDS = [\"ad\", \"adipisicing\", \"aliqua\", \"aliquip\", \"amet\", \"anim\", \"aute\", \"cillum\", \"commodo\", \"consectetur\", \"consequat\", \"culpa\", \"cupidatat\", \"deserunt\", \"do\", \"dolor\", \"dolore\", \"duis\", \"ea\", \"eiusmod\", \"elit\", \"enim\", \"esse\", \"est\", \"et\", \"eu\", \"ex\", \"excepteur\", \"exercitation\", \"fugiat\", \"id\", \"in\", \"incididunt\", \"ipsum\", \"irure\", \"labore\", \"laboris\", \"laborum\", \"Lorem\", \"magna\", \"minim\", \"mollit\", \"nisi\", \"non\", \"nostrud\", \"nulla\", \"occaecat\", \"officia\", \"pariatur\", \"proident\", \"qui\", \"quis\", \"reprehenderit\", \"sint\", \"sit\", \"sunt\", \"tempor\", \"ullamco\", \"ut\", \"velit\", \"veniam\", \"voluptate\"];\nexports.WORDS = WORDS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvd29yZHMudHMiXSwibmFtZXMiOlsiV09SRFMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLElBQU1BLEtBQUssR0FBRyxDQUNuQixJQURtQixFQUVuQixhQUZtQixFQUduQixRQUhtQixFQUluQixTQUptQixFQUtuQixNQUxtQixFQU1uQixNQU5tQixFQU9uQixNQVBtQixFQVFuQixRQVJtQixFQVNuQixTQVRtQixFQVVuQixhQVZtQixFQVduQixXQVhtQixFQVluQixPQVptQixFQWFuQixXQWJtQixFQWNuQixVQWRtQixFQWVuQixJQWZtQixFQWdCbkIsT0FoQm1CLEVBaUJuQixRQWpCbUIsRUFrQm5CLE1BbEJtQixFQW1CbkIsSUFuQm1CLEVBb0JuQixTQXBCbUIsRUFxQm5CLE1BckJtQixFQXNCbkIsTUF0Qm1CLEVBdUJuQixNQXZCbUIsRUF3Qm5CLEtBeEJtQixFQXlCbkIsSUF6Qm1CLEVBMEJuQixJQTFCbUIsRUEyQm5CLElBM0JtQixFQTRCbkIsV0E1Qm1CLEVBNkJuQixjQTdCbUIsRUE4Qm5CLFFBOUJtQixFQStCbkIsSUEvQm1CLEVBZ0NuQixJQWhDbUIsRUFpQ25CLFlBakNtQixFQWtDbkIsT0FsQ21CLEVBbUNuQixPQW5DbUIsRUFvQ25CLFFBcENtQixFQXFDbkIsU0FyQ21CLEVBc0NuQixTQXRDbUIsRUF1Q25CLE9BdkNtQixFQXdDbkIsT0F4Q21CLEVBeUNuQixPQXpDbUIsRUEwQ25CLFFBMUNtQixFQTJDbkIsTUEzQ21CLEVBNENuQixLQTVDbUIsRUE2Q25CLFNBN0NtQixFQThDbkIsT0E5Q21CLEVBK0NuQixVQS9DbUIsRUFnRG5CLFNBaERtQixFQWlEbkIsVUFqRG1CLEVBa0RuQixVQWxEbUIsRUFtRG5CLEtBbkRtQixFQW9EbkIsTUFwRG1CLEVBcURuQixlQXJEbUIsRUFzRG5CLE1BdERtQixFQXVEbkIsS0F2RG1CLEVBd0RuQixNQXhEbUIsRUF5RG5CLFFBekRtQixFQTBEbkIsU0ExRG1CLEVBMkRuQixJQTNEbUIsRUE0RG5CLE9BNURtQixFQTZEbkIsUUE3RG1CLEVBOERuQixXQTlEbUIsQ0FBZCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBXT1JEUyA9IFtcclxuICBcImFkXCIsXHJcbiAgXCJhZGlwaXNpY2luZ1wiLFxyXG4gIFwiYWxpcXVhXCIsXHJcbiAgXCJhbGlxdWlwXCIsXHJcbiAgXCJhbWV0XCIsXHJcbiAgXCJhbmltXCIsXHJcbiAgXCJhdXRlXCIsXHJcbiAgXCJjaWxsdW1cIixcclxuICBcImNvbW1vZG9cIixcclxuICBcImNvbnNlY3RldHVyXCIsXHJcbiAgXCJjb25zZXF1YXRcIixcclxuICBcImN1bHBhXCIsXHJcbiAgXCJjdXBpZGF0YXRcIixcclxuICBcImRlc2VydW50XCIsXHJcbiAgXCJkb1wiLFxyXG4gIFwiZG9sb3JcIixcclxuICBcImRvbG9yZVwiLFxyXG4gIFwiZHVpc1wiLFxyXG4gIFwiZWFcIixcclxuICBcImVpdXNtb2RcIixcclxuICBcImVsaXRcIixcclxuICBcImVuaW1cIixcclxuICBcImVzc2VcIixcclxuICBcImVzdFwiLFxyXG4gIFwiZXRcIixcclxuICBcImV1XCIsXHJcbiAgXCJleFwiLFxyXG4gIFwiZXhjZXB0ZXVyXCIsXHJcbiAgXCJleGVyY2l0YXRpb25cIixcclxuICBcImZ1Z2lhdFwiLFxyXG4gIFwiaWRcIixcclxuICBcImluXCIsXHJcbiAgXCJpbmNpZGlkdW50XCIsXHJcbiAgXCJpcHN1bVwiLFxyXG4gIFwiaXJ1cmVcIixcclxuICBcImxhYm9yZVwiLFxyXG4gIFwibGFib3Jpc1wiLFxyXG4gIFwibGFib3J1bVwiLFxyXG4gIFwiTG9yZW1cIixcclxuICBcIm1hZ25hXCIsXHJcbiAgXCJtaW5pbVwiLFxyXG4gIFwibW9sbGl0XCIsXHJcbiAgXCJuaXNpXCIsXHJcbiAgXCJub25cIixcclxuICBcIm5vc3RydWRcIixcclxuICBcIm51bGxhXCIsXHJcbiAgXCJvY2NhZWNhdFwiLFxyXG4gIFwib2ZmaWNpYVwiLFxyXG4gIFwicGFyaWF0dXJcIixcclxuICBcInByb2lkZW50XCIsXHJcbiAgXCJxdWlcIixcclxuICBcInF1aXNcIixcclxuICBcInJlcHJlaGVuZGVyaXRcIixcclxuICBcInNpbnRcIixcclxuICBcInNpdFwiLFxyXG4gIFwic3VudFwiLFxyXG4gIFwidGVtcG9yXCIsXHJcbiAgXCJ1bGxhbWNvXCIsXHJcbiAgXCJ1dFwiLFxyXG4gIFwidmVsaXRcIixcclxuICBcInZlbmlhbVwiLFxyXG4gIFwidm9sdXB0YXRlXCIsXHJcbl07XHJcbiJdfQ==","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { Column } from '../../../components/layout';\nimport AdvancedSettings from '../../../components/form/advanced-settings';\nimport GroupedDropdown from '../../../components/grouped-dropdown';\nimport { ItemWithRightHint } from '../../../components/menu/drop-item';\nimport { partial } from 'lodash';\nimport style from './advanced-settings-table-styles.scss';\n\nclass AdvancedSettingsTableComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {};\n\n    this.handleColumnClick = this.handleColumnClick.bind(this);\n  }\n\n  handleColumnClick(option) {\n    const { index: columnIndex } = option;\n    this.setState({ columnIndex, selectedColumn: option });\n  }\n\n  render() {\n    const {\n      columns,\n      numberFormat,\n      labelMargin,\n      isSmall,\n      onNumberFormatUpdate,\n    } = this.props;\n\n    if (!columns.length) {\n      return null;\n    }\n\n    const [defaultColumn] = columns;\n    const {\n      columnIndex = defaultColumn.index,\n      selectedColumn = defaultColumn,\n    } = this.state;\n\n    return (\n      <div>\n        <Column marginBottom={1}>\n          <GroupedDropdown\n            options={[columns]}\n            value={selectedColumn}\n            onChange={this.handleColumnClick}\n            getLabel={({ label, hint }) => (\n              <ItemWithRightHint label={label} hint={hint} />\n            )}\n            isSmall={isSmall}\n            canRenderUpwards={!isSmall}\n            listClassName={isSmall && style.listSmall}\n          />\n        </Column>\n        <AdvancedSettings\n          numberFormat={numberFormat[columnIndex] || {}}\n          onNumberFormatUpdate={partial(onNumberFormatUpdate, columnIndex)}\n          labelMargin={labelMargin}\n        />\n      </div>\n    );\n  }\n}\n\nAdvancedSettingsTableComponent.defaultProps = {\n  columns: [],\n  numberFormat: [],\n};\n\nAdvancedSettingsTableComponent.propTypes = {\n  columns: PropTypes.arrayOf(\n    PropTypes.shape({\n      hint: PropTypes.string,\n      index: PropTypes.number,\n      label: PropTypes.string,\n    }),\n  ).isRequired,\n  isSmall: PropTypes.bool,\n  labelMargin: PropTypes.number,\n  numberFormat: PropTypes.arrayOf(PropTypes.object),\n  onNumberFormatUpdate: PropTypes.func,\n};\n\nexport default AdvancedSettingsTableComponent;\n","import AdvancedSettingsTable from './advanced-settings-table-component';\nexport default AdvancedSettingsTable;\n","import * as datasetActions from './dataset-actions';\nimport * as pathHelpers from '../../lib/path';\nimport { create, update } from '../../lib/widget-service';\nimport { redirect } from '../../lib/global';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { widgetCreated, widgetConfigEdited } from '@Tracking/events';\nimport widgetStorage from '../../lib/widget-storage';\nimport { TEMPLATES } from '../../universal/serializers/services';\nimport { removeKeysWithUnderscore } from '../../universal/serializers/helpers';\nimport * as grapqhlDashboardHelpers from '../../dashboard/graphql-dashboard-helpers';\n\nconst prepareWidgetData = (dashboardId, getState) => {\n  const { config, dataSetId, query } = getState().datasets;\n  const cleanConfig = removeKeysWithUnderscore(config);\n\n  return {\n    dashboard_id: dashboardId,\n    config: {\n      ...cleanConfig,\n      dataSetId,\n      query,\n      template: TEMPLATES[config.type],\n    },\n    service_name: 'datasets',\n  };\n};\n\nexport const createWidget = dashboardId => async (dispatch, getState) => {\n  try {\n    const {\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n      datasets,\n      datasets: {\n        config: { type },\n        dataSetId,\n      },\n    } = getState();\n\n    track('Custom new - Click Add to Dashboard', {\n      properties: {\n        visualisation: type,\n        dataset_id: dataSetId,\n      },\n    });\n\n    dispatch(datasetActions.datasetSet({ isSaving: true }));\n\n    const widgetData = prepareWidgetData(dashboardId, getState);\n    const widget = await create(widgetData);\n\n    track('Widget added', {\n      properties: {\n        widget_id: widget.id,\n        service_name: 'datasets',\n        visualisation: type,\n      },\n    });\n\n    trackSnowplow('widget_add', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.services[0].id}`,\n      service_name: 'Datasets',\n      visualisation_type: type,\n    });\n\n    trackEvent(\n      widgetCreated({\n        'Integration name': widget.services[0].name,\n        'Integration slug': 'datasets',\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.configuration.type,\n        'Widget type ID': `${widget.widget_type_id}`,\n      }),\n    );\n\n    // Track table widget usage\n    if (type === 'table') {\n      const {\n        config: { tableType, hasHeader },\n        query: { columns } = {},\n      } = datasets;\n\n      track('Datasets - Added table viz', {\n        properties: {\n          column_count: columns.length,\n          table_type: tableType,\n          has_header: hasHeader,\n        },\n      });\n    }\n\n    redirect(pathHelpers.getDashboardPath(dashboardId, widget.id), 300);\n  } catch (error) {\n    dispatch(datasetActions.datasetSetError(error, { isSaving: false }));\n  }\n};\n\nexport const updateWidget = (widgetId, dashboardId, type) => async (\n  dispatch,\n  getState,\n) => {\n  try {\n    const {\n      user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    } = getState();\n    dispatch(datasetActions.datasetSet({ isSaving: true }));\n\n    const widgetData = prepareWidgetData(dashboardId, getState);\n    const widget = await update(widgetId, widgetData);\n\n    await trackEvent(\n      widgetConfigEdited({\n        'Integration name': widget.service.title,\n        'Integration slug': widget.service.name,\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.config.type,\n      }),\n    );\n\n    trackSnowplow('widget_update', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      widget_id: `${widget.id}`,\n      dashboard_id: `${dashboardId}`,\n      service_id: `${widget.service.id}`,\n      service_name: 'Datasets',\n      visualisation_type: type,\n    });\n\n    const graphqlDashboard =\n      grapqhlDashboardHelpers.getDashboardFromStorage(dashboardId) || {};\n    const isContainerLayout = grapqhlDashboardHelpers.isContainerLayout(\n      graphqlDashboard,\n    );\n\n    if (isContainerLayout) {\n      const instrumentId = await grapqhlDashboardHelpers.getInstrumentIdFromWidgetKey(\n        graphqlDashboard.id,\n        widget.key,\n      );\n      widgetStorage.removeItem(`instrumentData:${instrumentId}`);\n    } else {\n      widgetStorage.removeItem(`widgetData:${widget.key}`);\n    }\n\n    redirect(pathHelpers.getDashboardPath(dashboardId, widget.id));\n  } catch (error) {\n    dispatch(datasetActions.datasetSetError(error, { isSaving: false }));\n  }\n};\n","import * as salesforceConfigActions from '../salesforce-config/actions/salesforce-config-actions';\nimport * as spreadsheetConfigActions from '../spreadsheet-config/actions/spreadsheet-config-actions';\nimport * as spreadsheetActions from '../spreadsheet-config/actions/spreadsheet-actions';\nimport * as datasetActions from '../dataset-config/actions/dataset-actions';\nimport * as datasetSaveActions from '../dataset-config/actions/dataset-save-actions';\n\nconst ACTIONS = {\n  datasets: datasetActions,\n  datasetsSave: datasetSaveActions,\n  spreadsheets: spreadsheetActions,\n  spreadsheetsSave: spreadsheetConfigActions,\n  salesforce: salesforceConfigActions,\n  salesforceSave: salesforceConfigActions,\n};\n\nexport default serviceName => ACTIONS[serviceName];\n","import { hasDisabledSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'line',\n    hasHeader: true,\n    goal: undefined,\n  };\n};\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst configMappingRules = {\n  column: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n  ],\n  number: [\n    'dataRange',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  text: ['dataRange'],\n  leaderboard: ['dataRange', 'numberFormat', 'hasHeader'],\n  geckometer: [\n    'dataRange',\n    ['min', min => (min ? min.value : undefined), 'minYAxis'], // eslint-disable-line no-confusing-arrow\n    ['max', max => (max ? max.value : undefined), 'maxYAxis'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n  ],\n  bar: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  table: ['dataRange', 'hasHeader'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import { hasDisabledSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'column',\n    hasHeader: true,\n  };\n};\n\nconst isValid = cfg => {\n  const requiredSelections = [cfg.xAxis].concat(cfg.series);\n  return !hasDisabledSelection(requiredSelections);\n};\n\nconst headerPaths = () => {\n  return ['xAxis', 'series'];\n};\n\nconst headerColours = cfg => {\n  const { series = [] } = cfg;\n  if (!series.length) {\n    return { series };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = series.map(() => brewery.getNextColour());\n  return { series: colours };\n};\n\nconst MAX_SERIES = 3;\n\nconst configMappingRules = {\n  line: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'legends',\n    'hasHeader',\n  ],\n  text: ['dataRange'],\n  number: [\n    'dataRange',\n    'goal',\n    'numberFormat',\n    [\n      'comparison.thresholdType',\n      type => 'lower' === type,\n      'reverseGoalDirection',\n    ],\n  ],\n  leaderboard: [\n    'dataRange',\n    ['labels', null, 'xAxis'],\n    'numberFormat',\n    'hasHeader',\n  ],\n  geckometer: ['dataRange', 'numberFormat'],\n  bar: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  table: ['dataRange', 'hasHeader'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n  MAX_SERIES,\n};\n","import columnChartVisualisationHelpers from '../column-chart-form/helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'bar',\n    hasHeader: true,\n  };\n};\n\nconst isValid = columnChartVisualisationHelpers.isValid;\nconst headerPaths = columnChartVisualisationHelpers.headerPaths;\nconst headerColours = columnChartVisualisationHelpers.headerColours;\n\nconst configMappingRules = {\n  ...columnChartVisualisationHelpers.configMappingRules,\n  column: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n  line: [\n    'dataRange',\n    'goal',\n    'reverseGoalDirection',\n    'numberFormat',\n    'hasHeader',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  headerPaths,\n  headerColours,\n  configMappingRules,\n};\n","import { isUndefined, omitBy } from 'lodash';\nimport { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'number',\n    comparison: {\n      type: 'sparkline',\n    },\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ comparison: { type } = {} }) => {\n  switch (type) {\n    case 'sparkline':\n      return [-1];\n    case 'percentage':\n    case 'number':\n      return [0, -1];\n    default:\n      return [];\n  }\n};\n\n// We map the goal direction from line, column and geckometer\n// to a sensible goal type\nconst GOAL_TO_COMPARISON = [\n  'goal',\n  (goal, lastComparison = {}) => {\n    if (!goal) return undefined;\n\n    return omitBy(\n      {\n        type: 'goal',\n        startingValue: lastComparison.startingValue,\n      },\n      isUndefined,\n    );\n  },\n  'comparison',\n];\n\nconst configMappingRules = {\n  column: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON],\n  line: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON],\n  leaderboard: ['dataRange', 'numberFormat'],\n  text: ['dataRange'],\n  geckometer: ['dataRange', 'numberFormat', 'indicators'],\n  bar: ['dataRange', 'goal', 'numberFormat', GOAL_TO_COMPARISON],\n  table: ['dataRange'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'leaderboard',\n    hasHeader: true,\n    reverseSort: false,\n  };\n};\n\nconst isValid = ({ labels }) => {\n  return isValidSelection(labels);\n};\n\nconst headerPaths = () => {\n  return ['labels', 'values'];\n};\n\nconst configMappingRules = {\n  column: ['dataRange', 'numberFormat', 'hasHeader'],\n  line: ['dataRange', 'numberFormat', 'hasHeader'],\n  text: ['dataRange'],\n  number: ['dataRange', 'numberFormat'],\n  geckometer: ['dataRange', 'numberFormat'],\n  bar: ['dataRange', 'numberFormat', 'hasHeader'],\n  table: ['dataRange', 'hasHeader'],\n};\n\nexport default { getDefaultConfig, isValid, headerPaths, configMappingRules };\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'geckometer',\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\nconst getSelectionTargets = (config, activeFieldPath) => {\n  switch (activeFieldPath) {\n    case 'value':\n      return [-1];\n    default:\n      return [];\n  }\n};\n\nconst configMappingRules = {\n  column: ['dataRange', 'numberFormat'],\n  line: [\n    'dataRange',\n    ['minYAxis', min => (min ? { value: min } : undefined), 'min'], // eslint-disable-line no-confusing-arrow\n    ['maxYAxis', max => (max ? { value: max } : undefined), 'max'], // eslint-disable-line no-confusing-arrow\n    'numberFormat',\n  ],\n  text: ['dataRange'],\n  number: ['dataRange', 'numberFormat', 'indicators'],\n  leaderboard: ['dataRange', 'numberFormat'],\n  bar: ['dataRange', 'numberFormat'],\n  table: ['dataRange'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { isValidSelection } from '../../../helpers';\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'text',\n    hasHeader: false,\n  };\n};\n\nconst isValid = cfg => {\n  return isValidSelection(cfg.value);\n};\n\n// targets cells with values\nconst getSelectionTargets = ({ isLoop }) => {\n  if (isLoop) {\n    return [-5, -4, -3, -2, -1];\n  }\n  return [-1];\n};\n\nconst configMappingRules = {\n  number: ['dataRange'],\n  geckometer: ['dataRange'],\n  leaderboard: ['dataRange'],\n  line: ['dataRange'],\n  column: ['dataRange'],\n  bar: ['dataRange'],\n  table: ['dataRange'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  getSelectionTargets,\n  configMappingRules,\n};\n","import { defaultTo } from 'lodash';\nimport LineChartHelpers from './config-forms/line-chart-form/helpers';\nimport ColumnChartHelpers from './config-forms/column-chart-form/helpers';\nimport BarChartHelpers from './config-forms/bar-chart-form/helpers';\nimport NumberHelpers from './config-forms/number-form/helpers';\nimport LeaderboardHelpers from './config-forms/leaderboard-form/helpers';\nimport GeckometerHelpers from './config-forms/geckometer-form/helpers';\nimport TextHelpers from './config-forms/text-form/helpers';\nimport TableHelpers from './config-forms/table-form/helpers';\n\nconst DATA_METHODS = {\n  line: LineChartHelpers,\n  column: ColumnChartHelpers,\n  bar: BarChartHelpers,\n  number: NumberHelpers,\n  leaderboard: LeaderboardHelpers,\n  geckometer: GeckometerHelpers,\n  text: TextHelpers,\n  table: TableHelpers,\n};\n\nconst getVisualisationHelpers = visualisation =>\n  defaultTo(DATA_METHODS[visualisation], LineChartHelpers);\n\nexport default getVisualisationHelpers;\n","module.exports = (__webpack_require__(28))(1093);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage, { formatMessage } from '../../lib/i18n';\nimport WidgetMenuModal from '../widget-menu-modal';\nimport StatusIndicatorsForm from '../../universal-config/components/status-indicators-form';\nimport { Row, Column } from '../../components/layout';\nimport Button from '@UI/button';\nimport Border from '@UI/playground/border';\nimport Icon from '@UI/icon';\nimport Card from '../../components/card';\nimport { get, isArray } from 'lodash';\n\nimport style from './widget-status-indicator-form-style.scss';\n\nconst WidgetStatusIndicatorFormComponent = ({\n  onClose,\n  onSave,\n  onChange,\n  onDelete,\n  indicators,\n  format,\n  durationMetricUnit,\n  isEditing,\n  hasGoal,\n  onEditWidget,\n}) => {\n  const hasCellSelections = get(indicators, 'thresholds', []).some(isArray);\n  return (\n    <WidgetMenuModal\n      title={\n        <FormattedMessage\n          id={\n            isEditing\n              ? 'widget.menu.editStatusIndicators'\n              : 'widget.menu.addStatusIndicators'\n          }\n        />\n      }\n      icon=\"exclamation-triangle\"\n    >\n      <div>\n        <StatusIndicatorsForm\n          indicators={indicators}\n          onChange={onChange}\n          format={format}\n          smallestInputUnit={durationMetricUnit}\n        />\n        {hasGoal && (\n          <Column\n            flexWrap={false}\n            align=\"stretch\"\n            marginTop={1}\n            marginBottom={1}\n            className={style.notice}\n          >\n            <Card type=\"lightest\">\n              <Row flexWrap={false} align=\"baseline\">\n                <span className={style.iconContainer}>\n                  <Icon name=\"info-circle\" />\n                </span>\n                <FormattedMessage id=\"widget.menu.statusIndicators.goalConflict\" />\n              </Row>\n            </Card>\n          </Column>\n        )}\n        {hasCellSelections && (\n          <Row flexWrap={false} align=\"baseline\" marginBottom={2} marginTop={1}>\n            <span className={style.iconContainer}>\n              <Icon name=\"info-circle\" />\n            </span>\n            <Row align=\"center\">\n              <Column marginRight={1} flexFill>\n                <FormattedMessage id=\"widget.menu.statusIndicators.cellSelectionsCannotBeEdited\" />\n              </Column>\n              <Border rounded>\n                <Button\n                  onClick={onEditWidget}\n                  size={Button.SIZES.EXTRA_SMALL}\n                  intent={Button.INTENT.LINK}\n                >\n                  {formatMessage(\n                    'widget.menu.statusIndicators.cellSelectionsCannotBeEdited.editButton',\n                  )}\n                </Button>\n              </Border>\n            </Row>\n          </Row>\n        )}\n        <Row flexFill justify=\"flex-end\" flexWrap={false} marginTop={1}>\n          {isEditing && (\n            <Column flexFill>\n              <div>\n                <Button onClick={onDelete} intent={Button.INTENT.SECONDARY}>\n                  {formatMessage('button.deleteAll')}\n                </Button>\n              </div>\n            </Column>\n          )}\n          <Column marginLeft={1}>\n            <Button onClick={onClose} intent={Button.INTENT.SECONDARY}>\n              {formatMessage('button.cancel')}\n            </Button>\n          </Column>\n          <Column marginLeft={1}>\n            <Button type={Button.TYPES.SUBMIT} onClick={onSave}>\n              {formatMessage('button.save')}\n            </Button>\n          </Column>\n        </Row>\n      </div>\n    </WidgetMenuModal>\n  );\n};\nWidgetStatusIndicatorFormComponent.defaultProps = {\n  hasGoal: false,\n};\nWidgetStatusIndicatorFormComponent.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  onClose: PropTypes.func.isRequired,\n  onDelete: PropTypes.func.isRequired,\n  onEditWidget: PropTypes.func.isRequired,\n  onSave: PropTypes.func.isRequired,\n  durationMetricUnit: PropTypes.string,\n  format: PropTypes.string,\n  hasGoal: PropTypes.bool,\n  indicators: PropTypes.object,\n  isEditing: PropTypes.bool,\n};\n\nexport default WidgetStatusIndicatorFormComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loadingPositioner\":\"loadingPositioner---3plrA\",\"mainError\":\"mainError---1nzqw\",\"retryBtn\":\"retryBtn---24jMk\"};","import React, { useState, useEffect, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { getViewportDimensions } from '../../lib/global';\nimport { getBoundingClientRect } from '../../lib/dom-helper';\n\nimport style from './widget-menu-positioner-style.scss';\n\nconst MENU_POSITIONS = {\n  RIGHT: 'RIGHT',\n  LEFT: 'LEFT',\n  MIDDLE: 'MIDDLE',\n};\nconst MARGIN = 10;\n\nconst getPixelPosition = (position, widgetWidth) => {\n  switch (position) {\n    case MENU_POSITIONS.LEFT:\n      return { right: widgetWidth + MARGIN };\n    case MENU_POSITIONS.MIDDLE:\n      return { right: MARGIN };\n    default:\n      // Default to the right\n      return { left: MARGIN };\n  }\n};\n\nconst getOffset = domElement => {\n  const bounds = getBoundingClientRect(domElement);\n  const viewport = getViewportDimensions();\n\n  return {\n    left: Math.min(bounds.left, 0),\n    right: Math.min(viewport.width - bounds.right, 0),\n  };\n};\n\n/**\n * # <WidgetMenuPositioner />\n *\n * Takes children and a widgetWidth.\n *\n * On the first render, the WidgetMenuPositioner will position its children\n * (the widget menu) to the right of the parent component. If the menu does\n * not fit to the right, it will then position it to the left. If it doesn't\n * fit there either it will position it in the middle.\n *\n * The menu will receive an opacity of 0 until it has found it's final\n * destination. That way we're avoiding any immediate flashes.\n */\nconst WidgetMenuPositioner = ({ widgetWidth, children }) => {\n  const menuRef = useRef(null);\n  const [position, setPosition] = useState(MENU_POSITIONS.RIGHT);\n  const [isFinalPosition, setIsFinalPosition] = useState(false);\n\n  useEffect(() => {\n    const offset = getOffset(menuRef.current);\n    const isOutOfBounds = offset.left !== 0 || offset.right !== 0;\n\n    if (!isOutOfBounds) {\n      setIsFinalPosition(true);\n      return;\n    }\n\n    if (position === MENU_POSITIONS.RIGHT) {\n      setPosition(MENU_POSITIONS.LEFT);\n    } else if (position === MENU_POSITIONS.LEFT) {\n      setPosition(MENU_POSITIONS.MIDDLE);\n    } else if (position === MENU_POSITIONS.MIDDLE) {\n      setIsFinalPosition(true);\n    }\n  });\n\n  return (\n    <div\n      ref={menuRef}\n      className={style.layout}\n      style={{\n        opacity: isFinalPosition ? 1 : 0,\n        ...getPixelPosition(position, widgetWidth),\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n\nWidgetMenuPositioner.propTypes = {\n  children: PropTypes.node,\n  widgetWidth: PropTypes.number,\n};\n\nexport default WidgetMenuPositioner;\n","import { get, has, isUndefined, omitBy, without } from 'lodash';\nimport getVisualisationHelpers from '../components/get-visualisation-helpers';\nimport { getStateToSave } from '../../actions/helpers';\nimport { FORM_TYPES } from '../components/table-form/table-form-constants';\nimport * as datasetActions from '../actions/dataset-actions';\nimport update from 'immutability-helper';\n\nconst initialState = {\n  config: { type: 'line' },\n  error: null,\n  isLoading: true,\n  isSaving: false,\n  showFilePicker: false,\n};\n\nconst updateState = (oldState, newState) => {\n  if (has(newState, 'config') || has(newState, 'queryResult')) {\n    const actualConfig = get(newState, 'config', oldState.config);\n    const actualQueryResult = get(\n      newState,\n      'queryResult',\n      oldState.queryResult,\n    );\n    const { type } = actualConfig;\n    return {\n      ...newState,\n      config: getVisualisationHelpers(type).ensureConfig(\n        actualConfig,\n        actualQueryResult,\n      ),\n    };\n  }\n  return newState;\n};\n\nconst datasetReducer = (state = initialState, action) => {\n  switch (action.type) {\n    case datasetActions.datasetSet.type: {\n      const newState = updateState(state, action.payload);\n      return {\n        ...state,\n        ...newState,\n      };\n    }\n\n    case datasetActions.datasetSetError.type: {\n      const newState = updateState(state, action.payload);\n      return {\n        ...state,\n        ...newState,\n        error: action.error,\n      };\n    }\n\n    case datasetActions.setConfig.type: {\n      const { config, queryResult } = state;\n      const { type } = config;\n      const newConfig = { ...config, ...action.payload };\n\n      return {\n        ...state,\n        config: getVisualisationHelpers(type).ensureConfig(\n          newConfig,\n          queryResult,\n        ),\n      };\n    }\n\n    case datasetActions.resetConfig.type: {\n      const { config, queryResult } = state;\n      const { type } = config;\n\n      return {\n        ...state,\n        config: getVisualisationHelpers(type).ensureConfig(\n          { type },\n          queryResult,\n        ),\n      };\n    }\n\n    case datasetActions.saveState.type: {\n      const newConfig = getStateToSave(state.config, action.payload);\n\n      return {\n        ...state,\n        config: {\n          ...state.config,\n          ...newConfig,\n        },\n      };\n    }\n\n    case datasetActions.resetQueryHistory.type: {\n      const newState = { ...state };\n\n      delete newState._previousRawQuery;\n      delete newState._previousSummaryQuery;\n\n      return {\n        ...newState,\n        _previousQueries: {},\n      };\n    }\n\n    case datasetActions.toggleFilePicker.type:\n      return {\n        ...state,\n        showFilePicker: action.payload,\n      };\n\n    case datasetActions.setTableType.type: {\n      const currentTableType = state.config.tableType;\n      const nextTableType = action.payload;\n      const previousQuery =\n        nextTableType === FORM_TYPES.SUMMARIZED\n          ? '_previousRawQuery'\n          : '_previousSummaryQuery';\n\n      return {\n        ...state,\n        query: undefined,\n        config: {\n          ...state.config,\n          tableType: nextTableType,\n          numberFormat: state[`_${nextTableType}NumberFormat`],\n        },\n        [previousQuery]: state.query,\n        [`_${currentTableType}NumberFormat`]: state.config.numberFormat,\n        [`_${nextTableType}NumberFormat`]: undefined,\n      };\n    }\n\n    case datasetActions.updateColumnNumberFormat.type: {\n      const { index, format } = action.payload;\n      const { config } = state;\n      let numberFormat = state.config.numberFormat;\n\n      numberFormat = numberFormat ? [...numberFormat] : [];\n      numberFormat[index] = {\n        ...numberFormat[index],\n        ...format,\n      };\n\n      return {\n        ...state,\n        config: {\n          ...config,\n          numberFormat,\n        },\n      };\n    }\n\n    case datasetActions.reorderColumn.type: {\n      const { columns } = state.query;\n      const { numberFormat, tableType } = state.config;\n      const { column_types: columnTypes, headings } = state.queryResult;\n      const { sourceIndex, targetIndex } = action.payload;\n      const column = columns[sourceIndex];\n      const currentFormat = numberFormat[sourceIndex] || null;\n\n      let qrSourceIndex = sourceIndex;\n      let qrTargetIndex = targetIndex;\n\n      // Offset for the `group_by` column\n      // in our `queryResult`\n      if (FORM_TYPES.SUMMARIZED === tableType) {\n        qrSourceIndex++;\n        qrTargetIndex++;\n      }\n\n      const heading = headings[qrSourceIndex];\n      const columnType = columnTypes[qrSourceIndex];\n\n      return update(state, {\n        query: {\n          columns: {\n            $splice: [\n              [sourceIndex, 1],\n              [targetIndex, 0, column],\n            ],\n          },\n        },\n        config: {\n          numberFormat: {\n            $splice: [\n              [sourceIndex, 1],\n              [targetIndex, 0, currentFormat],\n            ],\n          },\n        },\n        queryResult: {\n          column_types: {\n            $splice: [\n              [qrSourceIndex, 1],\n              [qrTargetIndex, 0, columnType],\n            ],\n          },\n          headings: {\n            $splice: [\n              [qrSourceIndex, 1],\n              [qrTargetIndex, 0, heading],\n            ],\n          },\n          data: {\n            $apply: rows => {\n              return rows.map(row => {\n                const item = row[qrSourceIndex];\n                row.splice(qrSourceIndex, 1);\n                row.splice(qrTargetIndex, 0, item);\n                return row;\n              });\n            },\n          },\n        },\n      });\n    }\n    case datasetActions.setProgressGoal.type: {\n      const { config, queryResult } = state;\n      const { type } = config;\n      const { progressGoal, startingValue } = action.payload;\n      const newConfig = {\n        ...config,\n        comparison: omitBy(\n          { type: 'goal', thresholdType: 'percentage', startingValue },\n          isUndefined,\n        ),\n        goal: isFinite(progressGoal) ? progressGoal.toString() : progressGoal,\n      };\n\n      return {\n        ...state,\n        config: getVisualisationHelpers(type).ensureConfig(\n          newConfig,\n          queryResult,\n        ),\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n\nexport default datasetReducer;\n\nexport const getFilteredSuggestions = state => {\n  // remove current values, append free form value and removed empty string\n  const { _filterModal: filterForm } = state;\n  if (!filterForm || !filterForm.suggestions) {\n    return null;\n  }\n\n  const { suggestions, values = [], value = '' } = filterForm;\n\n  return without([...suggestions, value], '', ...values);\n};\n","import { get, partition, filter, flowRight as compose } from 'lodash';\n\nconst MAIN_QUERY_FIELD_PATH = {\n  line: 'x_axis.field',\n  bar: 'x_axis.field',\n  column: 'x_axis.field',\n};\n\nconst supportTimespan = (query, type) => {\n  switch (type) {\n    case 'number':\n    case 'geckometer':\n      return !!get(query, 'aggregate', null); // e.g aggregate === 'latest'\n    default:\n      return true;\n  }\n};\nconst getMainField = (query, type) =>\n  get(query, MAIN_QUERY_FIELD_PATH[type], null);\nconst getType = (fields, key) => get(fields, `${key}.type`);\nconst isDatetime = type => type === 'date' || type === 'datetime';\nconst isTypeDatetime = compose([isDatetime, getType]);\n// Add default \"_updated_at\" datetime\nconst getFiltersFields = (fieldGroups, fields) => {\n  if (!get(fieldGroups, 'datetime.length')) {\n    const newFieldGroups = {\n      ...fieldGroups,\n      datetime: [\n        {\n          key: '_updated_at',\n          type: 'datetime',\n        },\n      ],\n    };\n    const newFields = {\n      ...fields,\n      _updated_at: { type: 'datetime' },\n    };\n\n    return { fieldGroups: newFieldGroups, fields: newFields };\n  }\n  return { fieldGroups, fields };\n};\n\nconst applyTimespan = state => {\n  const {\n    query,\n    formState,\n    type,\n    fieldGroups: initialFiedGroups,\n    fields: initialFields,\n  } = state;\n  const { fieldGroups, fields } = getFiltersFields(\n    initialFiedGroups,\n    initialFields,\n  );\n  const { filters = [] } = query;\n  const firstDatetimeField = get(fieldGroups, 'datetime[0].key');\n  const hasTimespanFilter = supportTimespan(query, type);\n  const mainFieldKey = getMainField(query, type);\n  const isMainFieldDatetime = isTypeDatetime(fields, mainFieldKey);\n\n  let filtersWithTimespan = filters;\n  const [potentialTimespanFilter = {}] = filters;\n  if (!potentialTimespanFilter.isTimespan) {\n    // inject default all time timespan\n    const defaultTsField = isMainFieldDatetime\n      ? mainFieldKey\n      : firstDatetimeField;\n    const defaultTimespan = {\n      field: defaultTsField,\n      isTimespan: true,\n      since_start_of: {\n        unit: 'all',\n      },\n    };\n    filtersWithTimespan = [defaultTimespan, ...filters];\n  }\n\n  // Alter timespan formstate to hide field selector\n  let newFormState = formState;\n  if (formState.isTimespan) {\n    const numberOfDatetimeField = get(fieldGroups, 'datetime.length', 0);\n    newFormState = {\n      ...formState,\n      hideFieldSelector: numberOfDatetimeField === 1 || isMainFieldDatetime,\n    };\n  }\n\n  return {\n    hasTimespanFilter,\n    filters: filtersWithTimespan,\n    formState: newFormState,\n  };\n};\n\nconst syncFiltersQuery = (query, fields, type) => {\n  const mainField = getMainField(query, type);\n  const filters = get(query, 'filters', []);\n\n  const [[tsFilter], otherFilters] = partition(filters, { isTimespan: true });\n\n  // Remove timespan filter if needed\n  if (!supportTimespan(query, type)) {\n    return {\n      ...query,\n      filters: otherFilters,\n    };\n  }\n\n  // No ops when main field is not datetime or no filters set\n  if (!isTypeDatetime(fields, mainField) || !filters.length) {\n    return query;\n  }\n\n  // remove filters other than timespan with field set with mainField\n  const cleanFilters = filter(otherFilters, ({ field }) => mainField !== field);\n\n  let newFilters = cleanFilters;\n  if (tsFilter) {\n    // sync timespan filter field with mainField\n    const newTsFilters = { ...tsFilter, field: mainField };\n    newFilters = [newTsFilters, ...cleanFilters];\n  }\n\n  return {\n    ...query,\n    filters: newFilters,\n  };\n};\n\nexport { applyTimespan, syncFiltersQuery };\n","import { createServiceAccount } from './management-service';\nimport { auth } from '../lib/oauth';\nimport { open as openPopup } from '../lib/popup-window';\n\nfunction createConnection(groupId, service, extraParams) {\n  if ('basic' === service.auth_type) {\n    return createServiceAccount(groupId, service.id, extraParams);\n  }\n  return auth(openPopup(), service, groupId, extraParams);\n}\n\nexport { createConnection };\n","import { some, merge } from 'lodash';\nimport { isValidSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\nimport { INPUT_DEFAULT_SELECTION } from '../../../spreadsheets-config-constants';\n\nconst MIN_COLUMNS = 2;\nconst MAX_COLUMNS = 10;\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'table',\n    hasHeader: true,\n    columns: [INPUT_DEFAULT_SELECTION, INPUT_DEFAULT_SELECTION],\n    numberFormat: [null, null],\n  };\n};\n\nconst isValid = cfg => {\n  return some(cfg.columns, isValidSelection);\n};\n\nconst headerPaths = () => {\n  return ['columns'];\n};\n\nconst headerColours = cfg => {\n  const { columns = [] } = cfg;\n  if (!columns.length) {\n    return { columns };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = columns.map(() => brewery.getNextColour());\n  return { columns: colours };\n};\n\nconst mapSeriesToColumns = (newValue, prevValue = []) => {\n  const value = newValue.slice(0, MAX_COLUMNS - 1);\n  return merge(prevValue, [INPUT_DEFAULT_SELECTION, ...value]);\n};\n\nconst mapNumberToColumns = (newValue, prevValue = []) =>\n  merge(prevValue, [newValue]);\n\nconst configMappingRules = {\n  line: [\n    ['series', mapSeriesToColumns, 'columns'],\n    ['xAxis', undefined, 'columns[0]'],\n    'hasHeader',\n    'dataRange',\n  ],\n  column: [\n    ['series', mapSeriesToColumns, 'columns'],\n    ['xAxis', undefined, 'columns[0]'],\n    'hasHeader',\n    'dataRange',\n  ],\n  bar: [\n    ['series', mapSeriesToColumns, 'columns'],\n    ['xAxis', undefined, 'columns[0]'],\n    'hasHeader',\n  ],\n  number: [['value', mapNumberToColumns, 'columns']],\n  geckometer: [['value', mapNumberToColumns, 'columns']],\n  text: [['value', mapNumberToColumns, 'columns']],\n  leaderboard: [\n    [\n      'values',\n      (newValue, prevValue = []) =>\n        newValue ? merge(prevValue, [undefined, newValue]) : undefined,\n      'columns',\n    ],\n    ['labels', undefined, 'columns[0]'],\n    'hasHeader',\n  ],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  configMappingRules,\n  headerPaths,\n  headerColours,\n  MIN_COLUMNS,\n  MAX_COLUMNS,\n};\n","import { some } from 'lodash';\nimport { isValidSelection } from '../../../helpers';\nimport ColourBrewer from '../../../../lib/colour-brewer';\nimport { INPUT_DEFAULT_SELECTION } from '../../../spreadsheets-config-constants';\n\nconst MIN_COLUMNS = 2;\nconst MAX_COLUMNS = 10;\n\nconst getDefaultConfig = () => {\n  return {\n    type: 'table',\n    hasHeader: true,\n    columns: [INPUT_DEFAULT_SELECTION, INPUT_DEFAULT_SELECTION],\n    numberFormat: [null, null],\n  };\n};\n\nconst isValid = cfg => {\n  return some(cfg.columns, isValidSelection);\n};\n\nconst headerPaths = () => {\n  return ['columns'];\n};\n\nconst headerColours = cfg => {\n  const { columns = [] } = cfg;\n  if (!columns.length) {\n    return { columns };\n  }\n\n  const brewery = new ColourBrewer();\n  const colours = columns.map(() => brewery.getNextColour());\n  return { columns: colours };\n};\n\nconst configMappingRules = {\n  line: ['dataRange', 'hasHeader'],\n  column: ['dataRange', 'hasHeader'],\n  bar: ['dataRange', 'hasHeader'],\n  number: ['dataRange'],\n  geckometer: ['dataRange'],\n  text: ['dataRange'],\n  leaderboard: ['dataRange', 'hasHeader'],\n};\n\nexport default {\n  getDefaultConfig,\n  isValid,\n  configMappingRules,\n  headerPaths,\n  headerColours,\n  MIN_COLUMNS,\n  MAX_COLUMNS,\n};\n","import createAction from '../../lib/redux/create-action';\n\nexport const clearNotification = createAction(\n  'Notification:CLEAR_NOTIFICATION',\n);\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getClientSize } from '../../lib/dom-helper';\n\nconst ELLIPSIS = '...';\nconst LAST_WHITESPACE = /(\\W+)(\\w+)?$/;\n\nclass ClampLinesComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      text: props.text,\n      maxHeight: props.lines * props.lineHeight,\n    };\n  }\n\n  componentDidMount() {\n    this.clamp();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (nextProps.lines !== this.props.lines) {\n      const lines = nextProps.lines || this.props.lines;\n      const lineHeight = nextProps.lineHeight || this.props.lineHeight;\n      this.setState({ maxHeight: lines * lineHeight });\n    }\n  }\n\n  componentDidUpdate(previousProps) {\n    if (previousProps !== this.props) {\n      this.clamp();\n    }\n  }\n\n  render() {\n    return (\n      <div\n        style={{ lineHeight: `${this.props.lineHeight}px` }}\n        ref={e => (this.el = e)}\n        title={this.props.text}\n      >\n        {this.state.text}\n      </div>\n    );\n  }\n\n  fitIn() {\n    const [, clientHeight] = getClientSize(this.el);\n    return clientHeight <= this.state.maxHeight;\n  }\n\n  clamp() {\n    this.el.innerText = this.props.text;\n    // no need to truncate\n    if (this.fitIn()) {\n      this.setState({ text: this.props.text });\n      return;\n    }\n\n    let start = 0;\n    let cuttingPoint = 0;\n    let end = this.props.text.length;\n\n    while (start <= end) {\n      cuttingPoint = Math.floor((start + end) / 2);\n      this.el.innerText = this.props.text.slice(0, cuttingPoint);\n\n      if (this.fitIn()) {\n        start = cuttingPoint + 1;\n      } else {\n        end = cuttingPoint - 1;\n      }\n    }\n\n    const truncatedText = this.props.text.slice(\n      0,\n      cuttingPoint - ELLIPSIS.length,\n    );\n    const lastWhiteSpace = LAST_WHITESPACE.exec(truncatedText).index;\n    const truncatedAfterLastWord = truncatedText.slice(0, lastWhiteSpace);\n    const newText = `${truncatedAfterLastWord}...`;\n    this.el.innerText = newText;\n    this.setState({ text: newText });\n  }\n}\n\nClampLinesComponent.propTypes = {\n  lineHeight: PropTypes.number,\n  lines: PropTypes.number, // px\n  parentWidth: PropTypes.number, // max number of lines accepted\n  // It might be better to expose a triggerClamp function within the render\n  // props if we prefer to delegate the control to the parent. For now this\n  // component is only used in a widget where parent layout is set\n  text: PropTypes.string, // used to trigger new clamp on resize\n};\n\nexport default ClampLinesComponent;\n","import { chain, isNil, isEqual, get, every, uniqBy } from 'lodash';\n\n// ******\n// In order to determine which visualisations are available, we compare the\n// schema and content of the returned results against a ruleset for each\n// viz, returning true or false for each one. Certain visualisations\n// will have multiple conditions that need to be satisfied.\n//\n// The `visualisationsValidator` takes a schema and returns an object with\n// the format: {\n//  number: [{ text: 'The result only contains unicorns', passing: true }, ...],\n//  geckometer: [...],\n//  line: [...]\n//  ... }\n// ******\n\nconst _isNumericColumn = col =>\n  ['number', 'percentage', 'currency'].includes(col.type);\nconst _isDateColumn = col => col.type === 'datetime';\nconst _isStringColumn = col => col.type === 'text';\n\n// return the \"most represented column type\"\nconst getColumnType = rows => {\n  // first, we only keep rows with non-nil values\n  const filteredRows = rows.filter(({ value }) => !isNil(value));\n  /*\n   * Then, we'll do a bit of complex manipulations in order to pop the dominant\n   * type for a row.\n   *\n   * To achieve this, we'll reduce the filteredRows and create an object that\n   * will hold { type: number } so for example, a row with two number and one\n   * date will give us { number: 2, date: 1 }\n   *\n   * Then, we transform this object into an array of [type, number] so in that\n   * previous example, we'll get [[number, 2], [date, 1]]\n   * Then, we'll sort this, we'll get [[date, 1], [number, 2]]\n   *\n   * And finally, we pop the last, which is [number, 2] and we get the first\n   * entry which is 'number'!\n   */\n  const types = Object.entries(\n    filteredRows.reduce((acc, { type }) => {\n      if (!acc[type]) acc[type] = 0;\n      acc[type] += 1;\n      return acc;\n    }, {}),\n  ).sort((a, b) => a[1] - b[1]);\n\n  return get(types.pop(), 0);\n};\n\n/*\n * make a list of all rows, the values come with a property according to\n * the type of value the column is set to.\n *\n * type of the value is number? property is { number: value }\n * type of the value is text? property is { text: value }\n */\nconst getRows = (selection, columns) =>\n  columns\n    .map(({ name, type: columnType }) => [\n      columnType,\n      selection.filter(cell => cell.column === name),\n    ])\n    .map(([columnType, selections]) => ({\n      values: selections.reduce((acc, { value }) => {\n        acc.push({\n          [columnType]: value,\n        });\n\n        return acc;\n      }, []),\n    }));\n\nconst prepareSelectedCells = selectedCells => {\n  // merge all\n  const selection = chain(selectedCells)\n    .flatten()\n    .uniqWith(isEqual)\n    .value();\n  /*\n   * This will sort the selections in order to get arrays sorted by\n   * columns and rows\n   *\n   * make a list of all the unique columns and add the right type to it\n   * using getColumnType\n   */\n  const columns = uniqBy(\n    selection.map(cell => ({\n      name: cell.column,\n    })),\n    'name',\n  ).map(column => ({\n    ...column,\n    type: getColumnType(selection.filter(cell => column.name === cell.column)),\n  }));\n\n  const rows = getRows(selection, columns);\n\n  return { columns, rows };\n};\n\nconst _ruleset = {\n  number: [\n    {\n      text: 'The selection is a single numeric value',\n      validator: (columns, rows) =>\n        columns.length === 1 &&\n        _isNumericColumn(columns[0]) &&\n        get(rows, '[0].values').length === 1,\n    },\n  ],\n  geckometer: [\n    {\n      text: 'The selection is a single numeric value',\n      validator: (columns, rows) =>\n        columns.length === 1 &&\n        _isNumericColumn(columns[0]) &&\n        get(rows, '[0].values').length === 1,\n    },\n  ],\n  line: [\n    {\n      text: 'The first column is a date/datetime (for X-axis labels)',\n      validator: columns => columns.length > 0 && _isDateColumn(columns[0]),\n    },\n    {\n      text: 'The remaining columns are all numeric',\n      validator: columns =>\n        columns.length > 1 && every(columns.slice(1), _isNumericColumn),\n    },\n    {\n      text: 'Each column is a line of data and you can select up to 10 of them',\n      validator: columns => columns.length <= 11, // Allow 11 to account for the x-axis column and 10 series'\n    },\n  ],\n  column: [\n    {\n      text:\n        'The first column is a date, datetime or string (for X-axis labels)',\n      validator: columns =>\n        columns.length > 0 &&\n        (_isStringColumn(columns[0]) || _isDateColumn(columns[0])),\n    },\n    {\n      text: 'The remaining columns are all numeric',\n      validator: columns =>\n        columns.length > 1 && every(columns.slice(1), _isNumericColumn),\n    },\n    {\n      text: 'Each column is a line of data and you can select up to 3 of them',\n      validator: columns => columns.length <= 4, // Allow 4 to account for the x-axis column and 3 series'\n    },\n  ],\n  bar: [\n    {\n      text: 'There are exactly two columns',\n      validator: columns => columns.length === 2,\n    },\n    {\n      text:\n        'The first column is a date, datetime or string (for Y-axis labels)',\n      validator: columns =>\n        columns.length > 0 &&\n        (_isStringColumn(columns[0]) || _isDateColumn(columns[0])),\n    },\n    {\n      text: 'The second column is numeric',\n      validator: columns => columns.length > 1 && _isNumericColumn(columns[1]),\n    },\n  ],\n  leaderboard: [\n    {\n      text: 'There are exactly two columns',\n      validator: columns => columns.length === 2,\n    },\n    {\n      text: 'The first column is a string',\n      validator: columns => columns.length > 0 && _isStringColumn(columns[0]),\n    },\n    {\n      text: 'The second column is numeric',\n      validator: columns => columns.length > 1 && _isNumericColumn(columns[1]),\n    },\n  ],\n  table: [\n    {\n      text: 'There are ten columns or fewer',\n      validator: columns => columns.length > 1 && columns.length <= 10,\n    },\n  ],\n  text: [\n    {\n      text: 'The selection is one row, one column, or one cell',\n      validator: columns => columns.length === 1,\n    },\n  ],\n};\n\nconst visualisationsValidator = (columns, rows) => {\n  return Object.keys(_ruleset).map(vizType => ({\n    type: vizType,\n    rules: _ruleset[vizType].map(rule => ({\n      text: rule.text,\n      passing: rule.validator(columns, rows),\n    })),\n  }));\n};\n\nexport default visualisationsValidator;\nexport { getColumnType, prepareSelectedCells };\n","import { chain, isNil, isEqual, includes } from 'lodash';\n\nimport { getSelectedCells } from '../../../universal/spreadsheet-helpers';\nimport { getSelectionSize } from '../../helpers/selection-helpers';\nimport visualisationsValidator, {\n  prepareSelectedCells,\n} from '../../helpers/visualisations-validator';\n\n/*\n * areSelectionsTheSameLength\n *\n * @previous: a previously made selection\n * @current: the current selection we want to check\n * @isDirectionSwapped: true is ROW MODE, false is COLUMN MODE\n *\n * This will return either true or false wether or not the previous selection\n * is the same length as the current one\n *\n * There's a trick to switch wether we're checking the column or the row\n */\nexport const areSelectionsTheSameLength = (\n  previous,\n  current,\n  isDirectionSwapped,\n) => {\n  const indexToCompare = isDirectionSwapped ? 0 : 1;\n  const prevSize = getSelectionSize(previous);\n  const currSize = getSelectionSize(current);\n  const result = prevSize[indexToCompare] === currSize[indexToCompare];\n\n  return result;\n};\n\n/*\n * areSelectionsAligned\n *\n * @previous: a previously made selection\n * @current: the current selection we want to check\n * @isDirectionSwapped: true is ROW MODE, false is COLUMN MODE\n *\n * This will return true or false wether, or not, the two selections are\n * aligned;\n * Example:\n *\n * A .. B => same length, column mode? Aligned!\n * A\n * ..     => column mode, broken! not aligned BOO\n * B\n *\n * You can reverse the logic for row mode where the first example becomes not\n * aligned and the second one is.\n *\n *\n * There's a trick to switch wether we're checking the column or the row\n */\nexport const areSelectionsAligned = (previous, current, isDirectionSwapped) => {\n  // if direction is true (ROW MODE), then it's the index of col, and vice versa\n  const indexToCompare = isDirectionSwapped ? 0 : 1;\n  // if indexToCompare is col, then the following is row... vice versa\n  const oppositeIndex = indexToCompare === 0 ? 1 : 0;\n  const startPrevious = previous[0][indexToCompare];\n  const startCurrent = current[0][indexToCompare];\n  const startAtSameIndex = startCurrent === startPrevious;\n  const isOverlapping =\n    previous[0][oppositeIndex] === current[0][oppositeIndex];\n\n  return startAtSameIndex && !isOverlapping;\n};\n\n/*\n * getValidSelections\n *\n * @selections: an array of selections\n * @isDirectionSwapped: true is ROW MODE, false is COLUMN MODE\n *\n *  this will return the valid list of selections: an array of selections of\n *  the same size and adjacent\n *\n */\nexport const getValidSelections = (selections, isDirectionSwapped) => {\n  // meh, just avoid doing anything if there are no selections\n  if (selections.length === 0) return [];\n\n  /*\n   * THE BIG REDUCE!\n   *  We merge the initial selection (aka the first one) with all the others\n   *  and start reducing in order to compare \"previous\" and \"current\" (next)\n   *  selections and tests against sizes and positions\n   *\n   */\n  const validSelections = selections.reduce((acc, current) => {\n    const previous = acc[acc.length - 1];\n\n    // if there's no previous selection, we safely assume we're dealing with\n    // the initial one.\n    if (previous === undefined) {\n      acc.push(current);\n      return acc;\n    }\n\n    if (\n      areSelectionsTheSameLength(previous, current, isDirectionSwapped) &&\n      areSelectionsAligned(previous, current, isDirectionSwapped)\n    ) {\n      return [...acc, current];\n    }\n\n    // if it does not pass any conditions, we just return the accumulator\n    return acc;\n  }, []);\n\n  return validSelections;\n};\n\nexport const swapSelectionsDirection = selectedCells =>\n  selectedCells.map(selection =>\n    chain(selection)\n      .map(cell => ({\n        ...cell,\n        row: cell.column,\n        column: cell.row,\n      }))\n      .sortBy(['column', 'row'])\n      .value(),\n  );\n\n/*\n * allCellsWithinSelections\n *\n * @selections: an array containing selection [[0,0],[0,0]]\n * @cells: an array containing cell { column, row, type, value }\n *\n * That one is a pickle.\n *\n * When the selection actually contains empty cells, we can end up with\n * validations that are wrong because the validator relies on both the selections\n * and the list of cells from the spreadsheets.\n * We need to create a list of cells following the selections that have been\n * made in order to reflect the exact selections.\n *\n * Example: A selection of of 20 columns with only 5 existing cells per columns\n * will validate the Table viz as \"pickable\" because the validator consider\n * selected cells from the existed cells\n *\n * Problem ?\n * Yes, because the spreadsheet could be updated with more cells that planned\n * and this would create a selection the user did not want to display\n *\n * What we'll do is that for any non-infinity (unboundable, when selecting\n * entire rows/cols) we'll return all cells, even if empty.\n * If the selection is unboundable, we just return all existing cells.\n *\n * Once we've been creating the new cells – when needed – per selection, we\n * flatten the result and keep only uniques ones.\n */\nconst getColumnsLength = selection => selection[1][0] - selection[0][0] + 1;\nconst getRowsLength = selection => selection[1][1] - selection[0][1] + 1;\nconst selectionIsUnbound = selection =>\n  includes(selection[0], -1) || includes(selection[1], -1);\nexport const allCellsWithinSelections = (selections, cells) =>\n  chain(selections)\n    .map(selection => {\n      /*\n       * In case of a normal selection, we simply return the known list of cells\n       */\n      if (selectionIsUnbound(selection)) {\n        return cells;\n      }\n\n      // all columns being selection end, index 0 - selection start, index 0\n      const lenCols = getColumnsLength(selection);\n      // all rows being selection end, index 1 - selection start, index 1\n      const lenRows = getRowsLength(selection);\n\n      // +1 because col and row are 1-based.\n      const startCol = selection[0][0] + 1;\n      const startRow = selection[0][1] + 1;\n\n      // the number of cells contained in the selection\n      const maxLength = lenCols * lenRows;\n\n      // this will hold all our cells\n      const newCells = [];\n\n      /* two helpers to get column and row numbers from a single dimension\n       * for loop\n       */\n      const getColumn = index => startCol + (index % lenCols);\n      const getRow = index => startRow + Math.floor(index / lenCols);\n\n      /*\n       * cool trick for optimising double loops into one, it goes faster than\n       * double loops!\n       * Also, reversed loops are faster!\n       */\n      for (let i = maxLength; i--; ) {\n        const column = getColumn(i);\n        const row = getRow(i);\n\n        /*\n         * find the cell at the exact position at\n         * startCol + col\n         * startRow + row\n         */\n        const foundCell = cells.find(\n          cell => cell.row === row && cell.column === column,\n        );\n\n        // if there's a cell, return it, else return an empty obj\n        newCells.push(isNil(foundCell) ? { column, row } : foundCell);\n      }\n\n      return newCells;\n    })\n    .flatten()\n    .uniqWith(isEqual)\n    .sortBy(['column', 'row'])\n    .value();\n\nexport const validate = (selections, cells, isDirectionSwapped) => {\n  const allCells = allCellsWithinSelections(selections, cells);\n  let selectedCells = getSelectedCells(allCells, selections);\n\n  selectedCells = isDirectionSwapped\n    ? swapSelectionsDirection(selectedCells)\n    : selectedCells;\n\n  const { columns, rows } = prepareSelectedCells(selectedCells);\n\n  return visualisationsValidator(columns, rows);\n};\n","import { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { debounce } from 'lodash';\n\nimport { getValidSelections, validate } from './validation-helpers';\n\nclass ValidationProvider extends Component {\n  constructor(props) {\n    super(props);\n\n    const { selections, cells, isDirectionSwapped } = props;\n\n    const validSelections = getValidSelections(selections, isDirectionSwapped);\n\n    this.state = {\n      validation: validate(validSelections, cells, isDirectionSwapped),\n      validSelections,\n      isDirectionSwapped,\n    };\n\n    this.handleChangeSelections = this.handleChangeSelections.bind(this);\n    this.handleDirectionSwap = this.handleDirectionSwap.bind(this);\n    this.debouncedHandleChangeSelections = debounce(\n      this.handleChangeSelections,\n      200,\n    );\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    const { isDirectionSwapped } = this.state;\n    const { selections } = this.props;\n\n    if (prevState.isDirectionSwapped !== isDirectionSwapped) {\n      this.debouncedHandleChangeSelections({ selections });\n    }\n\n    if (prevProps.selections !== selections) {\n      this.debouncedHandleChangeSelections({ selections });\n    }\n  }\n\n  handleDirectionSwap() {\n    this.setState(({ isDirectionSwapped }) => ({\n      isDirectionSwapped: !isDirectionSwapped,\n    }));\n  }\n\n  handleChangeSelections({ selections }) {\n    const { isDirectionSwapped } = this.state;\n    const { cells } = this.props;\n\n    const validSelections = getValidSelections(selections, isDirectionSwapped);\n    const validation = validate(validSelections, cells, isDirectionSwapped);\n\n    this.setState({ validation, validSelections });\n  }\n\n  render() {\n    return this.props.children({\n      onChangeSelection: this.handleChangeSelections,\n      onDirectionSwap: this.handleDirectionSwap,\n      ...this.state,\n    });\n  }\n}\n\nValidationProvider.defaultProps = {\n  cells: [],\n  selections: [],\n};\n\nValidationProvider.propTypes = {\n  cells: PropTypes.array,\n  children: PropTypes.func,\n  isDirectionSwapped: PropTypes.bool,\n  selections: PropTypes.array,\n};\n\nexport default ValidationProvider;\n","import { connect } from 'react-redux';\nimport { convertSelectionToArrayFormat } from '../../helpers/selection-helpers';\n\nconst mapStateToProps = ({\n  spreadsheets: { cells, selections, lockedSelections, isDirectionSwapped },\n}) => ({\n  cells,\n  isDirectionSwapped,\n  selections: [\n    ...lockedSelections.map(convertSelectionToArrayFormat),\n    ...selections.map(convertSelectionToArrayFormat),\n  ],\n});\n\nexport default connect(mapStateToProps);\n","import ValidationProvider from './validation-provider';\nimport { validate } from './validation-helpers';\nimport validationProviderConnector from './validation-provider-connector';\n\nexport default validationProviderConnector(ValidationProvider);\nexport { validate };\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { chain, isEmpty, isNumber, isUndefined } from 'lodash';\nimport { isEmptyDurationInput } from '../../../universal-config/ui-field-options';\nimport {\n  SUPPORTED_UNITS,\n  getInputFromDuration,\n} from '../../../lib/humanise-number';\n\nimport styles from './duration-input-styles.scss';\n\nclass DurationInput extends Component {\n  constructor(props) {\n    super(props);\n\n    const units = this.getUnits(props);\n    const durationValues = this.getDurationValues(props, units);\n    this.state = {\n      durationValues,\n      units,\n    };\n\n    this.handleChange = this.handleChange.bind(this);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (!nextProps.controlInputs || isUndefined(nextProps.value)) {\n      const newState = {};\n      if (this.props.smallestInputUnit !== nextProps.smallestInputUnit) {\n        newState.units = this.getUnits(nextProps);\n        newState.durationValues = this.getDurationValues(\n          nextProps,\n          newState.units,\n        );\n      } else if (\n        this.props.value !== nextProps.value ||\n        this.props.unit !== nextProps.unit\n      ) {\n        newState.durationValues = this.getDurationValues(\n          nextProps,\n          this.state.units,\n        );\n      }\n\n      if (!isEmpty(newState)) {\n        this.setState(newState);\n      }\n    }\n  }\n\n  handleChange(e) {\n    const { onChange, controlInputs } = this.props;\n\n    const {\n      target: { name, value },\n    } = e;\n    const newDuration = {\n      ...this.state.durationValues,\n      [name]: value,\n    };\n\n    if (onChange) {\n      onChange({ value: newDuration });\n    }\n\n    if (controlInputs) {\n      // The inputs are controlled from state instead of value prop.\n      // This is so that when entering 70 seconds it doesn't immediately\n      // convert it to 1 minute 10 seconds and so on.\n      // TODO: We probably always want to do this when value is a number,\n      // so look at removing this when we stop supporting duration object as value.\n      this.setState({ durationValues: newDuration });\n    }\n  }\n\n  getDurationValues(props, units) {\n    const { value, unit, smallestInputUnit } = props;\n\n    if (isUndefined(value)) {\n      return units.reduce((total, u) => {\n        total[u] = '';\n        return total;\n      }, {});\n    }\n\n    if (isNumber(value)) {\n      return getInputFromDuration(value, unit, 3, smallestInputUnit);\n    }\n    return value || {};\n  }\n\n  getUnits(props) {\n    const { smallestInputUnit } = props;\n    return chain(SUPPORTED_UNITS)\n      .dropRightWhile(u => u !== smallestInputUnit)\n      .takeRight(3)\n      .value();\n  }\n\n  getPlaceholder(durationInput, units) {\n    const { value, placeholder } = this.props;\n\n    // If any of the inputs has a value use 0 as placeholder\n    // for all values (used geckometer min/max)\n    // TODO: remove isEmptyDurationInput when we stop supporting\n    // value as duration object\n    const usePlaceholder = isUndefined(value) || isEmptyDurationInput(value);\n\n    return units.reduce((total, unit) => {\n      total[unit] = '0';\n      if (usePlaceholder && placeholder[unit]) {\n        total[unit] = placeholder[unit];\n      }\n      return total;\n    }, {});\n  }\n\n  renderInputs() {\n    const { durationValues, units } = this.state;\n    const placeholder = this.getPlaceholder(durationValues, units);\n\n    return units.map(inputUnit => {\n      return (\n        <div key={inputUnit} className={styles.durationInput}>\n          <input\n            className={styles.input}\n            type=\"number\"\n            name={inputUnit}\n            value={durationValues[inputUnit]}\n            placeholder={placeholder[inputUnit]}\n            onChange={this.handleChange}\n            min=\"0\"\n            step=\"1\"\n          />\n          <span className={styles.suffix}>\n            {inputUnit.slice(0, 1).toUpperCase()}\n          </span>\n        </div>\n      );\n    });\n  }\n\n  render() {\n    return (\n      <div className={styles.durationInputContainer}>{this.renderInputs()}</div>\n    );\n  }\n}\n\nDurationInput.defaultProps = {\n  unit: 'milliseconds',\n  smallestInputUnit: 'minutes',\n  placeholder: {},\n  controlInputs: false,\n};\n\nDurationInput.propTypes = {\n  // value should be passed as a number from now on.\n  // duration object is still supported for old universal config (goal, min/max)\n  // but should be removed from here when config is moved to the dashboard and\n  // this component is no longer used in universal config.\n  controlInputs: PropTypes.bool,\n  placeholder: PropTypes.shape({\n    days: PropTypes.string,\n    hours: PropTypes.string,\n    minutes: PropTypes.string,\n    seconds: PropTypes.string,\n  }),\n  smallestInputUnit: PropTypes.oneOf(SUPPORTED_UNITS),\n  unit: PropTypes.oneOf(SUPPORTED_UNITS),\n  value: PropTypes.oneOfType([\n    PropTypes.shape({\n      days: PropTypes.string,\n      hours: PropTypes.string,\n      minutes: PropTypes.string,\n    }),\n    PropTypes.number,\n  ]),\n  onChange: PropTypes.func,\n};\n\nexport default DurationInput;\n","import DurationInput from './duration-input-component.js';\n\nexport default DurationInput;\n","/*!\n * UAParser.js v0.7.20\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2019 Faisal Salman <f@faisalman.com>\n * Licensed under MIT License\n */\n\n(function (window, undefined) {\n\n    'use strict';\n\n    //////////////\n    // Constants\n    /////////////\n\n\n    var LIBVERSION  = '0.7.20',\n        EMPTY       = '',\n        UNKNOWN     = '?',\n        FUNC_TYPE   = 'function',\n        UNDEF_TYPE  = 'undefined',\n        OBJ_TYPE    = 'object',\n        STR_TYPE    = 'string',\n        MAJOR       = 'major', // deprecated\n        MODEL       = 'model',\n        NAME        = 'name',\n        TYPE        = 'type',\n        VENDOR      = 'vendor',\n        VERSION     = 'version',\n        ARCHITECTURE= 'architecture',\n        CONSOLE     = 'console',\n        MOBILE      = 'mobile',\n        TABLET      = 'tablet',\n        SMARTTV     = 'smarttv',\n        WEARABLE    = 'wearable',\n        EMBEDDED    = 'embedded';\n\n\n    ///////////\n    // Helper\n    //////////\n\n\n    var util = {\n        extend : function (regexes, extensions) {\n            var mergedRegexes = {};\n            for (var i in regexes) {\n                if (extensions[i] && extensions[i].length % 2 === 0) {\n                    mergedRegexes[i] = extensions[i].concat(regexes[i]);\n                } else {\n                    mergedRegexes[i] = regexes[i];\n                }\n            }\n            return mergedRegexes;\n        },\n        has : function (str1, str2) {\n          if (typeof str1 === \"string\") {\n            return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;\n          } else {\n            return false;\n          }\n        },\n        lowerize : function (str) {\n            return str.toLowerCase();\n        },\n        major : function (version) {\n            return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g,'').split(\".\")[0] : undefined;\n        },\n        trim : function (str) {\n          return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n        }\n    };\n\n\n    ///////////////\n    // Map helper\n    //////////////\n\n\n    var mapper = {\n\n        rgx : function (ua, arrays) {\n\n            var i = 0, j, k, p, q, matches, match;\n\n            // loop through all regexes maps\n            while (i < arrays.length && !matches) {\n\n                var regex = arrays[i],       // even sequence (0,2,4,..)\n                    props = arrays[i + 1];   // odd sequence (1,3,5,..)\n                j = k = 0;\n\n                // try matching uastring with regexes\n                while (j < regex.length && !matches) {\n\n                    matches = regex[j++].exec(ua);\n\n                    if (!!matches) {\n                        for (p = 0; p < props.length; p++) {\n                            match = matches[++k];\n                            q = props[p];\n                            // check if given property is actually array\n                            if (typeof q === OBJ_TYPE && q.length > 0) {\n                                if (q.length == 2) {\n                                    if (typeof q[1] == FUNC_TYPE) {\n                                        // assign modified match\n                                        this[q[0]] = q[1].call(this, match);\n                                    } else {\n                                        // assign given value, ignore regex match\n                                        this[q[0]] = q[1];\n                                    }\n                                } else if (q.length == 3) {\n                                    // check whether function or regex\n                                    if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n                                        // call function (usually string mapper)\n                                        this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n                                    } else {\n                                        // sanitize match using given regex\n                                        this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n                                    }\n                                } else if (q.length == 4) {\n                                        this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n                                }\n                            } else {\n                                this[q] = match ? match : undefined;\n                            }\n                        }\n                    }\n                }\n                i += 2;\n            }\n        },\n\n        str : function (str, map) {\n\n            for (var i in map) {\n                // check if array\n                if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n                    for (var j = 0; j < map[i].length; j++) {\n                        if (util.has(map[i][j], str)) {\n                            return (i === UNKNOWN) ? undefined : i;\n                        }\n                    }\n                } else if (util.has(map[i], str)) {\n                    return (i === UNKNOWN) ? undefined : i;\n                }\n            }\n            return str;\n        }\n    };\n\n\n    ///////////////\n    // String map\n    //////////////\n\n\n    var maps = {\n\n        browser : {\n            oldsafari : {\n                version : {\n                    '1.0'   : '/8',\n                    '1.2'   : '/1',\n                    '1.3'   : '/3',\n                    '2.0'   : '/412',\n                    '2.0.2' : '/416',\n                    '2.0.3' : '/417',\n                    '2.0.4' : '/419',\n                    '?'     : '/'\n                }\n            }\n        },\n\n        device : {\n            amazon : {\n                model : {\n                    'Fire Phone' : ['SD', 'KF']\n                }\n            },\n            sprint : {\n                model : {\n                    'Evo Shift 4G' : '7373KT'\n                },\n                vendor : {\n                    'HTC'       : 'APA',\n                    'Sprint'    : 'Sprint'\n                }\n            }\n        },\n\n        os : {\n            windows : {\n                version : {\n                    'ME'        : '4.90',\n                    'NT 3.11'   : 'NT3.51',\n                    'NT 4.0'    : 'NT4.0',\n                    '2000'      : 'NT 5.0',\n                    'XP'        : ['NT 5.1', 'NT 5.2'],\n                    'Vista'     : 'NT 6.0',\n                    '7'         : 'NT 6.1',\n                    '8'         : 'NT 6.2',\n                    '8.1'       : 'NT 6.3',\n                    '10'        : ['NT 6.4', 'NT 10.0'],\n                    'RT'        : 'ARM'\n                }\n            }\n        }\n    };\n\n\n    //////////////\n    // Regex map\n    /////////////\n\n\n    var regexes = {\n\n        browser : [[\n\n            // Presto based\n            /(opera\\smini)\\/([\\w\\.-]+)/i,                                       // Opera Mini\n            /(opera\\s[mobiletab]+).+version\\/([\\w\\.-]+)/i,                      // Opera Mobi/Tablet\n            /(opera).+version\\/([\\w\\.]+)/i,                                     // Opera > 9.80\n            /(opera)[\\/\\s]+([\\w\\.]+)/i                                          // Opera < 9.80\n            ], [NAME, VERSION], [\n\n            /(opios)[\\/\\s]+([\\w\\.]+)/i                                          // Opera mini on iphone >= 8.0\n            ], [[NAME, 'Opera Mini'], VERSION], [\n\n            /\\s(opr)\\/([\\w\\.]+)/i                                               // Opera Webkit\n            ], [[NAME, 'Opera'], VERSION], [\n\n            // Mixed\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i,\n                                                                                // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n\n            // Trident based\n            /(avant\\s|iemobile|slim|baidu)(?:browser)?[\\/\\s]?([\\w\\.]*)/i,\n                                                                                // Avant/IEMobile/SlimBrowser/Baidu\n            /(?:ms|\\()(ie)\\s([\\w\\.]+)/i,                                        // Internet Explorer\n\n            // Webkit/KHTML based\n            /(rekonq)\\/([\\w\\.]*)/i,                                             // Rekonq\n            /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i\n                                                                                // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n            ], [NAME, VERSION], [\n\n            /(konqueror)\\/([\\w\\.]+)/i                                           // Konqueror\n            ], [[NAME, 'Konqueror'], VERSION], [\n\n            /(trident).+rv[:\\s]([\\w\\.]+).+like\\sgecko/i                         // IE11\n            ], [[NAME, 'IE'], VERSION], [\n\n            /(edge|edgios|edga|edg)\\/((\\d+)?[\\w\\.]+)/i                          // Microsoft Edge\n            ], [[NAME, 'Edge'], VERSION], [\n\n            /(yabrowser)\\/([\\w\\.]+)/i                                           // Yandex\n            ], [[NAME, 'Yandex'], VERSION], [\n\n            /(puffin)\\/([\\w\\.]+)/i                                              // Puffin\n            ], [[NAME, 'Puffin'], VERSION], [\n\n            /(focus)\\/([\\w\\.]+)/i                                               // Firefox Focus\n            ], [[NAME, 'Firefox Focus'], VERSION], [\n\n            /(opt)\\/([\\w\\.]+)/i                                                 // Opera Touch\n            ], [[NAME, 'Opera Touch'], VERSION], [\n\n            /((?:[\\s\\/])uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i         // UCBrowser\n            ], [[NAME, 'UCBrowser'], VERSION], [\n\n            /(comodo_dragon)\\/([\\w\\.]+)/i                                       // Comodo Dragon\n            ], [[NAME, /_/g, ' '], VERSION], [\n\n            /(windowswechat qbcore)\\/([\\w\\.]+)/i                                // WeChat Desktop for Windows Built-in Browser\n            ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [\n\n            /(micromessenger)\\/([\\w\\.]+)/i                                      // WeChat\n            ], [[NAME, 'WeChat'], VERSION], [\n\n            /(brave)\\/([\\w\\.]+)/i                                              // Brave browser\n            ], [[NAME, 'Brave'], VERSION], [\n\n            /(qqbrowserlite)\\/([\\w\\.]+)/i                                       // QQBrowserLite\n            ], [NAME, VERSION], [\n\n            /(QQ)\\/([\\d\\.]+)/i                                                  // QQ, aka ShouQ\n            ], [NAME, VERSION], [\n\n            /m?(qqbrowser)[\\/\\s]?([\\w\\.]+)/i                                    // QQBrowser\n            ], [NAME, VERSION], [\n\n            /(BIDUBrowser)[\\/\\s]?([\\w\\.]+)/i                                    // Baidu Browser\n            ], [NAME, VERSION], [\n\n            /(2345Explorer)[\\/\\s]?([\\w\\.]+)/i                                   // 2345 Browser\n            ], [NAME, VERSION], [\n\n            /(MetaSr)[\\/\\s]?([\\w\\.]+)/i                                         // SouGouBrowser\n            ], [NAME], [\n\n            /(LBBROWSER)/i                                      // LieBao Browser\n            ], [NAME], [\n\n            /xiaomi\\/miuibrowser\\/([\\w\\.]+)/i                                   // MIUI Browser\n            ], [VERSION, [NAME, 'MIUI Browser']], [\n\n            /;fbav\\/([\\w\\.]+);/i                                                // Facebook App for iOS & Android\n            ], [VERSION, [NAME, 'Facebook']], [\n\n            /safari\\s(line)\\/([\\w\\.]+)/i,                                       // Line App for iOS\n            /android.+(line)\\/([\\w\\.]+)\\/iab/i                                  // Line App for Android\n            ], [NAME, VERSION], [\n\n            /headlesschrome(?:\\/([\\w\\.]+)|\\s)/i                                 // Chrome Headless\n            ], [VERSION, [NAME, 'Chrome Headless']], [\n\n            /\\swv\\).+(chrome)\\/([\\w\\.]+)/i                                      // Chrome WebView\n            ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [\n\n            /((?:oculus|samsung)browser)\\/([\\w\\.]+)/i\n            ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [                // Oculus / Samsung Browser\n\n            /android.+version\\/([\\w\\.]+)\\s+(?:mobile\\s?safari|safari)*/i        // Android Browser\n            ], [VERSION, [NAME, 'Android Browser']], [\n\n            /(sailfishbrowser)\\/([\\w\\.]+)/i                                     // Sailfish Browser\n            ], [[NAME, 'Sailfish Browser'], VERSION], [\n\n            /(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i\n                                                                                // Chrome/OmniWeb/Arora/Tizen/Nokia\n            ], [NAME, VERSION], [\n\n            /(dolfin)\\/([\\w\\.]+)/i                                              // Dolphin\n            ], [[NAME, 'Dolphin'], VERSION], [\n\n            /((?:android.+)crmo|crios)\\/([\\w\\.]+)/i                             // Chrome for Android/iOS\n            ], [[NAME, 'Chrome'], VERSION], [\n\n            /(coast)\\/([\\w\\.]+)/i                                               // Opera Coast\n            ], [[NAME, 'Opera Coast'], VERSION], [\n\n            /fxios\\/([\\w\\.-]+)/i                                                // Firefox for iOS\n            ], [VERSION, [NAME, 'Firefox']], [\n\n            /version\\/([\\w\\.]+).+?mobile\\/\\w+\\s(safari)/i                       // Mobile Safari\n            ], [VERSION, [NAME, 'Mobile Safari']], [\n\n            /version\\/([\\w\\.]+).+?(mobile\\s?safari|safari)/i                    // Safari & Safari Mobile\n            ], [VERSION, NAME], [\n\n            /webkit.+?(gsa)\\/([\\w\\.]+).+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i  // Google Search Appliance on iOS\n            ], [[NAME, 'GSA'], VERSION], [\n\n            /webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i                     // Safari < 3.0\n            ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [\n\n            /(webkit|khtml)\\/([\\w\\.]+)/i\n            ], [NAME, VERSION], [\n\n            // Gecko based\n            /(navigator|netscape)\\/([\\w\\.-]+)/i                                 // Netscape\n            ], [[NAME, 'Netscape'], VERSION], [\n            /(swiftfox)/i,                                                      // Swiftfox\n            /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i,\n                                                                                // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n            /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i,\n\n                                                                                // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n            /(mozilla)\\/([\\w\\.]+).+rv\\:.+gecko\\/\\d+/i,                          // Mozilla\n\n            // Other\n            /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i,\n                                                                                // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir\n            /(links)\\s\\(([\\w\\.]+)/i,                                            // Links\n            /(gobrowser)\\/?([\\w\\.]*)/i,                                         // GoBrowser\n            /(ice\\s?browser)\\/v?([\\w\\._]+)/i,                                   // ICE Browser\n            /(mosaic)[\\/\\s]([\\w\\.]+)/i                                          // Mosaic\n            ], [NAME, VERSION]\n        ],\n\n        cpu : [[\n\n            /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i                     // AMD64\n            ], [[ARCHITECTURE, 'amd64']], [\n\n            /(ia32(?=;))/i                                                      // IA32 (quicktime)\n            ], [[ARCHITECTURE, util.lowerize]], [\n\n            /((?:i[346]|x)86)[;\\)]/i                                            // IA32\n            ], [[ARCHITECTURE, 'ia32']], [\n\n            // PocketPC mistakenly identified as PowerPC\n            /windows\\s(ce|mobile);\\sppc;/i\n            ], [[ARCHITECTURE, 'arm']], [\n\n            /((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i                           // PowerPC\n            ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [\n\n            /(sun4\\w)[;\\)]/i                                                    // SPARC\n            ], [[ARCHITECTURE, 'sparc']], [\n\n            /((?:avr32|ia64(?=;))|68k(?=\\))|arm(?:64|(?=v\\d+[;l]))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i\n                                                                                // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n            ], [[ARCHITECTURE, util.lowerize]]\n        ],\n\n        device : [[\n\n            /\\((ipad|playbook);[\\w\\s\\),;-]+(rim|apple)/i                        // iPad/PlayBook\n            ], [MODEL, VENDOR, [TYPE, TABLET]], [\n\n            /applecoremedia\\/[\\w\\.]+ \\((ipad)/                                  // iPad\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [\n\n            /(apple\\s{0,1}tv)/i                                                 // Apple TV\n            ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [\n\n            /(archos)\\s(gamepad2?)/i,                                           // Archos\n            /(hp).+(touchpad)/i,                                                // HP TouchPad\n            /(hp).+(tablet)/i,                                                  // HP Tablet\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /\\s(nook)[\\w\\s]+build\\/(\\w+)/i,                                     // Nook\n            /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i                                  // Dell Streak\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /(kf[A-z]+)\\sbuild\\/.+silk\\//i                                      // Kindle Fire HD\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [\n            /(sd|kf)[0349hijorstuw]+\\sbuild\\/.+silk\\//i                         // Fire Phone\n            ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [\n            /android.+aft([bms])\\sbuild/i                                       // Fire TV\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [\n\n            /\\((ip[honed|\\s\\w*]+);.+(apple)/i                                   // iPod/iPhone\n            ], [MODEL, VENDOR, [TYPE, MOBILE]], [\n            /\\((ip[honed|\\s\\w*]+);/i                                            // iPod/iPhone\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [\n\n            /(blackberry)[\\s-]?(\\w+)/i,                                         // BlackBerry\n            /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i,\n                                                                                // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n            /(hp)\\s([\\w\\s]+\\w)/i,                                               // HP iPAQ\n            /(asus)-?(\\w+)/i                                                    // Asus\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n            /\\(bb10;\\s(\\w+)/i                                                   // BlackBerry 10\n            ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [\n                                                                                // Asus Tablets\n            /android.+(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus 7|padfone|p00c)/i\n            ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [\n\n            /(sony)\\s(tablet\\s[ps])\\sbuild\\//i,                                  // Sony\n            /(sony)?(?:sgp.+)\\sbuild\\//i\n            ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [\n            /android.+\\s([c-g]\\d{4}|so[-l]\\w+)(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n            ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n\n            /\\s(ouya)\\s/i,                                                      // Ouya\n            /(nintendo)\\s([wids3u]+)/i                                          // Nintendo\n            ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n\n            /android.+;\\s(shield)\\sbuild/i                                      // Nvidia\n            ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n\n            /(playstation\\s[34portablevi]+)/i                                   // Playstation\n            ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [\n\n            /(sprint\\s(\\w+))/i                                                  // Sprint Phones\n            ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [\n\n            /(htc)[;_\\s-]+([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i,                        // HTC\n            /(zte)-(\\w*)/i,                                                     // ZTE\n            /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i\n                                                                                // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n            ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n            /(nexus\\s9)/i                                                       // HTC Nexus 9\n            ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n\n            /d\\/huawei([\\w\\s-]+)[;\\)]/i,\n            /(nexus\\s6p)/i                                                      // Huawei\n            ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [\n\n            /(microsoft);\\s(lumia[\\s\\w]+)/i                                     // Microsoft Lumia\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /[\\s\\(;](xbox(?:\\sone)?)[\\s\\);]/i                                   // Microsoft Xbox\n            ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [\n            /(kin\\.[onetw]{3})/i                                                // Microsoft Kin\n            ], [[MODEL, /\\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [\n\n                                                                                // Motorola\n            /\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)[\\w\\s]+build\\//i,\n            /mot[\\s-]?(\\w*)/i,\n            /(XT\\d{3,4}) build\\//i,\n            /(nexus\\s6)/i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [\n            /android.+\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [\n\n            /hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i            // HbbTV devices\n            ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [\n\n            /hbbtv.+maple;(\\d+)/i\n            ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [\n\n            /\\(dtv[\\);].+(aquos)/i                                              // Sharp\n            ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n\n            /android.+((sch-i[89]0\\d|shw-m380s|gt-p\\d{4}|gt-n\\d+|sgh-t8[56]9|nexus 10))/i,\n            /((SM-T\\w+))/i\n            ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [                  // Samsung\n            /smart-tv.+(samsung)/i\n            ], [VENDOR, [TYPE, SMARTTV], MODEL], [\n            /((s[cgp]h-\\w+|gt-\\w+|galaxy\\snexus|sm-\\w[\\w\\d]+))/i,\n            /(sam[sung]*)[\\s-]*(\\w+-?[\\w-]*)/i,\n            /sec-((sgh\\w+))/i\n            ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [\n\n            /sie-(\\w*)/i                                                        // Siemens\n            ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n\n            /(maemo|nokia).*(n900|lumia\\s\\d+)/i,                                // Nokia\n            /(nokia)[\\s_-]?([\\w-]*)/i\n            ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [\n\n            /android[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i                   // Acer\n            ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n            /android.+([vl]k\\-?\\d{3})\\s+build/i                                 // LG Tablet\n            ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [\n            /android\\s3\\.[\\s\\w;-]{10}(lg?)-([06cv9]{3,4})/i                     // LG Tablet\n            ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [\n            /(lg) netcast\\.tv/i                                                 // LG SmartTV\n            ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n            /(nexus\\s[45])/i,                                                   // LG\n            /lg[e;\\s\\/-]+(\\w*)/i,\n            /android.+lg(\\-?[\\d\\w]+)\\s+build/i\n            ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [\n\n            /(lenovo)\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+))/i             // Lenovo tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n            /android.+(ideatab[a-z0-9\\-\\s]+)/i                                  // Lenovo\n            ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n            /(lenovo)[_\\s-]?([\\w-]+)/i\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /linux;.+((jolla));/i                                               // Jolla\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /((pebble))app\\/[\\d\\.]+\\s/i                                         // Pebble\n            ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n\n            /android.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i                            // OPPO\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /crkey/i                                                            // Google Chromecast\n            ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [\n\n            /android.+;\\s(glass)\\s\\d/i                                          // Google Glass\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [\n\n            /android.+;\\s(pixel c)[\\s)]/i                                       // Google Pixel C\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [\n\n            /android.+;\\s(pixel( [23])?( xl)?)[\\s)]/i                              // Google Pixel\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [\n\n            /android.+;\\s(\\w+)\\s+build\\/hm\\1/i,                                 // Xiaomi Hongmi 'numeric' models\n            /android.+(hm[\\s\\-_]*note?[\\s_]*(?:\\d\\w)?)\\s+build/i,               // Xiaomi Hongmi\n            /android.+(mi[\\s\\-_]*(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]*(?:\\d?\\w?)[\\s_]*(?:plus)?)\\s+build/i,    \n                                                                                // Xiaomi Mi\n            /android.+(redmi[\\s\\-_]*(?:note)?(?:[\\s_]*[\\w\\s]+))\\s+build/i       // Redmi Phones\n            ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [\n            /android.+(mi[\\s\\-_]*(?:pad)(?:[\\s_]*[\\w\\s]+))\\s+build/i            // Mi Pad tablets\n            ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [\n            /android.+;\\s(m[1-5]\\snote)\\sbuild/i                                // Meizu\n            ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n            /(mz)-([\\w-]{2,})/i\n            ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [\n\n            /android.+a000(1)\\s+build/i,                                        // OnePlus\n            /android.+oneplus\\s(a\\d{4})\\s+build/i\n            ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n            /android.+[;\\/]\\s*(RCT[\\d\\w]+)\\s+build/i                            // RCA Tablets\n            ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n\n            /android.+[;\\/\\s]+(Venue[\\d\\s]{2,7})\\s+build/i                      // Dell Venue Tablets\n            ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(Q[T|M][\\d\\w]+)\\s+build/i                         // Verizon Tablet\n            ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s+(Barnes[&\\s]+Noble\\s+|BN[RT])(V?.*)\\s+build/i     // Barnes & Noble Tablet\n            ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s+(TM\\d{3}.*\\b)\\s+build/i                           // Barnes & Noble Tablet\n            ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n\n            /android.+;\\s(k88)\\sbuild/i                                         // ZTE K Series Tablet\n            ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(gen\\d{3})\\s+build.*49h/i                         // Swiss GEN Mobile\n            ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n\n            /android.+[;\\/]\\s*(zur\\d{3})\\s+build/i                              // Swiss ZUR Tablet\n            ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*((Zeki)?TB.*\\b)\\s+build/i                         // Zeki Tablets\n            ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n\n            /(android).+[;\\/]\\s+([YR]\\d{2})\\s+build/i,\n            /android.+[;\\/]\\s+(Dragon[\\-\\s]+Touch\\s+|DT)(\\w{5})\\sbuild/i        // Dragon Touch Tablet\n            ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(NS-?\\w{0,9})\\sbuild/i                            // Insignia Tablets\n            ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*((NX|Next)-?\\w{0,9})\\s+build/i                    // NextBook Tablets\n            ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(Xtreme\\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\\s+build/i\n            ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [                    // Voice Xtreme Phones\n\n            /android.+[;\\/]\\s*(LVTEL\\-)?(V1[12])\\s+build/i                     // LvTel Phones\n            ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n\n            /android.+;\\s(PH-1)\\s/i\n            ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [                // Essential PH-1\n\n            /android.+[;\\/]\\s*(V(100MD|700NA|7011|917G).*\\b)\\s+build/i          // Envizen Tablets\n            ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(Le[\\s\\-]+Pan)[\\s\\-]+(\\w{1,9})\\s+build/i          // Le Pan Tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(Trio[\\s\\-]*.*)\\s+build/i                         // MachSpeed Tablets\n            ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*(Trinity)[\\-\\s]*(T\\d{3})\\s+build/i                // Trinity Tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /android.+[;\\/]\\s*TU_(1491)\\s+build/i                               // Rotor Tablets\n            ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n\n            /android.+(KS(.+))\\s+build/i                                        // Amazon Kindle Tablets\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [\n\n            /android.+(Gigaset)[\\s\\-]+(Q\\w{1,9})\\s+build/i                      // Gigaset Tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /\\s(tablet|tab)[;\\/]/i,                                             // Unidentifiable Tablet\n            /\\s(mobile)(?:[;\\/]|\\ssafari)/i                                     // Unidentifiable Mobile\n            ], [[TYPE, util.lowerize], VENDOR, MODEL], [\n\n            /[\\s\\/\\(](smart-?tv)[;\\)]/i                                         // SmartTV\n            ], [[TYPE, SMARTTV]], [\n\n            /(android[\\w\\.\\s\\-]{0,9});.+build/i                                 // Generic Android Device\n            ], [MODEL, [VENDOR, 'Generic']]\n        ],\n\n        engine : [[\n\n            /windows.+\\sedge\\/([\\w\\.]+)/i                                       // EdgeHTML\n            ], [VERSION, [NAME, 'EdgeHTML']], [\n\n            /webkit\\/537\\.36.+chrome\\/(?!27)/i                                  // Blink\n            ], [[NAME, 'Blink']], [\n\n            /(presto)\\/([\\w\\.]+)/i,                                             // Presto\n            /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i,     \n                                                                                // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n            /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i,                          // KHTML/Tasman/Links\n            /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i                                      // iCab\n            ], [NAME, VERSION], [\n\n            /rv\\:([\\w\\.]{1,9}).+(gecko)/i                                       // Gecko\n            ], [VERSION, NAME]\n        ],\n\n        os : [[\n\n            // Windows based\n            /microsoft\\s(windows)\\s(vista|xp)/i                                 // Windows (iTunes)\n            ], [NAME, VERSION], [\n            /(windows)\\snt\\s6\\.2;\\s(arm)/i,                                     // Windows RT\n            /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i,                   // Windows Phone\n            /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)/i\n            ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [\n            /(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i\n            ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [\n\n            // Mobile/Embedded OS\n            /\\((bb)(10);/i                                                      // BlackBerry 10\n            ], [[NAME, 'BlackBerry'], VERSION], [\n            /(blackberry)\\w*\\/?([\\w\\.]*)/i,                                     // Blackberry\n            /(tizen)[\\/\\s]([\\w\\.]+)/i,                                          // Tizen\n            /(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i\n                                                                                // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS\n            ], [NAME, VERSION], [\n            /(symbian\\s?os|symbos|s60(?=;))[\\/\\s-]?([\\w\\.]*)/i                  // Symbian\n            ], [[NAME, 'Symbian'], VERSION], [\n            /\\((series40);/i                                                    // Series 40\n            ], [NAME], [\n            /mozilla.+\\(mobile;.+gecko.+firefox/i                               // Firefox OS\n            ], [[NAME, 'Firefox OS'], VERSION], [\n\n            // Console\n            /(nintendo|playstation)\\s([wids34portablevu]+)/i,                   // Nintendo/Playstation\n\n            // GNU/Linux based\n            /(mint)[\\/\\s\\(]?(\\w*)/i,                                            // Mint\n            /(mageia|vectorlinux)[;\\s]/i,                                       // Mageia/VectorLinux\n            /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\\/\\s-]?(?!chrom)([\\w\\.-]*)/i,\n                                                                                // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware\n                                                                                // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus\n            /(hurd|linux)\\s?([\\w\\.]*)/i,                                        // Hurd/Linux\n            /(gnu)\\s?([\\w\\.]*)/i                                                // GNU\n            ], [NAME, VERSION], [\n\n            /(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i                                       // Chromium OS\n            ], [[NAME, 'Chromium OS'], VERSION],[\n\n            // Solaris\n            /(sunos)\\s?([\\w\\.\\d]*)/i                                            // Solaris\n            ], [[NAME, 'Solaris'], VERSION], [\n\n            // BSD based\n            /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?([\\w\\.]*)/i                    // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly\n            ], [NAME, VERSION],[\n\n            /(haiku)\\s(\\w+)/i                                                   // Haiku\n            ], [NAME, VERSION],[\n\n            /cfnetwork\\/.+darwin/i,\n            /ip[honead]{2,4}(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i             // iOS\n            ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n\n            /(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i,\n            /(macintosh|mac(?=_powerpc)\\s)/i                                    // Mac OS\n            ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n            // Other\n            /((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i,                             // Solaris\n            /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i,                                // AIX\n            /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i,\n                                                                                // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia\n            /(unix)\\s?([\\w\\.]*)/i                                               // UNIX\n            ], [NAME, VERSION]\n        ]\n    };\n\n\n    /////////////////\n    // Constructor\n    ////////////////\n    var UAParser = function (uastring, extensions) {\n\n        if (typeof uastring === 'object') {\n            extensions = uastring;\n            uastring = undefined;\n        }\n\n        if (!(this instanceof UAParser)) {\n            return new UAParser(uastring, extensions).getResult();\n        }\n\n        var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n        var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n        this.getBrowser = function () {\n            var browser = { name: undefined, version: undefined };\n            mapper.rgx.call(browser, ua, rgxmap.browser);\n            browser.major = util.major(browser.version); // deprecated\n            return browser;\n        };\n        this.getCPU = function () {\n            var cpu = { architecture: undefined };\n            mapper.rgx.call(cpu, ua, rgxmap.cpu);\n            return cpu;\n        };\n        this.getDevice = function () {\n            var device = { vendor: undefined, model: undefined, type: undefined };\n            mapper.rgx.call(device, ua, rgxmap.device);\n            return device;\n        };\n        this.getEngine = function () {\n            var engine = { name: undefined, version: undefined };\n            mapper.rgx.call(engine, ua, rgxmap.engine);\n            return engine;\n        };\n        this.getOS = function () {\n            var os = { name: undefined, version: undefined };\n            mapper.rgx.call(os, ua, rgxmap.os);\n            return os;\n        };\n        this.getResult = function () {\n            return {\n                ua      : this.getUA(),\n                browser : this.getBrowser(),\n                engine  : this.getEngine(),\n                os      : this.getOS(),\n                device  : this.getDevice(),\n                cpu     : this.getCPU()\n            };\n        };\n        this.getUA = function () {\n            return ua;\n        };\n        this.setUA = function (uastring) {\n            ua = uastring;\n            return this;\n        };\n        return this;\n    };\n\n    UAParser.VERSION = LIBVERSION;\n    UAParser.BROWSER = {\n        NAME    : NAME,\n        MAJOR   : MAJOR, // deprecated\n        VERSION : VERSION\n    };\n    UAParser.CPU = {\n        ARCHITECTURE : ARCHITECTURE\n    };\n    UAParser.DEVICE = {\n        MODEL   : MODEL,\n        VENDOR  : VENDOR,\n        TYPE    : TYPE,\n        CONSOLE : CONSOLE,\n        MOBILE  : MOBILE,\n        SMARTTV : SMARTTV,\n        TABLET  : TABLET,\n        WEARABLE: WEARABLE,\n        EMBEDDED: EMBEDDED\n    };\n    UAParser.ENGINE = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n    UAParser.OS = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n\n    ///////////\n    // Export\n    //////////\n\n\n    // check js environment\n    if (typeof(exports) !== UNDEF_TYPE) {\n        // nodejs env\n        if (typeof module !== UNDEF_TYPE && module.exports) {\n            exports = module.exports = UAParser;\n        }\n        exports.UAParser = UAParser;\n    } else {\n        // requirejs env (optional)\n        if (typeof(define) === 'function' && define.amd) {\n            define(function () {\n                return UAParser;\n            });\n        } else if (window) {\n            // browser env\n            window.UAParser = UAParser;\n        }\n    }\n\n    // jQuery/Zepto specific (optional)\n    // Note:\n    //   In AMD env the global scope should be kept clean, but jQuery is an exception.\n    //   jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n    //   and we should catch that.\n    var $ = window && (window.jQuery || window.Zepto);\n    if (typeof $ !== UNDEF_TYPE && !$.ua) {\n        var parser = new UAParser();\n        $.ua = parser.getResult();\n        $.ua.get = function () {\n            return parser.getUA();\n        };\n        $.ua.set = function (uastring) {\n            parser.setUA(uastring);\n            var result = parser.getResult();\n            for (var prop in result) {\n                $.ua[prop] = result[prop];\n            }\n        };\n    }\n\n})(typeof window === 'object' ? window : this);\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"LoremIpsum\", {\n  enumerable: true,\n  get: function get() {\n    return _LoremIpsum.default;\n  }\n});\nexports.loremIpsum = void 0;\n\nvar _words = require(\"./constants/words\");\n\nvar _LoremIpsum = _interopRequireDefault(require(\"./lib/LoremIpsum\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar loremIpsum = function loremIpsum() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      _ref$count = _ref.count,\n      count = _ref$count === void 0 ? 1 : _ref$count,\n      _ref$format = _ref.format,\n      format = _ref$format === void 0 ? \"plain\" : _ref$format,\n      _ref$paragraphLowerBo = _ref.paragraphLowerBound,\n      paragraphLowerBound = _ref$paragraphLowerBo === void 0 ? 3 : _ref$paragraphLowerBo,\n      _ref$paragraphUpperBo = _ref.paragraphUpperBound,\n      paragraphUpperBound = _ref$paragraphUpperBo === void 0 ? 7 : _ref$paragraphUpperBo,\n      random = _ref.random,\n      _ref$sentenceLowerBou = _ref.sentenceLowerBound,\n      sentenceLowerBound = _ref$sentenceLowerBou === void 0 ? 5 : _ref$sentenceLowerBou,\n      _ref$sentenceUpperBou = _ref.sentenceUpperBound,\n      sentenceUpperBound = _ref$sentenceUpperBou === void 0 ? 15 : _ref$sentenceUpperBou,\n      _ref$units = _ref.units,\n      units = _ref$units === void 0 ? \"sentences\" : _ref$units,\n      _ref$words = _ref.words,\n      words = _ref$words === void 0 ? _words.WORDS : _ref$words,\n      _ref$suffix = _ref.suffix,\n      suffix = _ref$suffix === void 0 ? \"\" : _ref$suffix;\n\n  var options = {\n    random: random,\n    sentencesPerParagraph: {\n      max: paragraphUpperBound,\n      min: paragraphLowerBound\n    },\n    words: words,\n    wordsPerSentence: {\n      max: sentenceUpperBound,\n      min: sentenceLowerBound\n    }\n  };\n  var lorem = new _LoremIpsum.default(options, format, suffix);\n\n  switch (units) {\n    case \"paragraphs\":\n    case \"paragraph\":\n      return lorem.generateParagraphs(count);\n\n    case \"sentences\":\n    case \"sentence\":\n      return lorem.generateSentences(count);\n\n    case \"words\":\n    case \"word\":\n      return lorem.generateWords(count);\n\n    default:\n      return \"\";\n  }\n};\n\nexports.loremIpsum = loremIpsum;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJsb3JlbUlwc3VtIiwiY291bnQiLCJmb3JtYXQiLCJwYXJhZ3JhcGhMb3dlckJvdW5kIiwicGFyYWdyYXBoVXBwZXJCb3VuZCIsInJhbmRvbSIsInNlbnRlbmNlTG93ZXJCb3VuZCIsInNlbnRlbmNlVXBwZXJCb3VuZCIsInVuaXRzIiwid29yZHMiLCJXT1JEUyIsInN1ZmZpeCIsIm9wdGlvbnMiLCJzZW50ZW5jZXNQZXJQYXJhZ3JhcGgiLCJtYXgiLCJtaW4iLCJ3b3Jkc1BlclNlbnRlbmNlIiwibG9yZW0iLCJMb3JlbUlwc3VtIiwiZ2VuZXJhdGVQYXJhZ3JhcGhzIiwiZ2VuZXJhdGVTZW50ZW5jZXMiLCJnZW5lcmF0ZVdvcmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7Ozs7QUFlQSxJQUFNQSxVQUFVLEdBQUcsU0FBYkEsVUFBYSxHQVdtQjtBQUFBLGlGQUFmLEVBQWU7QUFBQSx3QkFWcENDLEtBVW9DO0FBQUEsTUFWcENBLEtBVW9DLDJCQVY1QixDQVU0QjtBQUFBLHlCQVRwQ0MsTUFTb0M7QUFBQSxNQVRwQ0EsTUFTb0MsNEJBVDNCLE9BUzJCO0FBQUEsbUNBUnBDQyxtQkFRb0M7QUFBQSxNQVJwQ0EsbUJBUW9DLHNDQVJkLENBUWM7QUFBQSxtQ0FQcENDLG1CQU9vQztBQUFBLE1BUHBDQSxtQkFPb0Msc0NBUGQsQ0FPYztBQUFBLE1BTnBDQyxNQU1vQyxRQU5wQ0EsTUFNb0M7QUFBQSxtQ0FMcENDLGtCQUtvQztBQUFBLE1BTHBDQSxrQkFLb0Msc0NBTGYsQ0FLZTtBQUFBLG1DQUpwQ0Msa0JBSW9DO0FBQUEsTUFKcENBLGtCQUlvQyxzQ0FKZixFQUllO0FBQUEsd0JBSHBDQyxLQUdvQztBQUFBLE1BSHBDQSxLQUdvQywyQkFINUIsV0FHNEI7QUFBQSx3QkFGcENDLEtBRW9DO0FBQUEsTUFGcENBLEtBRW9DLDJCQUY1QkMsWUFFNEI7QUFBQSx5QkFEcENDLE1BQ29DO0FBQUEsTUFEcENBLE1BQ29DLDRCQUQzQixFQUMyQjs7QUFDcEMsTUFBTUMsT0FBTyxHQUFHO0FBQ2RQLElBQUFBLE1BQU0sRUFBTkEsTUFEYztBQUVkUSxJQUFBQSxxQkFBcUIsRUFBRTtBQUNyQkMsTUFBQUEsR0FBRyxFQUFFVixtQkFEZ0I7QUFFckJXLE1BQUFBLEdBQUcsRUFBRVo7QUFGZ0IsS0FGVDtBQU1kTSxJQUFBQSxLQUFLLEVBQUxBLEtBTmM7QUFPZE8sSUFBQUEsZ0JBQWdCLEVBQUU7QUFDaEJGLE1BQUFBLEdBQUcsRUFBRVAsa0JBRFc7QUFFaEJRLE1BQUFBLEdBQUcsRUFBRVQ7QUFGVztBQVBKLEdBQWhCO0FBYUEsTUFBTVcsS0FBaUIsR0FBRyxJQUFJQyxtQkFBSixDQUFlTixPQUFmLEVBQXdCVixNQUF4QixFQUFnQ1MsTUFBaEMsQ0FBMUI7O0FBRUEsVUFBUUgsS0FBUjtBQUNFLFNBQUssWUFBTDtBQUNBLFNBQUssV0FBTDtBQUNFLGFBQU9TLEtBQUssQ0FBQ0Usa0JBQU4sQ0FBeUJsQixLQUF6QixDQUFQOztBQUNGLFNBQUssV0FBTDtBQUNBLFNBQUssVUFBTDtBQUNFLGFBQU9nQixLQUFLLENBQUNHLGlCQUFOLENBQXdCbkIsS0FBeEIsQ0FBUDs7QUFDRixTQUFLLE9BQUw7QUFDQSxTQUFLLE1BQUw7QUFDRSxhQUFPZ0IsS0FBSyxDQUFDSSxhQUFOLENBQW9CcEIsS0FBcEIsQ0FBUDs7QUFDRjtBQUNFLGFBQU8sRUFBUDtBQVhKO0FBYUQsQ0F4Q0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXT1JEUyB9IGZyb20gXCIuL2NvbnN0YW50cy93b3Jkc1wiO1xyXG5pbXBvcnQgeyBJUHJuZyB9IGZyb20gXCIuL2xpYi9nZW5lcmF0b3JcIjtcclxuaW1wb3J0IExvcmVtSXBzdW0gZnJvbSBcIi4vbGliL0xvcmVtSXBzdW1cIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUxvcmVtSXBzdW1QYXJhbXMge1xyXG4gIGNvdW50PzogbnVtYmVyO1xyXG4gIGZvcm1hdD86IFwicGxhaW5cIiB8IFwiaHRtbFwiO1xyXG4gIHBhcmFncmFwaExvd2VyQm91bmQ/OiBudW1iZXI7XHJcbiAgcGFyYWdyYXBoVXBwZXJCb3VuZD86IG51bWJlcjtcclxuICByYW5kb20/OiBJUHJuZztcclxuICBzZW50ZW5jZUxvd2VyQm91bmQ/OiBudW1iZXI7XHJcbiAgc2VudGVuY2VVcHBlckJvdW5kPzogbnVtYmVyO1xyXG4gIHVuaXRzPzogXCJ3b3Jkc1wiIHwgXCJ3b3JkXCIgfCBcInNlbnRlbmNlc1wiIHwgXCJzZW50ZW5jZVwiIHwgXCJwYXJhZ3JhcGhzXCIgfCBcInBhcmFncmFwaFwiO1xyXG4gIHdvcmRzPzogc3RyaW5nW107XHJcbiAgc3VmZml4Pzogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBsb3JlbUlwc3VtID0gKHtcclxuICBjb3VudCA9IDEsXHJcbiAgZm9ybWF0ID0gXCJwbGFpblwiLFxyXG4gIHBhcmFncmFwaExvd2VyQm91bmQgPSAzLFxyXG4gIHBhcmFncmFwaFVwcGVyQm91bmQgPSA3LFxyXG4gIHJhbmRvbSxcclxuICBzZW50ZW5jZUxvd2VyQm91bmQgPSA1LFxyXG4gIHNlbnRlbmNlVXBwZXJCb3VuZCA9IDE1LFxyXG4gIHVuaXRzID0gXCJzZW50ZW5jZXNcIixcclxuICB3b3JkcyA9IFdPUkRTLFxyXG4gIHN1ZmZpeCA9IFwiXCIsXHJcbn06IElMb3JlbUlwc3VtUGFyYW1zID0ge30pOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICByYW5kb20sXHJcbiAgICBzZW50ZW5jZXNQZXJQYXJhZ3JhcGg6IHtcclxuICAgICAgbWF4OiBwYXJhZ3JhcGhVcHBlckJvdW5kLFxyXG4gICAgICBtaW46IHBhcmFncmFwaExvd2VyQm91bmQsXHJcbiAgICB9LFxyXG4gICAgd29yZHMsXHJcbiAgICB3b3Jkc1BlclNlbnRlbmNlOiB7XHJcbiAgICAgIG1heDogc2VudGVuY2VVcHBlckJvdW5kLFxyXG4gICAgICBtaW46IHNlbnRlbmNlTG93ZXJCb3VuZCxcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgbG9yZW06IExvcmVtSXBzdW0gPSBuZXcgTG9yZW1JcHN1bShvcHRpb25zLCBmb3JtYXQsIHN1ZmZpeCk7XHJcblxyXG4gIHN3aXRjaCAodW5pdHMpIHtcclxuICAgIGNhc2UgXCJwYXJhZ3JhcGhzXCI6XHJcbiAgICBjYXNlIFwicGFyYWdyYXBoXCI6XHJcbiAgICAgIHJldHVybiBsb3JlbS5nZW5lcmF0ZVBhcmFncmFwaHMoY291bnQpO1xyXG4gICAgY2FzZSBcInNlbnRlbmNlc1wiOlxyXG4gICAgY2FzZSBcInNlbnRlbmNlXCI6XHJcbiAgICAgIHJldHVybiBsb3JlbS5nZW5lcmF0ZVNlbnRlbmNlcyhjb3VudCk7XHJcbiAgICBjYXNlIFwid29yZHNcIjpcclxuICAgIGNhc2UgXCJ3b3JkXCI6XHJcbiAgICAgIHJldHVybiBsb3JlbS5nZW5lcmF0ZVdvcmRzKGNvdW50KTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxufTtcclxuXHJcbmV4cG9ydCB7IGxvcmVtSXBzdW0sIExvcmVtSXBzdW0gfTtcclxuIl19","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputWrapper\":\"inputWrapper---kpcZa\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"header---P8Udm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"separator\":\"separator---_XtGe\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"listSmall\":\"listSmall---2rWX2\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"badge\":\"badge---33IH_\",\"green-badge\":\"green-badge---1KAhp badge---33IH_\",\"grey-badge\":\"grey-badge---JwLYR badge---33IH_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"confirmModal\":\"confirmModal---23BTu\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"warning\":\"warning---22fd1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"panelContainer\":\"panelContainer---3CvOB\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"layout\":\"layout---3yPL3\"};","module.exports = (__webpack_require__(28))(1448);","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport AbsolutePositioned from '../absolute-positioned';\n\nclass Popover extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { popoverWidth: 0 };\n\n    bindAll(this, ['handleClick', 'handleKeyDown']);\n  }\n\n  componentDidMount() {\n    this.updateEventHandlers();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.isVisible === this.props.isVisible) {\n      return;\n    }\n\n    /**\n     * This is a hack but AbsolutePositioned doesn't render\n     * its children when isVisible is false this.popoverRef\n     * won't be defined at the point of componentDidUpdate.\n     *\n     * By calling updatePosition in an async manner we can\n     * be sure that the full component lifecycle has completed\n     * before we try and do DOM stuff.\n     */\n    setTimeout(() => this.updatePosition(), 0);\n\n    this.updateEventHandlers();\n  }\n\n  componentWillUnmount() {\n    this.removeEventHandlers();\n  }\n\n  handleClick(e) {\n    if (!this.popoverRef.contains(e.target)) {\n      this.props.onClose();\n    }\n  }\n\n  handleKeyDown(e) {\n    if (e.which === 27) {\n      // Esc\n      this.props.onClose();\n    }\n  }\n\n  render() {\n    const { target, isVisible, isRightAligned, above, render } = this.props;\n\n    if (!isVisible) {\n      return null;\n    }\n\n    const { top, left, height, width } = target.getBoundingClientRect();\n    let positionLeft = left;\n\n    if (isRightAligned) {\n      positionLeft = left - this.state.popoverWidth + width;\n    }\n\n    // Currently hard coded to be position at the bottom left of\n    // the target element.\n    // Ideally you would be able to pass in a position\n    // (above, below, right, left, etc)\n\n    return (\n      <AbsolutePositioned\n        isVisible\n        top={top + height + above}\n        left={positionLeft}\n      >\n        <div ref={ref => (this.popoverRef = ref)}>{render()}</div>\n      </AbsolutePositioned>\n    );\n  }\n\n  updateEventHandlers() {\n    const { isVisible } = this.props;\n\n    if (isVisible) {\n      this.addEventHandlers();\n    } else {\n      this.removeEventHandlers();\n    }\n  }\n\n  addEventHandlers() {\n    document.addEventListener('keydown', this.handleKeyDown);\n    document.addEventListener('click', this.handleClick);\n  }\n\n  removeEventHandlers() {\n    document.removeEventListener('keydown', this.handleKeyDown);\n    document.removeEventListener('click', this.handleClick);\n  }\n\n  updatePosition() {\n    if (this.props.isRightAligned && this.popoverRef) {\n      const { width: popoverWidth } = this.popoverRef.getBoundingClientRect();\n\n      if (this.state.popoverWidth !== popoverWidth) {\n        this.setState({ popoverWidth }); //eslint-disable-line\n      }\n    }\n  }\n}\n\nPopover.defaultProps = {\n  above: 0,\n};\n\nPopover.propTypes = {\n  isVisible: PropTypes.bool.isRequired,\n  render: PropTypes.func.isRequired,\n  onClose: PropTypes.func.isRequired,\n  above: PropTypes.number,\n  isRightAligned: PropTypes.bool,\n  target: PropTypes.instanceOf(Element),\n};\n\nexport default Popover;\n","import DatabaseClient from './database-client';\n\nexport default DatabaseClient;\n","import apolloClient from '../../services/concierge-service/apollo-client';\nimport DatabaseQuery from '../database-query.graphql';\nimport DatabaseConnectionCreate from '../database-connection-create.graphql';\n\n/*\n * DatabaseClient\n *\n * Helper methods to exectute graphQL queries\n * against our database integration.\n *\n * client.create()\n * Creates a database connection and returns a Promise\n * that resolves to a DatabaseConnection onject.\n *\n * client.query()\n * Runs a given SQL query and returns a Promise that\n * resolves to a DatabaseQueryResults object.\n */\nconst DatabaseClient = () => {\n  const client = apolloClient.create();\n\n  const create = (name, engine, credentials) =>\n    client\n      .mutate({\n        mutation: DatabaseConnectionCreate,\n        variables: { name, engine, configInput: credentials },\n      })\n      .catch(e => {\n        return { error: e };\n      });\n\n  const query = (databaseID, q) =>\n    client\n      .query({\n        query: DatabaseQuery,\n        variables: { query: q, databaseID },\n      })\n      .catch(e => {\n        return { error: e };\n      });\n\n  return {\n    create,\n    query,\n  };\n};\n\nexport default DatabaseClient;\n","import { once } from 'lodash';\n\n/*\n * importQueryEditor\n *\n * Loads the query editor component asynchronously while ensuring\n * that the bundle is only ever requested once, even if it is\n * requested in multiple places simultaneously.\n *\n * PLEASE USE THIS INSTEAD OF IMPORTING THE\n * QUERY EDITOR ENTRY FILE DIRECTLY.\n */\nconst __importQueryEditor = () => import('./entry');\nconst importQueryEditor = once(__importQueryEditor);\n\nexport default importQueryEditor;\n","import { every } from 'lodash';\n\n// ******\n// In order to determine which visualisations are available, we compare the\n// schema and content of the returned results against a ruleset for each\n// viz, returning true or false for each one. Certain visualisations\n// will have multiple conditions that need to be satisfied.\n//\n// The `visualisationsValidator` takes a schema and returns an object with\n// the format: {\n//  number: [{ text: 'The result only contains unicorns', passing: true }, ...],\n//  geckometer: [...],\n//  line: [...]\n//  ... }\n// ******\n\nconst _isNumericColumn = col =>\n  col.dataType === 'INTEGER' || col.dataType === 'FLOAT';\nconst _isDateColumn = col => col.dataType === 'TIMESTAMP';\nconst _isStringColumn = col => col.dataType === 'STRING';\n\nconst _ruleset = {\n  number: [\n    {\n      text: 'The result is a single numeric value',\n      validator: (columns, rows) =>\n        columns.length === 1 &&\n        _isNumericColumn(columns[0]) &&\n        rows.length === 1,\n    },\n  ],\n  geckometer: [\n    {\n      text: 'The result is a single numeric value',\n      validator: (columns, rows) =>\n        columns.length === 1 &&\n        _isNumericColumn(columns[0]) &&\n        rows.length === 1,\n    },\n  ],\n  line: [\n    {\n      text: 'The first column is a date/datetime (for X-axis labels)',\n      validator: columns => columns.length > 0 && _isDateColumn(columns[0]),\n    },\n    {\n      text: 'The remaining columns are all numeric',\n      validator: columns =>\n        columns.length > 1 && every(columns.slice(1), _isNumericColumn),\n    },\n  ],\n  column: [\n    {\n      text:\n        'The first column is a date, datetime or string (for X-axis labels)',\n      validator: columns =>\n        columns.length > 0 &&\n        (_isStringColumn(columns[0]) || _isDateColumn(columns[0])),\n    },\n    {\n      text: 'The remaining columns are all numeric',\n      validator: columns =>\n        columns.length > 1 && every(columns.slice(1), _isNumericColumn),\n    },\n  ],\n  bar: [\n    {\n      text: 'There are exactly two columns',\n      validator: columns => columns.length === 2,\n    },\n    {\n      text:\n        'The first column is a date, datetime or string (for Y-axis labels)',\n      validator: columns =>\n        columns.length > 0 &&\n        (_isStringColumn(columns[0]) || _isDateColumn(columns[0])),\n    },\n    {\n      text: 'The second column is numeric',\n      validator: columns => columns.length > 1 && _isNumericColumn(columns[1]),\n    },\n  ],\n  leaderboard: [\n    {\n      text: 'There are exactly two columns',\n      validator: columns => columns.length === 2,\n    },\n    {\n      text: 'The first column is a string (for Y-axis labels)',\n      validator: columns => columns.length > 0 && _isStringColumn(columns[0]),\n    },\n    {\n      text: 'The second column is numeric',\n      validator: columns => columns.length > 1 && _isNumericColumn(columns[1]),\n    },\n  ],\n  table: [\n    {\n      text: 'There are ten columns or fewer',\n      validator: columns => columns.length <= 10,\n    },\n  ],\n};\n\nconst visualisationsValidator = (columns, rows) => {\n  return Object.keys(_ruleset).map(vizType => ({\n    type: vizType,\n    rules: _ruleset[vizType].map(rule => ({\n      text: rule.text,\n      passing: rule.validator(columns, rows),\n    })),\n  }));\n};\n\nexport default visualisationsValidator;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { noop, upperFirst } from 'lodash';\nimport DatabaseClient from '../../database-client';\nimport importQueryEditor from '../query-editor/import-query-editor';\nimport AsyncComponentLoader from '../../../async-component-loader';\nimport { ModalHeading } from '../../../components/modal';\nimport Dimensions from '../../../hoc/dimensions';\nimport Button from '@UI/button';\nimport RuleBasedVisualisationPicker from '@UI/playground/rule-based-visualisation-picker';\nimport FormattedMessage, { formatMessage } from '../../../lib/i18n';\nimport {\n  getApolloErrorType,\n  ERROR_TYPES,\n} from '../../../services/concierge-service/error-types';\nimport Alert from '@UI/alert';\nimport ProgressBar from '@UI/progress-bar';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport styles from './query-editor-modal-style.scss';\nimport visualisationsValidator from '../../visualisations-validator';\n\nconst getErrorDetails = e => {\n  switch (getApolloErrorType(e)) {\n    case ERROR_TYPES.INVALID_QUERY:\n    case ERROR_TYPES.QUERY_FAILED:\n    case ERROR_TYPES.CONNECTION_FAILED:\n    case ERROR_TYPES.VALUE_OUT_OF_RANGE:\n    case ERROR_TYPES.DANGEROUS_USER_PERMISSIONS:\n    case ERROR_TYPES.QUERY_RESPONSE_TOO_LARGE:\n    case ERROR_TYPES.CANCELED:\n      return {\n        title: formatMessage('database.query.error.queryFailed.title'),\n        message: upperFirst(e.graphQLErrors[0].message),\n      };\n\n    case ERROR_TYPES.TIMEOUT:\n      return {\n        title: formatMessage('database.query.error.timeout.title'),\n        message: formatMessage('database.query.error.timeout.message'),\n      };\n\n    default:\n      return {\n        title: formatMessage('database.query.error.unknown.title'),\n        message: formatMessage('database.query.error.unknown.message'),\n      };\n  }\n};\n\nconst AsyncQueryEditor = props => (\n  <AsyncComponentLoader\n    importComponent={importQueryEditor}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return (\n          <div className={styles.loadingPositioner}>\n            <LoadingSpinner />\n          </div>\n        );\n      }\n\n      const { QueryEditor } = component;\n\n      return <QueryEditor {...props} />;\n    }}\n  />\n);\n\nclass QueryEditorModalComponentContent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      query: props.initialValue,\n      loading: false,\n      queryResult: null,\n      error: null,\n    };\n\n    this.client = new DatabaseClient();\n    this.handleRunQuery = this.handleRunQuery.bind(this);\n    this.handleQueryInput = this.handleQueryInput.bind(this);\n    this.handleSelectVisualisation = this.handleSelectVisualisation.bind(this);\n  }\n\n  async handleRunQuery() {\n    this.setState({ loading: true, queryResult: null });\n\n    const { query } = this.state;\n    const { databaseId } = this.props;\n    this.props.onRunQuery(query);\n    try {\n      const { data, error } = await this.client.query(databaseId, query);\n      if (error) {\n        this.handleError(error);\n        return;\n      }\n\n      this.setState({ loading: false, queryResult: data.databaseQuery });\n      this.props.onQuerySuccess(data);\n    } catch (error) {\n      this.handleError(error);\n    }\n  }\n\n  handleError(error) {\n    this.setState({ loading: false, error: getErrorDetails(error) });\n    this.props.onQueryError(error);\n  }\n\n  handleQueryInput(value) {\n    this.setState({ query: value, queryResult: null, error: null });\n  }\n\n  handleSelectVisualisation(vizType) {\n    const { onConfirm } = this.props;\n    const { query, queryResult } = this.state;\n\n    onConfirm(query, vizType, {\n      data: {\n        databaseQuery: queryResult,\n      },\n    });\n  }\n\n  getProgressStatus() {\n    const { loading, error, queryResult } = this.state;\n\n    if (!!queryResult) {\n      return ProgressBar.STATUSES.SUCCESS;\n    }\n\n    if (!!loading) {\n      return ProgressBar.STATUSES.LOADING;\n    }\n\n    if (!!error) {\n      return ProgressBar.STATUSES.ERROR;\n    }\n\n    return ProgressBar.STATUSES.IDLE;\n  }\n\n  render() {\n    const { query, loading, queryResult, error } = this.state;\n\n    return (\n      <div className={styles.container}>\n        <div className={styles.header}>\n          <ModalHeading>\n            <FormattedMessage id=\"database.config.queryEditorModalHeader\" />\n          </ModalHeading>\n        </div>\n        <div className={styles.editorContainer}>\n          <Dimensions>\n            {({ width, height }) => (\n              <AsyncQueryEditor\n                onChange={this.handleQueryInput}\n                value={query}\n                disabled={loading}\n                height={height}\n                width={width}\n              />\n            )}\n          </Dimensions>\n        </div>\n        <div className={styles.footer}>\n          <div className={styles.buttons}>\n            <Button\n              onClick={this.handleRunQuery}\n              disabled={loading}\n              size={Button.SIZES.LARGE}\n            >\n              {loading ? (\n                <FormattedMessage id=\"database.config.button.running\" />\n              ) : (\n                <FormattedMessage id=\"database.config.button.run\" />\n              )}\n            </Button>\n          </div>\n          {queryResult && (\n            <div className={styles.editorMessage}>\n              <span className={styles.success}>\n                <FormattedMessage id=\"database.config.success.title\" />\n              </span>\n              <span className={styles.successSubtitle}>\n                <FormattedMessage id=\"database.config.success.subtitle\" />\n              </span>\n              <RuleBasedVisualisationPicker\n                visualisations={visualisationsValidator(\n                  queryResult.columns,\n                  queryResult.rows,\n                )}\n                onSelect={this.handleSelectVisualisation}\n              />\n            </div>\n          )}\n          {error && !loading && (\n            <div className={styles.error}>\n              <Alert\n                type={Alert.TYPES.ERROR}\n                title={error.title}\n                message={error.message}\n              />\n            </div>\n          )}\n          <div className={styles.progressBar}>\n            <ProgressBar status={this.getProgressStatus()} />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nQueryEditorModalComponentContent.defaultProps = {\n  initialValue: '',\n  onConfirm: noop,\n  onQueryError: noop,\n  onQuerySuccess: noop,\n  onRunQuery: noop,\n};\n\nQueryEditorModalComponentContent.propTypes = {\n  databaseId: PropTypes.string,\n  initialValue: PropTypes.string,\n  onConfirm: PropTypes.func,\n  onQueryError: PropTypes.func,\n  onQuerySuccess: PropTypes.func,\n  onRunQuery: PropTypes.func,\n};\n\nexport default QueryEditorModalComponentContent;\nexport { AsyncQueryEditor };\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Modal from '../../../components/modal';\nimport QueryEditorModalComponentContent from './query-editor-modal-component-content';\n\nclass QueryEditorModalComponent extends Component {\n  render() {\n    const { isOpen, onClose, ...contentProps } = this.props;\n\n    return (\n      <Modal visible={isOpen} onClose={onClose}>\n        <QueryEditorModalComponentContent {...contentProps} />\n      </Modal>\n    );\n  }\n}\n\nQueryEditorModalComponent.propTypes = {\n  isOpen: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nexport default QueryEditorModalComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { CustomPicker as customPicker } from 'react-color';\nimport { Saturation, Hue } from 'react-color/lib/components/common';\nimport { debounce, noop } from 'lodash';\nimport ColorPickerSwatch from '../../swatch/color-picker-swatch';\nimport Popover from '../../popover';\n\nimport style from './color-picker-input-style.scss';\n\nconst BaseColorPicker = props => (\n  <div className={style.colorPicker}>\n    <div className={style.saturation}>\n      <Saturation {...props} />\n    </div>\n    <div className={style.hue}>\n      <Hue\n        {...props}\n        direction=\"vertical\"\n        pointer={() => <div className={style.pointer} />}\n      />\n    </div>\n  </div>\n);\n\nconst ColorPicker = customPicker(BaseColorPicker);\n\nclass ColorPickerInput extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      open: false,\n      color: props.color,\n    };\n\n    this.handleColorChange = this.handleColorChange.bind(this);\n    this.emitColorChange = debounce(this.emitColorChange.bind(this), 50);\n  }\n\n  handleColorChange(color) {\n    this.setState({ color: color.hsl });\n    this.emitColorChange(color.hex);\n  }\n\n  handleClick() {\n    this.setState(({ open }) => ({ open: !open }));\n  }\n\n  handleClose() {\n    this.setState({ open: false });\n  }\n\n  renderColorPicker() {\n    const { color, open } = this.state;\n\n    return (\n      <Popover\n        target={this.swatchRef}\n        isVisible={open}\n        onClose={() => this.handleClose()}\n        render={() => (\n          <ColorPicker color={color} onChange={this.handleColorChange} />\n        )}\n      />\n    );\n  }\n\n  render() {\n    const { color } = this.props;\n\n    return (\n      <div ref={ref => (this.swatchRef = ref)}>\n        <ColorPickerSwatch onClick={() => this.handleClick()} color={color} />\n        {this.renderColorPicker()}\n      </div>\n    );\n  }\n\n  emitColorChange(hex) {\n    this.props.onChange(hex);\n  }\n}\n\nColorPickerInput.defaultPropTypes = {\n  onChange: noop,\n};\n\nColorPickerInput.propTypes = {\n  color: PropTypes.string.isRequired,\n  onChange: PropTypes.func,\n};\n\nexport default ColorPickerInput;\nexport { ColorPicker, BaseColorPicker };\n","import ColorPickerInput from './color-picker-input-component';\nexport default ColorPickerInput;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Swatch from '../swatch-component';\n\nconst ColorPickerSwatch = props => {\n  const { color } = props;\n\n  return <Swatch {...props} colorStops={[color]} hoverIcon=\"eye-dropper\" />;\n};\n\nColorPickerSwatch.propTypes = {\n  color: PropTypes.string.isRequired,\n};\n\nexport default ColorPickerSwatch;\n","import ColorPickerSwatch from './color-picker-swatch-component';\n\nexport default ColorPickerSwatch;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport DropItem from '../drop-item';\n\nclass DropLinkComponent extends Component {\n  render() {\n    const classes = classNames('drop-menu-control', this.props.className);\n    return (\n      <DropItem>\n        <a {...this.props} className={classes} />\n      </DropItem>\n    );\n  }\n}\n\nDropLinkComponent.propTypes = {\n  className: PropTypes.string,\n};\n\nexport default DropLinkComponent;\n","import DropLink from './drop-link-component';\nexport default DropLink;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\n\nimport style from './drop-item-style.scss';\n\nclass DropItemComponent extends Component {\n  render() {\n    const { className } = this.props;\n    const classes = classNames(style.dropItem, className);\n\n    return (\n      <li {...this.props} role=\"menuitem\" tabIndex={-1} className={classes} />\n    );\n  }\n}\n\nDropItemComponent.propTypes = {\n  className: PropTypes.string,\n};\n\nexport default DropItemComponent;\n","import DropItem from './drop-item-component';\nexport default DropItem;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"featureGate\":\"featureGate---3poxb\",\"featureGateInner\":\"featureGateInner---2EzeB\",\"featureGateTitle\":\"featureGateTitle---CHhV1\",\"featureGateContent\":\"featureGateContent---3xbQP\",\"featureGateAction\":\"featureGateAction---3ZeZD\",\"featureGateDesktopLink\":\"featureGateDesktopLink---1hQdk\"};","import React, { Component } from 'react';\n\nconst renderEvery = interval => DecoratedComponent => {\n  const displayName =\n    DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n  class RenderEvery extends Component {\n    static get displayName() {\n      return `renderEvery(${displayName})`;\n    }\n\n    constructor(props) {\n      super(props);\n      this.state = {\n        time: Date.now(),\n      };\n    }\n\n    componentDidMount() {\n      this.registerTimeout();\n    }\n\n    componentWillUnmount() {\n      clearTimeout(this.timer);\n    }\n\n    render() {\n      const { time } = this.state;\n      return <DecoratedComponent {...this.props} time={time} />;\n    }\n\n    registerTimeout() {\n      this.timer = setTimeout(() => {\n        const time = Date.now();\n        this.setState({ time });\n        this.registerTimeout();\n      }, interval);\n    }\n  }\n\n  return RenderEvery;\n};\n\nexport default renderEvery;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport moment from 'moment';\nimport renderEvery from '../../../hoc/render-every';\n\nconst MOMENT_TIME_FORMAT = 'HH:mm';\n\nconst FooterClock = ({ time }) => {\n  // Exposure uses the id `dashboard-footer-clock` to remove the clock from the DOM before taking a screenshot\n  return (\n    <div id=\"dashboard-footer-clock\">\n      {moment(time).format(MOMENT_TIME_FORMAT)}\n    </div>\n  );\n};\n\nFooterClock.propTypes = {\n  time: PropTypes.number, // unix timestamp\n};\n\nconst UpdatingFooterClock = renderEvery(1000)(FooterClock);\n\nexport { UpdatingFooterClock as default, FooterClock };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---19RYg\",\"emptyLoops\":\"emptyLoops---2fPyu\",\"emptyLoopsImage\":\"emptyLoopsImage---cP-px\",\"inputContainer\":\"inputContainer---M-aNf\",\"manageLink\":\"manageLink---2XbiD\",\"manageLinkIcon\":\"manageLinkIcon---3EGpw\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---28usM\",\"header\":\"header---_0HDp\",\"content\":\"content---NlxY4\",\"list\":\"list---5pva3\",\"footer\":\"footer---3gB0V\",\"infoMessage\":\"infoMessage---3pJpL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"toastInner\":\"toastInner---t0tMp\",\"toastWrapper\":\"toastWrapper---3P-jy\",\"toastText\":\"toastText---2Mmep\",\"statusText\":\"statusText---xLY6P\",\"progressText\":\"progressText---2PDv7\",\"toastProgress\":\"toastProgress---3L7vr\"};","import ColumnChart from './column-chart-component';\nimport seriesPresenter from '../series-presenter';\n\nexport default seriesPresenter(ColumnChart);\n","import seriesPresenter from '../series-presenter';\nimport BarChartComponent from './bar-chart-component';\n\nexport default seriesPresenter(BarChartComponent);\n","import React from 'react';\nimport Funnel from './funnel-component';\nimport FunnelDataLimiter from './funnel-data-limiter';\n\nconst DataLimitedFunnel = props => (\n  <FunnelDataLimiter {...props}>\n    {items => <Funnel {...props} items={items} />}\n  </FunnelDataLimiter>\n);\nexport default DataLimitedFunnel;\n","import React from 'react';\nimport Geckometer from './geckometer-component';\nimport { isFinite } from 'lodash';\nimport { parseDurationInput } from '../../lib/humanise-number';\n\nconst mapDurationThresholdsToUnit = (thresholds, unit) =>\n  thresholds.map(value => {\n    if (!isFinite(value)) return value;\n\n    return parseDurationInput({ milliseconds: value }, unit);\n  });\n\nconst pickIndicators = props => {\n  const {\n    configuration: { indicators: configIndicators } = {},\n    indicators: dataIndicators,\n  } = props;\n  // On the config screen indicators only exist in data\n  const indicators = configIndicators || dataIndicators;\n\n  if (indicators && indicators.thresholds) {\n    return indicators;\n  }\n\n  return { thresholds: [] };\n};\n\nconst GeckometerPresenter = props => {\n  let indicators = pickIndicators(props);\n  const { format, unit } = props;\n\n  if ('duration' === format) {\n    indicators = {\n      thresholds: mapDurationThresholdsToUnit(indicators.thresholds, unit),\n    };\n  }\n\n  return <Geckometer {...props} indicators={indicators} />;\n};\n\nGeckometerPresenter.propTypes = {\n  format: Geckometer.propTypes.format,\n  unit: Geckometer.propTypes.unit,\n};\n\nGeckometerPresenter.canRender = Geckometer.canRender;\n\nexport default GeckometerPresenter;\n","import MapLoader from './map-loader-component';\n\nexport default MapLoader;\n","import Rag from './rag-component';\nexport default Rag;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport he from 'he';\nimport { isNaN } from 'lodash';\n\nconst WIDTH_BREAKPOINT = 434;\nconst HEIGHT_BREAKPOINT = 386;\nconst STATUS_CLASSES = ['negative', 'level', 'positive'];\nconst REVERSED_STATUS_CLASSES = STATUS_CLASSES.slice().reverse();\n\nconst RagVisualisationComponent = props => {\n  const { item: allItems = [], type } = props.data;\n  const { width, height } = props.layout.pixels;\n  const isLarge = width >= WIDTH_BREAKPOINT && height >= HEIGHT_BREAKPOINT;\n  const className = classNames({ isLarge });\n  const itemClassName = classNames(\n    {\n      't-size-x60': isLarge,\n      't-size-x36': !isLarge,\n    },\n    'number',\n  );\n  const statusClasses =\n    type === 'reverse' ? REVERSED_STATUS_CLASSES : STATUS_CLASSES;\n  const items = allItems.map(({ text, value: rawValue, prefix = '' }, i) => {\n    // Do not render the row if an invalid value is supplied\n    let value = parseFloat(rawValue);\n    if (isNaN(value)) {\n      return null;\n    }\n\n    const unescapedPrefix = he.decode(prefix);\n\n    // If the prefix is a percentage symbol, we make it a suffix instead\n    const symbolAppendField = unescapedPrefix === '%' ? 'suffix' : 'prefix';\n\n    value = humaniseNumber(value, {\n      numberFormat: { [symbolAppendField]: unescapedPrefix },\n    });\n\n    return (\n      <tr key={i}>\n        <td className={`${itemClassName} ${statusClasses[i]}`}>{value}</td>\n        <td className=\"t-secondary\">{text}</td>\n      </tr>\n    );\n  });\n\n  return (\n    <div className=\"rag-visualisation\">\n      <table className={className}>\n        <tbody>{items}</tbody>\n      </table>\n    </div>\n  );\n};\nRagVisualisationComponent.propTypes = {\n  layout: PropTypes.shape({\n    pixels: PropTypes.shape({\n      height: PropTypes.number,\n      width: PropTypes.number,\n    }),\n  }).isRequired,\n  data: PropTypes.shape({\n    item: PropTypes.arrayOf(\n      PropTypes.shape({\n        prefix: PropTypes.string,\n        text: PropTypes.string,\n        value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n      }),\n    ),\n    type: PropTypes.oneOf(['reverse', undefined]),\n  }),\n};\n\nexport default RagVisualisationComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport PieChartComponent from './pie-chart-component';\nimport { map } from 'lodash';\n\nconst PieChart = ({ layout, item }) => {\n  const data = map(item, slice => {\n    const { value, color, colour } = slice;\n    const customColor = color || colour;\n    let transformedColor;\n\n    if (customColor) {\n      transformedColor =\n        customColor.indexOf('#') === 0 ? customColor : `#${customColor}`;\n    }\n\n    return {\n      ...slice,\n      value: typeof value === 'string' ? parseFloat(value) : value,\n      color: transformedColor,\n    };\n  });\n\n  return <PieChartComponent layout={layout} data={data} />;\n};\nPieChart.propTypes = {\n  item: PropTypes.arrayOf(\n    PropTypes.shape({\n      color: PropTypes.string,\n      colour: PropTypes.string,\n      label: PropTypes.string,\n      value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n    }),\n  ),\n  layout: PropTypes.object,\n};\n\nexport default PieChart;\n","import List from './list-component';\nexport default List;\n","import Clock from './clock-component';\n\nexport default Clock;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { isArray, isEmpty } from 'lodash';\nimport moment from 'moment';\n\nconst WIDTH_BREAKPOINT = 462;\nconst HEIGHT_BREAKPOINT = 418;\n\nclass Clock extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      time: this.getCurrentTime(props),\n      use24HourClock: this.getUse24HourClock(props),\n    };\n  }\n\n  componentDidMount() {\n    this.interval = setInterval(() => {\n      this.setState({\n        time: this.getCurrentTime(this.props),\n      });\n    }, 1000 * 10);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    const newState = {};\n    if (\n      nextProps.configuration.timezone_offset !==\n      this.props.configuration.timezone_offset\n    ) {\n      newState.time = this.getCurrentTime(nextProps);\n    }\n    if (\n      nextProps.configuration.fullhour !== this.props.configuration.fullhour\n    ) {\n      newState.use24HourClock = this.getUse24HourClock(nextProps);\n    }\n\n    if (!isEmpty(newState)) {\n      this.setState(newState);\n    }\n  }\n\n  componentWillUnmount() {\n    clearInterval(this.interval);\n  }\n\n  getCurrentTime(props) {\n    // Offset is in hours, convert to ms\n    const { configuration: { timezone_offset: offset = 0 } = {} } = props;\n    const timeOffset = offset * 60 * 60 * 1000;\n\n    const now = new Date();\n    const localOffset = now.getTimezoneOffset() * 60000;\n    const newTime = now.getTime() + localOffset + timeOffset;\n    return moment(newTime);\n  }\n\n  getUse24HourClock(props) {\n    const { configuration: { fullhour = '1' } = {} } = props;\n\n    if (isArray(fullhour)) {\n      return !!fullhour[0];\n    }\n\n    return parseInt(fullhour, 10) === 1;\n  }\n\n  render() {\n    const { layout: { pixels: { width, height } = {} } = {} } = this.props;\n    const { time, use24HourClock } = this.state;\n\n    const isLargeTemplate =\n      width >= WIDTH_BREAKPOINT && height >= HEIGHT_BREAKPOINT;\n\n    let timeSize = '3_75rem';\n    let dateSize = '1_5rem';\n\n    if (isLargeTemplate) {\n      timeSize = '6_75rem';\n      dateSize = '2_25rem';\n    } else if (use24HourClock) {\n      timeSize = '4_5rem';\n    }\n\n    const timeClasses = `time t-size-x${timeSize}`;\n    const dateClasses = `date t-secondary t-size-x${dateSize}`;\n    return (\n      <div className=\"clock-visualisation\">\n        <time className={timeClasses}>\n          {time.format(use24HourClock ? 'HH' : 'h')}:{time.format('mm')}\n          {!use24HourClock && <sub>{time.format('A')}</sub>}\n        </time>\n\n        <time className={dateClasses}>\n          <span className=\"day\">{time.format('dddd')}</span>\n          <span className=\"full-date\">\n            {time.format('D')} {time.format('MMM')} {time.format('YYYY')}\n          </span>\n        </time>\n      </div>\n    );\n  }\n}\n\nClock.defaultProps = {\n  configuration: {\n    timezone_offset: 0,\n    fullhour: '1',\n  },\n};\n\nClock.propTypes = {\n  configuration: PropTypes.shape({\n    fullhour: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),\n    timezone_offset: PropTypes.number,\n  }),\n  layout: PropTypes.shape({\n    pixels: PropTypes.shape({\n      height: PropTypes.number,\n      width: PropTypes.number,\n    }),\n  }),\n};\n\nexport default Clock;\n","import Bullet from './bullet-component';\nexport default Bullet;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport {\n  take,\n  isArray,\n  maxBy,\n  minBy,\n  map,\n  sortBy,\n  last,\n  isUndefined,\n} from 'lodash';\n\nconst LABEL_WIDTH = 195;\nconst LABEL_HEIGHT = 58;\nconst CHART_SIZE_HORIZONTAL = 85;\nconst CHART_SIZE_VERTICAL = 101;\nconst MIN_SPACE_FOR_LABELS = 430;\n\nconst getOrientation = (width, height, userOrientation) => {\n  // When our visualisation is roughly square we allow the user\n  // to specify the orientation\n  if (Math.abs(width - height) < 40) {\n    if (userOrientation === 'vertical') {\n      return 'vertical';\n    }\n\n    return 'horizontal';\n  } else if (width < height) {\n    return 'vertical';\n  }\n\n  return 'horizontal';\n};\n\nconst getMaxChartCount = (orientation, width, height) => {\n  switch (orientation) {\n    case 'vertical':\n      return Math.floor(width / CHART_SIZE_VERTICAL);\n    default:\n      return Math.floor(height / CHART_SIZE_HORIZONTAL);\n  }\n};\n\nconst getScaleLength = point => {\n  const max = maxBy(point, parseFloat);\n  const min = minBy(point, parseFloat);\n\n  return max - min;\n};\n\nconst getChartSize = (orientation, width, height) => {\n  switch (orientation) {\n    case 'vertical':\n      return height;\n    default:\n      return width;\n  }\n};\n\nconst getShowLabels = (orientation, width) => {\n  switch (orientation) {\n    case 'vertical':\n      return true;\n    default:\n      return width >= MIN_SPACE_FOR_LABELS;\n  }\n};\n\nconst getLabelOffset = (orientation, showLabels) => {\n  if (orientation === 'horizontal' && showLabels) {\n    return LABEL_WIDTH;\n  }\n\n  if (orientation === 'vertical') {\n    return LABEL_HEIGHT;\n  }\n\n  return 0;\n};\n\nconst pickColor = (value, color) => value.color || value.colour || color;\n\n// Calculates the size of a chart value based on the size of the chart,\n// the data value and the scale length\nconst scaleSize = (value, scaleFactor) => {\n  return Math.floor(value * scaleFactor);\n};\n\nconst getRangeItems = (range, availableSize, scaleFactor) => {\n  let ragRanges = map(range, (value, key) => {\n    const size = scaleSize(value.end - value.start, scaleFactor);\n\n    return {\n      color: pickColor(value, key),\n      start: value.start,\n      size,\n    };\n  });\n  const rangeTotalSize = ragRanges.reduce((total, { size }) => total + size, 0);\n  ragRanges = sortBy(ragRanges, value => parseFloat(value.start));\n\n  // Check total range length and bump up to fit if less than the\n  // total bullet width\n  if (rangeTotalSize < availableSize) {\n    const lastRag = last(ragRanges);\n\n    return [\n      ...ragRanges.slice(0, -1),\n      { ...lastRag, size: lastRag.size + (availableSize - rangeTotalSize) },\n    ];\n  }\n\n  return ragRanges;\n};\n\n// Gets the indicators to show both the current and projected values\nconst getCurrentAgainstProjectedState = (\n  { start: currentStart, end: currentEnd },\n  { start: projectedStart, end: projectedEnd },\n) => {\n  const start = minBy([currentStart, projectedStart], parseFloat);\n  const end = maxBy([currentEnd, projectedEnd], parseFloat);\n\n  return {\n    offset: start,\n    size: end - start,\n    bar: currentEnd - currentStart,\n  };\n};\n\n// Gets the indicators to only show the current value\nconst getCurrentState = ({ start: currentStart, end: currentEnd }) => ({\n  offset: currentStart,\n  size: currentEnd - currentStart,\n});\n\n// Gets the indicators to only show the projected value\nconst getProjectedState = ({ start: projectedStart, end: projectedEnd }) => ({\n  offset: projectedStart,\n  size: projectedEnd - projectedStart,\n  bar: 0,\n});\n\nconst getMeasure = ({ current, projected } = {}) => {\n  if (current && projected) {\n    return getCurrentAgainstProjectedState(current, projected);\n  }\n\n  if (current) {\n    return getCurrentState(current);\n  }\n\n  if (projected) {\n    return getProjectedState(projected);\n  }\n\n  return null;\n};\n\nconst renderComparative = (\n  rawComparative,\n  firstAxisPoint,\n  scaleFactor,\n  orientation,\n) => {\n  if (!rawComparative) {\n    return null;\n  }\n\n  const comparative = isArray(rawComparative)\n    ? rawComparative\n    : [rawComparative];\n  const position = orientation === 'vertical' ? 'bottom' : 'left';\n\n  return map(comparative, (point, i) => {\n    const offset = point - firstAxisPoint;\n    const size = scaleSize(offset, scaleFactor);\n\n    return <div key={i} className=\"graph-line\" style={{ [position]: size }} />;\n  });\n};\n\nconst renderMeasure = (\n  rawMeasure,\n  availableSize,\n  firstAxisPoint,\n  scaleFactor,\n  orientation,\n) => {\n  const measure = getMeasure(rawMeasure, firstAxisPoint, scaleFactor);\n\n  if (!measure) {\n    return null;\n  }\n\n  const { offset: originalOffset, size, bar } = measure;\n  const offset = originalOffset - firstAxisPoint;\n  const barSize = isUndefined(bar)\n    ? availableSize\n    : scaleSize(bar, scaleFactor);\n\n  let float = 'left';\n  let position = 'left';\n  let dimension = 'width';\n\n  if (orientation === 'vertical') {\n    float = 'none';\n    position = 'bottom';\n    dimension = 'height';\n  }\n\n  return (\n    <div\n      className=\"graph-bar\"\n      style={{\n        [dimension]: scaleSize(size, scaleFactor),\n        [position]: scaleSize(offset, scaleFactor),\n      }}\n    >\n      {barSize > 0 && (\n        <span\n          className=\"graph-measure\"\n          style={{ [dimension]: barSize, float }}\n        />\n      )}\n    </div>\n  );\n};\n\nconst renderRange = (range, availableSize, scaleFactor, orientation) => {\n  const dimension = orientation === 'vertical' ? 'height' : 'width';\n\n  let rangeItems = getRangeItems(range, availableSize, scaleFactor);\n\n  if (orientation === 'vertical') {\n    rangeItems = rangeItems.slice().reverse();\n  }\n\n  return rangeItems.map(({ color, size }, i) => (\n    <div key={i} className={`ind ind-${color}`} style={{ [dimension]: size }} />\n  ));\n};\n\nconst renderLabels = item => (\n  <div className=\"graph-name\">\n    <span className=\"t-size-x18 t-main\">{item.label || ''}</span>\n    <span className=\"t-size-x11 t-secondary\">{item.sublabel || ''}</span>\n  </div>\n);\n\nconst renderBullet = (item, availableSize, chartSize, orientation) => {\n  const scaleLength = getScaleLength(item.axis.point);\n  const scaleFactor = availableSize / scaleLength;\n  const { comparative: { point: comparative } = {}, measure, range } = item;\n  let {\n    axis: { point: axis },\n  } = item;\n  const [firstAxisPoint] = axis;\n\n  if (orientation === 'vertical') {\n    axis = axis.slice().reverse();\n  }\n\n  return (\n    <div className=\"graph-body\">\n      <div className=\"graph-ind\">\n        {renderMeasure(\n          measure,\n          availableSize,\n          firstAxisPoint,\n          scaleFactor,\n          orientation,\n        )}\n        {renderComparative(\n          comparative,\n          firstAxisPoint,\n          scaleFactor,\n          orientation,\n        )}\n        {renderRange(range, availableSize, scaleFactor, orientation)}\n      </div>\n      <div className=\"graph-scale t-secondary\">\n        <ul className={`p-${axis.length}`}>\n          {axis.map((value, i) => (\n            <li key={i}>{value}</li>\n          ))}\n        </ul>\n      </div>\n    </div>\n  );\n};\n\nconst BulletVisualisationComponent = ({ layout, data }) => {\n  let { item: items = [] } = data;\n  const {\n    pixels: { height, width },\n  } = layout;\n  const orientation = getOrientation(width, height, data.orientation);\n  const maxChartCount = getMaxChartCount(orientation, width, height);\n  const graphClassName = classNames('graph', orientation);\n  const chartSize = getChartSize(orientation, width, height);\n  const showLabels = getShowLabels(orientation, width);\n  const availableSize = chartSize - getLabelOffset(orientation, showLabels);\n\n  // `item` can be either an object or an array of objects\n  // TODO it might be nice to move this out of the visualisation into a presentation layer\n  if (!isArray(items)) {\n    items = [items];\n  }\n\n  // Render as many items as we can fit\n  items = take(items, maxChartCount);\n\n  return (\n    <div className=\"bullet-visualisation\">\n      <div className=\"flex-container\">\n        <div>\n          {items.map((item, i) => (\n            <div key={i} className={graphClassName}>\n              {showLabels && renderLabels(item)}\n              {renderBullet(item, availableSize, chartSize, orientation)}\n            </div>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nconst STRING_OR_NUMBER_PROP_TYPE = PropTypes.oneOfType([\n  PropTypes.number,\n  PropTypes.string,\n]);\nconst RANGE_PROP_TYPE = PropTypes.shape({\n  color: PropTypes.string,\n  colour: PropTypes.string,\n  end: STRING_OR_NUMBER_PROP_TYPE,\n  start: STRING_OR_NUMBER_PROP_TYPE,\n});\nconst RANGE_OBJECT_PROP_TYPE = PropTypes.shape({\n  amber: RANGE_PROP_TYPE,\n  green: RANGE_PROP_TYPE,\n  red: RANGE_PROP_TYPE,\n});\nconst ITEM_PROP_TYPE = PropTypes.shape({\n  axis: PropTypes.shape({\n    point: PropTypes.arrayOf(STRING_OR_NUMBER_PROP_TYPE),\n  }),\n  comparative: PropTypes.shape({\n    point: PropTypes.oneOfType([\n      STRING_OR_NUMBER_PROP_TYPE,\n      PropTypes.arrayOf(STRING_OR_NUMBER_PROP_TYPE),\n    ]),\n  }),\n  label: PropTypes.string,\n  measure: PropTypes.shape({\n    current: RANGE_PROP_TYPE,\n    projected: RANGE_PROP_TYPE,\n  }),\n  range: PropTypes.oneOfType([\n    RANGE_OBJECT_PROP_TYPE,\n    PropTypes.arrayOf(RANGE_PROP_TYPE),\n  ]),\n  sublabel: PropTypes.string,\n});\nBulletVisualisationComponent.propTypes = {\n  layout: PropTypes.shape({\n    pixels: PropTypes.shape({\n      height: PropTypes.number,\n      width: PropTypes.number,\n    }),\n  }).isRequired,\n  data: PropTypes.shape({\n    item: PropTypes.oneOfType([\n      ITEM_PROP_TYPE,\n      PropTypes.arrayOf(ITEM_PROP_TYPE),\n    ]).isRequired,\n    orientation: PropTypes.oneOf(['horizontal', 'vertical']),\n  }),\n};\n\nexport default BulletVisualisationComponent;\n","import {\n  chain,\n  isArray,\n  isNull,\n  isUndefined,\n  omit,\n  indexOf,\n  last,\n  get,\n} from 'lodash';\nimport PropTypes from 'prop-types';\nimport he from 'he';\n\nconst getValue = props => {\n  return chain(props.item)\n    .compact()\n    .map('value')\n    .reject(isNull)\n    .value()\n    .reverse();\n};\n\nconst hasTrendLine = props => {\n  return isArray(props.item[1]);\n};\n\nconst hasLegacyStringValue = props => {\n  return props.item[0].type && props.item[0].type === 'text';\n};\n\nconst composeDurationContext = (context, props) => {\n  if (props.item[0].type && props.item[0].type === 'time_duration') {\n    return { ...context, format: 'duration', unit: 'milliseconds' };\n  }\n\n  return context;\n};\n\nconst composeLegacyStringContext = (context, props) => {\n  // sadly we need to maintain support for when primary metric is given as a string\n  if (hasLegacyStringValue(props)) {\n    return {\n      ...context,\n      hasLegacyStringValue: true,\n      legacyStringValue: `${props.item[0].value}`,\n    };\n  }\n\n  return context;\n};\n\nconst composeNumberFormatContext = (context, props) => {\n  const numberFormat = props.numberFormat || {};\n\n  if (props.item[0].prefix) {\n    const prefix = he.decode(props.item[0].prefix);\n\n    // When prefix is a percentage sign, render it as suffix\n    if (prefix === '%') {\n      numberFormat.suffix = numberFormat.suffix || prefix;\n    } else {\n      numberFormat.prefix = numberFormat.prefix || prefix;\n    }\n  }\n\n  if (props.precision !== undefined && isUndefined(numberFormat.precision)) {\n    numberFormat.precision = props.precision;\n  }\n\n  if (['none', 'K', 'M', 'B', 'T'].includes(props.abbreviation)) {\n    numberFormat.abbreviation = numberFormat.abbreviation || props.abbreviation;\n  }\n\n  return { ...context, numberFormat };\n};\n\nconst composeComparisonContext = (context, props) => {\n  // secondary is goal - legacy string not supported!\n  if (props.threshold && !hasLegacyStringValue(props)) {\n    return {\n      ...context,\n      threshold: parseFloat(props.threshold),\n      comparison: { type: 'goal' },\n    };\n  }\n\n  // secondary is a trendline\n  if (hasTrendLine(props)) {\n    return {\n      ...context,\n      trendline: props.item[1].map(parseFloat),\n      comparison: { type: 'trendline' },\n    };\n  }\n\n  // secondary is a number - legacy string not supported!\n  if (\n    getValue(props).length > 1 &&\n    !hasTrendLine(props) &&\n    !hasLegacyStringValue(props)\n  ) {\n    const isReversed =\n      props.type === 'reverse' ||\n      !!(props.data && props.data.type === 'reverse');\n    return {\n      ...context,\n      comparison: {\n        type: props.absolute ? 'number' : 'percentage',\n        reversed: isReversed,\n        label: get(props, 'comparison.label'),\n        defaultLabel: props.item[1].text,\n      },\n    };\n  }\n\n  return context;\n};\n\nconst getVisualisationContext = props => {\n  let context = {\n    type: 'number',\n    value: getValue(props),\n    label: props.label,\n    defaultLabel: props.item[0].text,\n    canEdit: props.canEdit,\n    onConfigChange: props.onConfigChange,\n    widgetKey: props.widgetKey,\n  };\n\n  context = composeDurationContext(context, props);\n  context = composeLegacyStringContext(context, props);\n  context = composeNumberFormatContext(context, props);\n  context = composeComparisonContext(context, props);\n\n  return context;\n};\n\nconst pickThresholdState = (configuration, data) => {\n  const { indicators: { thresholds = [] } = {} } = configuration;\n\n  if (!thresholds.length) return false;\n\n  let visualisationValue = last(getValue(data));\n\n  if (data.format === 'percent') {\n    visualisationValue *= 100;\n  }\n  const neutralIndex = indexOf(thresholds, 'neutral');\n  const lowerThreshold = thresholds[neutralIndex - 1];\n  const upperThreshold = thresholds[neutralIndex + 1];\n\n  if (isFinite(lowerThreshold) && visualisationValue <= lowerThreshold) {\n    return thresholds[0];\n  }\n\n  if (isFinite(upperThreshold) && visualisationValue >= upperThreshold) {\n    return last(thresholds);\n  }\n\n  return 'neutral';\n};\n\nconst LegacyNumberTransformerComponent = ({ render, ...props }) => {\n  const transformedProps = {\n    ...omit(props, 'item'),\n    ...getVisualisationContext(props),\n  };\n\n  return render(transformedProps);\n};\nLegacyNumberTransformerComponent.propTypes = {\n  render: PropTypes.func.isRequired,\n};\nLegacyNumberTransformerComponent.getVisualisationStatus = (\n  configuration = {},\n  data = {},\n) => {\n  switch (pickThresholdState(configuration, data)) {\n    case 'warning':\n      return 'warningThresholdReached';\n    case 'positive':\n      return 'positiveThresholdReached';\n    default:\n      return undefined;\n  }\n};\n\nexport default LegacyNumberTransformerComponent;\n","import React from 'react';\nimport Dimensions from '../../hoc/dimensions';\nimport ResponsiveNumber from './responsive-number-component';\n\nconst DimensionsInjectorComponent = props => (\n  <Dimensions>\n    {({ width, height }) => (\n      <ResponsiveNumber {...props} width={width} height={height} />\n    )}\n  </Dimensions>\n);\n\nexport default DimensionsInjectorComponent;\n","import ResponsiveNumber from './dimensions-injector';\nexport default ResponsiveNumber;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isUndefined, isArray } from 'lodash';\nimport LegacyNumberTransformerComponent from './legacy-number-transformer-component';\nimport OrientedNumberComponent from './oriented-number-component';\nimport ResponsiveNumberComponent from '../responsive-number';\n\nconst NumberVisualisationPicker = props => {\n  const { canUseResponsiveNumberViz, ...restProps } = props;\n  const NumberComponent = canUseResponsiveNumberViz\n    ? ResponsiveNumberComponent\n    : OrientedNumberComponent;\n  // Skip the transformation for payloads that don't match the old style\n  // NOTE: This does not apply to Zendesk Talk, it does not have item\n  if (!isUndefined(props.item)) {\n    if (!isArray(props.item)) {\n      return null;\n    }\n    return (\n      <LegacyNumberTransformerComponent\n        {...restProps}\n        render={transformedProps => <NumberComponent {...transformedProps} />}\n      />\n    );\n  }\n\n  return <NumberComponent {...restProps} />;\n};\nNumberVisualisationPicker.propTypes = {\n  canUseResponsiveNumberViz: PropTypes.bool,\n  configuration: PropTypes.object,\n  item: PropTypes.oneOfType([\n    PropTypes.array,\n    PropTypes.number,\n    PropTypes.string,\n  ]),\n  serviceName: PropTypes.string,\n};\nNumberVisualisationPicker.canRender = OrientedNumberComponent.canRender;\nNumberVisualisationPicker.getVisualisationStatus = (\n  configuration,\n  data = {},\n) => {\n  if (!isUndefined(data.item)) {\n    return LegacyNumberTransformerComponent.getVisualisationStatus(\n      configuration,\n      data,\n    );\n  }\n\n  return OrientedNumberComponent.getVisualisationStatus(configuration, data);\n};\n\nexport default NumberVisualisationPicker;\n","import ClampLines from './clamp-lines-component';\n\nexport default ClampLines;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { compact } from 'lodash';\nimport Layout, { Column, Row } from '../../components/layout';\nimport ClampLines from '../../components/clamp-lines';\nimport RelativeTime from '../../components/relative-time';\nimport config from '../../universal/config';\n\nimport styles from './feed-row-styles.scss';\n\nclass FeedRow extends Component {\n  renderIcons(icons) {\n    if (!icons.length) return null;\n\n    return (\n      <Column className={styles.iconWrapper}>\n        {icons.map(icon => {\n          return icon;\n        })}\n      </Column>\n    );\n  }\n\n  render() {\n    const {\n      columns,\n      fields,\n      size,\n      typeScale,\n      layout: { width: parentWidth } = {},\n    } = this.props;\n    const classes = classNames(styles.item, styles[size]);\n\n    const mainStyleLineHeight = typeScale.increase(2).px();\n    const mainStyle = { fontSize: typeScale.px() };\n    const secondaryScale = typeScale.decrease(1);\n    const secondaryStyle = {\n      fontSize: secondaryScale.px(),\n      lineHeight: `${secondaryScale.increase(1).px()}px`,\n    };\n    const spaceWidth = secondaryScale.decrease(1).px();\n    const dividerStyle = { fontSize: spaceWidth, width: spaceWidth };\n\n    const icons = [];\n    let mainImage;\n    const children = fields.map((field, columnIndex) => {\n      const { format, useRelativeTime } = columns[columnIndex];\n      if (format === 'datetime' && useRelativeTime) {\n        return <RelativeTime datetime={field} />;\n      }\n\n      if (format === 'icon' || format === 'image') {\n        const src =\n          format === 'icon'\n            ? `${config.get().StaticAssetBaseURL}${field}`\n            : field;\n\n        icons.push(\n          <div\n            key={`feedIcon${icons.length}`}\n            className={classNames(styles.icon, {\n              [styles.iconSecondary]: icons.length > 0,\n            })}\n          >\n            <img src={src} />\n          </div>,\n        );\n        return null;\n      }\n\n      if (format === 'mainImage') {\n        mainImage = <img className={styles.mainImage} src={field} />;\n        return null;\n      }\n\n      return field;\n    });\n    const [main, ...secondary] = compact(children);\n\n    return (\n      <Layout flex className={classes}>\n        {this.renderIcons(icons)}\n        <Column className={styles.mainColumn}>\n          <div className={styles.main} style={mainStyle}>\n            {mainImage}\n            <ClampLines\n              lines={3}\n              text={main}\n              lineHeight={mainStyleLineHeight}\n              parentWidth={parentWidth}\n            />\n          </div>\n          <Row>\n            {secondary.map((s, i) => (\n              <div key={i} className={styles.secondary} style={secondaryStyle}>\n                {s}\n                {i < secondary.length - 1 && (\n                  <span className={styles.divider} style={dividerStyle}>\n                    •\n                  </span>\n                )}\n              </div>\n            ))}\n          </Row>\n        </Column>\n      </Layout>\n    );\n  }\n}\n\nFeedRow.defaultProps = {\n  columns: [],\n  fields: [],\n};\n\nFeedRow.propTypes = {\n  columns: PropTypes.array,\n  fields: PropTypes.array,\n  layout: PropTypes.object,\n  size: PropTypes.oneOf(['tiny', 'small', 'medium', 'large', 'extraLarge']),\n  typeScale: PropTypes.object,\n};\n\nexport default FeedRow;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { layoutType } from '../prop-types';\nimport classNames from 'classnames';\nimport { includes, unzip, isString } from 'lodash';\nimport {\n  isSmallDimension,\n  isMediumDimension,\n  isLargeDimension,\n} from '../helpers';\nimport typeScale from '../../lib/type-scale';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport { prettyDateFormatForDuration } from '../../lib/pretty-date-format';\nimport FeedRow from './feed-row-component';\n\nimport styles from './feed-style.scss';\n\nconst VALID_COLUMN_TYPES = [\n  'decimal',\n  'currency',\n  'percent',\n  'datetime',\n  'duration',\n  'icon',\n  'image',\n];\nconst FORMATTABLE_NUMBER_TYPES = ['decimal', 'currency', 'percent', 'duration'];\nconst BASE_TYPE_SCALE = 4;\n\nclass FeedComponent extends Component {\n  getSize() {\n    const {\n      layout: { pixels: { width } = {} },\n      isMobile,\n    } = this.props;\n\n    if (isMobile) {\n      return 'tiny';\n    }\n\n    if (isSmallDimension(width)) {\n      return 'small';\n    }\n\n    if (isMediumDimension(width)) {\n      return 'medium';\n    }\n\n    if (isLargeDimension(width)) {\n      return 'large';\n    }\n\n    return 'extraLarge';\n  }\n\n  getTypeScale() {\n    const size = this.getSize();\n\n    switch (size) {\n      case 'tiny':\n        return typeScale(BASE_TYPE_SCALE - 3);\n      case 'small':\n        return typeScale(BASE_TYPE_SCALE);\n      case 'medium':\n      case 'large':\n        return typeScale(BASE_TYPE_SCALE + 1);\n      case 'extraLarge':\n        return typeScale(BASE_TYPE_SCALE + 2);\n      default:\n        return typeScale(BASE_TYPE_SCALE);\n    }\n  }\n\n  render() {\n    const {\n      columns,\n      data,\n      isPreviewMode,\n      dashboardTz,\n      layout: { pixels },\n    } = this.props;\n\n    const wrapperStyle = classNames(styles.feedWrapper, {\n      [styles.previewLayout]: isPreviewMode,\n    });\n\n    const columnValues = unzip(data).map((values, columnIndex) => {\n      const columnMeta = columns[columnIndex] || {};\n      const { format, unit, useRelativeTime } = columnMeta;\n\n      // Present the all datetimes with the same contextual date format\n      if (format === 'datetime' && !useRelativeTime && values.every(isString)) {\n        return prettyDateFormatForDuration(values, dashboardTz);\n      }\n\n      return values.map(value => {\n        if (includes(FORMATTABLE_NUMBER_TYPES, format)) {\n          return humaniseNumber(value, { format, unit });\n        }\n\n        return value;\n      });\n    });\n    const size = this.getSize();\n    const typeScaleProp = this.getTypeScale();\n\n    return (\n      <div className={wrapperStyle}>\n        {data.map((row, rowIndex) => (\n          <FeedRow\n            key={rowIndex}\n            columns={columns}\n            fields={row.map(\n              (field, columnIndex) => columnValues[columnIndex][rowIndex],\n            )}\n            size={size}\n            typeScale={typeScaleProp}\n            layout={pixels}\n          />\n        ))}\n      </div>\n    );\n  }\n}\n\nFeedComponent.defaultProps = {\n  columns: [],\n};\n\nFeedComponent.propTypes = {\n  layout: layoutType.isRequired,\n  columns: PropTypes.arrayOf(\n    PropTypes.shape({\n      format: PropTypes.oneOf(VALID_COLUMN_TYPES),\n      unit: PropTypes.string,\n    }),\n  ),\n  dashboardTz: PropTypes.string,\n  data: PropTypes.arrayOf(\n    PropTypes.arrayOf(\n      PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n    ),\n  ),\n  isMobile: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n};\n\nexport default FeedComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './list-style.scss';\n\nconst ListItemComponent = ({ item }) => {\n  return (\n    <li className=\"list-item\">\n      <div className={`title ${style.title}`}>\n        {item.label && (\n          <div\n            className={`w-label ${style.label}`}\n            style={{\n              backgroundColor: item.label.color || 'transparent',\n            }}\n          >\n            {item.label.name}\n          </div>\n        )}\n        {item.title && item.title.text}\n      </div>\n      <div className={`description ${style.description}`}>\n        {item.description}\n      </div>\n    </li>\n  );\n};\n\nListItemComponent.propTypes = {\n  item: PropTypes.object,\n};\n\nexport default ListItemComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ListItemComponent from './list-item-component';\nimport classnames from 'classnames';\n\nimport style from './list-style.scss';\n\nconst ListItemsComponent = ({ items, currentPage }) => {\n  return (\n    <div className=\"w-list-container\">\n      {items.map((group, groupIndex) => {\n        const classes = classnames('slide', style.list, {\n          active: groupIndex === currentPage,\n        });\n        return (\n          <ul className={classes} key={groupIndex}>\n            {group.map((item, index) => (\n              <ListItemComponent item={item} key={`grouped-item-${index}`} />\n            ))}\n          </ul>\n        );\n      })}\n    </div>\n  );\n};\n\nListItemsComponent.defaultProps = {\n  currentPage: 0,\n};\n\nListItemsComponent.propTypes = {\n  currentPage: PropTypes.number,\n  items: PropTypes.array,\n};\n\nexport default ListItemsComponent;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport ListItem from './list-item-component';\nimport ListItems from './list-items-component';\nimport { isEqual, cloneDeep, times } from 'lodash';\nimport classnames from 'classnames';\n\nimport style from './list-style.scss';\n\nclass ListVisualisationComponent extends PureComponent {\n  constructor() {\n    super();\n    this.state = { groupedItems: [], currentPage: 0 };\n  }\n\n  componentDidMount() {\n    this.loopTimer = setInterval(() => {\n      let newPage = 0;\n      if (this.state.currentPage < this.state.groupedItems.length - 1) {\n        newPage = this.state.currentPage + 1;\n      }\n\n      this.setState({ currentPage: newPage });\n    }, 30000);\n\n    this.initialise();\n  }\n\n  componentDidUpdate() {\n    this.initialise();\n  }\n\n  componentWillUnmount() {\n    if (this.loopTimer) clearInterval(this.loopTimer);\n  }\n\n  render() {\n    const {\n      data: items,\n      layout: {\n        pixels: { height, width },\n      },\n    } = this.props;\n\n    const containerClasses = classnames('list-visualisation', {\n      'is-large': width > 300 && height > 300,\n    });\n\n    return (\n      <div\n        className={containerClasses}\n        ref={container => (this.container = container)}\n        style={{ height: '100%' }}\n      >\n        <ul\n          className={style.offScreenItems}\n          ref={offScreen => (this.offScreen = offScreen)}\n        >\n          {items.map((item, idx) => (\n            <ListItem item={item} key={`item-${idx}`} />\n          ))}\n        </ul>\n        <div className=\"w-list\">\n          {this.state.groupedItems.length > 0 && (\n            <ListItems\n              items={this.state.groupedItems}\n              currentPage={this.state.currentPage}\n            />\n          )}\n        </div>\n\n        {this.state.groupedItems.length > 1 && (\n          <div className={style.pagination}>\n            {times(this.state.groupedItems.length, index => {\n              const classes = classnames({\n                active: this.state.currentPage === index,\n              });\n              return (\n                <button\n                  key={`page-${index + 1}`}\n                  className={classes}\n                  onClick={() => {\n                    this.setState({ currentPage: index });\n                  }}\n                />\n              );\n            })}\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  initialise() {\n    const groupedItems = [];\n    let currentPageHeight = 0;\n    let currentItemCount = 1;\n\n    // If the \"off screen\" container has been rendered, set the width\n    // to match the container, so the list items are the correct height\n    if (this.container && this.offScreen) {\n      this.offScreen.style.width = `${this.container.offsetWidth}px`;\n    }\n\n    // Get all of the items that have been rendered into the full \"off-screen\" list\n    const listItemDOMNodes = Array.prototype.slice.call(\n      this.offScreen.children,\n    );\n\n    // Clone the items passed via props to avoid mutation\n    const dataItems = cloneDeep(this.props.data);\n\n    // The old list allowed a little less space per page, this\n    // matches it by removing 40px\n    const containerHeight = this.container.offsetHeight - 40;\n\n    // Loop through items until we fill a page, then create a group of those items\n    listItemDOMNodes.forEach(item => {\n      currentPageHeight += item.offsetHeight;\n\n      if (currentPageHeight > containerHeight) {\n        // Slice a group of items out (ending with the item before this one)\n        groupedItems.push([...dataItems.splice(0, currentItemCount - 1)]);\n\n        // We are including this item in the next group, so we start the next\n        // part of the loop with the height set to this item's height, and we\n        // start with two items (this one and the next one)\n        currentPageHeight = item.offsetHeight;\n        currentItemCount = 2;\n      } else {\n        // Move on to the next item\n        currentItemCount++;\n      }\n    });\n\n    // Put the rest of the items on the last page if there are any left over\n    if (dataItems.length > 0) {\n      groupedItems.push([...dataItems]);\n    }\n\n    // If the items have changed since the last render\n    if (!isEqual(this.state.groupedItems, groupedItems)) {\n      this.setState({\n        groupedItems,\n        currentPage: 0,\n      });\n    }\n  }\n}\n\nListVisualisationComponent.propTypes = {\n  data: PropTypes.arrayOf(\n    PropTypes.shape({\n      description: PropTypes.string,\n      label: PropTypes.shape({\n        color: PropTypes.string,\n        name: PropTypes.string,\n      }),\n      title: PropTypes.shape({\n        text: PropTypes.text,\n      }),\n    }),\n  ),\n  layout: PropTypes.object,\n};\n\nexport default ListVisualisationComponent;\n","import { connect } from 'react-redux';\nimport FeedVisualisation from './feed-component';\n\nconst FeedVisualisationConnector = connect(({ dashboard: { isMobile } }) => ({\n  isMobile,\n}))(FeedVisualisation);\n\nexport default FeedVisualisationConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport Feed from './feed-connector';\nimport styles from './feed-style.scss';\n\nconst FeedVisualisation = props => {\n  if (props.isPreviewMode) {\n    return <Feed {...props} />;\n  }\n\n  return (\n    <div className={styles.container}>\n      <Feed {...props} />\n    </div>\n  );\n};\n\nFeedVisualisation.canRender = cfg => {\n  const [row] = cfg.data || [];\n  return !isEmpty(row);\n};\n\nFeedVisualisation.defaultProps = {\n  isPreviewMode: false,\n};\n\nFeedVisualisation.propTypes = {\n  columns: PropTypes.array,\n  dashboardTz: PropTypes.string,\n  data: PropTypes.array,\n  isPreviewMode: PropTypes.bool,\n};\n\nexport default FeedVisualisation;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { humaniseNumber } from '../../lib/humanise-number';\nimport he from 'he';\nimport { map, reduce, filter, isNaN, isNull } from 'lodash';\n\nimport style from './ragcolumn-style.scss';\n\nconst WIDTH_BREAKPOINT = 434;\nconst HEIGHT_BREAKPOINT = 386;\n\nclass RagColumnComponent extends PureComponent {\n  getDisplayClass(index, isReverse) {\n    if (index === 0) return isReverse ? 'positive' : 'negative';\n    if (index === 1) return 'level';\n\n    return isReverse ? 'negative' : 'positive';\n  }\n\n  render() {\n    const {\n      data,\n      layout: {\n        pixels: { height, width },\n      },\n    } = this.props;\n    const isReverse = data.type === 'reverse';\n    const totalValues = reduce(\n      data.item,\n      (sum, item) => {\n        return sum + parseInt(item.value, 10) || 0;\n      },\n      0,\n    );\n\n    const isLargeTemplate =\n      width >= WIDTH_BREAKPOINT && height >= HEIGHT_BREAKPOINT;\n\n    const columnClasses = classNames('column', style.column, {\n      [style.large]: isLargeTemplate,\n      isLarge: isLargeTemplate,\n    });\n    const tableClasses = classNames('table', style.table, {\n      [style.large]: isLargeTemplate,\n      isLarge: isLargeTemplate,\n    });\n\n    const processedItems = this.prepareItems(data.item, totalValues, isReverse);\n\n    return (\n      <div className={`${style.container} ragcolumn-visualisation`}>\n        <div className=\"content\">\n          <div className={columnClasses}>\n            {map(processedItems, (item, index) => (\n              <div\n                className={item.displayClass}\n                style={{ height: `${item.height}%` }}\n                key={`block-${index}`}\n              />\n            ))}\n          </div>\n          <table className={tableClasses}>\n            {map(processedItems, (item, index) => (\n              <tr key={`row-${index}`}>\n                <td className={`number ${style.number} ${item.displayClass}`}>\n                  {item.prefix && <sup>{item.prefix}</sup>}\n                  {item.value}\n                  {item.suffix && <sup>{item.suffix}</sup>}\n                </td>\n                <td className={`t-secondary ${style.secondary}`}>\n                  {item.text}\n                </td>\n              </tr>\n            ))}\n          </table>\n        </div>\n      </div>\n    );\n  }\n\n  prepareItems(items, totalValues, isReverse) {\n    return filter(\n      map(items, (item, index) => {\n        const value = parseInt(item.value, 10);\n        const newItem = { ...item };\n\n        // Do not render the row if an invalid value is supplied\n        if (isNaN(value)) {\n          return null;\n        }\n\n        if (item.value || item.value === 0) {\n          const unescapedPrefix = he.decode(item.prefix || '');\n\n          newItem.height =\n            totalValues > 0\n              ? Math.round((item.value / totalValues) * 100)\n              : 100 / items.length;\n          newItem.color = `color-${index}`;\n          newItem.value = humaniseNumber(value);\n          newItem.text = newItem.text || '';\n          newItem.displayClass = this.getDisplayClass(index, isReverse);\n\n          // If the prefix is a percentage symbol, we make it a suffix instead\n          if (unescapedPrefix === '%') {\n            delete newItem.prefix;\n            newItem.suffix = unescapedPrefix;\n          } else {\n            newItem.prefix = unescapedPrefix;\n          }\n        }\n\n        return newItem;\n      }),\n      i => !isNull(i),\n    );\n  }\n}\n\nRagColumnComponent.propTypes = {\n  data: PropTypes.shape({\n    item: PropTypes.arrayOf(\n      PropTypes.shape({\n        prefix: PropTypes.string,\n        text: PropTypes.string,\n        value: PropTypes.number,\n      }),\n    ),\n    type: PropTypes.string,\n  }),\n  layout: PropTypes.object,\n};\n\nexport default RagColumnComponent;\n","import RagColumn from './ragcolumn-component';\nexport default RagColumn;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Highchart from '../highchart';\nimport LineChart from '../line-chart';\nimport { isObject } from 'lodash';\n\nconst HighchartOrLineChartComponent = props => {\n  const { data, configuration = {} } = props;\n\n  // We transform some Heirloom widgets that used Highcharts\n  // to render line charts to our own line chart\n  if (isObject(data) && data.series && !data.chart) {\n    const {\n      threshold,\n      min_y_axis: minYAxis,\n      max_y_axis: maxYAxis,\n    } = configuration;\n\n    return (\n      <LineChart\n        {...data}\n        {...props}\n        threshold={threshold}\n        minYAxis={minYAxis}\n        maxYAxis={maxYAxis}\n      />\n    );\n  }\n\n  return <Highchart {...props} />;\n};\nHighchartOrLineChartComponent.propTypes = {\n  configuration: PropTypes.object,\n  data: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),\n};\n\nexport default HighchartOrLineChartComponent;\n","import HighchartOrLineChartComponent from './highchart-or-line-chart-component';\nexport default HighchartOrLineChartComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { isFinite } from 'lodash';\n\nimport style from './monitoring-style.scss';\n\nconst LARGE_BREAKPOINT = 386;\n\nconst MonitoringComponent = props => {\n  const {\n    layout: {\n      pixels: { height, width },\n    },\n  } = props;\n  let {\n    data: { status, downTime, responseTime },\n  } = props;\n  status = status.toLowerCase();\n\n  // Logic ported from the old Gecko viz\n  // Essentially it just forces some values if the status is 'down'\n  // and alternatively provides some empty states if certain values aren't provided\n  if (status === 'down') {\n    downTime = 'NOW';\n    responseTime = 'N/A';\n  } else {\n    downTime = downTime || '-';\n    responseTime = responseTime || '-';\n\n    // if just a number append ms on the end\n    if (isFinite(responseTime)) {\n      responseTime += 'ms';\n    }\n  }\n\n  const isLargeTemplate =\n    width >= LARGE_BREAKPOINT && height >= LARGE_BREAKPOINT;\n  const isUp = status === 'up';\n  const isDown = status === 'down';\n  const isUnreported = status === 'unreported';\n  const hasStatus = isUp || isDown;\n\n  // Apply all the relevant classes that are being used as custom CSS hooks\n  const contentClasses = classNames('content', {\n    isLargeTemplate,\n    [style.isLargeTemplate]: isLargeTemplate,\n  });\n  const statusClasses = classNames('status', style.status, {\n    positive: isUp,\n    'arrow-up': isUp,\n    [style.arrowUp]: isUp,\n    negative: isDown,\n    'arrow-down': isDown,\n    [style.arrowDown]: isDown,\n    arrow: hasStatus,\n    [style.arrow]: hasStatus,\n    unreported: isUnreported,\n    [style.unreported]: isUnreported,\n  });\n\n  return (\n    <div\n      className={`monitoring-visualisation ${style.monitoringVisualisation}`}\n    >\n      <div className={contentClasses}>\n        <div className={statusClasses}>{status}</div>\n        <div className={`server-times ${style.serverTimes}`}>\n          <div className={`server-time ${style.serverTime} downtime`}>\n            <div className={`label ${style.label}`}>Last downtime</div>\n            <div className={`t-main ${style.secondaryStat}`}>{downTime}</div>\n          </div>\n          <div className={`server-time ${style.serverTime} uptime`}>\n            <div className={`label ${style.label}`}>Response time</div>\n            <div className={`t-main ${style.secondaryStat}`}>\n              {responseTime}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nMonitoringComponent.defaultProps = {\n  data: {},\n};\n\nMonitoringComponent.propTypes = {\n  data: PropTypes.shape({\n    downTime: PropTypes.string,\n    responseTime: PropTypes.string,\n    status: PropTypes.string,\n  }),\n  layout: PropTypes.object,\n};\n\nexport default MonitoringComponent;\n","import Monitoring from './monitoring-component';\nexport default Monitoring;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\n\nimport style from './image-style.scss';\n\nclass ImageComponent extends PureComponent {\n  constructor(props) {\n    super();\n    this.state = { url: this.getImageUrl(props.configuration.path) };\n  }\n\n  componentDidMount() {\n    const { reload, path } = this.props.configuration;\n    const delay = parseInt(reload, 10) || 3600;\n\n    this.timer = setInterval(() => {\n      this.setState({ url: this.getImageUrl(path) });\n    }, delay * 1000);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (nextProps.configuration.path !== this.props.configuration.path) {\n      this.setState({ url: this.getImageUrl(nextProps.configuration.path) });\n    }\n  }\n\n  componentWillUnmount() {\n    clearTimeout(this.timer);\n  }\n\n  getImageUrl(path) {\n    let url = path || '';\n    const refreshParam = `imagerefresh=${new Date().getTime().toString()}`;\n    const isDropbox =\n      url.indexOf('dropbox.com') !== -1 ||\n      url.indexOf('dropboxusercontent.com') !== -1;\n\n    if (isDropbox) {\n      url = `${url.replace(/\\?.+$/, '')}?dl=1`;\n    }\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + refreshParam;\n\n    return url;\n  }\n\n  render() {\n    const { title } = this.props.configuration;\n    return <img className={style.image} src={this.state.url} alt={title} />;\n  }\n}\n\nImageComponent.defaultProps = {\n  configuration: {},\n};\n\nImageComponent.propTypes = {\n  configuration: PropTypes.shape({\n    path: PropTypes.string,\n    reload: PropTypes.string,\n    title: PropTypes.string,\n  }),\n};\n\nexport default ImageComponent;\n","import Image from './image-component';\nexport default Image;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"image\":\"image---3ScaR\",\"loading\":\"loading---2hofZ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"editableInput\":\"editableInput---Snk4c\",\"input\":\"input---3qLG_\"};","import Popover from './popover-component';\nexport default Popover;\n","import { invert } from 'lodash';\n\nconst CREATE_BASE = '/v4/dashboards/:dashboardId/spreadsheetsbeta/:fileId';\nconst EDIT_BASE =\n  '/v4/dashboards/:dashboardId/widgets/:widgetId/spreadsheetsbeta';\n\nconst PATHS = {\n  edit: {\n    base: EDIT_BASE,\n    selectData: `${EDIT_BASE}/select-data`,\n    selectVisualization: `${EDIT_BASE}/select-visualization`,\n    configure: `${EDIT_BASE}/configure`,\n  },\n  create: {\n    base: CREATE_BASE,\n    selectData: `${CREATE_BASE}/select-data`,\n    selectVisualization: `${CREATE_BASE}/select-visualization`,\n    configure: `${CREATE_BASE}/configure`,\n  },\n};\n\nconst STEPS = {\n  configure: 'CONFIGURE',\n  selectData: 'SELECT_DATA',\n  selectVisualization: 'SELECT_VISUALIZATION',\n};\n\nconst _stepsInverted = invert(STEPS);\n\nconst _getPathsFromStep = step => ({\n  edit: PATHS.edit[_stepsInverted[step]],\n  create: PATHS.create[_stepsInverted[step]],\n});\n\n/**\n * makePath - Takes a step and the prarams passed by the router and returns a URL\n * for the step. Since spreadsheets config can be used to create a new widget and\n * edit an existing widget, it uses the URL params to figure out what to return.\n *\n * i.e. if a Widget ID is present in the URL params then we're in edit mode,\n * if not it's create mode.\n *\n * @param {string} step\n * @param {object} params\n */\nconst makePath = (step, params) => {\n  const paths = _getPathsFromStep(step);\n  const path = params.widgetId ? paths.edit : paths.create;\n\n  return Object.entries(params).reduce(\n    (acc, [key, value]) => acc.replace(`:${key}`, value),\n    path,\n  );\n};\n\n/**\n * getStep - given a router path returns the step string constant\n *\n * Possible return values:\n * 'SELECT_DATA'\n * 'SELECT_VISUALIZATION'\n * 'CONFIGURE'\n * undefined\n *\n * @param {*} path\n */\nconst getStep = path => {\n  switch (path) {\n    case PATHS.edit.selectData:\n    case PATHS.create.selectData:\n      return STEPS.selectData;\n\n    case PATHS.edit.selectVisualization:\n    case PATHS.create.selectVisualization:\n      return STEPS.selectVisualization;\n\n    case PATHS.edit.configure:\n    case PATHS.create.configure:\n      return STEPS.configure;\n\n    default:\n      return undefined;\n  }\n};\n\nexport { PATHS, STEPS, makePath, getStep };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout---Hkhok\",\"tvMode\":\"tvMode---2AW6D\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewLayout\":\"previewLayout----9NUf\",\"tvMode\":\"tvMode---2jil3\"};","import FilterLoader from './filter-loader-component';\n\nexport default FilterLoader;\n","import React from 'react';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './filter-loader-style.scss';\n\nconst FilterLoader = () => {\n  return (\n    <div className={style.loader}>\n      <FormattedMessage id=\"universal.filters.loading\" />\n    </div>\n  );\n};\n\nexport default FilterLoader;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\nimport Autowhatever from 'react-autowhatever';\nimport FormattedMessage from '../../../lib/i18n';\nimport FilterLoader from '../../filter-loader';\n\nimport style from './auto-input-style.scss';\n\nclass AutoInputComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(\n      this,\n      'handleChange',\n      'handleKeyDown',\n      'handleMouseEnter',\n      'handleMouseDown',\n      'handleClick',\n      'handleFocus',\n      'handleBlur',\n    );\n\n    this.state = { isSelecting: false };\n  }\n\n  handleChange(evt) {\n    const { value } = evt.target;\n    this.setState({ isSelecting: true });\n\n    this.props.onChange({\n      ...this.props.formState,\n      value,\n    });\n  }\n\n  handleClick() {\n    this.setState({ isSelecting: true });\n  }\n\n  handleFocus() {\n    this.setState({ isSelecting: true });\n  }\n\n  handleBlur() {\n    const { formState, freeForm } = this.props;\n    const { values = [], value } = formState;\n\n    this.setState({ isSelecting: false });\n\n    if (value && value.length && freeForm) {\n      // prevent empty string\n      this.props.onChange({\n        ...formState,\n        value: '',\n        values: [...values, { key: value, value }],\n        highlightedItemIndex: null,\n      });\n    }\n  }\n\n  handlePressEnter(evt, formState, highlightedItemIndex) {\n    evt.preventDefault();\n\n    const { availableSuggestions, freeForm } = this.props;\n    const { isSelecting } = this.state;\n    const { values = [], value } = formState;\n    let newValue;\n    if (availableSuggestions.length && highlightedItemIndex !== null) {\n      newValue = availableSuggestions[highlightedItemIndex];\n    } else if (freeForm) {\n      newValue = { key: value, value };\n    }\n\n    if (newValue && newValue.value.length && isSelecting) {\n      // prevent empty string\n      this.setState({ isSelecting: false });\n      this.props.onChange({\n        ...formState,\n        value: '',\n        values: [...values, newValue],\n        highlightedItemIndex: null,\n      });\n    } else if (this.props.onApply) {\n      this.props.onApply();\n    }\n  }\n\n  handleKeyDown(evt, { highlightedItemIndex, newHighlightedItemIndex }) {\n    const { onChange, formState } = this.props;\n    const { values = [], value } = formState;\n\n    switch (evt.key) {\n      case 'ArrowDown':\n      case 'ArrowUp':\n        evt.preventDefault();\n        if (typeof newHighlightedItemIndex !== 'undefined') {\n          this.setState({ isSelecting: true });\n          onChange({\n            ...formState,\n            highlightedItemIndex: newHighlightedItemIndex,\n          });\n        }\n        break;\n      case 'Enter':\n        this.handlePressEnter(evt, formState, highlightedItemIndex);\n        break;\n      case 'Backspace':\n        if (value === '') {\n          evt.preventDefault();\n          this.setState({ isSelecting: false });\n          onChange({\n            ...formState,\n            values: values.slice(0, values.length - 1),\n          });\n        }\n        break;\n      case 'Escape':\n        this.setState({ isSelecting: false });\n        onChange({\n          ...formState,\n          highlightedItemIndex: null,\n        });\n        break;\n      default:\n        break;\n    }\n  }\n\n  handleMouseEnter(evt, { itemIndex }) {\n    this.props.onChange({\n      ...this.props.formState,\n      highlightedItemIndex: itemIndex,\n    });\n  }\n\n  handleMouseDown(evt, { itemIndex }) {\n    evt.preventDefault();\n    const { formState, availableSuggestions } = this.props;\n    const { values = [] } = formState;\n\n    this.setState({ isSelecting: false });\n    this.props.onChange({\n      ...formState,\n      value: '',\n      values: [...values, availableSuggestions[itemIndex]],\n      highlightedItemIndex: null,\n    });\n  }\n\n  handleRemoveTag(i) {\n    const { formState } = this.props;\n    const { values = [] } = formState;\n    const newValues = [...values.slice(0, i), ...values.slice(i + 1)];\n\n    this.props.onChange({\n      ...formState,\n      values: newValues,\n    });\n  }\n\n  renderTags() {\n    const {\n      formState: { values = [] },\n    } = this.props;\n\n    return values.map((val, i) => {\n      const tagText = val.value;\n      const onRemove = e => {\n        e.preventDefault();\n        this.handleRemoveTag(i);\n      };\n      return (\n        <div className={style.tag} key={`${val}-${i}`}>\n          <span>{tagText}</span>\n          <button\n            type=\"button\"\n            className={style.removeTag}\n            onClick={onRemove}\n            title=\"Remove tag\"\n          >\n            {'\\uf00d'}\n          </button>\n        </div>\n      );\n    });\n  }\n\n  renderNoResults() {\n    if (\n      !this.state.isSelecting ||\n      this.props.freeForm ||\n      (this.props.availableSuggestions &&\n        this.props.availableSuggestions.length) ||\n      !this.props.formState.value\n    ) {\n      return null;\n    }\n\n    return (\n      <div className={style.noResults}>\n        <FormattedMessage id=\"universal.filters.noResult\" />\n      </div>\n    );\n  }\n\n  renderItem(typedValue, rawItem, { prefixIndex }) {\n    const { value } = rawItem;\n    const className = classNames({\n      [style.userTypedValue]: typedValue === value,\n    });\n    const [prefix, tail] = [\n      value.slice(0, prefixIndex),\n      value.slice(prefixIndex),\n    ];\n    return (\n      <span className={className}>\n        <span className={style.highlighted}>{prefix}</span>\n        {tail}\n      </span>\n    );\n  }\n\n  render() {\n    const {\n      formState,\n      availableSuggestions = [],\n      placeholder: placeholderValue,\n      isLoadingSuggestions,\n    } = this.props;\n    const { isSelecting } = this.state;\n    const { value = '', highlightedItemIndex } = formState;\n    const placeholder = placeholderValue || 'Enter value';\n    const inputProps = {\n      onChange: this.handleChange,\n      onKeyDown: this.handleKeyDown,\n      onFocus: this.handleFocus,\n      onBlur: this.handleBlur,\n      onClick: this.handleClick,\n      placeholder,\n      value,\n    };\n    const itemProps = {\n      onMouseDown: this.handleMouseDown,\n      onMouseEnter: this.handleMouseEnter,\n    };\n    const wrapperClasses = classNames(style.inputWrapper, {\n      [style.error]: this.props.hasError,\n      [style.small]: this.props.isSmall,\n    });\n\n    return (\n      <div className={style.wrapper}>\n        {!isLoadingSuggestions ? (\n          <div className={wrapperClasses}>\n            {this.renderTags()}\n            <Autowhatever\n              items={isSelecting ? availableSuggestions : []}\n              renderItem={this.renderItem.bind(this, value)}\n              renderItemData={{ prefixIndex: value.length }}\n              inputProps={inputProps}\n              itemProps={itemProps}\n              highlightedItemIndex={highlightedItemIndex}\n              theme={style}\n            />\n          </div>\n        ) : (\n          <FilterLoader />\n        )}\n        {this.renderNoResults()}\n      </div>\n    );\n  }\n}\n\nAutoInputComponent.defaultProps = {\n  formState: {},\n  availableSuggestions: [],\n  freeForm: true,\n};\n\nAutoInputComponent.propTypes = {\n  availableSuggestions: PropTypes.arrayOf(\n    PropTypes.shape({\n      key: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n      value: PropTypes.string,\n    }),\n  ),\n  formState: PropTypes.object,\n  freeForm: PropTypes.bool,\n  hasError: PropTypes.bool,\n  isLoadingSuggestions: PropTypes.bool,\n  isSmall: PropTypes.bool,\n  placeholder: PropTypes.string,\n  onApply: PropTypes.func,\n  onChange: PropTypes.func,\n};\n\nexport default AutoInputComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport AutoInputComponent from './auto-input-component';\n\nconst toKeyVal = value => ({ key: value, value });\n\n// Wrap AutoInputComponent to support simple collection of string as suggestions\n// or selected values.\n\nconst AutoInputTextCollection = props => {\n  let textSuggestionsAsCollection, updatedFormState;\n\n  // serialize ['foo', 'bar']\n  // into\n  // [{ key: 'foo', value: 'foo' }, { key: 'bar', value: 'bar' }]\n  if (props.availableSuggestions) {\n    textSuggestionsAsCollection = props.availableSuggestions.map(toKeyVal);\n  }\n\n  if (props.formState) {\n    updatedFormState = { ...props.formState };\n\n    if (updatedFormState.values) {\n      updatedFormState.values = updatedFormState.values.map(toKeyVal);\n    }\n  }\n\n  // Deserialize\n  const onChange = ({ values, ...rest }) => {\n    if (values) {\n      rest.values = values.map(v => v.key);\n    }\n    props.onChange(rest);\n  };\n\n  return (\n    <AutoInputComponent\n      {...props}\n      availableSuggestions={textSuggestionsAsCollection}\n      formState={updatedFormState}\n      onChange={onChange}\n    />\n  );\n};\n\nAutoInputTextCollection.propTypes = {\n  availableSuggestions: PropTypes.arrayOf(PropTypes.string),\n  formState: PropTypes.object,\n  onChange: PropTypes.func,\n};\n\nexport default AutoInputTextCollection;\n","import AutoInput from './auto-input-component';\nimport AutoInputTextCollection from './auto-input-text-collection';\n\nexport { AutoInput as default, AutoInputTextCollection };\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseConnectionCreate\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"engine\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseEngine\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"configInput\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseConnectionConfigInput\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseConnectionCreate\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"engine\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"engine\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"configInput\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"configInput\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"engine\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":268}};\n    doc.loc.source = {\"body\":\"mutation DatabaseConnectionCreate(\\n  $name: String!,\\n  $engine: DatabaseEngine!,\\n  $configInput: DatabaseConnectionConfigInput!\\n) {\\n  databaseConnectionCreate(\\n    name: $name,\\n    engine: $engine,\\n    configInput: $configInput\\n  ) {\\n    id,\\n    name,\\n    engine\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DatabaseConnectionCreate\"] = oneQuery(doc, \"DatabaseConnectionCreate\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---1-xgY\",\"header\":\"header---3xXwo\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---PaU4z\",\"icon\":\"icon---A5h1t\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"handleWrapper\":\"handleWrapper---1E6H5\",\"handle\":\"handle---3xlKk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"logo\":\"logo---2_v1W\",\"serviceTitle\":\"serviceTitle---2baxV\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---2_Gve\",\"swatch\":\"swatch---22mCt\"};","module.exports = (__webpack_require__(28))(56);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropzone\":\"dropzone---2DKbZ\",\"dropHere\":\"dropHere---2mFgE\"};","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { times, sample } from 'lodash';\n\nconst WIDTH = 960;\nconst HEIGHT = 540;\nconst SQUIGGLE_POLY = (\n  <polygon\n    fill=\"#219BFF\"\n    points=\"0.0249041967 6.40715712 2.44266787 2.32841404 8.61913975 5.99475295 15.7411051 0.968176232 23.2334787 5.41761831 30.343342 0.392213768 39.1559965 5.62565618 36.7370086 9.70369201 30.5690362 6.03818152 23.4582075 11.0638447 15.9648685 6.61466132 8.8438685 11.6409794\"\n  />\n);\nconst WEDGE_POLY = (\n  <polygon\n    fill=\"#FFBF1B\"\n    points=\"16.9164158 0.365617519 22.2256862 12.3238556 2.3369639 14.1473783 0.548819712 7.66988246\"\n  />\n);\nconst CIRCLE_POLY = <circle fill=\"#FF575C\" cx=\"8.5\" cy=\"8.5\" r=\"8.5\" />;\nconst SHAPES = [SQUIGGLE_POLY, WEDGE_POLY, CIRCLE_POLY];\n\nconst rand = (min, max) => {\n  const value = Math.random() * (max + min) - min;\n  return Math.random() > 0.5 ? value : -value;\n};\n\nclass ConfettiComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.loop = this.loop.bind(this);\n    this.state = {\n      particles: [],\n    };\n  }\n\n  componentDidMount() {\n    this.frame = requestAnimationFrame(time => {\n      this.lastTime = time;\n      this.loop(time);\n    });\n  }\n\n  componentWillUnmount() {\n    cancelAnimationFrame(this.frame);\n  }\n\n  render() {\n    const { particles } = this.state;\n    const { size } = this.props;\n\n    return (\n      <svg\n        style={{ width: '100%', height: '100%' }}\n        viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n      >\n        {particles.map((particle, i) => {\n          const {\n            position: { x, y },\n            velocity: { x: vx, y: vy },\n            element,\n            opacity = 1,\n          } = particle;\n          const rotation = (Math.atan2(vy, vx) / Math.PI) * 180;\n          return (\n            <g\n              key={i}\n              transform={`translate(${x}, ${y}) rotate(${rotation} 0 0) scale(${size})`}\n              opacity={opacity}\n            >\n              {element}\n            </g>\n          );\n        })}\n      </svg>\n    );\n  }\n\n  makeParticle(minSpeed, maxSpeed) {\n    return {\n      velocity: { x: rand(minSpeed, maxSpeed), y: rand(minSpeed, maxSpeed) },\n      position: { x: WIDTH / 2, y: HEIGHT / 2 },\n      element: sample(this.props.particles),\n      opacity: 1,\n    };\n  }\n\n  loop(time) {\n    const delta = (time - this.lastTime) / 60;\n    this.lastTime = time;\n    const {\n      count,\n      minSpeed,\n      maxSpeed,\n      gravity,\n      windResistance,\n      fade,\n    } = this.props;\n    let { particles } = this.state;\n\n    // Add particles up to our limit\n    times(count - particles.length, () => {\n      const particle = this.makeParticle(minSpeed, maxSpeed);\n      particles.push(particle);\n    });\n\n    particles.forEach(particle => {\n      const { velocity, position } = particle;\n\n      velocity.y += gravity;\n\n      velocity.x = velocity.x - (velocity.x * delta) / (100 - windResistance);\n      velocity.y = velocity.y - (velocity.y * delta) / (100 - windResistance);\n\n      position.x += velocity.x * delta;\n      position.y += velocity.y * delta;\n\n      particle.opacity -= delta / (100 - fade);\n    });\n\n    // Remove off-canvas particles\n    // TODO reuse particles when they go off-canvas\n    particles = particles.filter(\n      ({ position: { x, y }, opacity }) =>\n        opacity > 0 && x > 0 && y > 0 && x < WIDTH && y < HEIGHT,\n    );\n\n    this.setState({ particles });\n\n    this.frame = requestAnimationFrame(this.loop);\n  }\n}\nConfettiComponent.defaultProps = {\n  minSpeed: 5,\n  maxSpeed: 21,\n  count: 157,\n  gravity: 0.25,\n  size: 0.6,\n  windResistance: 66,\n  fade: 63,\n  particles: SHAPES,\n};\nConfettiComponent.propTypes = {\n  count: PropTypes.number,\n  fade: PropTypes.number,\n  gravity: PropTypes.number,\n  maxSpeed: PropTypes.number,\n  minSpeed: PropTypes.number,\n  particles: PropTypes.arrayOf(PropTypes.element),\n  size: PropTypes.number,\n  windResistance: PropTypes.number,\n};\n\nexport default ConfettiComponent;\n","import ConfettiComponent from './confetti-component';\nexport default ConfettiComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport Icon from '@UI/icon';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './marketing-button-style.scss';\n\nconst SIZES = {\n  EXTRA_SMALL: 'extra-small',\n  SMALL: 'small',\n  MEDIUM: 'medium',\n  LARGE: 'large',\n};\n\nconst INTENT = {\n  PRIMARY: 'primary',\n  SECONDARY: 'secondary',\n};\n\nconst TYPES = {\n  BUTTON: 'button',\n  SUBMIT: 'submit',\n  RESET: 'reset',\n};\n\nconst mapSizeToLoadingSpinnerSizes = {\n  [SIZES.EXTRA_SMALL]: 12,\n  [SIZES.SMALL]: 14,\n  [SIZES.MEDIUM]: 16,\n  [SIZES.LARGE]: 20,\n};\n\nconst mapIntentToLoadingSpinnerTheme = {\n  [INTENT.PRIMARY]: LoadingSpinner.THEMES.LIGHT,\n  [INTENT.SECONDARY]: LoadingSpinner.THEMES.DARK,\n};\n\n// This component is very similar to the `Button` component within our UI Kit.\n// The reason this component exists is we did not want to bloat our Button component with very specific intents\n\nconst MarketingButton = props => {\n  const {\n    href,\n    icon,\n    intent,\n    disabled,\n    loading,\n    children,\n    onClick,\n    onFocus,\n    onBlur,\n    size,\n    stretched,\n    target,\n    title,\n    type,\n  } = props;\n\n  const Tag = href ? 'a' : 'button';\n  const hasIcon = !!icon && !loading;\n\n  const classes = classNames(\n    style.MarketingButton,\n    style[`size-${size}`],\n    style[`intent-${intent}`],\n    {\n      [style.stretched]: stretched,\n      [style.loading]: loading,\n      [style.hasIcon]: hasIcon,\n    },\n  );\n\n  return (\n    <Tag\n      className={classes}\n      disabled={disabled || loading}\n      href={href}\n      onClick={onClick}\n      onFocus={onFocus}\n      onBlur={onBlur}\n      target={target}\n      title={title}\n      type={type}\n    >\n      <TransitionGroup className={style.spinnerContainer}>\n        {loading && (\n          <CSSTransition classNames={style.spinnerTransition} timeout={200}>\n            <div className={style.spinner}>\n              <LoadingSpinner\n                size={mapSizeToLoadingSpinnerSizes[size]}\n                theme={mapIntentToLoadingSpinnerTheme[intent]}\n              />\n            </div>\n          </CSSTransition>\n        )}\n      </TransitionGroup>\n      {hasIcon && (\n        <span\n          className={classNames(style.icon, {\n            [style.iconNoChildren]: !children,\n          })}\n        >\n          <Icon name={icon} />\n        </span>\n      )}\n      {children}\n    </Tag>\n  );\n};\n\nMarketingButton.SIZES = SIZES;\nMarketingButton.INTENT = INTENT;\nMarketingButton.TYPES = TYPES;\n\nMarketingButton.defaultProps = {\n  intent: INTENT.PRIMARY,\n  size: SIZES.MEDIUM,\n  type: TYPES.BUTTON,\n};\n\nMarketingButton.propTypes = {\n  children: PropTypes.node,\n  disabled: PropTypes.bool,\n  href: PropTypes.string,\n  icon: PropTypes.string,\n  intent: PropTypes.oneOf([INTENT.PRIMARY, INTENT.SECONDARY]),\n  loading: PropTypes.bool,\n  size: PropTypes.oneOf([\n    SIZES.EXTRA_SMALL,\n    SIZES.SMALL,\n    SIZES.MEDIUM,\n    SIZES.LARGE,\n  ]),\n  stretched: PropTypes.bool,\n  target: PropTypes.string,\n  title: PropTypes.string,\n  type: PropTypes.oneOf([TYPES.BUTTON, TYPES.SUBMIT, TYPES.RESET]),\n  onBlur: PropTypes.func,\n  onClick: PropTypes.func,\n  onFocus: PropTypes.func,\n};\n\nexport default MarketingButton;\n","import MarketingButton from './marketing-button-component';\nexport default MarketingButton;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"list---KucJK\",\"iconContainer\":\"iconContainer---WqGji\",\"button\":\"button---2uuTI\",\"engineLogo\":\"engineLogo---2JHNG\",\"footer\":\"footer---3s1fF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---255hL\",\"content\":\"content---1GOAw\",\"link\":\"link---2HBrR\",\"heading\":\"heading---h-abW\",\"angleRight\":\"angleRight---3-nCk\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---2oDpv\",\"banner\":\"banner---3WE-A\",\"row\":\"row---YH0O8\",\"content\":\"content---UnOWn\",\"title\":\"title---1SaKk\",\"getStartedButton\":\"getStartedButton---rCEpb\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"innerModal\":\"innerModal---3zB7o\",\"table\":\"table---16GmQ\",\"header\":\"header---1eykS\",\"metadata\":\"metadata---50emC\",\"heading\":\"heading---XVjrP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loadAnimationContainer\":\"loadAnimationContainer---3iZPP\",\"loaderBar\":\"loaderBar---3s7ed\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"emptyState\":\"emptyState---1JKsD\",\"placeholder\":\"placeholder---1fzwp\",\"image\":\"image---2BEVz\",\"illustration\":\"illustration---3wL0A\",\"text\":\"text---3jETB\",\"lLoading\":\"lLoading---2ADtS\"};","import React from 'react';\nimport { connect } from 'react-redux';\nimport WidgetComponent from './widget-component';\n\nconst mapStateToProps = ({ dashboard, widgets, user }, props) => {\n  const { widgetKey } = props;\n  const widget = widgets[widgetKey];\n  const { user: { features = [] } = {} } = user;\n  let isReady = false;\n  let bodyClassName;\n\n  if (widget) {\n    isReady = true;\n    bodyClassName = widgets[widgetKey].bodyClassName;\n  }\n\n  return {\n    scaleFactor: dashboard.scaleFactor,\n    features,\n    bodyClassName,\n    isReady,\n  };\n};\n\nconst WidgetConnector = connect(mapStateToProps)(({ isReady, ...props }) => {\n  /*\n   * As Gecko-JS initially renders the widget, but the widget component\n   * is relying on the widget being present in the Redux store, there\n   * is a race condition where the rendering will happen before the\n   * store is hydrated. This ensures that the widget is present in\n   * the store before trying to render it.\n   */\n  if (isReady) {\n    return <WidgetComponent {...props} />;\n  }\n\n  return null;\n});\n\nexport default WidgetConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { VisualisationWrapper } from '../../visualisation';\nimport { useView } from '../../lib/gecko-view';\nimport { includes } from 'lodash';\n\nconst getPolymorphicWidgetType = (\n  data = {},\n  config = {},\n  visualisation = { type: 'line' },\n) => {\n  const template = data.template || config.template || {};\n  return template.type || visualisation.type;\n};\n\nconst getSpecificContext = (type, config, data) => {\n  switch (type) {\n    case 'line':\n      // Apparently the min and max Y-axis values can come\n      // in the configuration or data :(\n      return {\n        minYAxis:\n          data.minYAxis !== undefined ? data.minYAxis : config.min_y_axis,\n        maxYAxis:\n          data.maxYAxis !== undefined ? data.maxYAxis : config.max_y_axis,\n      };\n    case 'bar':\n      if (config.orientation === 'vertical') {\n        return { type: 'column' };\n      }\n\n      return {};\n\n    case 'number':\n      return {\n        label: config.label,\n        comparison: { ...data.comparison, label: config.comparisonLabel },\n      };\n\n    case 'map':\n      const { points: { point: points } = {} } = data || {};\n\n      // It's a world map\n      if (config.map === 'World') {\n        return {\n          mapType: 'world',\n          points,\n        };\n      }\n\n      // It's a continent map\n      if (!config.region) {\n        return {\n          mapType: 'continent',\n          value: config.map.toLowerCase().replace(/ /g, '_'),\n          points,\n        };\n      }\n\n      if (includes(config.region, 'REGION')) {\n        // It's a region map\n        return {\n          mapType: 'region',\n          value: config.region,\n          points,\n        };\n      }\n\n      // It's a country map\n      return {\n        mapType: 'country',\n        value: config.region,\n        points,\n      };\n\n    default: {\n      return {};\n    }\n  }\n};\n\nconst getVisualisationContext = (data, config = {}, visualisation) => {\n  const type = getPolymorphicWidgetType(data, config, visualisation);\n\n  return {\n    threshold: config.threshold,\n    ...data,\n    type,\n    numberFormat: config.numberFormat,\n    ...getSpecificContext(type, config, data),\n  };\n};\n\nconst VisualisationComponent = props => {\n  const Visualisation = useView('visualisation');\n  const {\n    id,\n    data,\n    configuration,\n    widgetKey,\n    canEdit,\n    visualisation,\n    polymorphicTemplate,\n    dashboardTz,\n    isCustomWidget,\n    isPublic,\n    theme,\n    onConfigChange,\n    serviceName,\n    isContentLoading,\n    hideHints,\n    gridSize,\n    isMobile,\n    features = [],\n  } = props;\n\n  if (features.includes('gbmax')) {\n    return (\n      <VisualisationWrapper\n        data={data}\n        configuration={configuration}\n        canEdit={canEdit}\n        widgetKey={widgetKey}\n        id={id}\n        dashboardTz={dashboardTz}\n        polymorphicTemplate={polymorphicTemplate}\n        isCustomWidget={isCustomWidget}\n        isPublic={isPublic}\n        theme={theme}\n        visualisation={visualisation}\n        onConfigChange={onConfigChange}\n        serviceName={serviceName}\n        isContentLoading={isContentLoading}\n        hideHints={hideHints}\n        gridSize={gridSize}\n        isMobile={isMobile}\n        {...getVisualisationContext(data, configuration, visualisation)}\n      />\n    );\n  }\n\n  return (\n    <Visualisation\n      data={data}\n      configuration={configuration}\n      canEdit={canEdit}\n      widgetKey={widgetKey}\n      id={id}\n      dashboardTz={dashboardTz}\n      polymorphicTemplate={polymorphicTemplate}\n      isCustomWidget={isCustomWidget}\n      isPublic={isPublic}\n      theme={theme}\n      visualisation={visualisation}\n      onConfigChange={onConfigChange}\n      serviceName={serviceName}\n      isContentLoading={isContentLoading}\n      hideHints={hideHints}\n      gridSize={gridSize}\n      isMobile={isMobile}\n    />\n  );\n};\nVisualisationComponent.propTypes = {\n  visualisation: PropTypes.shape({\n    type: PropTypes.string,\n    version: PropTypes.number,\n  }).isRequired,\n  canEdit: PropTypes.bool,\n  configuration: PropTypes.object, // highcharts data can be stringified JS\n  dashboardTz: PropTypes.string,\n  data: PropTypes.oneOfType([\n    PropTypes.object,\n    PropTypes.array,\n    PropTypes.string,\n  ]),\n  features: PropTypes.array,\n  gridSize: PropTypes.number,\n  hideHints: PropTypes.bool,\n  id: PropTypes.number,\n\n  // Highcharts specific\n  isContentLoading: PropTypes.bool,\n  isCustomWidget: PropTypes.bool,\n  isMobile: PropTypes.bool,\n  isPublic: PropTypes.bool,\n  polymorphicTemplate: PropTypes.object,\n  serviceName: PropTypes.string,\n  theme: PropTypes.string,\n  widgetKey: PropTypes.string,\n  onConfigChange: PropTypes.func,\n};\n\nexport default VisualisationComponent;\n","import { connect } from 'react-redux';\nimport VisualisationComponent from './visualisation-component';\n\nconst mapStateToProps = ({ widgetMenu, customize, dashboard, user }, props) => {\n  const { widgetKey } = props;\n  const { dashboard: { theme } = {} } = dashboard;\n  const { user: { features = [] } = {} } = user;\n  let layout = props.layout;\n\n  if (!!customize.widgets) {\n    const widget = customize.widgets[widgetKey] || {};\n    layout = widget.layout;\n  }\n\n  const isMenuOpen = widgetKey === widgetMenu.widgetKey;\n\n  const pixelWidth = layout.pixel_width;\n  const pixelHeight = layout.pixel_height;\n\n  if (!isMenuOpen) {\n    // We need to pass the widget width and widget height so that the visualisation\n    // will rerender when the width or height have changed\n    return {\n      pixelWidth,\n      pixelHeight,\n      theme,\n      features,\n    };\n  }\n\n  let configuration = props.configuration;\n\n  // If the number formatting is being edited then overwrite\n  // the visualisation configuration that comes from gecko-js\n  if (widgetMenu.numberFormat) {\n    configuration = {\n      ...props.configuration,\n      numberFormat: widgetMenu.numberFormat,\n    };\n  }\n\n  return {\n    pixelWidth,\n    pixelHeight,\n    configuration,\n    hideHints: isMenuOpen,\n    theme,\n    features,\n  };\n};\n\nconst VisualisationConnector = connect(mapStateToProps)(VisualisationComponent);\n\nexport default VisualisationConnector;\n","import Visualisation from './visualisation-connector';\nexport default Visualisation;\n","import { connect } from 'react-redux';\n\nconst mapStateToProps = (state, props) => {\n  const { transformedData = {}, config } = state.editWidget;\n  const { data } = transformedData;\n\n  return {\n    config,\n    isPreviewMode: false,\n    polecatService: props.serviceName,\n    isLoading: false,\n    dashboard: { attributes: state.dashboard.dashboard },\n    transformedData: data,\n  };\n};\n\nexport default connect(mapStateToProps);\n","import { once } from 'lodash';\n\n/*\n * importVisualisationPreview\n *\n * Loads the universal config visualisation\n * preview asynchronously.\n *\n * PLEASE USE THIS INSTEAD OF IMPORTING THE\n * UNIVERSAL VISUALISATION ENTRY FILE DIRECTLY.\n */\nconst __importVisualisationPreview = () => import('./entry');\nconst importVisualisationPreview = once(__importVisualisationPreview);\n\nexport default importVisualisationPreview;\n","import React from 'react';\nimport AsyncComponentLoader from '../../../async-component-loader';\nimport importVisualisationPreview from './import-visualisation-preview';\n\nconst AsyncVisualisationPreview = props => (\n  <AsyncComponentLoader\n    importComponent={importVisualisationPreview}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { VisualisationPreview } = component;\n      return <VisualisationPreview {...props} />;\n    }}\n  />\n);\n\nexport default AsyncVisualisationPreview;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isUniversal } from '../../lib/service';\nimport visualisationPreviewConnector from './visualisation-preview-connector';\nimport Preview from '../../preview/components/preview';\nimport UniversalVisualisationPreview from '../../universal-config/components/visualisation-preview';\n\nconst VisualisationPreview = visualisationPreviewConnector(Preview);\n\nconst VisualisationPreviewSwitch = props => {\n  if (isUniversal(props.serviceName)) {\n    return <UniversalVisualisationPreview {...props} />;\n  }\n\n  return <VisualisationPreview {...props} />;\n};\n\nVisualisationPreviewSwitch.propTypes = {\n  serviceName: PropTypes.string.isRequired,\n};\n\nexport default VisualisationPreviewSwitch;\nexport { VisualisationPreview };\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Widget from './widget-connector';\nimport WidgetLoader from '../widget-loader';\nimport WidgetImporting from './widget-importing';\nimport { withErrorBoundary } from '../error-boundary';\nimport Visualisation from './visualisation';\nimport { getVisualisationStatus } from '../visualisation';\nimport { dispatchEvent } from '../lib/dispatch-event';\nimport FormattedMessage from '../lib/i18n';\nimport NoDataPushedError from './widget-errors/no-data-pushed-error';\nimport ServiceAccountNotFoundError from './widget-errors/service-account-not-found-error';\nimport OAuthTokenExpiredOrInvalidError from './widget-errors/oauth-token-expired-or-invalid-error';\nimport WidgetDataError from './widget-errors/widget-data-error';\nimport VisualisationPreview from '../compact-config/visualisation-preview';\n\nconst getWidgetError = (error = {}, { widgetKey, canEdit, serviceTitle }) => {\n  switch (error.type) {\n    case 'ErrNoDataPushed':\n      return {\n        type: 'ErrNoDataPushed',\n        message: <NoDataPushedError widgetKey={widgetKey} canEdit={canEdit} />,\n      };\n\n    case 'ErrTimeout':\n      return { type: 'ErrTimeout' };\n\n    case 'ErrNoData':\n      return {\n        type: 'ErrNoData',\n        message: <FormattedMessage id=\"widget.error.noDataError.description\" />,\n      };\n\n    case 'ErrOAuthTokenExpiredOrInvalid':\n      return {\n        type: 'ErrOAuthTokenExpiredOrInvalid',\n        message: (\n          <OAuthTokenExpiredOrInvalidError\n            canEdit={canEdit}\n            serviceTitle={serviceTitle}\n          />\n        ),\n      };\n\n    case 'ErrServiceAccountNotFound':\n      return {\n        type: 'ErrServiceAccountNotFound',\n        message: (\n          <ServiceAccountNotFoundError\n            widgetKey={widgetKey}\n            canEdit={canEdit}\n            serviceTitle={serviceTitle}\n          />\n        ),\n      };\n\n    case 'validation':\n    case 'ErrPossiblyTransientBetweenPush':\n      if (error.name === 'WidgetDataError') {\n        return {\n          type: 'WidgetDataError',\n          message: (\n            <WidgetDataError message={error.message} canEdit={canEdit} />\n          ),\n          canBeRefreshed: true,\n        };\n      }\n      return undefined;\n\n    default:\n      return undefined;\n  }\n};\n\nconst getWidgetStatus = (status, error = {}) => {\n  const typeStatusMap = {\n    ErrNoData: 'ready',\n    ErrTimeout: 'warning',\n    ErrNoDataPushed: 'warning',\n    ErrServiceAccountNotFound: 'failed',\n    ErrOAuthTokenExpiredOrInvalid: 'failed',\n    ErrImportPending: 'importing',\n  };\n\n  if (typeStatusMap[error.type]) {\n    return typeStatusMap[error.type];\n  }\n\n  if (error.name === 'WidgetDataError') {\n    return 'failed';\n  }\n\n  return status;\n};\n\nexport class VisualisedWidgetComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.handleConfigChange = this.handleConfigChange.bind(this);\n  }\n\n  handleConfigChange(config, shouldUpdate) {\n    const { widgetKey } = this.props;\n\n    this.props.onConfigChange(widgetKey, config);\n\n    // TODO We need to notify gecko-js to ensure that the title\n    // is updated in the current generation of dashboards\n    // once we're rendering everything on the react side we\n    // can remove this 🌮\n    dispatchEvent(this, 'widget-action', {\n      type: 'widget:config:change',\n      config,\n      update: shouldUpdate,\n    });\n  }\n\n  render() {\n    const {\n      canEdit,\n      configuration,\n      dashboardTz,\n      data,\n      error,\n      friendlyDataUpdatedAt,\n      gridSize,\n      id,\n      isCustomWidget,\n      isDataRequired,\n      isExpired,\n      isPublic,\n      isResizable,\n      isMobile,\n      layout,\n      message,\n      polymorphicTemplate,\n      serviceName,\n      serviceTitle,\n      showPreview,\n      status,\n      visualisation,\n      visualisation: { type: widgetType },\n      widgetKey,\n      canScrollTo,\n    } = this.props;\n    let { canBeRefreshed } = this.props;\n    const canRenderVisualisation = !isDataRequired || !!data;\n    const { template: { type: templateType } = {} } = configuration;\n\n    const widgetError = getWidgetError(error, {\n      widgetKey,\n      canEdit,\n      serviceTitle,\n    });\n    const widgetStatus =\n      (showPreview && 'ready') ||\n      (!message &&\n        getVisualisationStatus(\n          templateType || widgetType,\n          configuration,\n          data,\n        )) ||\n      getWidgetStatus(status, error);\n\n    // Certain errors mean that the widget can be refreshed\n    if (widgetError && widgetError.canBeRefreshed) {\n      canBeRefreshed = true;\n    }\n\n    const hasNoMessage =\n      (!message && !widgetError) || (widgetError && !widgetError.message);\n    const showLoader =\n      (widgetStatus === 'loading' && !canRenderVisualisation) ||\n      widgetStatus === 'waitingInitialServerSideRefresh';\n\n    const isImporting = this.props.isImporting || widgetStatus === 'importing';\n\n    return (\n      <Widget\n        id={id}\n        widgetKey={widgetKey}\n        configuration={configuration}\n        layout={layout}\n        serviceName={serviceName}\n        serviceTitle={serviceTitle}\n        canBeRefreshed={canBeRefreshed}\n        canEdit={canEdit}\n        widgetType={widgetType}\n        status={widgetStatus}\n        friendlyDataUpdatedAt={friendlyDataUpdatedAt}\n        isPublic={isPublic}\n        isExpired={isExpired}\n        isImporting={isImporting}\n        isResizable={isResizable}\n        data={data}\n        showPreview={showPreview}\n        canScrollTo={canScrollTo}\n      >\n        {/*\n         * Errors handled by Polecat\n         */\n        !showPreview && !hasNoMessage && !isImporting && widgetError && (\n          <div className=\"widget-message\">{widgetError.message}</div>\n        )}\n        {/*\n         * Errors coming through from gecko-js\n         */\n        !showPreview &&\n          !hasNoMessage &&\n          !isImporting &&\n          !widgetError &&\n          message && (\n            <div\n              className=\"widget-message\"\n              dangerouslySetInnerHTML={{ __html: message }}\n            />\n          )}\n        {/*\n         * Importing state\n         */\n        !showPreview && isImporting && <WidgetImporting />}\n        {/*\n         * Loading state\n         */\n        !showPreview && hasNoMessage && !isImporting && showLoader && (\n          <WidgetLoader status={widgetStatus} serviceTitle={serviceTitle} />\n        )}\n        {!showPreview &&\n          canRenderVisualisation &&\n          hasNoMessage &&\n          !isImporting &&\n          !showLoader && (\n            <Visualisation\n              data={data}\n              layout={layout}\n              configuration={configuration}\n              onConfigChange={this.handleConfigChange}\n              canEdit={canEdit}\n              widgetKey={widgetKey}\n              id={id}\n              dashboardTz={dashboardTz}\n              polymorphicTemplate={polymorphicTemplate}\n              isCustomWidget={isCustomWidget}\n              isPublic={isPublic}\n              visualisation={visualisation}\n              serviceName={serviceName}\n              isContentLoading={widgetStatus === 'loading'}\n              gridSize={gridSize}\n              isMobile={isMobile}\n            />\n          )}\n        {showPreview && (\n          <VisualisationPreview\n            layout={layout}\n            gridSize={gridSize}\n            serviceName={serviceName}\n          />\n        )}\n      </Widget>\n    );\n  }\n}\n\nVisualisedWidgetComponent.defaultProps = {\n  showPreview: false,\n  layout: {},\n};\n\nVisualisedWidgetComponent.propTypes = {\n  visualisation: PropTypes.shape({\n    type: PropTypes.string,\n    version: PropTypes.number,\n  }).isRequired,\n  onConfigChange: PropTypes.func.isRequired,\n  canBeRefreshed: PropTypes.bool,\n  canEdit: PropTypes.bool,\n  canScrollTo: PropTypes.bool, // highcharts data can be stringified JS\n  configuration: PropTypes.object,\n  dashboardTz: PropTypes.string,\n  data: PropTypes.oneOfType([\n    PropTypes.object,\n    PropTypes.array,\n    PropTypes.string,\n  ]),\n  error: PropTypes.object,\n  friendlyDataUpdatedAt: PropTypes.string,\n  gridSize: PropTypes.number,\n  id: PropTypes.number,\n  isCustomWidget: PropTypes.bool,\n  isDataRequired: PropTypes.bool,\n  isExpired: PropTypes.bool,\n  isImporting: PropTypes.bool,\n  isMobile: PropTypes.bool,\n  isPublic: PropTypes.bool,\n\n  // Highcharts specific\n  isResizable: PropTypes.bool,\n  layout: PropTypes.object,\n  message: PropTypes.string,\n  polymorphicTemplate: PropTypes.object,\n  serviceName: PropTypes.string,\n  serviceTitle: PropTypes.string,\n  showPreview: PropTypes.bool,\n  status: PropTypes.string,\n  theme: PropTypes.string,\n  widgetKey: PropTypes.string,\n  widgetType: PropTypes.string,\n};\n\nexport default withErrorBoundary(VisualisedWidgetComponent);\n","import { connect } from 'react-redux';\nimport moment from 'moment';\nimport { isArray, isObject, omit, some, toString } from 'lodash';\nimport * as widgetActions from '../widget/actions/widget-actions';\nimport WidgetMenu from '../widget-menu/widget-menu-component';\nimport VisualisedWidgetComponent from './visualised-widget-component';\nimport {\n  transformThresholdsToFormState,\n  transformFormStateToThresholds,\n} from '../universal-config/components/status-indicators-form';\n\nconst timeSince = milliseconds => {\n  const seconds = milliseconds / 1e3,\n    minutes = seconds / 60,\n    hours = minutes / 60;\n\n  if (seconds < 45) {\n    return `${Math.round(seconds)}s`;\n  }\n\n  if (minutes < 45) {\n    return `${Math.round(minutes)}m`;\n  }\n\n  return `${Math.round(hours)}h`;\n};\n\nconst isImporting = (serviceAccountId, importsState) => {\n  if (importsState.queuedServiceAccountId === serviceAccountId) {\n    return true;\n  }\n\n  const hasRelevantActiveImports = some(\n    importsState.activeImports,\n    activeImport => activeImport.serviceAccountId === serviceAccountId,\n  );\n\n  return (\n    !!importsState.activeImports &&\n    hasRelevantActiveImports &&\n    importsState.polling\n  );\n};\n\nconst mapStateToProps = (\n  {\n    dashboard: { dashboard: { timezone: dashboardTz } = {} } = {},\n    imports,\n    widgetData,\n    widgetMenu,\n    widgets,\n  },\n  props,\n) => {\n  const { widgetKey } = props;\n  const widget = widgets[widgetKey] || {};\n  const { error, data, updatedAt } = widgetData[widgetKey] || {};\n  const { indicators: { thresholds: dataThresholds } = {} } = data || {};\n  const {\n    isWidgetStatusIndicatorFormOpen,\n    widgetKey: focusedWidgetKey,\n  } = widgetMenu;\n  const isInEditMode = widgetMenu.view === WidgetMenu.VIEWS.EDIT;\n  let friendlyDataUpdatedAt;\n\n  // status and message can still be passed from gecko-js\n  let status = props.status;\n  let message = props.message;\n\n  let configuration = props.configuration || {};\n\n  if (updatedAt) {\n    friendlyDataUpdatedAt = timeSince(moment().diff(updatedAt));\n  }\n\n  if (\n    !status &&\n    widget.isDataRequired &&\n    !widget.isAwaitingInitialServerSideRefresh &&\n    !data &&\n    !error\n  ) {\n    status = 'loading';\n  }\n\n  if (!status && widget.isAwaitingInitialServerSideRefresh && !data && !error) {\n    status = 'waitingInitialServerSideRefresh';\n  }\n\n  if (!message && error) {\n    message = error.message;\n  }\n\n  // If the user is editing the widget status indicators, override with the value\n  // from widgetMenu state\n  if (isWidgetStatusIndicatorFormOpen && widgetKey === focusedWidgetKey) {\n    configuration = {\n      ...configuration,\n      indicators: { ...widgetMenu.indicators },\n    };\n  }\n\n  // Some integrations (ie spreadsheets) can have thresholds that needs to be\n  // transformed (ie cell selections). When this is the case for a threshold,\n  // override it with it's transformed value from widget data.\n  const { indicators: { thresholds: configThresholds } = {} } = configuration;\n  if (dataThresholds && configThresholds) {\n    const configThresholdsFormatted = transformThresholdsToFormState(\n      configThresholds,\n    );\n    const dataThresholdsFormatted = transformThresholdsToFormState(\n      dataThresholds,\n    );\n\n    const newThresholds = { ...configThresholdsFormatted };\n\n    if (isArray(newThresholds.lowerValue)) {\n      newThresholds.lowerValue = dataThresholdsFormatted.lowerValue;\n    }\n\n    if (isArray(newThresholds.upperValue)) {\n      newThresholds.upperValue = dataThresholdsFormatted.upperValue;\n    }\n\n    configuration = {\n      ...configuration,\n      indicators: {\n        ...configuration.indicators,\n        thresholds: transformFormStateToThresholds(newThresholds),\n      },\n    };\n  }\n\n  // If the widget is currently celebrating, we hide the goal / progress bar\n  const suppressThreshold = isObject(data) && widget.isCelebrating;\n\n  const serviceAccountId = toString(widget.service_account_id);\n\n  return {\n    configuration,\n    dashboardTz,\n    data: suppressThreshold ? omit(data, 'threshold') : data,\n    error,\n    friendlyDataUpdatedAt,\n    id: widget.id,\n    isDataRequired: widget.isDataRequired,\n    isImporting: isImporting(serviceAccountId, imports),\n    message,\n    serviceName: widget.serviceName,\n    serviceTitle: widget.serviceTitle,\n    showPreview: widgetKey === focusedWidgetKey && isInEditMode,\n    status,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onConfigChange: (widgetKey, attributes) =>\n      dispatch(\n        widgetActions.widgetUpdateConfig({\n          key: widgetKey,\n          attributes,\n        }),\n      ),\n  };\n};\n\nconst VisualisedWidgetConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(VisualisedWidgetComponent);\n\nexport { VisualisedWidgetConnector as default, timeSince };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport { findDOMNode } from 'react-dom';\nimport classNames from 'classnames';\nimport { getActiveElement } from '../../../lib/dom-helper';\n\nclass DropMenuComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, [\n      'handleAction',\n      'handleClose',\n      'handleClick',\n      'handleAction',\n      'handleFocus',\n      'handleKeyDown',\n    ]);\n    this.state = { open: false };\n  }\n\n  componentDidUpdate(_nextProps, nextState) {\n    const { open } = this.state;\n\n    if (open === nextState.open) return;\n\n    // Bind the keydown and click handlers if the menu transitioned to visible\n    if (open) {\n      document.addEventListener('keydown', this.handleKeyDown);\n      document.addEventListener('click', this.handleClose);\n      document.addEventListener('focus', this.handleClose, true);\n      // otherwise unbind the handlers\n    } else {\n      const activeElement = getActiveElement();\n      // to prevent focus event getting re-triggered and menu re-opening,\n      // we blur the active element if it belongs to the menu\n      if (findDOMNode(this).contains(activeElement)) {\n        activeElement.blur();\n      }\n      document.removeEventListener('keydown', this.handleKeyDown);\n      document.removeEventListener('click', this.handleClose);\n      document.removeEventListener('focus', this.handleClose, true);\n    }\n  }\n\n  componentWillUnmount() {\n    // make sure we unbind these listeners - at the very least\n    // twas messing up the tests\n    document.removeEventListener('keydown', this.handleKeyDown);\n    document.removeEventListener('click', this.handleClose);\n    document.removeEventListener('focus', this.handleClose, true);\n  }\n\n  handleClick() {\n    this.setState(({ open }) => ({ open: !open }));\n  }\n\n  handleFocus() {\n    this.setState({ open: true });\n  }\n\n  handleClose(e) {\n    if (!findDOMNode(this).contains(e.target)) {\n      this.setState({ open: false });\n    }\n  }\n\n  handleKeyDown(e) {\n    if (e.which === 27) {\n      // Esc\n      this.setState({ open: false });\n    }\n  }\n\n  handleAction() {\n    const { autoClose } = this.props;\n\n    if (autoClose) {\n      this.setState({ open: false });\n    }\n  }\n\n  render() {\n    const {\n      toggleClassName,\n      className,\n      label,\n      listClassName,\n      children,\n    } = this.props;\n\n    const toggleClasses = classNames('drop-menu-toggle', toggleClassName);\n    const classes = classNames('drop-menu', className, {\n      open: this.state.open,\n    });\n\n    return (\n      <div className={classes}>\n        <button\n          type=\"button\"\n          className={toggleClasses}\n          onClick={this.handleClick}\n          tabIndex={-1}\n        >\n          {label}\n        </button>\n        <ul\n          role=\"menu\"\n          className={listClassName}\n          onFocus={this.handleFocus}\n          onClick={this.handleAction}\n        >\n          {children}\n        </ul>\n      </div>\n    );\n  }\n}\n\nDropMenuComponent.propTypes = {\n  autoClose: PropTypes.bool,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  label: PropTypes.string,\n  listClassName: PropTypes.string,\n  toggleClassName: PropTypes.string,\n};\n\nDropMenuComponent.defaultProps = {\n  autoClose: true,\n};\n\nexport default DropMenuComponent;\n","import DropMenu from './drop-menu-component';\nexport default DropMenu;\n","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getDocumentElement } from '../../lib/global';\nimport {\n  getShowDesktopView,\n  setPageToFitScreen,\n  isMobileViewport,\n} from '../../lib/mobile';\nimport { getWindow } from '../../lib/global';\n\nclass MobileDetectorComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isMobile: false,\n      showDesktopView: false,\n    };\n    this.handleResize = this.handleResize.bind(this);\n  }\n\n  componentDidMount() {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.handleResize);\n  }\n\n  handleResize() {\n    const documentElement = getDocumentElement();\n    const { clientWidth } = documentElement;\n\n    const showDesktopView = getShowDesktopView();\n    this.setState({ showDesktopView });\n\n    // Only mess with viewport meta tag when the screen\n    // width is smaller than the breakpoint\n    if (isMobileViewport(getWindow().screen.width) && showDesktopView) {\n      setPageToFitScreen();\n    }\n\n    if (isMobileViewport(clientWidth) && !showDesktopView) {\n      this.setState({ isMobile: true, clientWidth });\n      documentElement.classList.add('is-mobile');\n    } else {\n      this.setState({ isMobile: false, clientWidth });\n      documentElement.classList.remove('is-mobile');\n    }\n  }\n\n  render() {\n    return this.props.render(this.state.isMobile, this.state.clientWidth);\n  }\n}\n\nMobileDetectorComponent.propTypes = {\n  render: PropTypes.func.isRequired,\n};\n\nexport default MobileDetectorComponent;\n","import MobileDetector from './mobile-detector-component';\n\nexport default MobileDetector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './blob.scss';\n\nconst assetBaseUrl = 'https://s3.amazonaws.com/gecko.static/images';\n\nconst BLOB_VERSIONS = {\n  FIRST: 'blob_1.svg',\n  SECOND: 'blob_2.svg',\n  THIRD: 'blob_3.svg',\n};\n\nconst Blob = ({ size, version, children }) => (\n  <div\n    className={styles.Blob}\n    style={{\n      width: `${size}px`,\n      height: `${size}px`,\n      backgroundImage: `url(${assetBaseUrl}/${version})`,\n    }}\n  >\n    {children}\n  </div>\n);\n\nBlob.VERSIONS = BLOB_VERSIONS;\n\nBlob.defaultProps = {\n  size: 50,\n  version: BLOB_VERSIONS.FIRST,\n};\n\nBlob.propTypes = {\n  children: PropTypes.node,\n  size: PropTypes.number,\n  version: PropTypes.oneOf([\n    BLOB_VERSIONS.FIRST,\n    BLOB_VERSIONS.SECOND,\n    BLOB_VERSIONS.THIRD,\n  ]),\n};\n\nexport default Blob;\n","import Blob from './blob';\n\nexport default Blob;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"picker\":\"picker---2u6gT\",\"search\":\"search---32IiJ\",\"lLoadingList\":\"lLoadingList---stKIM\",\"error\":\"error---1TkOD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---3ukQb\",\"headerContainer\":\"headerContainer---o83nc\",\"header\":\"header---Qgskr\",\"icon\":\"icon---bPdVl\",\"connectionList\":\"connectionList---1QAgX\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"lLoading\":\"lLoading---2zOMG\",\"popover\":\"popover---oKpEL\",\"container\":\"container---3By06\",\"sidePanel\":\"sidePanel---1tUxn\",\"content\":\"content---2zi39\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"items\":\"items---7E68V\",\"pubDate\":\"pubDate---1b0mP\",\"article\":\"article---3M3jr\",\"formatting\":\"formatting---6qgnt\",\"notificationPill\":\"notificationPill---1lEy5\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconContainer\":\"iconContainer---3NM1q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"addDashboardModal\":\"addDashboardModal---DKxUA\",\"groupSection\":\"groupSection---erJnK\",\"toggleSection\":\"toggleSection---1tVO3\",\"toggle\":\"toggle---3x2RP\",\"illustration\":\"illustration---CrWwY\",\"betaTag\":\"betaTag---2UFpe\",\"submitLabel\":\"submitLabel---17GK9\",\"submitSpinner\":\"submitSpinner---lUw2Q\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ScheduledPosts\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPosts\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"dashboardId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":114}};\n    doc.loc.source = {\"body\":\"query ScheduledPosts($id: ID!) {\\n  scheduledPosts(dashboardId: $id) {\\n    id\\n    slackChannelId\\n    timeHour\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"ScheduledPosts\"] = oneQuery(doc, \"ScheduledPosts\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"link\":\"link---3By2D\",\"featuredLogo\":\"featuredLogo---3RVf_\",\"content\":\"content---2GuZe\",\"logo\":\"logo---3ilc3\",\"label\":\"label---2HVdJ\",\"pillContainer\":\"pillContainer---2enOl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"previewWrapper\":\"previewWrapper---3aUxP\",\"title\":\"title---oLCrQ\",\"previewMode\":\"previewMode---OmbWd\",\"visualisationNotComplete\":\"visualisationNotComplete---14QX5\"};","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\nimport { Observable } from 'rxjs/Observable';\nimport { getWindow } from '../../lib/global';\nimport 'rxjs/add/observable/fromEvent';\nimport 'rxjs/add/operator/mergeMap';\nimport 'rxjs/add/operator/map';\nimport 'rxjs/add/operator/filter';\nimport 'rxjs/add/operator/takeUntil';\nimport 'rxjs/add/operator/take';\nimport 'rxjs/add/operator/mergeMapTo';\nimport 'rxjs/add/operator/merge';\n\nconst OFFSET_TO_EDGE = 30;\nconst SCROLL_AMOUNT = 30;\n\nconst mapTouch = event => {\n  event.preventDefault(); // Prevent touch devices from scrolling while drag resizing\n  return event.touches[0];\n};\n\nclass DragInteractionComponent extends PureComponent {\n  componentDidMount() {\n    const start = Observable.fromEvent(this._domTarget, 'mousedown')\n      .filter(e => e.button === 0)\n      .merge(Observable.fromEvent(this._domTarget, 'touchstart').map(mapTouch));\n    const move = Observable.fromEvent(document, 'mousemove').merge(\n      Observable.fromEvent(document, 'touchmove').map(mapTouch),\n    );\n    const end = Observable.fromEvent(document, 'mouseup').merge(\n      Observable.fromEvent(document, 'touchend').map(mapTouch),\n    );\n    const dragMove = start.flatMap(downEvent => {\n      downEvent.stopPropagation();\n\n      const startX = downEvent.pageX;\n      const startY = downEvent.pageY;\n\n      return move\n        .map(moveEvent => {\n          return {\n            x: moveEvent.pageX - startX,\n            y: moveEvent.pageY - startY,\n            pageX: moveEvent.pageX,\n            pageY: moveEvent.pageY,\n          };\n        })\n        .takeUntil(end);\n    });\n    const dragEnd = start.mergeMapTo(end.take(1));\n\n    this._dragStart = start.subscribe(e => {\n      this.props.onDragStart(e);\n    });\n    this._dragMove = dragMove.subscribe(({ x, y, pageX, pageY }) => {\n      this.props.onDragMove({ x, y });\n      this.scrollWindow(pageX, pageY);\n    });\n    this._dragEnd = dragEnd.subscribe(() => {\n      this.props.onDragEnd();\n    });\n  }\n\n  componentWillUnmount() {\n    this._dragStart.unsubscribe();\n    this._dragMove.unsubscribe();\n    this._dragEnd.unsubscribe();\n  }\n\n  render() {\n    return (\n      <div ref={domTarget => (this._domTarget = domTarget)}>\n        {this.props.children}\n      </div>\n    );\n  }\n\n  scrollWindow(pageX, pageY) {\n    const window = getWindow();\n\n    const currentPageTop = window.pageYOffset;\n    const currentPageLeft = window.pageXOffset;\n    const windowHeight = window.innerHeight;\n    const windowWidth = window.innerWidth;\n\n    let top = currentPageTop;\n    let left = currentPageLeft;\n\n    // Scrolling down\n    if (pageY > currentPageTop + windowHeight - OFFSET_TO_EDGE) {\n      top = pageY - windowHeight + SCROLL_AMOUNT;\n    }\n\n    // Scrolling up\n    if (pageY < currentPageTop + OFFSET_TO_EDGE) {\n      top = pageY - SCROLL_AMOUNT;\n    }\n\n    // Scrolling right\n    if (pageX > currentPageLeft + windowWidth - OFFSET_TO_EDGE) {\n      left = pageX - windowWidth + SCROLL_AMOUNT;\n    }\n\n    // Scrolling left\n    if (pageX < currentPageLeft + OFFSET_TO_EDGE) {\n      left = pageX - SCROLL_AMOUNT;\n    }\n\n    window.scrollTo(left, top);\n  }\n}\n\nDragInteractionComponent.defaultProps = {\n  onDragStart: noop,\n  onDragMove: noop,\n  onDragEnd: noop,\n};\n\nDragInteractionComponent.propTypes = {\n  children: PropTypes.node,\n  onDragEnd: PropTypes.func,\n  onDragMove: PropTypes.func,\n  onDragStart: PropTypes.func,\n};\n\nconst ConditionalDragInteraction = ({ disabled, ...props }) =>\n  disabled ? props.children : <DragInteractionComponent {...props} />;\n\nConditionalDragInteraction.propTypes = {\n  ...DragInteractionComponent.propTypes,\n  disabled: PropTypes.bool,\n};\n\nexport default ConditionalDragInteraction;\nexport { DragInteractionComponent };\n","import DragInteractionComponent from './drag-interaction-component';\n\nexport default DragInteractionComponent;\n","module.exports = (__webpack_require__(28))(227);","export const SECONDARY_VIZ_TYPES = {\n  Sparkline: 'Sparkline',\n  ProgressIndicator: 'ProgressIndicator',\n  NumberComparison: 'NumberComparison',\n  PercentageComparison: 'PercentageComparison',\n};\n\nexport const LAYOUT_TYPES = {\n  vertical: 'vertical',\n  horizontal: 'horizontal',\n  mobile: 'mobile',\n};\n\n// On an instrument with BASE_WIDTH, the font size would\n// be BASE_PRIMARY_FONT_SIZE. Use this to work out\n// the font size on different size instruments.\nexport const BASE_WIDTH = 320;\nexport const BASE_PRIMARY_FONT_SIZE = 104;\n\n// Multiply primary font size with this to get label size\nexport const LABEL_FONT_SIZE_MULTIPLIER = 0.33;\n\n// Margin variables for secondary viz on vertical number.\n// Margin top is a proportion of the row height, margin bottom is a fixed value.\nexport const VERTICAL_SECONDARY_MARGIN_TOP_MULTIPLIER = 0.75;\nexport const VERTICAL_SECONDARY_BOTTOM_MARGIN = 5;\n\n// Main number is positioned slightly off-centre in vertical layouts\nexport const VERTICAL_CENTRE_MULTIPLIER = 0.48;\n","import PropTypes from 'prop-types';\nimport { SECONDARY_VIZ_TYPES } from './responsive-number-constants';\n\nexport const numberFormatType = PropTypes.shape({\n  abbreviation: PropTypes.oneOf(['none', 'K', 'M', 'B']),\n  precision: PropTypes.number,\n  prefix: PropTypes.string,\n  suffix: PropTypes.string,\n});\n\nexport const formatType = PropTypes.oneOf([\n  'currency',\n  'decimal',\n  'duration',\n  'percent',\n]);\n\nexport const sparklineType = PropTypes.shape({\n  sparklineValues: PropTypes.arrayOf(PropTypes.number),\n});\n\nexport const comparisonType = PropTypes.shape({\n  compareValue: PropTypes.number.isRequired,\n  defaultLabel: PropTypes.string,\n  label: PropTypes.string,\n  positiveDirection: PropTypes.oneOf(['UP', 'DOWN']),\n});\n\nexport const progressIndicatorType = PropTypes.shape({\n  targetValue: PropTypes.number.isRequired,\n  startingValue: PropTypes.number,\n});\n\nexport const statusIndicatorType = PropTypes.shape({\n  lowerThreshold: PropTypes.number,\n  positiveDirection: PropTypes.oneOf(['UP', 'DOWN']),\n  upperThreshold: PropTypes.number,\n});\n\nexport const secondaryVisualisationType = PropTypes.oneOfType([\n  PropTypes.shape({\n    data: PropTypes.oneOfType([\n      comparisonType,\n      progressIndicatorType,\n      sparklineType,\n    ]),\n    type: PropTypes.oneOf([\n      SECONDARY_VIZ_TYPES.NumberComparison,\n      SECONDARY_VIZ_TYPES.PercentageComparison,\n      SECONDARY_VIZ_TYPES.ProgressIndicator,\n      SECONDARY_VIZ_TYPES.Sparkline,\n    ]),\n  }),\n]);\n\nexport const numberPropTypes = {\n  primaryValue: PropTypes.number.isRequired,\n  canEdit: PropTypes.bool,\n  defaultLabel: PropTypes.string,\n  format: formatType,\n  height: PropTypes.number,\n  label: PropTypes.string,\n  numberFormat: numberFormatType,\n  secondaryVisualisation: secondaryVisualisationType,\n  unit: PropTypes.string,\n  width: PropTypes.number,\n  onChangeLabel: PropTypes.func,\n  onChangeComparisonLabel: PropTypes.func,\n};\n","import { isNil } from 'lodash';\nimport {\n  SECONDARY_VIZ_TYPES,\n  LAYOUT_TYPES,\n  BASE_WIDTH,\n  BASE_PRIMARY_FONT_SIZE,\n  LABEL_FONT_SIZE_MULTIPLIER,\n  VERTICAL_SECONDARY_MARGIN_TOP_MULTIPLIER,\n  VERTICAL_SECONDARY_BOTTOM_MARGIN,\n  VERTICAL_CENTRE_MULTIPLIER,\n} from './responsive-number-constants';\nimport { parseDurationInput } from '../../lib/humanise-number';\n\n// This is how much of the total height the main number\n// will take up compared to the label when on a short widget.\n// I.e. when the label is 0.33 of the primary font size, the primary\n// number takes up 0.75 of the total height of the container.\n// Used to apply a height constraint to make sure the number\n// and label fit on a short vertical layout.\nconst PRIMARY_MAX_FONT_MULTIPLIER = 1 / (1 + LABEL_FONT_SIZE_MULTIPLIER);\n\nexport const getVerticalPrimaryFontSize = (\n  instrumentWidth,\n  instrumentHeight,\n  widthScaleFactor = 1,\n) => {\n  const fontScale = instrumentWidth / BASE_WIDTH;\n  const primaryFontSize = Math.round(BASE_PRIMARY_FONT_SIZE * fontScale);\n\n  // When the widget is short we're dropping the comparison visualisation\n  // and picking a font size such that the main number stacked on top of\n  // the label occupies the height of the widget.\n  // In all other cases, we choose a font size that leaves space for a main\n  // number, a label, and a comparison visualisation.\n  let primaryFontMaxFontSize;\n  if (instrumentHeight <= 150) {\n    primaryFontMaxFontSize = Math.round(\n      instrumentHeight * PRIMARY_MAX_FONT_MULTIPLIER,\n    );\n  } else {\n    // The vertical layout is comprised of some \"top\", the main number, a label,\n    // margins for the secondary viz, and the secondary viz itself.\n    // All of these are functions of the font size and instrument height,\n    // so we can add them all up and re-arrange to solve for font size given a height.\n    const numerator =\n      2 *\n      (instrumentHeight * (1 - VERTICAL_CENTRE_MULTIPLIER) -\n        VERTICAL_SECONDARY_BOTTOM_MARGIN);\n    const denominator =\n      1 +\n      (3 + 2 * VERTICAL_SECONDARY_MARGIN_TOP_MULTIPLIER) *\n        LABEL_FONT_SIZE_MULTIPLIER;\n\n    // Reduce size by 1% to account for rounding when later determining whether\n    // there's space for a secondary viz. Otherwise, we'll drop the secondary when\n    // we shouldn't.\n    primaryFontMaxFontSize = Math.round((0.99 * numerator) / denominator);\n  }\n\n  return Math.round(\n    Math.min(primaryFontSize, primaryFontMaxFontSize) * widthScaleFactor,\n  );\n};\n\nexport const getHorizontalPrimaryFontSize = (\n  instrumentHeight,\n  widthScaleFactor = 1,\n) => {\n  return instrumentHeight * widthScaleFactor;\n};\n\nexport const getLabelFontSize = primaryFontSize => {\n  return Math.round(primaryFontSize * LABEL_FONT_SIZE_MULTIPLIER);\n};\n\nexport const hasSecondaryViz = secondaryVisualisation =>\n  !!(\n    secondaryVisualisation && SECONDARY_VIZ_TYPES[secondaryVisualisation.type]\n  );\n\n// NB this is only used by the vertical layout. Horizontal has it's own logic.\nexport const canFitSecondaryViz = (width, height, rowHeight) => {\n  return width >= 80 && height >= rowHeight;\n};\n\nexport const getSecondaryVisualisationMargins = (layoutType, labelFontSize) => {\n  if (layoutType === LAYOUT_TYPES.vertical) {\n    return {\n      marginTop: labelFontSize * VERTICAL_SECONDARY_MARGIN_TOP_MULTIPLIER,\n      marginBottom: VERTICAL_SECONDARY_BOTTOM_MARGIN,\n    };\n  }\n\n  return {\n    marginTop: 0,\n    marginBottom: 0,\n  };\n};\n\nexport const getSecondaryVisualisationStyle = (\n  width,\n  secondaryVizType,\n  numberAndLabelWidth,\n) => {\n  if (\n    secondaryVizType === SECONDARY_VIZ_TYPES.PercentageComparison ||\n    secondaryVizType === SECONDARY_VIZ_TYPES.NumberComparison\n  ) {\n    const secondaryVizMaxWidth = width - numberAndLabelWidth;\n    return { maxWidth: `${secondaryVizMaxWidth}px` };\n  }\n  return { width: `${width * 0.25}px` };\n};\n\nconst getValueForStatusIndicator = (value, format, unit) => {\n  if (format === 'percent') {\n    return value * 100;\n  }\n\n  if (format === 'duration') {\n    const unitWithDefault = unit || 'milliseconds';\n    return parseDurationInput({ [unitWithDefault]: value }, 'milliseconds');\n  }\n\n  return value;\n};\n\nexport const getStatusIndicatorState = (\n  statusIndicator,\n  primaryValue,\n  format,\n  unit = 'milliseconds',\n) => {\n  if (!statusIndicator) {\n    return undefined;\n  }\n\n  const value = getValueForStatusIndicator(primaryValue, format, unit);\n  const { upperThreshold, lowerThreshold, positiveDirection } = statusIndicator;\n  const metIndicators = [];\n\n  if (!isNil(upperThreshold) && value >= upperThreshold) {\n    if (positiveDirection === 'DOWN') {\n      metIndicators.push('negative');\n    }\n\n    if (positiveDirection === 'UP') {\n      metIndicators.push('positive');\n    }\n  }\n\n  if (!isNil(lowerThreshold) && value <= lowerThreshold) {\n    if (positiveDirection === 'UP') {\n      metIndicators.push('negative');\n    }\n\n    if (positiveDirection === 'DOWN') {\n      metIndicators.push('positive');\n    }\n  }\n\n  if (metIndicators.length) {\n    // Array alphabetically so that negative always comes first\n    metIndicators.sort();\n    return metIndicators[0];\n  }\n\n  return undefined;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { noop, toString } from 'lodash';\nimport { formatMessage } from '../../../../lib/i18n';\nimport EditableInput from '../../../../components/form/editable-input/editable-component';\n\nimport styles from './label-styles.scss';\n\nconst getLabel = ({ defaultLabel, label }) => {\n  // The labels can be any type for custom widgets so we\n  // coerce it before attempting to .trim() it\n  return label || toString(defaultLabel).trim();\n};\n\nconst Label = props => {\n  const { className, canEdit, onChange } = props;\n  const label = getLabel(props);\n  const editableClasses = classNames(styles.input, className, {\n    [styles.hasValue]: !!label,\n  });\n\n  return (\n    <div>\n      {canEdit ? (\n        <EditableInput\n          text={label}\n          placeholder={formatMessage('widget.number.label.add')}\n          inputClassName={editableClasses}\n          onSubmit={onChange}\n        />\n      ) : (\n        <div className={styles.label}>{label}</div>\n      )}\n    </div>\n  );\n};\n\nLabel.defaultProps = {\n  onChange: noop,\n};\n\nLabel.propTypes = {\n  canEdit: PropTypes.bool,\n  className: PropTypes.string, // use className to show on parent hover\n  defaultLabel: PropTypes.string,\n  label: PropTypes.string,\n  onChange: PropTypes.func,\n};\n\nexport default Label;\n","import Label from './label-component';\nexport default Label;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { formatType, numberFormatType } from '../../prop-types';\nimport { omit, isUndefined } from 'lodash';\nimport { SECONDARY_VIZ_TYPES } from '../../responsive-number-constants';\nimport ComparisonValue from '../../../shared/comparison-value';\nimport Label from '../../components/label';\n\nimport styles from './comparison-styles.scss';\n\nconst Comparison = props => {\n  const {\n    compareValue,\n    currentValue,\n    type,\n    defaultLabel,\n    format,\n    canEdit,\n    label,\n    labelClassName,\n    numberFormat,\n    positiveDirection,\n    rowHeight,\n    unit,\n    isHoveringVisualisation,\n    onChangeLabel,\n  } = props;\n\n  const hasLabel = !isUndefined(label || defaultLabel);\n\n  return (\n    <div className={styles.comparisonContainer} style={{ fontSize: rowHeight }}>\n      <div className={styles.value}>\n        <ComparisonValue\n          value={currentValue}\n          comparisonValue={compareValue}\n          options={{\n            format,\n            unit,\n            numberFormat: omit(numberFormat, ['abbreviation', 'precision']),\n          }}\n          reversed={positiveDirection === 'DOWN'}\n          absolute={type === SECONDARY_VIZ_TYPES.NumberComparison}\n        />\n      </div>\n      <div\n        className={styles.label}\n        style={{\n          width: hasLabel || isHoveringVisualisation ? 'auto' : 0,\n        }}\n      >\n        <Label\n          className={labelClassName}\n          label={label}\n          defaultLabel={defaultLabel}\n          canEdit={canEdit}\n          onChange={onChangeLabel}\n        />\n      </div>\n    </div>\n  );\n};\n\nComparison.defaultProps = {\n  positiveDirection: 'UP',\n};\n\nComparison.propTypes = {\n  compareValue: PropTypes.number.isRequired,\n  currentValue: PropTypes.number.isRequired,\n  type: PropTypes.oneOf([\n    SECONDARY_VIZ_TYPES.NumberComparison,\n    SECONDARY_VIZ_TYPES.PercentageComparison,\n  ]).isRequired,\n  canEdit: PropTypes.bool,\n  defaultLabel: PropTypes.string,\n  format: formatType,\n  isHoveringVisualisation: PropTypes.bool,\n  label: PropTypes.string,\n  labelClassName: PropTypes.string, // used to show empty label on parent hover\n  numberFormat: numberFormatType,\n  positiveDirection: PropTypes.oneOf(['UP', 'DOWN']),\n  rowHeight: PropTypes.number,\n  unit: PropTypes.string,\n  onChangeLabel: PropTypes.func,\n};\n\nexport default Comparison;\n","import Comparison from './comparison-component';\n\nexport default Comparison;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { omit } from 'lodash';\nimport classNames from 'classnames';\nimport { getProgressionPercentage } from './progress-indicator-helpers';\nimport { formatType, numberFormatType } from '../../prop-types';\nimport FramedFormattedNumber from '../../../../components/framed-formatted-number';\n\nimport styles from './progress-indicator-styles.scss';\n\nconst MARGIN_SCALE_FACTOR = 0.2;\n\nconst getProgressBarHeight = rowHeight => {\n  // The progress indicator is composed of a progress bar on top of a \"text bar\"\n  // containing the % progress and target value, with some margin between them.\n  // The total height of that combination needs to be the row height to ensure\n  // alignment between widgets. We give the \"text bar\" half the available height,\n  // which means we need to steal some height from the progress bar to make room\n  // for the margin.\n  return (rowHeight * (1 - MARGIN_SCALE_FACTOR)) / 2;\n};\n\nclass ProgressIndicator extends PureComponent {\n  renderProgressBar(progress) {\n    const { rowHeight } = this.props;\n\n    const progressBarHeight = getProgressBarHeight(rowHeight);\n\n    return (\n      <div\n        className={styles.progressBarContainer}\n        style={{\n          height: progressBarHeight,\n          borderRadius: progressBarHeight / 2,\n        }}\n      >\n        <div className={styles.progressBarBackground} />\n        <div\n          className={styles.progressBarProgress}\n          style={{ width: `${progress}%` }}\n        />\n      </div>\n    );\n  }\n\n  render() {\n    const {\n      currentValue,\n      format,\n      numberFormat,\n      rowHeight,\n      startingValue,\n      targetValue,\n      unit,\n    } = this.props;\n    const progress = getProgressionPercentage(\n      currentValue,\n      targetValue,\n      startingValue,\n    );\n    const containerClasses = classNames(styles.progressIndicatorContainer, {\n      [styles.targetReached]: progress >= 100,\n    });\n\n    return (\n      <div className={containerClasses}>\n        {this.renderProgressBar(progress)}\n        <div\n          className={styles.text}\n          style={{\n            fontSize: rowHeight / 2,\n            margin: `${(rowHeight / 2) * MARGIN_SCALE_FACTOR}px 0 0 0`,\n          }}\n        >\n          <div className={styles.percentageText}>{progress}%</div>\n          <div className={styles.targetText}>\n            <FramedFormattedNumber\n              value={targetValue}\n              options={{\n                format,\n                numberFormat: omit(numberFormat, ['abbreviation', 'precision']),\n                unit,\n              }}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nProgressIndicator.defaultProps = {\n  startingValue: 0,\n};\n\nProgressIndicator.propTypes = {\n  currentValue: PropTypes.number.isRequired,\n  targetValue: PropTypes.number.isRequired,\n  format: formatType,\n  numberFormat: numberFormatType,\n  rowHeight: PropTypes.number,\n  startingValue: PropTypes.number,\n  unit: PropTypes.string,\n};\n\nexport default ProgressIndicator;\n","export const getProgressionPercentage = (\n  currentValue,\n  targetValue,\n  startingValue = 0,\n) => {\n  const offsetValue = currentValue - startingValue;\n  const offsetThreshold = targetValue - startingValue;\n  const percentage = Math.floor((offsetValue / offsetThreshold) * 100);\n  return percentage;\n};\n","import ProgressIndicator from './progress-indicator-component';\n\nexport default ProgressIndicator;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport d3 from 'd3';\n\nimport styles from './sparkline-styles.scss';\n\nconst STROKE_WIDTH = 3.5;\n\nconst Sparkline = ({ values, width, height }) => {\n  if (!height || !width) {\n    return null;\n  }\n\n  // To avoid the thick stroke line from being cropped at the\n  // edges by the SVG boundary, we need to add half of the\n  // stroke width at the top, left, bottom and right of the line\n  const pad = STROKE_WIDTH / 2;\n\n  const max = d3.max(values);\n  const min = d3.min(values);\n  const x = d3.scale\n    .linear()\n    .domain([0, values.length - 1])\n    .range([0, width - pad * 2]);\n  const y = d3.scale\n    .linear()\n    .domain([min, max])\n    .range([height - pad * 2, 0]);\n  const line = d3.svg\n    .line()\n    .x((_, i) => x(i) + pad)\n    .y(d => y(d) + pad);\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      className={styles.sparkline}\n      style={{ width, height, strokeWidth: STROKE_WIDTH }}\n    >\n      <title>Sparkline</title>\n      <path d={line(values)} />\n    </svg>\n  );\n};\n\nSparkline.defaultProps = {\n  height: 0,\n  width: 0,\n};\n\nSparkline.propTypes = {\n  height: PropTypes.number.isRequired,\n  values: PropTypes.arrayOf(PropTypes.number).isRequired,\n  width: PropTypes.number.isRequired,\n};\n\nexport default Sparkline;\n","import Sparkline from './sparkline-component';\nexport default Sparkline;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  formatType,\n  numberFormatType,\n  secondaryVisualisationType,\n} from '../prop-types';\nimport {\n  canFitSecondaryViz,\n  getSecondaryVisualisationMargins,\n} from '../responsive-number-helpers';\nimport Comparison from './comparison';\nimport ProgressIndicator from './progress-indicator';\nimport Sparkline from './sparkline';\nimport {\n  SECONDARY_VIZ_TYPES,\n  LAYOUT_TYPES,\n} from '../responsive-number-constants';\n\nimport styles from './secondary-visualisation-styles.scss';\n\nclass SecondaryVisualisation extends PureComponent {\n  renderSecondaryVisualisation(height) {\n    const {\n      type,\n      currentValue,\n      format,\n      canEdit,\n      labelClassName,\n      numberFormat,\n      data,\n      unit,\n      width,\n      isHoveringVisualisation,\n      onChangeComparisonLabel,\n    } = this.props;\n\n    switch (type) {\n      case SECONDARY_VIZ_TYPES.Sparkline: {\n        return (\n          <Sparkline\n            width={width}\n            height={height}\n            values={data.sparklineValues}\n          />\n        );\n      }\n      case SECONDARY_VIZ_TYPES.NumberComparison:\n      case SECONDARY_VIZ_TYPES.PercentageComparison: {\n        return (\n          <Comparison\n            currentValue={currentValue}\n            type={type}\n            format={format}\n            canEdit={canEdit}\n            labelClassName={labelClassName}\n            numberFormat={numberFormat}\n            rowHeight={height}\n            unit={unit}\n            isHoveringVisualisation={isHoveringVisualisation}\n            onChangeLabel={onChangeComparisonLabel}\n            {...data}\n          />\n        );\n      }\n      case SECONDARY_VIZ_TYPES.ProgressIndicator: {\n        return (\n          <ProgressIndicator\n            currentValue={currentValue}\n            format={format}\n            numberFormat={numberFormat}\n            rowHeight={height}\n            unit={unit}\n            {...data}\n          />\n        );\n      }\n      default:\n        return null;\n    }\n  }\n\n  render() {\n    const { height, labelFontSize, type, width, layoutType } = this.props;\n\n    const secondaryVisualisationMargins = getSecondaryVisualisationMargins(\n      layoutType,\n      labelFontSize,\n    );\n\n    const availableHeight =\n      height -\n      secondaryVisualisationMargins.marginTop -\n      secondaryVisualisationMargins.marginBottom;\n\n    if (layoutType === LAYOUT_TYPES.vertical) {\n      if (!canFitSecondaryViz(width, availableHeight, labelFontSize)) {\n        return null;\n      }\n    }\n\n    const secondaryVizHeight =\n      type === SECONDARY_VIZ_TYPES.Sparkline ? availableHeight : labelFontSize;\n\n    return (\n      <div\n        className={styles.secondaryVisualisation}\n        style={secondaryVisualisationMargins}\n      >\n        {this.renderSecondaryVisualisation(secondaryVizHeight)}\n      </div>\n    );\n  }\n}\n\nSecondaryVisualisation.propTypes = {\n  ...secondaryVisualisationType.isRequired,\n  layoutType: PropTypes.string.isRequired,\n  canEdit: PropTypes.bool,\n  currentValue: PropTypes.number,\n  format: formatType,\n  height: PropTypes.number, // used to show empty label on parent hover\n  isHoveringVisualisation: PropTypes.bool,\n  labelClassName: PropTypes.string,\n  labelFontSize: PropTypes.number,\n  numberFormat: numberFormatType,\n  unit: PropTypes.string,\n  width: PropTypes.number,\n  onChangeComparisonLabel: PropTypes.func,\n};\n\nexport default SecondaryVisualisation;\n","import SecondaryVisualisation from './secondary-visualisation-component';\n\nexport default SecondaryVisualisation;\n","import React, { PureComponent } from 'react';\nimport { numberPropTypes } from '../../prop-types';\nimport {\n  getLabelFontSize,\n  getVerticalPrimaryFontSize,\n  hasSecondaryViz,\n  getStatusIndicatorState,\n} from '../../responsive-number-helpers';\nimport { VERTICAL_CENTRE_MULTIPLIER } from '../../responsive-number-constants';\nimport { getClientSize } from '../../../../lib/dom-helper';\nimport Label from '../../components/label';\nimport FramedFormattedNumber from '../../../../components/framed-formatted-number';\nimport { LAYOUT_TYPES } from '../../responsive-number-constants';\nimport SecondaryVisualisation from '../../secondary-visualisation';\n\nimport styles from './vertical-number-styles.scss';\n\nconst getContainerTop = (instrumentHeight, totalPrimaryLabelHeight) => {\n  // Position number & label slightly off centre\n  return (\n    instrumentHeight * VERTICAL_CENTRE_MULTIPLIER - totalPrimaryLabelHeight / 2\n  );\n};\n\nclass VerticalNumberComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = { widthScaleFactor: 1 };\n  }\n\n  componentDidMount() {\n    this.handleWidthConstraint();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps() {\n    // Reset widthScaleFactor before every render\n    if (this.state.widthScaleFactor !== 1) {\n      this.setState({ widthScaleFactor: 1 });\n    }\n  }\n\n  componentDidUpdate() {\n    this.handleWidthConstraint();\n  }\n\n  handleWidthConstraint() {\n    const { width } = this.props;\n    const [primaryNumberWidth] = getClientSize(this.primaryNumberRef);\n\n    // There is enough space for the primary number to be displayed.\n    // Do not set state here, to prevent executing render method infinitely.\n    if (primaryNumberWidth <= width) {\n      return;\n    }\n\n    const scale = width / primaryNumberWidth;\n    // Subtract 0.01 from scaleFactor so that we're never ending\n    // in an infinite loop\n    this.setState({ widthScaleFactor: scale - 0.01 });\n  }\n\n  render() {\n    const {\n      primaryValue,\n      numberFormat,\n      defaultLabel,\n      format,\n      canEdit,\n      label,\n      unit,\n      height,\n      width,\n      secondaryVisualisation,\n      statusIndicator,\n      onChangeLabel,\n      onChangeComparisonLabel,\n    } = this.props;\n    const { widthScaleFactor } = this.state;\n\n    const primaryFontSize = getVerticalPrimaryFontSize(\n      width,\n      height,\n      widthScaleFactor,\n    );\n    const labelFontSize = getLabelFontSize(primaryFontSize);\n    const totalPrimaryLabelHeight = primaryFontSize + labelFontSize;\n    const containerTop = getContainerTop(height, totalPrimaryLabelHeight);\n    const secondaryVizHeight = height - totalPrimaryLabelHeight - containerTop;\n    const statusIndicatorState = getStatusIndicatorState(\n      statusIndicator,\n      primaryValue,\n      format,\n      unit,\n    );\n\n    const containerStyle = {\n      top: `${containerTop}px`,\n    };\n\n    return (\n      <div className={styles.verticalNumberContainer} style={containerStyle}>\n        <div\n          className={styles.primaryNumberLayout}\n          style={{ fontSize: `${primaryFontSize}px` }}\n        >\n          <span\n            ref={input => {\n              this.primaryNumberRef = input;\n            }}\n            className={styles.primaryNumber}\n          >\n            <FramedFormattedNumber\n              value={primaryValue}\n              options={{ numberFormat, format, unit }}\n            />\n          </span>\n        </div>\n        <div\n          className={styles.labelLayout}\n          style={{\n            fontSize: `${labelFontSize}px`,\n            height: `${labelFontSize}px`,\n          }}\n        >\n          <Label\n            className={styles.label}\n            label={label}\n            defaultLabel={defaultLabel}\n            canEdit={canEdit}\n            onChange={onChangeLabel}\n          />\n        </div>\n        {hasSecondaryViz(secondaryVisualisation) && !statusIndicatorState && (\n          <SecondaryVisualisation\n            {...secondaryVisualisation}\n            currentValue={primaryValue}\n            numberFormat={numberFormat}\n            format={format}\n            canEdit={canEdit}\n            labelClassName={styles.label}\n            unit={unit}\n            labelFontSize={labelFontSize}\n            height={secondaryVizHeight}\n            width={width}\n            onChangeComparisonLabel={onChangeComparisonLabel}\n            layoutType={LAYOUT_TYPES.vertical}\n          />\n        )}\n      </div>\n    );\n  }\n}\n\nVerticalNumberComponent.propTypes = {\n  ...numberPropTypes,\n};\n\nexport default VerticalNumberComponent;\n","import VerticalNumber from './vertical-number-component';\nexport default VerticalNumber;\n","import React, { PureComponent } from 'react';\nimport { getClientSize } from '../../../../lib/dom-helper';\nimport FramedFormattedNumber from '../../../../components/framed-formatted-number';\nimport { numberPropTypes } from '../../prop-types';\nimport Label from '../../components/label';\nimport {\n  getHorizontalPrimaryFontSize,\n  getLabelFontSize,\n  hasSecondaryViz,\n  getSecondaryVisualisationStyle,\n} from '../../responsive-number-helpers';\nimport {\n  LAYOUT_TYPES,\n  SECONDARY_VIZ_TYPES,\n} from '../../responsive-number-constants';\nimport SecondaryVisualisation from '../../secondary-visualisation';\nimport { isUndefined } from 'lodash';\n\nimport styles from './horizontal-number-styles.scss';\n\n// center vertically. the main font is slightly of centre so push down (primaryFontSize * 0.05)\nconst getContainerTop = (height, fontSize) => {\n  return (height - fontSize) * 0.5 + fontSize * 0.05;\n};\n\nclass HorizontalNumber extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      widthScaleFactor: 1,\n      displaySecondaryViz: false,\n      primaryNumberWidth: 0,\n      numberAndLabelWidth: 0,\n      isHovering: false,\n    };\n  }\n\n  componentDidMount() {\n    this.handleResize();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps() {\n    // Reset widthScaleFactor before every render\n    if (this.state.widthScaleFactor !== 1) {\n      this.setState({ widthScaleFactor: 1 });\n    }\n  }\n\n  componentDidUpdate() {\n    this.handleResize();\n  }\n\n  handleResize() {\n    const { width, secondaryVisualisation } = this.props;\n    const [primaryNumberWidth] = getClientSize(this.primaryNumberRef);\n    // There is enough space for the primary number to be displayed.\n    // Do not set widthScaleFactor here, to prevent executing render method infinitely.\n    if (primaryNumberWidth <= width) {\n      let labelWidth = 0;\n      if (this.labelRef) {\n        [labelWidth] = getClientSize(this.labelRef);\n      }\n      const canFitSecondaryViz =\n        primaryNumberWidth + labelWidth <= width * 0.75;\n\n      const displaySecondaryViz =\n        hasSecondaryViz(secondaryVisualisation) && canFitSecondaryViz;\n      this.setState({\n        displaySecondaryViz,\n        primaryNumberWidth,\n        numberAndLabelWidth: primaryNumberWidth + labelWidth,\n      });\n      return;\n    }\n\n    const scale = width / primaryNumberWidth;\n    // Subtract 0.01 from scaleFactor so that we're never ending\n    // in an infinite loop\n    this.setState({ widthScaleFactor: scale - 0.01 });\n  }\n\n  render() {\n    const {\n      primaryValue,\n      numberFormat,\n      format,\n      unit,\n      height,\n      width,\n      label,\n      canEdit,\n      defaultLabel,\n      onChangeLabel,\n      onChangeComparisonLabel,\n      secondaryVisualisation,\n    } = this.props;\n    const {\n      widthScaleFactor,\n      displaySecondaryViz,\n      primaryNumberWidth,\n      numberAndLabelWidth,\n      isHovering,\n    } = this.state;\n    const primaryFontSize = getHorizontalPrimaryFontSize(\n      height,\n      widthScaleFactor,\n    );\n    const labelFontSize = getLabelFontSize(primaryFontSize);\n    const containerTop = getContainerTop(height, primaryFontSize);\n    const containerStyle = {\n      top: `${containerTop}px`,\n    };\n    const hasLabel = !isUndefined(label || defaultLabel);\n\n    const isSparklineSecondaryViz =\n      displaySecondaryViz &&\n      secondaryVisualisation.type === SECONDARY_VIZ_TYPES.Sparkline;\n\n    return (\n      <div\n        className={styles.horizontalNumberContainer}\n        style={containerStyle}\n        onMouseEnter={() => this.setState({ isHovering: true })}\n        onMouseLeave={() => this.setState({ isHovering: false })}\n      >\n        <div\n          className={styles.primaryNumberLayout}\n          style={{ fontSize: `${primaryFontSize}px` }}\n        >\n          <span\n            ref={input => {\n              this.primaryNumberRef = input;\n            }}\n            className={styles.primaryNumber}\n          >\n            <FramedFormattedNumber\n              value={primaryValue}\n              options={{ numberFormat, format, unit }}\n            />\n          </span>\n        </div>\n        <div\n          ref={input => {\n            this.labelRef = input;\n          }}\n          className={styles.labelLayout}\n          style={{\n            fontSize: `${labelFontSize}px`,\n            height: `${labelFontSize}px`,\n            paddingLeft: `${labelFontSize / 3}px`,\n            paddingRight: `${labelFontSize / 3}px`,\n            maxWidth: `${width - primaryNumberWidth - labelFontSize}px`,\n            width: hasLabel || isHovering ? 'auto' : 0,\n          }}\n        >\n          <Label\n            label={label}\n            defaultLabel={defaultLabel}\n            canEdit={canEdit}\n            onChange={onChangeLabel}\n            className={styles.label}\n          />\n        </div>\n        {displaySecondaryViz && (\n          <div\n            className={styles.secondaryVisualisationLayout}\n            style={{\n              ...getSecondaryVisualisationStyle(\n                width,\n                secondaryVisualisation.type,\n                numberAndLabelWidth,\n              ),\n            }}\n          >\n            <SecondaryVisualisation\n              {...secondaryVisualisation}\n              currentValue={primaryValue}\n              numberFormat={numberFormat}\n              format={format}\n              unit={unit}\n              labelFontSize={labelFontSize}\n              height={0.7 * primaryFontSize}\n              width={isSparklineSecondaryViz ? 0.25 * width : undefined}\n              layoutType={LAYOUT_TYPES.horizontal}\n              labelClassName={styles.label}\n              canEdit={canEdit}\n              isHoveringVisualisation={isHovering}\n              onChangeComparisonLabel={onChangeComparisonLabel}\n            />\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nHorizontalNumber.propTypes = {\n  ...numberPropTypes,\n};\n\nexport default HorizontalNumber;\n","import HorizontalNumber from './horizontal-number-component';\nexport default HorizontalNumber;\n","import React, { PureComponent } from 'react';\nimport { numberPropTypes } from '../../prop-types';\nimport {\n  hasSecondaryViz,\n  getStatusIndicatorState,\n} from '../../responsive-number-helpers';\nimport { getClientSize } from '../../../../lib/dom-helper';\nimport Label from '../../components/label';\nimport FramedFormattedNumber from '../../../../components/framed-formatted-number';\nimport {\n  LAYOUT_TYPES,\n  SECONDARY_VIZ_TYPES,\n} from '../../responsive-number-constants';\nimport SecondaryVisualisation from '../../secondary-visualisation';\nimport { PRIMARY_FONT_SIZE, LABEL_FONT_SIZE } from './mobile-number-helpers';\n\nimport styles from './mobile-number-styles.scss';\n\nclass MobileNumberComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.state = { widthScaleFactor: 1 };\n  }\n\n  componentDidMount() {\n    this.handleWidthConstraint();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps() {\n    // Reset widthScaleFactor before every render\n    if (this.state.widthScaleFactor !== 1) {\n      this.setState({ widthScaleFactor: 1 });\n    }\n  }\n\n  componentDidUpdate() {\n    this.handleWidthConstraint();\n  }\n\n  handleWidthConstraint() {\n    const { width } = this.props;\n    const [primaryNumberWidth] = getClientSize(this.primaryNumberRef);\n\n    // There is enough space for the primary number to be displayed.\n    // Do not set state here, to prevent executing render method infinitely.\n    if (primaryNumberWidth <= width) {\n      return;\n    }\n\n    const scale = width / primaryNumberWidth;\n    // Subtract 0.01 from scaleFactor so that we're never ending\n    // in an infinite loop\n    this.setState({ widthScaleFactor: scale - 0.01 });\n  }\n\n  render() {\n    const {\n      primaryValue,\n      numberFormat,\n      defaultLabel,\n      format,\n      label,\n      unit,\n      width,\n      secondaryVisualisation,\n      statusIndicator,\n    } = this.props;\n    const { widthScaleFactor } = this.state;\n\n    const statusIndicatorState = getStatusIndicatorState(\n      statusIndicator,\n      primaryValue,\n      format,\n      unit,\n    );\n    const primaryFontSize = PRIMARY_FONT_SIZE * widthScaleFactor;\n    const hasSecondary =\n      hasSecondaryViz(secondaryVisualisation) && !statusIndicatorState;\n    const hasSparkline =\n      hasSecondary &&\n      SECONDARY_VIZ_TYPES[secondaryVisualisation.type] ===\n        SECONDARY_VIZ_TYPES.Sparkline;\n    const secondaryVizHeight = hasSparkline\n      ? LABEL_FONT_SIZE * 2\n      : LABEL_FONT_SIZE;\n\n    return (\n      <div className={styles.mobileNumberContainer}>\n        <div\n          className={styles.primaryNumberLayout}\n          style={{ fontSize: `${primaryFontSize}px` }}\n        >\n          <span\n            ref={input => {\n              this.primaryNumberRef = input;\n            }}\n            className={styles.primaryNumber}\n          >\n            <FramedFormattedNumber\n              value={primaryValue}\n              options={{ numberFormat, format, unit }}\n            />\n          </span>\n        </div>\n        <div\n          className={styles.labelLayout}\n          style={{\n            fontSize: `${LABEL_FONT_SIZE}px`,\n            height: `${LABEL_FONT_SIZE}px`,\n          }}\n        >\n          <Label\n            className={styles.label}\n            label={label}\n            defaultLabel={defaultLabel}\n          />\n        </div>\n        {hasSecondary && (\n          <div style={{ height: secondaryVizHeight, marginTop: '1rem' }}>\n            <SecondaryVisualisation\n              {...secondaryVisualisation}\n              currentValue={primaryValue}\n              numberFormat={numberFormat}\n              format={format}\n              labelClassName={styles.label}\n              unit={unit}\n              labelFontSize={LABEL_FONT_SIZE}\n              height={secondaryVizHeight}\n              width={width}\n              layoutType={LAYOUT_TYPES.mobile}\n            />\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nMobileNumberComponent.propTypes = {\n  ...numberPropTypes,\n};\n\nexport default MobileNumberComponent;\n","export const PRIMARY_FONT_SIZE = 75;\nexport const LABEL_FONT_SIZE = 25;\n","import MobileNumber from './mobile-number-component';\nexport default MobileNumber;\n","import { isUndefined, last, omitBy } from 'lodash';\nimport { SECONDARY_VIZ_TYPES } from '../responsive-number-constants';\nimport { getComparisonValue } from '../../helpers';\n\nconst getSecondaryVisualisation = (\n  value,\n  comparison,\n  trendline,\n  progressIndicator,\n) => {\n  if (progressIndicator) {\n    return {\n      type: SECONDARY_VIZ_TYPES.ProgressIndicator,\n      data: {\n        ...progressIndicator,\n      },\n    };\n  }\n\n  if (comparison) {\n    // We support both legacy comparison with \"type\" and GraphQL configs with \"__typename\".\n    // This is because the comparison might come from the data and in that case\n    // it will be in legacy format.\n    const { __typename, type } = comparison;\n    const hasSparkline = type === 'sparkline' && value.length >= 2;\n    const hasTrendline = type === 'trendline' && trendline.length >= 2;\n    const hasNumberComparison =\n      (type === 'number' ||\n        __typename === SECONDARY_VIZ_TYPES.NumberComparison) &&\n      value.length >= 2;\n    const hasPercentageComparison =\n      (type === 'percentage' ||\n        __typename === SECONDARY_VIZ_TYPES.PercentageComparison) &&\n      value.length >= 2;\n\n    if (hasSparkline || hasTrendline) {\n      return {\n        type: SECONDARY_VIZ_TYPES.Sparkline,\n        data: {\n          sparklineValues: hasTrendline ? trendline : value,\n        },\n      };\n    }\n\n    if (hasNumberComparison || hasPercentageComparison) {\n      const comparisonType = hasNumberComparison\n        ? SECONDARY_VIZ_TYPES.NumberComparison\n        : SECONDARY_VIZ_TYPES.PercentageComparison;\n\n      let positiveDirection = comparison.positiveDirection;\n      if (!positiveDirection) {\n        // if positiveDirection isn't set, we've received a legacy config. Map it to GraphQL:\n        positiveDirection = comparison.reversed ? 'DOWN' : 'UP';\n      }\n\n      return {\n        type: comparisonType,\n        data: omitBy(\n          {\n            compareValue: getComparisonValue(value, comparison),\n            label: comparison.label,\n            defaultLabel: comparison.defaultLabel,\n            positiveDirection,\n          },\n          isUndefined,\n        ),\n      };\n    }\n  }\n\n  return undefined;\n};\n\nexport const transformPayload = props => {\n  const { value, comparison, trendline, progressIndicator, ...rest } = props;\n  const primaryValue = last(value);\n\n  const secondaryVisualisation = getSecondaryVisualisation(\n    value,\n    comparison,\n    trendline,\n    progressIndicator,\n  );\n\n  return {\n    ...rest,\n    secondaryVisualisation,\n    primaryValue,\n  };\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport VerticalLayout from './layouts/vertical';\nimport HorizontalLayout from './layouts/horizontal';\nimport MobileLayout from './layouts/mobile';\nimport { SECONDARY_VIZ_TYPES } from './responsive-number-constants';\nimport { transformPayload } from './transform-payload/transform-payload-helpers';\nimport { getStatusIndicatorState } from './responsive-number-helpers';\nimport {\n  formatType,\n  numberFormatType,\n  progressIndicatorType,\n  statusIndicatorType,\n} from './prop-types';\nimport { useMobileDetect } from '@Hooks';\n\nimport styles from './responsive-number-style.scss';\n\nconst ResponsiveNumber = props => {\n  const transformedProps = transformPayload(props);\n  const isHorizontalLayout = props.width / props.height > 4;\n  const isMobile = useMobileDetect();\n\n  const renderLayout = () => {\n    if (isMobile) {\n      return <MobileLayout {...transformedProps} />;\n    }\n    if (isHorizontalLayout) {\n      return <HorizontalLayout {...transformedProps} />;\n    }\n\n    return <VerticalLayout {...transformedProps} />;\n  };\n\n  return <div className={styles.container}>{renderLayout()}</div>;\n};\n\nResponsiveNumber.getStatusIndicatorState = (statusIndicator, data) => {\n  if (!statusIndicator) {\n    return undefined;\n  }\n\n  const { value, format, unit } = data;\n  const transformedData = transformPayload({ value, format, unit });\n  const {\n    primaryValue,\n    format: transformedFormat,\n    unit: transformedUnit,\n  } = transformedData;\n\n  return getStatusIndicatorState(\n    statusIndicator,\n    primaryValue,\n    transformedFormat,\n    transformedUnit,\n  );\n};\n\nResponsiveNumber.defaultProps = {\n  format: 'decimal',\n};\n\n// Support various comparison types:\n// 1. Legacy sparkline/trendline config\n// 2. GraphQL number/percent config\n// 3. Legacy number/percent config\nconst comparisonType = PropTypes.oneOfType([\n  PropTypes.shape({\n    type: PropTypes.string,\n  }),\n  PropTypes.shape({\n    __typename: PropTypes.oneOf([\n      SECONDARY_VIZ_TYPES.NumberComparison,\n      SECONDARY_VIZ_TYPES.PercentageComparison,\n    ]),\n    label: PropTypes.string,\n    positiveDirection: PropTypes.oneOf(['UP', 'DOWN']),\n  }),\n  PropTypes.shape({\n    defaultLabel: PropTypes.string,\n    label: PropTypes.string,\n    reversed: PropTypes.bool,\n    type: PropTypes.string,\n  }),\n]);\n\nResponsiveNumber.propTypes = {\n  value: PropTypes.arrayOf(PropTypes.number).isRequired,\n  canEdit: PropTypes.bool,\n  comparison: comparisonType,\n  defaultLabel: PropTypes.string,\n  format: formatType,\n  height: PropTypes.number,\n  label: PropTypes.string,\n  numberFormat: numberFormatType,\n  progressIndicator: progressIndicatorType,\n  statusIndicator: statusIndicatorType,\n  unit: PropTypes.string,\n  width: PropTypes.number,\n  onChangeComparisonLabel: PropTypes.func,\n  onChangeLabel: PropTypes.func,\n};\n\nexport default ResponsiveNumber;\n","// Set the root from which webpack can load chunks\n// This needs to be in a separate module so that it is executed first within our entrypoint\n// since `import` is hoisted\n\n// eslint-disable-next-line camelcase, no-undef\n__webpack_public_path__ = window.PUBLIC_BASE_URL;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _formats = require(\"../constants/formats\");\n\nvar _lineEndings = require(\"../constants/lineEndings\");\n\nvar _generator = _interopRequireDefault(require(\"../lib/generator\"));\n\nvar _util = require(\"../util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar LoremIpsum =\n/*#__PURE__*/\nfunction () {\n  function LoremIpsum() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _formats.FORMAT_PLAIN;\n    var suffix = arguments.length > 2 ? arguments[2] : undefined;\n\n    _classCallCheck(this, LoremIpsum);\n\n    _defineProperty(this, \"generator\", void 0);\n\n    _defineProperty(this, \"format\", void 0);\n\n    _defineProperty(this, \"suffix\", void 0);\n\n    if (_formats.FORMATS.indexOf(format.toLowerCase()) === -1) {\n      throw new Error(\"\".concat(format, \" is an invalid format. Please use \").concat(_formats.FORMATS.join(\" or \"), \".\"));\n    }\n\n    this.format = format.toLowerCase();\n    this.suffix = suffix;\n    this.generator = new _generator.default(options);\n  }\n\n  _createClass(LoremIpsum, [{\n    key: \"getLineEnding\",\n    value: function getLineEnding() {\n      if (this.suffix) {\n        return this.suffix;\n      }\n\n      if (!(0, _util.isReactNative)() && (0, _util.isNode)() && (0, _util.isWindows)()) {\n        return _lineEndings.LINE_ENDINGS.WIN32;\n      }\n\n      return _lineEndings.LINE_ENDINGS.POSIX;\n    }\n  }, {\n    key: \"formatString\",\n    value: function formatString(str) {\n      if (this.format === _formats.FORMAT_HTML) {\n        return \"<p>\".concat(str, \"</p>\");\n      }\n\n      return str;\n    }\n  }, {\n    key: \"formatStrings\",\n    value: function formatStrings(strings) {\n      var _this = this;\n\n      return strings.map(function (str) {\n        return _this.formatString(str);\n      });\n    }\n  }, {\n    key: \"generateWords\",\n    value: function generateWords(num) {\n      return this.formatString(this.generator.generateRandomWords(num));\n    }\n  }, {\n    key: \"generateSentences\",\n    value: function generateSentences(num) {\n      return this.formatString(this.generator.generateRandomParagraph(num));\n    }\n  }, {\n    key: \"generateParagraphs\",\n    value: function generateParagraphs(num) {\n      var makeString = this.generator.generateRandomParagraph.bind(this.generator);\n      return this.formatStrings((0, _util.makeArrayOfStrings)(num, makeString)).join(this.getLineEnding());\n    }\n  }]);\n\n  return LoremIpsum;\n}();\n\nvar _default = LoremIpsum;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvTG9yZW1JcHN1bS50cyJdLCJuYW1lcyI6WyJMb3JlbUlwc3VtIiwib3B0aW9ucyIsImZvcm1hdCIsIkZPUk1BVF9QTEFJTiIsInN1ZmZpeCIsIkZPUk1BVFMiLCJpbmRleE9mIiwidG9Mb3dlckNhc2UiLCJFcnJvciIsImpvaW4iLCJnZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJMSU5FX0VORElOR1MiLCJXSU4zMiIsIlBPU0lYIiwic3RyIiwiRk9STUFUX0hUTUwiLCJzdHJpbmdzIiwibWFwIiwiZm9ybWF0U3RyaW5nIiwibnVtIiwiZ2VuZXJhdGVSYW5kb21Xb3JkcyIsImdlbmVyYXRlUmFuZG9tUGFyYWdyYXBoIiwibWFrZVN0cmluZyIsImJpbmQiLCJmb3JtYXRTdHJpbmdzIiwiZ2V0TGluZUVuZGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7SUFFTUEsVTs7O0FBS0osd0JBSUU7QUFBQSxRQUhBQyxPQUdBLHVFQUg2QixFQUc3QjtBQUFBLFFBRkFDLE1BRUEsdUVBRmlCQyxxQkFFakI7QUFBQSxRQURBQyxNQUNBOztBQUFBOztBQUFBOztBQUFBOztBQUFBOztBQUNBLFFBQUlDLGlCQUFRQyxPQUFSLENBQWdCSixNQUFNLENBQUNLLFdBQVAsRUFBaEIsTUFBMEMsQ0FBQyxDQUEvQyxFQUFrRDtBQUNoRCxZQUFNLElBQUlDLEtBQUosV0FDRE4sTUFEQywrQ0FDMENHLGlCQUFRSSxJQUFSLENBQWEsTUFBYixDQUQxQyxPQUFOO0FBR0Q7O0FBRUQsU0FBS1AsTUFBTCxHQUFjQSxNQUFNLENBQUNLLFdBQVAsRUFBZDtBQUNBLFNBQUtILE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtNLFNBQUwsR0FBaUIsSUFBSUMsa0JBQUosQ0FBY1YsT0FBZCxDQUFqQjtBQUNEOzs7O29DQUVzQjtBQUNyQixVQUFJLEtBQUtHLE1BQVQsRUFBaUI7QUFDZixlQUFPLEtBQUtBLE1BQVo7QUFDRDs7QUFFRCxVQUFJLENBQUMsMEJBQUQsSUFBb0IsbUJBQXBCLElBQWdDLHNCQUFwQyxFQUFpRDtBQUMvQyxlQUFPUSwwQkFBYUMsS0FBcEI7QUFDRDs7QUFFRCxhQUFPRCwwQkFBYUUsS0FBcEI7QUFDRDs7O2lDQUVtQkMsRyxFQUFxQjtBQUN2QyxVQUFJLEtBQUtiLE1BQUwsS0FBZ0JjLG9CQUFwQixFQUFpQztBQUMvQiw0QkFBYUQsR0FBYjtBQUNEOztBQUNELGFBQU9BLEdBQVA7QUFDRDs7O2tDQUVvQkUsTyxFQUE2QjtBQUFBOztBQUNoRCxhQUFPQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSxVQUFDSCxHQUFEO0FBQUEsZUFBUyxLQUFJLENBQUNJLFlBQUwsQ0FBa0JKLEdBQWxCLENBQVQ7QUFBQSxPQUFaLENBQVA7QUFDRDs7O2tDQUVvQkssRyxFQUFzQjtBQUN6QyxhQUFPLEtBQUtELFlBQUwsQ0FBa0IsS0FBS1QsU0FBTCxDQUFlVyxtQkFBZixDQUFtQ0QsR0FBbkMsQ0FBbEIsQ0FBUDtBQUNEOzs7c0NBRXdCQSxHLEVBQXNCO0FBQzdDLGFBQU8sS0FBS0QsWUFBTCxDQUFrQixLQUFLVCxTQUFMLENBQWVZLHVCQUFmLENBQXVDRixHQUF2QyxDQUFsQixDQUFQO0FBQ0Q7Ozt1Q0FFeUJBLEcsRUFBcUI7QUFDN0MsVUFBTUcsVUFBVSxHQUFHLEtBQUtiLFNBQUwsQ0FBZVksdUJBQWYsQ0FBdUNFLElBQXZDLENBQ2pCLEtBQUtkLFNBRFksQ0FBbkI7QUFHQSxhQUFPLEtBQUtlLGFBQUwsQ0FBbUIsOEJBQW1CTCxHQUFuQixFQUF3QkcsVUFBeEIsQ0FBbkIsRUFBd0RkLElBQXhELENBQ0wsS0FBS2lCLGFBQUwsRUFESyxDQUFQO0FBR0Q7Ozs7OztlQUdZMUIsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZPUk1BVF9IVE1MLCBGT1JNQVRfUExBSU4sIEZPUk1BVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL2Zvcm1hdHNcIjtcclxuaW1wb3J0IHsgTElORV9FTkRJTkdTIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9saW5lRW5kaW5nc1wiO1xyXG5pbXBvcnQgR2VuZXJhdG9yLCB7IElHZW5lcmF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL2xpYi9nZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgaXNOb2RlLCBpc1JlYWN0TmF0aXZlLCBpc1dpbmRvd3MsIG1ha2VBcnJheU9mU3RyaW5ncyB9IGZyb20gXCIuLi91dGlsXCI7XHJcblxyXG5jbGFzcyBMb3JlbUlwc3VtIHtcclxuICBwdWJsaWMgZ2VuZXJhdG9yOiBHZW5lcmF0b3I7XHJcbiAgcHVibGljIGZvcm1hdDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdWZmaXg/OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgb3B0aW9uczogSUdlbmVyYXRvck9wdGlvbnMgPSB7fSxcclxuICAgIGZvcm1hdDogc3RyaW5nID0gRk9STUFUX1BMQUlOLFxyXG4gICAgc3VmZml4Pzogc3RyaW5nLFxyXG4gICkge1xyXG4gICAgaWYgKEZPUk1BVFMuaW5kZXhPZihmb3JtYXQudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgJHtmb3JtYXR9IGlzIGFuIGludmFsaWQgZm9ybWF0LiBQbGVhc2UgdXNlICR7Rk9STUFUUy5qb2luKFwiIG9yIFwiKX0uYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7XHJcbiAgICB0aGlzLmdlbmVyYXRvciA9IG5ldyBHZW5lcmF0b3Iob3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGluZUVuZGluZygpIHtcclxuICAgIGlmICh0aGlzLnN1ZmZpeCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdWZmaXg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc1JlYWN0TmF0aXZlKCkgJiYgaXNOb2RlKCkgJiYgaXNXaW5kb3dzKCkpIHtcclxuICAgICAgcmV0dXJuIExJTkVfRU5ESU5HUy5XSU4zMjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTElORV9FTkRJTkdTLlBPU0lYO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdFN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5mb3JtYXQgPT09IEZPUk1BVF9IVE1MKSB7XHJcbiAgICAgIHJldHVybiBgPHA+JHtzdHJ9PC9wPmA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGZvcm1hdFN0cmluZ3Moc3RyaW5nczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gc3RyaW5ncy5tYXAoKHN0cikgPT4gdGhpcy5mb3JtYXRTdHJpbmcoc3RyKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVXb3JkcyhudW0/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0U3RyaW5nKHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlUmFuZG9tV29yZHMobnVtKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2VuZXJhdGVTZW50ZW5jZXMobnVtPzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdFN0cmluZyh0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVJhbmRvbVBhcmFncmFwaChudW0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVBhcmFncmFwaHMobnVtOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFrZVN0cmluZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlUmFuZG9tUGFyYWdyYXBoLmJpbmQoXHJcbiAgICAgIHRoaXMuZ2VuZXJhdG9yLFxyXG4gICAgKTtcclxuICAgIHJldHVybiB0aGlzLmZvcm1hdFN0cmluZ3MobWFrZUFycmF5T2ZTdHJpbmdzKG51bSwgbWFrZVN0cmluZykpLmpvaW4oXHJcbiAgICAgIHRoaXMuZ2V0TGluZUVuZGluZygpLFxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExvcmVtSXBzdW07XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FORMATS = exports.FORMAT_PLAIN = exports.FORMAT_HTML = void 0;\nvar FORMAT_HTML = \"html\";\nexports.FORMAT_HTML = FORMAT_HTML;\nvar FORMAT_PLAIN = \"plain\";\nexports.FORMAT_PLAIN = FORMAT_PLAIN;\nvar FORMATS = [FORMAT_HTML, FORMAT_PLAIN];\nexports.FORMATS = FORMATS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvZm9ybWF0cy50cyJdLCJuYW1lcyI6WyJGT1JNQVRfSFRNTCIsIkZPUk1BVF9QTEFJTiIsIkZPUk1BVFMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLElBQU1BLFdBQVcsR0FBRyxNQUFwQjs7QUFDQSxJQUFNQyxZQUFZLEdBQUcsT0FBckI7O0FBQ0EsSUFBTUMsT0FBTyxHQUFHLENBQUNGLFdBQUQsRUFBY0MsWUFBZCxDQUFoQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBGT1JNQVRfSFRNTCA9IFwiaHRtbFwiO1xyXG5leHBvcnQgY29uc3QgRk9STUFUX1BMQUlOID0gXCJwbGFpblwiO1xyXG5leHBvcnQgY29uc3QgRk9STUFUUyA9IFtGT1JNQVRfSFRNTCwgRk9STUFUX1BMQUlOXTtcclxuIl19","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LINE_ENDINGS = void 0;\nvar LINE_ENDINGS = {\n  POSIX: \"\\n\",\n  WIN32: \"\\r\\n\"\n};\nexports.LINE_ENDINGS = LINE_ENDINGS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvbGluZUVuZGluZ3MudHMiXSwibmFtZXMiOlsiTElORV9FTkRJTkdTIiwiUE9TSVgiLCJXSU4zMiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQU8sSUFBTUEsWUFBWSxHQUFHO0FBQzFCQyxFQUFBQSxLQUFLLEVBQUUsSUFEbUI7QUFFMUJDLEVBQUFBLEtBQUssRUFBRTtBQUZtQixDQUFyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBMSU5FX0VORElOR1MgPSB7XHJcbiAgUE9TSVg6IFwiXFxuXCIsXHJcbiAgV0lOMzI6IFwiXFxyXFxuXCIsXHJcbn07XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _words = require(\"../constants/words\");\n\nvar _util = require(\"../util\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Generator =\n/*#__PURE__*/\nfunction () {\n  function Generator() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref$sentencesPerPara = _ref.sentencesPerParagraph,\n        sentencesPerParagraph = _ref$sentencesPerPara === void 0 ? {\n      max: 7,\n      min: 3\n    } : _ref$sentencesPerPara,\n        _ref$wordsPerSentence = _ref.wordsPerSentence,\n        wordsPerSentence = _ref$wordsPerSentence === void 0 ? {\n      max: 15,\n      min: 5\n    } : _ref$wordsPerSentence,\n        random = _ref.random,\n        seed = _ref.seed,\n        _ref$words = _ref.words,\n        words = _ref$words === void 0 ? _words.WORDS : _ref$words;\n\n    _classCallCheck(this, Generator);\n\n    _defineProperty(this, \"sentencesPerParagraph\", void 0);\n\n    _defineProperty(this, \"wordsPerSentence\", void 0);\n\n    _defineProperty(this, \"random\", void 0);\n\n    _defineProperty(this, \"words\", void 0);\n\n    if (sentencesPerParagraph.min > sentencesPerParagraph.max) {\n      throw new Error(\"Minimum number of sentences per paragraph (\".concat(sentencesPerParagraph.min, \") cannot exceed maximum (\").concat(sentencesPerParagraph.max, \").\"));\n    }\n\n    if (wordsPerSentence.min > wordsPerSentence.max) {\n      throw new Error(\"Minimum number of words per sentence (\".concat(wordsPerSentence.min, \") cannot exceed maximum (\").concat(wordsPerSentence.max, \").\"));\n    }\n\n    this.sentencesPerParagraph = sentencesPerParagraph;\n    this.words = words;\n    this.wordsPerSentence = wordsPerSentence;\n    this.random = random || Math.random;\n  }\n\n  _createClass(Generator, [{\n    key: \"generateRandomInteger\",\n    value: function generateRandomInteger(min, max) {\n      return Math.floor(this.random() * (max - min + 1) + min);\n    }\n  }, {\n    key: \"generateRandomWords\",\n    value: function generateRandomWords(num) {\n      var _this = this;\n\n      var _this$wordsPerSentenc = this.wordsPerSentence,\n          min = _this$wordsPerSentenc.min,\n          max = _this$wordsPerSentenc.max;\n      var length = num || this.generateRandomInteger(min, max);\n      return (0, _util.makeArrayOfLength)(length).reduce(function (accumulator, index) {\n        return \"\".concat(_this.pluckRandomWord(), \" \").concat(accumulator);\n      }, \"\").trim();\n    }\n  }, {\n    key: \"generateRandomSentence\",\n    value: function generateRandomSentence(num) {\n      return \"\".concat((0, _util.capitalize)(this.generateRandomWords(num)), \".\");\n    }\n  }, {\n    key: \"generateRandomParagraph\",\n    value: function generateRandomParagraph(num) {\n      var _this2 = this;\n\n      var _this$sentencesPerPar = this.sentencesPerParagraph,\n          min = _this$sentencesPerPar.min,\n          max = _this$sentencesPerPar.max;\n      var length = num || this.generateRandomInteger(min, max);\n      return (0, _util.makeArrayOfLength)(length).reduce(function (accumulator, index) {\n        return \"\".concat(_this2.generateRandomSentence(), \" \").concat(accumulator);\n      }, \"\").trim();\n    }\n  }, {\n    key: \"pluckRandomWord\",\n    value: function pluckRandomWord() {\n      var min = 0;\n      var max = this.words.length - 1;\n      var index = this.generateRandomInteger(min, max);\n      return this.words[index];\n    }\n  }]);\n\n  return Generator;\n}();\n\nvar _default = Generator;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbIkdlbmVyYXRvciIsInNlbnRlbmNlc1BlclBhcmFncmFwaCIsIm1heCIsIm1pbiIsIndvcmRzUGVyU2VudGVuY2UiLCJyYW5kb20iLCJzZWVkIiwid29yZHMiLCJXT1JEUyIsIkVycm9yIiwiTWF0aCIsImZsb29yIiwibnVtIiwibGVuZ3RoIiwiZ2VuZXJhdGVSYW5kb21JbnRlZ2VyIiwicmVkdWNlIiwiYWNjdW11bGF0b3IiLCJpbmRleCIsInBsdWNrUmFuZG9tV29yZCIsInRyaW0iLCJnZW5lcmF0ZVJhbmRvbVdvcmRzIiwiZ2VuZXJhdGVSYW5kb21TZW50ZW5jZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7Ozs7O0lBdUJNQSxTOzs7QUFNSix1QkFNMkI7QUFBQSxtRkFBSixFQUFJO0FBQUEscUNBTHpCQyxxQkFLeUI7QUFBQSxRQUx6QkEscUJBS3lCLHNDQUxEO0FBQUVDLE1BQUFBLEdBQUcsRUFBRSxDQUFQO0FBQVVDLE1BQUFBLEdBQUcsRUFBRTtBQUFmLEtBS0M7QUFBQSxxQ0FKekJDLGdCQUl5QjtBQUFBLFFBSnpCQSxnQkFJeUIsc0NBSk47QUFBRUYsTUFBQUEsR0FBRyxFQUFFLEVBQVA7QUFBV0MsTUFBQUEsR0FBRyxFQUFFO0FBQWhCLEtBSU07QUFBQSxRQUh6QkUsTUFHeUIsUUFIekJBLE1BR3lCO0FBQUEsUUFGekJDLElBRXlCLFFBRnpCQSxJQUV5QjtBQUFBLDBCQUR6QkMsS0FDeUI7QUFBQSxRQUR6QkEsS0FDeUIsMkJBRGpCQyxZQUNpQjs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFDekIsUUFBSVAscUJBQXFCLENBQUNFLEdBQXRCLEdBQTRCRixxQkFBcUIsQ0FBQ0MsR0FBdEQsRUFBMkQ7QUFDekQsWUFBTSxJQUFJTyxLQUFKLHNEQUVGUixxQkFBcUIsQ0FBQ0UsR0FGcEIsc0NBR3dCRixxQkFBcUIsQ0FBQ0MsR0FIOUMsUUFBTjtBQUtEOztBQUVELFFBQUlFLGdCQUFnQixDQUFDRCxHQUFqQixHQUF1QkMsZ0JBQWdCLENBQUNGLEdBQTVDLEVBQWlEO0FBQy9DLFlBQU0sSUFBSU8sS0FBSixpREFFRkwsZ0JBQWdCLENBQUNELEdBRmYsc0NBR3dCQyxnQkFBZ0IsQ0FBQ0YsR0FIekMsUUFBTjtBQUtEOztBQUVELFNBQUtELHFCQUFMLEdBQTZCQSxxQkFBN0I7QUFDQSxTQUFLTSxLQUFMLEdBQWFBLEtBQWI7QUFDQSxTQUFLSCxnQkFBTCxHQUF3QkEsZ0JBQXhCO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFNLElBQUlLLElBQUksQ0FBQ0wsTUFBN0I7QUFDRDs7OzswQ0FFNEJGLEcsRUFBYUQsRyxFQUFxQjtBQUM3RCxhQUFPUSxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLTixNQUFMLE1BQWlCSCxHQUFHLEdBQUdDLEdBQU4sR0FBWSxDQUE3QixJQUFrQ0EsR0FBN0MsQ0FBUDtBQUNEOzs7d0NBRTBCUyxHLEVBQXNCO0FBQUE7O0FBQUEsa0NBQzFCLEtBQUtSLGdCQURxQjtBQUFBLFVBQ3ZDRCxHQUR1Qyx5QkFDdkNBLEdBRHVDO0FBQUEsVUFDbENELEdBRGtDLHlCQUNsQ0EsR0FEa0M7QUFFL0MsVUFBTVcsTUFBTSxHQUFHRCxHQUFHLElBQUksS0FBS0UscUJBQUwsQ0FBMkJYLEdBQTNCLEVBQWdDRCxHQUFoQyxDQUF0QjtBQUNBLGFBQU8sNkJBQWtCVyxNQUFsQixFQUNKRSxNQURJLENBQ0csVUFBQ0MsV0FBRCxFQUFzQkMsS0FBdEIsRUFBZ0Q7QUFDdEQseUJBQVUsS0FBSSxDQUFDQyxlQUFMLEVBQVYsY0FBb0NGLFdBQXBDO0FBQ0QsT0FISSxFQUdGLEVBSEUsRUFJSkcsSUFKSSxFQUFQO0FBS0Q7OzsyQ0FFNkJQLEcsRUFBc0I7QUFDbEQsdUJBQVUsc0JBQVcsS0FBS1EsbUJBQUwsQ0FBeUJSLEdBQXpCLENBQVgsQ0FBVjtBQUNEOzs7NENBRThCQSxHLEVBQXNCO0FBQUE7O0FBQUEsa0NBQzlCLEtBQUtYLHFCQUR5QjtBQUFBLFVBQzNDRSxHQUQyQyx5QkFDM0NBLEdBRDJDO0FBQUEsVUFDdENELEdBRHNDLHlCQUN0Q0EsR0FEc0M7QUFFbkQsVUFBTVcsTUFBTSxHQUFHRCxHQUFHLElBQUksS0FBS0UscUJBQUwsQ0FBMkJYLEdBQTNCLEVBQWdDRCxHQUFoQyxDQUF0QjtBQUNBLGFBQU8sNkJBQWtCVyxNQUFsQixFQUNKRSxNQURJLENBQ0csVUFBQ0MsV0FBRCxFQUFzQkMsS0FBdEIsRUFBZ0Q7QUFDdEQseUJBQVUsTUFBSSxDQUFDSSxzQkFBTCxFQUFWLGNBQTJDTCxXQUEzQztBQUNELE9BSEksRUFHRixFQUhFLEVBSUpHLElBSkksRUFBUDtBQUtEOzs7c0NBRWdDO0FBQy9CLFVBQU1oQixHQUFHLEdBQUcsQ0FBWjtBQUNBLFVBQU1ELEdBQUcsR0FBRyxLQUFLSyxLQUFMLENBQVdNLE1BQVgsR0FBb0IsQ0FBaEM7QUFDQSxVQUFNSSxLQUFLLEdBQUcsS0FBS0gscUJBQUwsQ0FBMkJYLEdBQTNCLEVBQWdDRCxHQUFoQyxDQUFkO0FBQ0EsYUFBTyxLQUFLSyxLQUFMLENBQVdVLEtBQVgsQ0FBUDtBQUNEOzs7Ozs7ZUFHWWpCLFMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXT1JEUyB9IGZyb20gXCIuLi9jb25zdGFudHMvd29yZHNcIjtcclxuaW1wb3J0IHsgY2FwaXRhbGl6ZSwgbWFrZUFycmF5T2ZMZW5ndGggfSBmcm9tIFwiLi4vdXRpbFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQm91bmRzIHtcclxuICBtaW46IG51bWJlcjtcclxuICBtYXg6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVBybmcgPSAoKSA9PiBudW1iZXI7XHJcblxyXG5leHBvcnQgdHlwZSBJU2VlZFJhbmRvbSA9IG5ldyAoc2VlZD86IHN0cmluZykgPT4gSVBybmc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNYXRoIHtcclxuICBzZWVkcmFuZG9tOiBJU2VlZFJhbmRvbTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJR2VuZXJhdG9yT3B0aW9ucyB7XHJcbiAgc2VudGVuY2VzUGVyUGFyYWdyYXBoPzogSUJvdW5kcztcclxuICB3b3Jkc1BlclNlbnRlbmNlPzogSUJvdW5kcztcclxuICByYW5kb20/OiBJUHJuZztcclxuICBzZWVkPzogc3RyaW5nO1xyXG4gIHdvcmRzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmNsYXNzIEdlbmVyYXRvciB7XHJcbiAgcHVibGljIHNlbnRlbmNlc1BlclBhcmFncmFwaDogSUJvdW5kcztcclxuICBwdWJsaWMgd29yZHNQZXJTZW50ZW5jZTogSUJvdW5kcztcclxuICBwdWJsaWMgcmFuZG9tOiBJUHJuZztcclxuICBwdWJsaWMgd29yZHM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih7XHJcbiAgICBzZW50ZW5jZXNQZXJQYXJhZ3JhcGggPSB7IG1heDogNywgbWluOiAzIH0sXHJcbiAgICB3b3Jkc1BlclNlbnRlbmNlID0geyBtYXg6IDE1LCBtaW46IDUgfSxcclxuICAgIHJhbmRvbSxcclxuICAgIHNlZWQsXHJcbiAgICB3b3JkcyA9IFdPUkRTLFxyXG4gIH06IElHZW5lcmF0b3JPcHRpb25zID0ge30pIHtcclxuICAgIGlmIChzZW50ZW5jZXNQZXJQYXJhZ3JhcGgubWluID4gc2VudGVuY2VzUGVyUGFyYWdyYXBoLm1heCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYE1pbmltdW0gbnVtYmVyIG9mIHNlbnRlbmNlcyBwZXIgcGFyYWdyYXBoICgke1xyXG4gICAgICAgICAgc2VudGVuY2VzUGVyUGFyYWdyYXBoLm1pblxyXG4gICAgICAgIH0pIGNhbm5vdCBleGNlZWQgbWF4aW11bSAoJHtzZW50ZW5jZXNQZXJQYXJhZ3JhcGgubWF4fSkuYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod29yZHNQZXJTZW50ZW5jZS5taW4gPiB3b3Jkc1BlclNlbnRlbmNlLm1heCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYE1pbmltdW0gbnVtYmVyIG9mIHdvcmRzIHBlciBzZW50ZW5jZSAoJHtcclxuICAgICAgICAgIHdvcmRzUGVyU2VudGVuY2UubWluXHJcbiAgICAgICAgfSkgY2Fubm90IGV4Y2VlZCBtYXhpbXVtICgke3dvcmRzUGVyU2VudGVuY2UubWF4fSkuYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbnRlbmNlc1BlclBhcmFncmFwaCA9IHNlbnRlbmNlc1BlclBhcmFncmFwaDtcclxuICAgIHRoaXMud29yZHMgPSB3b3JkcztcclxuICAgIHRoaXMud29yZHNQZXJTZW50ZW5jZSA9IHdvcmRzUGVyU2VudGVuY2U7XHJcbiAgICB0aGlzLnJhbmRvbSA9IHJhbmRvbSB8fCBNYXRoLnJhbmRvbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVJhbmRvbUludGVnZXIobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlUmFuZG9tV29yZHMobnVtPzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHsgbWluLCBtYXggfSA9IHRoaXMud29yZHNQZXJTZW50ZW5jZTtcclxuICAgIGNvbnN0IGxlbmd0aCA9IG51bSB8fCB0aGlzLmdlbmVyYXRlUmFuZG9tSW50ZWdlcihtaW4sIG1heCk7XHJcbiAgICByZXR1cm4gbWFrZUFycmF5T2ZMZW5ndGgobGVuZ3RoKVxyXG4gICAgICAucmVkdWNlKChhY2N1bXVsYXRvcjogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5wbHVja1JhbmRvbVdvcmQoKX0gJHthY2N1bXVsYXRvcn1gO1xyXG4gICAgICB9LCBcIlwiKVxyXG4gICAgICAudHJpbSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdlbmVyYXRlUmFuZG9tU2VudGVuY2UobnVtPzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtjYXBpdGFsaXplKHRoaXMuZ2VuZXJhdGVSYW5kb21Xb3JkcyhudW0pKX0uYDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZW5lcmF0ZVJhbmRvbVBhcmFncmFwaChudW0/OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpcy5zZW50ZW5jZXNQZXJQYXJhZ3JhcGg7XHJcbiAgICBjb25zdCBsZW5ndGggPSBudW0gfHwgdGhpcy5nZW5lcmF0ZVJhbmRvbUludGVnZXIobWluLCBtYXgpO1xyXG4gICAgcmV0dXJuIG1ha2VBcnJheU9mTGVuZ3RoKGxlbmd0aClcclxuICAgICAgLnJlZHVjZSgoYWNjdW11bGF0b3I6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ2VuZXJhdGVSYW5kb21TZW50ZW5jZSgpfSAke2FjY3VtdWxhdG9yfWA7XHJcbiAgICAgIH0sIFwiXCIpXHJcbiAgICAgIC50cmltKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGx1Y2tSYW5kb21Xb3JkKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtaW4gPSAwO1xyXG4gICAgY29uc3QgbWF4ID0gdGhpcy53b3Jkcy5sZW5ndGggLSAxO1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdlbmVyYXRlUmFuZG9tSW50ZWdlcihtaW4sIG1heCk7XHJcbiAgICByZXR1cm4gdGhpcy53b3Jkc1tpbmRleF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHZW5lcmF0b3I7XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\n/**\r\n * @param str  A string that may or may not be capitalized.\r\n * @returns    A capitalized string.\r\n */\nvar capitalize = function capitalize(str) {\n  var trimmed = str.trim();\n  return trimmed.charAt(0).toUpperCase() + trimmed.slice(1);\n};\n\nvar _default = capitalize;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2NhcGl0YWxpemUudHMiXSwibmFtZXMiOlsiY2FwaXRhbGl6ZSIsInN0ciIsInRyaW1tZWQiLCJ0cmltIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBSUEsSUFBTUEsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ0MsR0FBRCxFQUF5QjtBQUMxQyxNQUFNQyxPQUFPLEdBQUdELEdBQUcsQ0FBQ0UsSUFBSixFQUFoQjtBQUNBLFNBQU9ELE9BQU8sQ0FBQ0UsTUFBUixDQUFlLENBQWYsRUFBa0JDLFdBQWxCLEtBQWtDSCxPQUFPLENBQUNJLEtBQVIsQ0FBYyxDQUFkLENBQXpDO0FBQ0QsQ0FIRDs7ZUFLZU4sVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAcGFyYW0gc3RyICBBIHN0cmluZyB0aGF0IG1heSBvciBtYXkgbm90IGJlIGNhcGl0YWxpemVkLlxyXG4gKiBAcmV0dXJucyAgICBBIGNhcGl0YWxpemVkIHN0cmluZy5cclxuICovXHJcbmNvbnN0IGNhcGl0YWxpemUgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IHRyaW1tZWQgPSBzdHIudHJpbSgpO1xyXG4gIHJldHVybiB0cmltbWVkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHJpbW1lZC5zbGljZSgxKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNhcGl0YWxpemU7XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\n/**\r\n * @returns  True if the runtime is NodeJS.\r\n */\nvar isNode = function isNode() {\n  return typeof module !== \"undefined\" && !!module.exports;\n};\n\nvar _default = isNode;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2lzTm9kZS50cyJdLCJuYW1lcyI6WyJpc05vZGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7OztBQUdBLElBQU1BLE1BQU0sR0FBRyxTQUFUQSxNQUFTLEdBQWU7QUFDNUIsU0FBTyxPQUFPQyxNQUFQLEtBQWtCLFdBQWxCLElBQWlDLENBQUMsQ0FBQ0EsTUFBTSxDQUFDQyxPQUFqRDtBQUNELENBRkQ7O2VBSWVGLE0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQHJldHVybnMgIFRydWUgaWYgdGhlIHJ1bnRpbWUgaXMgTm9kZUpTLlxyXG4gKi9cclxuY29uc3QgaXNOb2RlID0gKCk6IGJvb2xlYW4gPT4ge1xyXG4gIHJldHVybiB0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmICEhbW9kdWxlLmV4cG9ydHM7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpc05vZGU7XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\n/**\r\n * @returns  True if runtime is ReactNative.\r\n */\nvar isReactNative = function isReactNative() {\n  return typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\n};\n\nvar _default = isReactNative;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2lzUmVhY3ROYXRpdmUudHMiXSwibmFtZXMiOlsiaXNSZWFjdE5hdGl2ZSIsIm5hdmlnYXRvciIsInByb2R1Y3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7O0FBR0EsSUFBTUEsYUFBYSxHQUFHLFNBQWhCQSxhQUFnQixHQUFlO0FBQ25DLFNBQ0UsT0FBT0MsU0FBUCxLQUFxQixXQUFyQixJQUFvQ0EsU0FBUyxDQUFDQyxPQUFWLEtBQXNCLGFBRDVEO0FBR0QsQ0FKRDs7ZUFNZUYsYSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAcmV0dXJucyAgVHJ1ZSBpZiBydW50aW1lIGlzIFJlYWN0TmF0aXZlLlxyXG4gKi9cclxuY29uc3QgaXNSZWFjdE5hdGl2ZSA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gXCJSZWFjdE5hdGl2ZVwiXHJcbiAgKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGlzUmVhY3ROYXRpdmU7XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _platforms = require(\"../constants/platforms\");\n\n/**\r\n * @returns True if process is windows.\r\n */\nvar isWindows = function isWindows() {\n  return typeof process !== \"undefined\" && process.platform === _platforms.SUPPORTED_PLATFORMS.WIN32;\n};\n\nvar _default = isWindows;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2lzV2luZG93cy50cyJdLCJuYW1lcyI6WyJpc1dpbmRvd3MiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJTVVBQT1JURURfUExBVEZPUk1TIiwiV0lOMzIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7O0FBR0EsSUFBTUEsU0FBUyxHQUFHLFNBQVpBLFNBQVksR0FBZTtBQUMvQixTQUFPLE9BQU9DLE9BQVAsS0FBbUIsV0FBbkIsSUFBa0NBLE9BQU8sQ0FBQ0MsUUFBUixLQUFxQkMsK0JBQW9CQyxLQUFsRjtBQUNELENBRkQ7O2VBSWVKLFMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTVVBQT1JURURfUExBVEZPUk1TIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9wbGF0Zm9ybXNcIjtcclxuXHJcbi8qKlxyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHByb2Nlc3MgaXMgd2luZG93cy5cclxuICovXHJcbmNvbnN0IGlzV2luZG93cyA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gU1VQUE9SVEVEX1BMQVRGT1JNUy5XSU4zMjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGlzV2luZG93cztcclxuIl19","module.exports = (__webpack_require__(28))(252);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SUPPORTED_PLATFORMS = void 0;\nvar SUPPORTED_PLATFORMS = {\n  DARWIN: \"darwin\",\n  LINUX: \"linux\",\n  WIN32: \"win32\"\n};\nexports.SUPPORTED_PLATFORMS = SUPPORTED_PLATFORMS;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvcGxhdGZvcm1zLnRzIl0sIm5hbWVzIjpbIlNVUFBPUlRFRF9QTEFURk9STVMiLCJEQVJXSU4iLCJMSU5VWCIsIldJTjMyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxJQUFNQSxtQkFBbUIsR0FBRztBQUNqQ0MsRUFBQUEsTUFBTSxFQUFFLFFBRHlCO0FBRWpDQyxFQUFBQSxLQUFLLEVBQUUsT0FGMEI7QUFHakNDLEVBQUFBLEtBQUssRUFBRTtBQUgwQixDQUE1QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTVVBQT1JURURfUExBVEZPUk1TID0ge1xyXG4gIERBUldJTjogXCJkYXJ3aW5cIixcclxuICBMSU5VWDogXCJsaW51eFwiLFxyXG4gIFdJTjMyOiBcIndpbjMyXCIsXHJcbn07XHJcbiJdfQ==","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\n/**\r\n * @param length Length \"x\".\r\n * @returns      An array of indexes of length \"x\".\r\n */\nvar makeArrayOfLength = function makeArrayOfLength() {\n  var length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n  return Array.apply(null, Array(length)).map(function (item, index) {\n    return index;\n  });\n};\n\nvar _default = makeArrayOfLength;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL21ha2VBcnJheU9mTGVuZ3RoLnRzIl0sIm5hbWVzIjpbIm1ha2VBcnJheU9mTGVuZ3RoIiwibGVuZ3RoIiwiQXJyYXkiLCJhcHBseSIsIm1hcCIsIml0ZW0iLCJpbmRleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7O0FBSUEsSUFBTUEsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixHQUFrQztBQUFBLE1BQWpDQyxNQUFpQyx1RUFBaEIsQ0FBZ0I7QUFDMUQsU0FBT0MsS0FBSyxDQUFDQyxLQUFOLENBQVksSUFBWixFQUFrQkQsS0FBSyxDQUFDRCxNQUFELENBQXZCLEVBQWlDRyxHQUFqQyxDQUNMLFVBQUNDLElBQUQsRUFBWUMsS0FBWjtBQUFBLFdBQXNDQSxLQUF0QztBQUFBLEdBREssQ0FBUDtBQUdELENBSkQ7O2VBTWVOLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBwYXJhbSBsZW5ndGggTGVuZ3RoIFwieFwiLlxyXG4gKiBAcmV0dXJucyAgICAgIEFuIGFycmF5IG9mIGluZGV4ZXMgb2YgbGVuZ3RoIFwieFwiLlxyXG4gKi9cclxuY29uc3QgbWFrZUFycmF5T2ZMZW5ndGggPSAobGVuZ3RoOiBudW1iZXIgPSAwKTogbnVtYmVyW10gPT4ge1xyXG4gIHJldHVybiBBcnJheS5hcHBseShudWxsLCBBcnJheShsZW5ndGgpKS5tYXAoXHJcbiAgICAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4LFxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBtYWtlQXJyYXlPZkxlbmd0aDtcclxuIl19","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _ = require(\".\");\n\n/**\r\n * @param length  Length \"x\".\r\n * @returns       An array of strings of length \"x\".\r\n */\nvar makeArrayOfStrings = function makeArrayOfStrings(length, makeString) {\n  var arr = (0, _.makeArrayOfLength)(length);\n  return arr.map(function () {\n    return makeString();\n  });\n};\n\nvar _default = makeArrayOfStrings;\nexports.default = _default;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL21ha2VBcnJheU9mU3RyaW5ncy50cyJdLCJuYW1lcyI6WyJtYWtlQXJyYXlPZlN0cmluZ3MiLCJsZW5ndGgiLCJtYWtlU3RyaW5nIiwiYXJyIiwibWFwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7Ozs7QUFJQSxJQUFNQSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCLENBQ3pCQyxNQUR5QixFQUV6QkMsVUFGeUIsRUFHWjtBQUNiLE1BQU1DLEdBQUcsR0FBRyx5QkFBa0JGLE1BQWxCLENBQVo7QUFDQSxTQUFPRSxHQUFHLENBQUNDLEdBQUosQ0FBUTtBQUFBLFdBQU1GLFVBQVUsRUFBaEI7QUFBQSxHQUFSLENBQVA7QUFDRCxDQU5EOztlQVFlRixrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1ha2VBcnJheU9mTGVuZ3RoIH0gZnJvbSBcIi5cIjtcclxuLyoqXHJcbiAqIEBwYXJhbSBsZW5ndGggIExlbmd0aCBcInhcIi5cclxuICogQHJldHVybnMgICAgICAgQW4gYXJyYXkgb2Ygc3RyaW5ncyBvZiBsZW5ndGggXCJ4XCIuXHJcbiAqL1xyXG5jb25zdCBtYWtlQXJyYXlPZlN0cmluZ3MgPSAoXHJcbiAgbGVuZ3RoOiBudW1iZXIsXHJcbiAgbWFrZVN0cmluZzogKCkgPT4gc3RyaW5nLFxyXG4pOiBzdHJpbmdbXSA9PiB7XHJcbiAgY29uc3QgYXJyID0gbWFrZUFycmF5T2ZMZW5ndGgobGVuZ3RoKTtcclxuICByZXR1cm4gYXJyLm1hcCgoKSA9PiBtYWtlU3RyaW5nKCkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbWFrZUFycmF5T2ZTdHJpbmdzO1xyXG4iXX0=","module.exports = (__webpack_require__(28))(11);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"rounded\":\"rounded---1RM7U\"};","/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n    if (typeof Map !== 'undefined') {\r\n        return Map;\r\n    }\r\n    /**\r\n     * Returns index in provided array that matches the specified key.\r\n     *\r\n     * @param {Array<Array>} arr\r\n     * @param {*} key\r\n     * @returns {number}\r\n     */\r\n    function getIndex(arr, key) {\r\n        var result = -1;\r\n        arr.some(function (entry, index) {\r\n            if (entry[0] === key) {\r\n                result = index;\r\n                return true;\r\n            }\r\n            return false;\r\n        });\r\n        return result;\r\n    }\r\n    return /** @class */ (function () {\r\n        function class_1() {\r\n            this.__entries__ = [];\r\n        }\r\n        Object.defineProperty(class_1.prototype, \"size\", {\r\n            /**\r\n             * @returns {boolean}\r\n             */\r\n            get: function () {\r\n                return this.__entries__.length;\r\n            },\r\n            enumerable: true,\r\n            configurable: true\r\n        });\r\n        /**\r\n         * @param {*} key\r\n         * @returns {*}\r\n         */\r\n        class_1.prototype.get = function (key) {\r\n            var index = getIndex(this.__entries__, key);\r\n            var entry = this.__entries__[index];\r\n            return entry && entry[1];\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @param {*} value\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.set = function (key, value) {\r\n            var index = getIndex(this.__entries__, key);\r\n            if (~index) {\r\n                this.__entries__[index][1] = value;\r\n            }\r\n            else {\r\n                this.__entries__.push([key, value]);\r\n            }\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.delete = function (key) {\r\n            var entries = this.__entries__;\r\n            var index = getIndex(entries, key);\r\n            if (~index) {\r\n                entries.splice(index, 1);\r\n            }\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.has = function (key) {\r\n            return !!~getIndex(this.__entries__, key);\r\n        };\r\n        /**\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.clear = function () {\r\n            this.__entries__.splice(0);\r\n        };\r\n        /**\r\n         * @param {Function} callback\r\n         * @param {*} [ctx=null]\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.forEach = function (callback, ctx) {\r\n            if (ctx === void 0) { ctx = null; }\r\n            for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n                var entry = _a[_i];\r\n                callback.call(ctx, entry[1], entry[0]);\r\n            }\r\n        };\r\n        return class_1;\r\n    }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n    if (typeof global !== 'undefined' && global.Math === Math) {\r\n        return global;\r\n    }\r\n    if (typeof self !== 'undefined' && self.Math === Math) {\r\n        return self;\r\n    }\r\n    if (typeof window !== 'undefined' && window.Math === Math) {\r\n        return window;\r\n    }\r\n    // eslint-disable-next-line no-new-func\r\n    return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n    if (typeof requestAnimationFrame === 'function') {\r\n        // It's required to use a bounded function because IE sometimes throws\r\n        // an \"Invalid calling object\" error if rAF is invoked without the global\r\n        // object on the left hand side.\r\n        return requestAnimationFrame.bind(global$1);\r\n    }\r\n    return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n    var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n    /**\r\n     * Invokes the original callback function and schedules new invocation if\r\n     * the \"proxy\" was called during current request.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function resolvePending() {\r\n        if (leadingCall) {\r\n            leadingCall = false;\r\n            callback();\r\n        }\r\n        if (trailingCall) {\r\n            proxy();\r\n        }\r\n    }\r\n    /**\r\n     * Callback invoked after the specified delay. It will further postpone\r\n     * invocation of the original function delegating it to the\r\n     * requestAnimationFrame.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function timeoutCallback() {\r\n        requestAnimationFrame$1(resolvePending);\r\n    }\r\n    /**\r\n     * Schedules invocation of the original function.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function proxy() {\r\n        var timeStamp = Date.now();\r\n        if (leadingCall) {\r\n            // Reject immediately following calls.\r\n            if (timeStamp - lastCallTime < trailingTimeout) {\r\n                return;\r\n            }\r\n            // Schedule new call to be in invoked when the pending one is resolved.\r\n            // This is important for \"transitions\" which never actually start\r\n            // immediately so there is a chance that we might miss one if change\r\n            // happens amids the pending invocation.\r\n            trailingCall = true;\r\n        }\r\n        else {\r\n            leadingCall = true;\r\n            trailingCall = false;\r\n            setTimeout(timeoutCallback, delay);\r\n        }\r\n        lastCallTime = timeStamp;\r\n    }\r\n    return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserverController.\r\n     *\r\n     * @private\r\n     */\r\n    function ResizeObserverController() {\r\n        /**\r\n         * Indicates whether DOM listeners have been added.\r\n         *\r\n         * @private {boolean}\r\n         */\r\n        this.connected_ = false;\r\n        /**\r\n         * Tells that controller has subscribed for Mutation Events.\r\n         *\r\n         * @private {boolean}\r\n         */\r\n        this.mutationEventsAdded_ = false;\r\n        /**\r\n         * Keeps reference to the instance of MutationObserver.\r\n         *\r\n         * @private {MutationObserver}\r\n         */\r\n        this.mutationsObserver_ = null;\r\n        /**\r\n         * A list of connected observers.\r\n         *\r\n         * @private {Array<ResizeObserverSPI>}\r\n         */\r\n        this.observers_ = [];\r\n        this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n        this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n    }\r\n    /**\r\n     * Adds observer to observers list.\r\n     *\r\n     * @param {ResizeObserverSPI} observer - Observer to be added.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.addObserver = function (observer) {\r\n        if (!~this.observers_.indexOf(observer)) {\r\n            this.observers_.push(observer);\r\n        }\r\n        // Add listeners if they haven't been added yet.\r\n        if (!this.connected_) {\r\n            this.connect_();\r\n        }\r\n    };\r\n    /**\r\n     * Removes observer from observers list.\r\n     *\r\n     * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.removeObserver = function (observer) {\r\n        var observers = this.observers_;\r\n        var index = observers.indexOf(observer);\r\n        // Remove observer if it's present in registry.\r\n        if (~index) {\r\n            observers.splice(index, 1);\r\n        }\r\n        // Remove listeners if controller has no connected observers.\r\n        if (!observers.length && this.connected_) {\r\n            this.disconnect_();\r\n        }\r\n    };\r\n    /**\r\n     * Invokes the update of observers. It will continue running updates insofar\r\n     * it detects changes.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.refresh = function () {\r\n        var changesDetected = this.updateObservers_();\r\n        // Continue running updates if changes have been detected as there might\r\n        // be future ones caused by CSS transitions.\r\n        if (changesDetected) {\r\n            this.refresh();\r\n        }\r\n    };\r\n    /**\r\n     * Updates every observer from observers list and notifies them of queued\r\n     * entries.\r\n     *\r\n     * @private\r\n     * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n     *      dimensions of it's elements.\r\n     */\r\n    ResizeObserverController.prototype.updateObservers_ = function () {\r\n        // Collect observers that have active observations.\r\n        var activeObservers = this.observers_.filter(function (observer) {\r\n            return observer.gatherActive(), observer.hasActive();\r\n        });\r\n        // Deliver notifications in a separate cycle in order to avoid any\r\n        // collisions between observers, e.g. when multiple instances of\r\n        // ResizeObserver are tracking the same element and the callback of one\r\n        // of them changes content dimensions of the observed target. Sometimes\r\n        // this may result in notifications being blocked for the rest of observers.\r\n        activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n        return activeObservers.length > 0;\r\n    };\r\n    /**\r\n     * Initializes DOM listeners.\r\n     *\r\n     * @private\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.connect_ = function () {\r\n        // Do nothing if running in a non-browser environment or if listeners\r\n        // have been already added.\r\n        if (!isBrowser || this.connected_) {\r\n            return;\r\n        }\r\n        // Subscription to the \"Transitionend\" event is used as a workaround for\r\n        // delayed transitions. This way it's possible to capture at least the\r\n        // final state of an element.\r\n        document.addEventListener('transitionend', this.onTransitionEnd_);\r\n        window.addEventListener('resize', this.refresh);\r\n        if (mutationObserverSupported) {\r\n            this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n            this.mutationsObserver_.observe(document, {\r\n                attributes: true,\r\n                childList: true,\r\n                characterData: true,\r\n                subtree: true\r\n            });\r\n        }\r\n        else {\r\n            document.addEventListener('DOMSubtreeModified', this.refresh);\r\n            this.mutationEventsAdded_ = true;\r\n        }\r\n        this.connected_ = true;\r\n    };\r\n    /**\r\n     * Removes DOM listeners.\r\n     *\r\n     * @private\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.disconnect_ = function () {\r\n        // Do nothing if running in a non-browser environment or if listeners\r\n        // have been already removed.\r\n        if (!isBrowser || !this.connected_) {\r\n            return;\r\n        }\r\n        document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n        window.removeEventListener('resize', this.refresh);\r\n        if (this.mutationsObserver_) {\r\n            this.mutationsObserver_.disconnect();\r\n        }\r\n        if (this.mutationEventsAdded_) {\r\n            document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n        }\r\n        this.mutationsObserver_ = null;\r\n        this.mutationEventsAdded_ = false;\r\n        this.connected_ = false;\r\n    };\r\n    /**\r\n     * \"Transitionend\" event handler.\r\n     *\r\n     * @private\r\n     * @param {TransitionEvent} event\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n        var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n        // Detect whether transition may affect dimensions of an element.\r\n        var isReflowProperty = transitionKeys.some(function (key) {\r\n            return !!~propertyName.indexOf(key);\r\n        });\r\n        if (isReflowProperty) {\r\n            this.refresh();\r\n        }\r\n    };\r\n    /**\r\n     * Returns instance of the ResizeObserverController.\r\n     *\r\n     * @returns {ResizeObserverController}\r\n     */\r\n    ResizeObserverController.getInstance = function () {\r\n        if (!this.instance_) {\r\n            this.instance_ = new ResizeObserverController();\r\n        }\r\n        return this.instance_;\r\n    };\r\n    /**\r\n     * Holds reference to the controller's instance.\r\n     *\r\n     * @private {ResizeObserverController}\r\n     */\r\n    ResizeObserverController.instance_ = null;\r\n    return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n    for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        Object.defineProperty(target, key, {\r\n            value: props[key],\r\n            enumerable: false,\r\n            writable: false,\r\n            configurable: true\r\n        });\r\n    }\r\n    return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n    // Assume that the element is an instance of Node, which means that it\r\n    // has the \"ownerDocument\" property from which we can retrieve a\r\n    // corresponding global object.\r\n    var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n    // Return the local global object if it's not possible extract one from\r\n    // provided element.\r\n    return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n    return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n    var positions = [];\r\n    for (var _i = 1; _i < arguments.length; _i++) {\r\n        positions[_i - 1] = arguments[_i];\r\n    }\r\n    return positions.reduce(function (size, position) {\r\n        var value = styles['border-' + position + '-width'];\r\n        return size + toFloat(value);\r\n    }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n    var positions = ['top', 'right', 'bottom', 'left'];\r\n    var paddings = {};\r\n    for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n        var position = positions_1[_i];\r\n        var value = styles['padding-' + position];\r\n        paddings[position] = toFloat(value);\r\n    }\r\n    return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n *      to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n    var bbox = target.getBBox();\r\n    return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n    // Client width & height properties can't be\r\n    // used exclusively as they provide rounded values.\r\n    var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n    // By this condition we can catch all non-replaced inline, hidden and\r\n    // detached elements. Though elements with width & height properties less\r\n    // than 0.5 will be discarded as well.\r\n    //\r\n    // Without it we would need to implement separate methods for each of\r\n    // those cases and it's not possible to perform a precise and performance\r\n    // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n    // gives wrong results for elements with width & height less than 0.5.\r\n    if (!clientWidth && !clientHeight) {\r\n        return emptyRect;\r\n    }\r\n    var styles = getWindowOf(target).getComputedStyle(target);\r\n    var paddings = getPaddings(styles);\r\n    var horizPad = paddings.left + paddings.right;\r\n    var vertPad = paddings.top + paddings.bottom;\r\n    // Computed styles of width & height are being used because they are the\r\n    // only dimensions available to JS that contain non-rounded values. It could\r\n    // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n    // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n    var width = toFloat(styles.width), height = toFloat(styles.height);\r\n    // Width & height include paddings and borders when the 'border-box' box\r\n    // model is applied (except for IE).\r\n    if (styles.boxSizing === 'border-box') {\r\n        // Following conditions are required to handle Internet Explorer which\r\n        // doesn't include paddings and borders to computed CSS dimensions.\r\n        //\r\n        // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n        // properties then it's either IE, and thus we don't need to subtract\r\n        // anything, or an element merely doesn't have paddings/borders styles.\r\n        if (Math.round(width + horizPad) !== clientWidth) {\r\n            width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n        }\r\n        if (Math.round(height + vertPad) !== clientHeight) {\r\n            height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n        }\r\n    }\r\n    // Following steps can't be applied to the document's root element as its\r\n    // client[Width/Height] properties represent viewport area of the window.\r\n    // Besides, it's as well not necessary as the <html> itself neither has\r\n    // rendered scroll bars nor it can be clipped.\r\n    if (!isDocumentElement(target)) {\r\n        // In some browsers (only in Firefox, actually) CSS width & height\r\n        // include scroll bars size which can be removed at this step as scroll\r\n        // bars are the only difference between rounded dimensions + paddings\r\n        // and \"client\" properties, though that is not always true in Chrome.\r\n        var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n        var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n        // Chrome has a rather weird rounding of \"client\" properties.\r\n        // E.g. for an element with content width of 314.2px it sometimes gives\r\n        // the client width of 315px and for the width of 314.7px it may give\r\n        // 314px. And it doesn't happen all the time. So just ignore this delta\r\n        // as a non-relevant.\r\n        if (Math.abs(vertScrollbar) !== 1) {\r\n            width -= vertScrollbar;\r\n        }\r\n        if (Math.abs(horizScrollbar) !== 1) {\r\n            height -= horizScrollbar;\r\n        }\r\n    }\r\n    return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n    // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n    // interface.\r\n    if (typeof SVGGraphicsElement !== 'undefined') {\r\n        return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n    }\r\n    // If it's so, then check that element is at least an instance of the\r\n    // SVGElement and that it has the \"getBBox\" method.\r\n    // eslint-disable-next-line no-extra-parens\r\n    return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n        typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element (<html>).\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n    return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n    if (!isBrowser) {\r\n        return emptyRect;\r\n    }\r\n    if (isSVGGraphicsElement(target)) {\r\n        return getSVGContentRect(target);\r\n    }\r\n    return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n    var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n    // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n    var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n    var rect = Object.create(Constr.prototype);\r\n    // Rectangle's properties are not writable and non-enumerable.\r\n    defineConfigurable(rect, {\r\n        x: x, y: y, width: width, height: height,\r\n        top: y,\r\n        right: x + width,\r\n        bottom: height + y,\r\n        left: x\r\n    });\r\n    return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n    return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n    /**\r\n     * Creates an instance of ResizeObservation.\r\n     *\r\n     * @param {Element} target - Element to be observed.\r\n     */\r\n    function ResizeObservation(target) {\r\n        /**\r\n         * Broadcasted width of content rectangle.\r\n         *\r\n         * @type {number}\r\n         */\r\n        this.broadcastWidth = 0;\r\n        /**\r\n         * Broadcasted height of content rectangle.\r\n         *\r\n         * @type {number}\r\n         */\r\n        this.broadcastHeight = 0;\r\n        /**\r\n         * Reference to the last observed content rectangle.\r\n         *\r\n         * @private {DOMRectInit}\r\n         */\r\n        this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n        this.target = target;\r\n    }\r\n    /**\r\n     * Updates content rectangle and tells whether it's width or height properties\r\n     * have changed since the last broadcast.\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    ResizeObservation.prototype.isActive = function () {\r\n        var rect = getContentRect(this.target);\r\n        this.contentRect_ = rect;\r\n        return (rect.width !== this.broadcastWidth ||\r\n            rect.height !== this.broadcastHeight);\r\n    };\r\n    /**\r\n     * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n     * from the corresponding properties of the last observed content rectangle.\r\n     *\r\n     * @returns {DOMRectInit} Last observed content rectangle.\r\n     */\r\n    ResizeObservation.prototype.broadcastRect = function () {\r\n        var rect = this.contentRect_;\r\n        this.broadcastWidth = rect.width;\r\n        this.broadcastHeight = rect.height;\r\n        return rect;\r\n    };\r\n    return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n    /**\r\n     * Creates an instance of ResizeObserverEntry.\r\n     *\r\n     * @param {Element} target - Element that is being observed.\r\n     * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n     */\r\n    function ResizeObserverEntry(target, rectInit) {\r\n        var contentRect = createReadOnlyRect(rectInit);\r\n        // According to the specification following properties are not writable\r\n        // and are also not enumerable in the native implementation.\r\n        //\r\n        // Property accessors are not being used as they'd require to define a\r\n        // private WeakMap storage which may cause memory leaks in browsers that\r\n        // don't support this type of collections.\r\n        defineConfigurable(this, { target: target, contentRect: contentRect });\r\n    }\r\n    return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserver.\r\n     *\r\n     * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n     *      when one of the observed elements changes it's content dimensions.\r\n     * @param {ResizeObserverController} controller - Controller instance which\r\n     *      is responsible for the updates of observer.\r\n     * @param {ResizeObserver} callbackCtx - Reference to the public\r\n     *      ResizeObserver instance which will be passed to callback function.\r\n     */\r\n    function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n        /**\r\n         * Collection of resize observations that have detected changes in dimensions\r\n         * of elements.\r\n         *\r\n         * @private {Array<ResizeObservation>}\r\n         */\r\n        this.activeObservations_ = [];\r\n        /**\r\n         * Registry of the ResizeObservation instances.\r\n         *\r\n         * @private {Map<Element, ResizeObservation>}\r\n         */\r\n        this.observations_ = new MapShim();\r\n        if (typeof callback !== 'function') {\r\n            throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n        }\r\n        this.callback_ = callback;\r\n        this.controller_ = controller;\r\n        this.callbackCtx_ = callbackCtx;\r\n    }\r\n    /**\r\n     * Starts observing provided element.\r\n     *\r\n     * @param {Element} target - Element to be observed.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.observe = function (target) {\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        // Do nothing if current environment doesn't have the Element interface.\r\n        if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n            return;\r\n        }\r\n        if (!(target instanceof getWindowOf(target).Element)) {\r\n            throw new TypeError('parameter 1 is not of type \"Element\".');\r\n        }\r\n        var observations = this.observations_;\r\n        // Do nothing if element is already being observed.\r\n        if (observations.has(target)) {\r\n            return;\r\n        }\r\n        observations.set(target, new ResizeObservation(target));\r\n        this.controller_.addObserver(this);\r\n        // Force the update of observations.\r\n        this.controller_.refresh();\r\n    };\r\n    /**\r\n     * Stops observing provided element.\r\n     *\r\n     * @param {Element} target - Element to stop observing.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.unobserve = function (target) {\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        // Do nothing if current environment doesn't have the Element interface.\r\n        if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n            return;\r\n        }\r\n        if (!(target instanceof getWindowOf(target).Element)) {\r\n            throw new TypeError('parameter 1 is not of type \"Element\".');\r\n        }\r\n        var observations = this.observations_;\r\n        // Do nothing if element is not being observed.\r\n        if (!observations.has(target)) {\r\n            return;\r\n        }\r\n        observations.delete(target);\r\n        if (!observations.size) {\r\n            this.controller_.removeObserver(this);\r\n        }\r\n    };\r\n    /**\r\n     * Stops observing all elements.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.disconnect = function () {\r\n        this.clearActive();\r\n        this.observations_.clear();\r\n        this.controller_.removeObserver(this);\r\n    };\r\n    /**\r\n     * Collects observation instances the associated element of which has changed\r\n     * it's content rectangle.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.gatherActive = function () {\r\n        var _this = this;\r\n        this.clearActive();\r\n        this.observations_.forEach(function (observation) {\r\n            if (observation.isActive()) {\r\n                _this.activeObservations_.push(observation);\r\n            }\r\n        });\r\n    };\r\n    /**\r\n     * Invokes initial callback function with a list of ResizeObserverEntry\r\n     * instances collected from active resize observations.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.broadcastActive = function () {\r\n        // Do nothing if observer doesn't have active observations.\r\n        if (!this.hasActive()) {\r\n            return;\r\n        }\r\n        var ctx = this.callbackCtx_;\r\n        // Create ResizeObserverEntry instance for every active observation.\r\n        var entries = this.activeObservations_.map(function (observation) {\r\n            return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n        });\r\n        this.callback_.call(ctx, entries, ctx);\r\n        this.clearActive();\r\n    };\r\n    /**\r\n     * Clears the collection of active observations.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.clearActive = function () {\r\n        this.activeObservations_.splice(0);\r\n    };\r\n    /**\r\n     * Tells whether observer has active observations.\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    ResizeObserverSPI.prototype.hasActive = function () {\r\n        return this.activeObservations_.length > 0;\r\n    };\r\n    return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserver.\r\n     *\r\n     * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n     *      dimensions of the observed elements change.\r\n     */\r\n    function ResizeObserver(callback) {\r\n        if (!(this instanceof ResizeObserver)) {\r\n            throw new TypeError('Cannot call a class as a function.');\r\n        }\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        var controller = ResizeObserverController.getInstance();\r\n        var observer = new ResizeObserverSPI(callback, controller, this);\r\n        observers.set(this, observer);\r\n    }\r\n    return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n    'observe',\r\n    'unobserve',\r\n    'disconnect'\r\n].forEach(function (method) {\r\n    ResizeObserver.prototype[method] = function () {\r\n        var _a;\r\n        return (_a = observers.get(this))[method].apply(_a, arguments);\r\n    };\r\n});\n\nvar index = (function () {\r\n    // Export existing implementation if available.\r\n    if (typeof global$1.ResizeObserver !== 'undefined') {\r\n        return global$1.ResizeObserver;\r\n    }\r\n    return ResizeObserver;\r\n})();\n\nexport default index;\n","import { createDashboard as serviceCreateDashboard } from '../../services/management-service';\nimport SegmentTracker from '../../tracking/segment-tracker';\nimport { trackEvent } from '@Tracking';\nimport { trackSnowplow } from '../../lib/tracker';\nimport { TRACKING_LAYOUT_TYPES } from '@Tracking/contexts/dashboard';\nimport { dashboardCreated } from '@Tracking/events';\n\nexport const hasReachedDashboardLimit = org => {\n  if (!org) {\n    return false;\n  }\n\n  if (!org.allowances || !org.allowances.max_dashboards) {\n    return false;\n  }\n\n  return org.usages.dashboards >= org.allowances.max_dashboards;\n};\n\nexport const createDashboard = async (orgId, optimiseForTV, groupId) => {\n  const defaultDashboardName = 'New Dashboard';\n\n  const body = {\n    title: defaultDashboardName,\n    scale_when_fullscreen: true,\n  };\n\n  let addedDashboardType = 'classic';\n\n  if (optimiseForTV) {\n    addedDashboardType = 'container';\n    body.toggles = ['grid', 'container'];\n    body.columns = 6;\n    body.tv_mode = true;\n  }\n\n  const dashboard = await serviceCreateDashboard(groupId, body);\n  const { id: dashboardId } = dashboard;\n\n  SegmentTracker.getInstance().track('dashboard added', {\n    properties: { addedDashboardType },\n  });\n\n  trackSnowplow('dashboard_add', '1-0-1', {\n    dashboard_id: `${dashboardId}`,\n    dashboard_name: `${defaultDashboardName}`,\n    org_id: `${orgId}`,\n    group_id: `${groupId}`,\n  });\n\n  trackEvent(\n    dashboardCreated({\n      'Created dashboard type':\n        addedDashboardType === 'classic'\n          ? TRACKING_LAYOUT_TYPES.ClassicLayout\n          : TRACKING_LAYOUT_TYPES.ContainerLayout,\n    }),\n  );\n\n  return dashboard;\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport UniversalDropdown from '../../../universal-config/components/universal-dropdown';\nimport Input from '../input';\nimport Label from '../label';\nimport styles from './input-dropdown-group-style.scss';\n\nconst InputDropdownGroupComponent = ({\n  label,\n  mainKey,\n  value,\n  ...universalDropProps\n}) => (\n  <div>\n    {!!label && <Label>{label}</Label>}\n    <UniversalDropdown\n      value={value}\n      getLabel={v => v[mainKey]}\n      searchKeys={[mainKey]}\n      listClassName={styles.dropdownList}\n      renderDropMenuLabel={() => (\n        <div className={styles.withCaret}>\n          <Input value={value[mainKey]} readOnly />\n        </div>\n      )}\n      renderSearchInput={({ value: searchValue, search }) => (\n        <span style={{ position: 'absolute', width: '100%' }}>\n          <div className={styles.withCaret}>\n            <Input\n              autoFocus\n              value={searchValue}\n              placeholder={value[mainKey]}\n              onChange={e => search(e.target.value)}\n            />\n          </div>\n        </span>\n      )}\n      {...universalDropProps}\n    />\n  </div>\n);\n\nInputDropdownGroupComponent.defaultValue = {\n  mainKey: 'value',\n};\n\nInputDropdownGroupComponent.propTypes = {\n  label: PropTypes.node,\n  mainKey: PropTypes.string,\n  ...UniversalDropdown.propTypes,\n};\n\nexport default InputDropdownGroupComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"searchInput\":\"searchInput---CsKvp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"input\":\"input---33E75\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---l1Bot\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sparkline\":\"sparkline---2tK-y\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---2rxem\",\"primaryNumber\":\"primaryNumber---uqS38\",\"container\":\"container---3rtCZ\",\"primaryContainer\":\"primaryContainer---2fZh2\",\"primaryAlignment\":\"primaryAlignment---15Qwr\",\"primaryStat\":\"primaryStat---1arYf\",\"label\":\"label---3DXle\",\"comparisonLabel\":\"comparisonLabel---2R0rO\",\"labelInput\":\"labelInput---3H0tI\",\"comparisonLabelInput\":\"comparisonLabelInput---3Xa--\",\"secondaryStat\":\"secondaryStat---3srIm\",\"sparklineValue\":\"sparklineValue---_UK25\",\"goalContainer\":\"goalContainer---134B5\",\"previewLayout\":\"previewLayout---1Yoao\",\"horizontal\":\"horizontal---2Jh5d\",\"hasGoalComparison\":\"hasGoalComparison---26erL\",\"hasComparison\":\"hasComparison---1Xce0\",\"comparisonValue\":\"comparisonValue---2Xpfe secondaryStat---3srIm\",\"sparkline\":\"sparkline---1F8pk secondaryStat---3srIm\",\"hasAnyText\":\"hasAnyText---2ZTeJ\",\"slimline\":\"slimline---1JykE\",\"small\":\"small---1MRjX\",\"medium\":\"medium---10ZXk\",\"large\":\"large---26VPd\",\"hasHorizontalLabelSupport\":\"hasHorizontalLabelSupport---2VvE1\",\"vertical\":\"vertical---1c43o\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sparkline\":\"sparkline---3q6BP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"secondaryVisualisation\":\"secondaryVisualisation---2wVqK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---3hBEQ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"listItem\":\"listItem---hNPGT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---HaB9-\",\"listItem\":\"listItem---3iB_A\"};","// In our case, there's only one dependency\n\nvar toRgb = require('hsl-to-rgb-for-reals')\n\n// Typically all dependencies should be declared at the top of the file.\n\n// Now let's define an API for our module, we're taking hue, saturation and luminosity values and outputting a CSS compatible hex string.\n// Hue is in degrees, between 0 and 359. Since degrees a cyclical in nature, we'll support numbers greater than 359 or less than 0 by \"spinning\" them around until they fall within the 0 to 359 range.\n// Saturation and luminosity are both percentages, we'll represent these percentages with whole numbers between 0 and 100. For these numbers we'll need to enforce a maximum and a minimum, anything below 0 will become 0, anything above 100 will become 100.\n// Let's write some utility functions to handle this logic:\n\nfunction max (val, n) {\n  return (val > n) ? n : val\n}\n\nfunction min (val, n) {\n  return (val < n) ? n : val\n}\n\nfunction cycle (val) {\n  // for safety:\n  val = max(val, 1e7)\n  val = min(val, -1e7)\n  // cycle value:\n  while (val < 0) { val += 360 }\n  while (val > 359) { val -= 360 }\n  return val\n}\n\n// Now for the main piece, the `hsl` function:\n\nfunction hsl (hue, saturation, luminosity) {\n  // resolve degrees to 0 - 359 range\n  hue = cycle(hue)\n\n  // enforce constraints\n  saturation = min(max(saturation, 100), 0)\n  luminosity = min(max(luminosity, 100), 0)\n\n  // convert to 0 to 1 range used by hsl-to-rgb-for-reals\n  saturation /= 100\n  luminosity /= 100\n\n  // let hsl-to-rgb-for-reals do the hard work\n  var rgb = toRgb(hue, saturation, luminosity)\n\n  // convert each value in the returned RGB array\n  // to a 2 character hex value, join the array into\n  // a string, prefixed with a hash\n  return '#' + rgb\n    .map(function (n) {\n      return (256 + n).toString(16).substr(-2)\n    })\n    .join('')\n}\n\n// In order to make our code into a bona fide module we have to export it:\n\nmodule.exports = hsl\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"image\":\"image---39Jet\"};","module.exports = (__webpack_require__(28))(1109);","import PropTypes from 'prop-types';\nimport React from 'react';\nimport config from '../../universal/config';\n\nimport style from './tv-page-style.scss';\n\nconst TvPageComponent = ({ error, children }) => {\n  const assetHost = config.get().AssetBaseURL;\n\n  return (\n    <div className={style.page}>\n      <table className={style.table}>\n        {error && (\n          <tr>\n            <div className={style.error}>{error}</div>\n          </tr>\n        )}\n        <tr className={`${style.logoContainer}`}>\n          <a\n            className={style.link}\n            rel=\"external\"\n            target=\"_blank\"\n            href=\"https://www.geckoboard.com\"\n          >\n            <img\n              className={style.logo}\n              src={`${assetHost}/geckoboard-text-logo.svg`}\n            />\n          </a>\n        </tr>\n        <tr height=\"100%\">\n          <td className={style.content}>{children}</td>\n        </tr>\n      </table>\n    </div>\n  );\n};\n\nTvPageComponent.propTypes = {\n  children: PropTypes.node,\n  error: PropTypes.string,\n};\n\nexport default TvPageComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport TvPage from './tv-page-component';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './tv-page-style.scss';\n\nclass TvPagePinComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    props.onLoad();\n  }\n\n  render() {\n    const { code, error } = this.props;\n\n    return (\n      <TvPage error={error}>\n        <div className={style.descriptionTitle}>\n          <FormattedMessage id=\"tvpage.pin.title\" />\n        </div>\n        <div className={style.pinCode}>\n          {code || <span className={style.placeholderPin}>XXXXXX</span>}\n        </div>\n      </TvPage>\n    );\n  }\n}\n\nTvPagePinComponent.propTypes = {\n  onLoad: PropTypes.func.isRequired,\n  code: PropTypes.string,\n  error: PropTypes.string,\n};\n\nexport default TvPagePinComponent;\n","import { connect } from 'react-redux';\nimport TvPagePinComponent from './tv-page-pin-component';\nimport { init } from '../actions/tv-page-actions';\n\nconst TvPagePinConnector = connect(s => s.tvPage, { onLoad: init })(\n  TvPagePinComponent,\n);\n\nexport default TvPagePinConnector;\n","import React from 'react';\nimport TvPage from './tv-page-component';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './tv-page-style.scss';\n\nconst TvPageEmptyComponent = () => {\n  return (\n    <TvPage>\n      <div className={style.descriptionTitle}>\n        <FormattedMessage id=\"tvpage.empty.title\" />\n      </div>\n      <div className={style.descriptionText}>\n        <FormattedMessage id=\"tvpage.empty.text\" />\n      </div>\n    </TvPage>\n  );\n};\n\nexport default TvPageEmptyComponent;\n","import createReactRenderer from '../react-renderer';\nimport TvPagePinComponent from './components/tv-page-pin-connector';\nimport TvPageEmptyComponent from './components/tv-page-empty-component';\n\nconst TvPagePin = createReactRenderer(TvPagePinComponent);\nconst TvPageEmpty = createReactRenderer(TvPageEmptyComponent);\n\nexport { TvPagePin, TvPageEmpty };\n","import { filter, find } from 'lodash';\nimport apolloClient from '../../../services/concierge-service/apollo-client';\nimport * as widgetService from '../../../lib/widget-service';\nimport { deleteWidget } from '../../../services/management-service';\nimport delay from '../../../lib/delay';\nimport { DashboardByIdWithContainers } from '../../../services/concierge-service/graphql/dashboard-with-containers-query.graphql';\nimport { CONTAINER_GRID_CELLS } from '../../../dashboard/container-layout/container-layout-constants';\n\nexport const deleteInstrument = async (\n  instrumentId,\n  dashboardId,\n  legacyWidgetKey,\n  legacyDashboardId,\n) => {\n  const client = apolloClient.create();\n  const result = client.readQuery({\n    query: DashboardByIdWithContainers,\n    variables: {\n      id: dashboardId,\n    },\n  });\n\n  const { dashboard } = result;\n  const container = find(dashboard.containers, ({ frames }) => {\n    return !!find(frames, ({ instrument }) => {\n      return instrument.id === instrumentId;\n    });\n  });\n\n  let amendedContainers;\n\n  if (container.frames.length === 1) {\n    // only one frame/instrument in the container\n    // so we need to remove whole container\n    amendedContainers = filter(\n      dashboard.containers,\n      c => c.id !== container.id,\n    );\n  } else {\n    // more than one frame/instrument in the container\n    // so container must stay but instrument and its frame\n    // need to go\n    const newNumberOfFrames = container.frames.length - 1;\n    const newFrameSpan = CONTAINER_GRID_CELLS / newNumberOfFrames;\n    const amendedContainer = {\n      ...container,\n      frames: filter(\n        container.frames,\n        f => f.instrument.id !== instrumentId,\n      ).map(frame => ({ ...frame, span: newFrameSpan })),\n    };\n    amendedContainers = [\n      ...filter(dashboard.containers, c => c.id !== container.id),\n      amendedContainer,\n    ];\n  }\n\n  client.writeQuery({\n    query: DashboardByIdWithContainers,\n    variables: {\n      id: dashboardId,\n    },\n    data: {\n      dashboard: {\n        ...dashboard,\n        containers: amendedContainers,\n      },\n    },\n  });\n\n  try {\n    await deleteWidget(legacyDashboardId, legacyWidgetKey);\n  } catch (error) {\n    // reset the cache on legacy API error\n    client.writeQuery({\n      query: DashboardByIdWithContainers,\n      variables: {\n        id: dashboardId,\n      },\n      data: { dashboard },\n    });\n  }\n};\n\n// We currently do not have a GraphQL editing API so in the meantime\n// we need to call the old API and refetch instruments to duplicate a instrument\nexport const duplicateInstrument = async (\n  legacyWidgetKey,\n  legacyDashboardId,\n  refetchInstruments,\n  location,\n) => {\n  try {\n    await widgetService.copyToDashboard(\n      legacyWidgetKey,\n      legacyDashboardId,\n      legacyDashboardId,\n      location,\n    );\n    await delay(500);\n    await refetchInstruments();\n  } catch (error) {\n    throw new Error(error);\n  }\n};\n\nexport const updateTitle = async (\n  title,\n  legacyWidgetKey,\n  instrumentId,\n  oldTitle,\n) => {\n  const client = apolloClient.create();\n\n  client.writeData({\n    id: instrumentId,\n    data: {\n      title,\n    },\n  });\n\n  try {\n    await widgetService.patchConfig(legacyWidgetKey, {\n      title,\n    });\n  } catch (error) {\n    // TODO: display error message to user\n    client.writeData({\n      id: instrumentId,\n      data: {\n        title: oldTitle,\n      },\n    });\n  }\n};\n\nexport const updateLabelAndTitle = async (\n  labelAndTitle,\n  legacyWidgetKey,\n  instrumentId,\n  oldLabelAndTitle,\n) => {\n  const client = apolloClient.create();\n  client.writeData({\n    id: instrumentId,\n    data: labelAndTitle,\n  });\n\n  try {\n    await widgetService.patchConfig(legacyWidgetKey, labelAndTitle);\n  } catch (error) {\n    // TODO: display error message to user\n    client.writeData({\n      id: instrumentId,\n      data: oldLabelAndTitle,\n    });\n  }\n};\n\nexport const updateComparisonLabel = async (\n  comparisonLabel,\n  legacyWidgetKey,\n  instrumentId,\n  oldComparison,\n) => {\n  let newComparison;\n\n  if (oldComparison) {\n    newComparison = {\n      ...oldComparison,\n      label: comparisonLabel,\n    };\n  } else {\n    // If there is no no existing comparison, it's because\n    // the comparison is coming from the data (universal widget).\n    // In this case we need to create a DynamicComparison.\n    newComparison = {\n      __typename: 'DynamicComparison',\n      label: comparisonLabel,\n    };\n  }\n\n  const client = apolloClient.create();\n  client.writeData({\n    id: instrumentId,\n    data: { comparison: newComparison },\n  });\n\n  try {\n    await widgetService.patchConfig(legacyWidgetKey, {\n      comparisonLabel,\n    });\n  } catch (error) {\n    // oldComparison is null if it's not set, so in\n    // that case we just write null back to the cache.\n    // TODO: display error message to user\n    client.writeData({\n      id: instrumentId,\n      data: {\n        comparison: oldComparison,\n      },\n    });\n  }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { map } from 'lodash';\nimport classnames from 'classnames';\nimport Icon from '../../icon';\nimport { getHumanReadableName } from './helpers';\nimport { noop } from 'lodash';\nimport style from './rule-based-visualisation-picker.scss';\nimport { VISUALISATION_TYPES } from './constants';\n\nconst tooltipDescriptionDefaultFormatter = (enabled, vizName) =>\n  enabled\n    ? `You can show your results as a ${vizName}.`\n    : `To use a ${vizName} you need to update your query so that:`;\n\nconst Rule = ({ passing, text }) => {\n  const indicatorClassName = classnames(style.ruleIndicator, {\n    [style.passing]: passing,\n  });\n\n  return (\n    <div className={style.rule}>\n      <div className={indicatorClassName}>\n        <Icon\n          name={passing ? 'check' : 'times'}\n          fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR}\n        />\n      </div>\n      {text}\n    </div>\n  );\n};\n\nRule.propTypes = {\n  passing: PropTypes.bool,\n  text: PropTypes.node,\n};\n\nconst Tooltip = ({ children }) => (\n  <div className={style.tooltip}>\n    {children}\n    <div className={style.tooltipPointer} />\n  </div>\n);\n\nTooltip.propTypes = {\n  children: PropTypes.node,\n};\n\nconst RuleBasedVisualisationPicker = ({\n  visualisations,\n  tooltipDescriptionFormatter,\n  onSelect,\n}) => {\n  return (\n    <ul className={style.ruleBasedVisualisationPicker}>\n      {map(visualisations, viz => {\n        const enabled = !viz.rules.find(r => !r.passing);\n        const vizName = getHumanReadableName(viz.type);\n        const tooltipDescription = tooltipDescriptionFormatter(\n          enabled,\n          vizName,\n        );\n\n        return (\n          <li className={style.visualisation} key={viz.type}>\n            <div className={style.tooltipContainer}>\n              <Tooltip>\n                <div className={style.visualisationIcon}>\n                  <Icon font=\"gecko\" name={viz.type} />\n                </div>\n                <p className={style.tooltipDescription}>{tooltipDescription}</p>\n                <div className={style.rules}>\n                  {viz.rules.map((rule, i) => (\n                    <Rule key={`${viz.type}_${i}`} {...rule} />\n                  ))}\n                </div>\n              </Tooltip>\n            </div>\n            <button\n              disabled={!enabled}\n              className={style.visualisationIcon}\n              onClick={() => enabled && onSelect(viz.type)}\n            >\n              <Icon font=\"gecko\" name={viz.type} />\n            </button>\n          </li>\n        );\n      })}\n    </ul>\n  );\n};\n\nRuleBasedVisualisationPicker.defaultProps = {\n  onSelect: noop,\n  tooltipDescriptionFormatter: tooltipDescriptionDefaultFormatter,\n};\n\n/*\n * Takes an array of visualisations where each\n * visualisation contains an array of rules.\n * Each rule has a description and a boolean\n * to represent if the rule is passing.\n */\nRuleBasedVisualisationPicker.propTypes = {\n  visualisations: PropTypes.arrayOf(\n    PropTypes.shape({\n      rules: PropTypes.arrayOf(\n        PropTypes.shape({\n          passing: PropTypes.bool.isRequired,\n          text: PropTypes.string.isRequired,\n        }),\n      ).isRequired,\n      type: PropTypes.oneOf(Object.values(VISUALISATION_TYPES)).isRequired,\n    }),\n  ).isRequired,\n  onSelect: PropTypes.func.isRequired,\n  tooltipDescriptionFormatter: PropTypes.func,\n};\n\nexport default RuleBasedVisualisationPicker;\nexport { Rule, Tooltip };\n","export const getHumanReadableName = type => {\n  const name = {\n    bar: 'Bar Chart',\n    clock: 'Clock',\n    column: 'Column Chart',\n    geckometer: 'Gauge',\n    funnel: 'Funnel',\n    leaderboard: 'Leaderboard',\n    line: 'Line Chart',\n    number: 'Number',\n    map: 'Map',\n    table: 'Table',\n    feed: 'Feed',\n    text: 'Text',\n    rag: 'RAG',\n    ragcolumn: 'RAG Column',\n    pie: 'Pie Chart',\n    highcharts: 'Highcharts',\n    list: 'List',\n    monitoring: 'Monitoring',\n    bullet: 'Bullet Chart',\n    image: 'Image',\n  }[type];\n\n  if (name) {\n    return name;\n  }\n\n  throw new Error(\n    `The visualisation type '${type}' has no human readable name.\nBe sure to add one in src/visualisation/helpers.js`,\n  );\n};\n","export const VISUALISATION_TYPES = {\n  NUMBER: 'number',\n  GECKOMETER: 'geckometer',\n  LINE: 'line',\n  COLUMN: 'column',\n  BAR: 'bar',\n  LEADERBOARD: 'leaderboard',\n  TABLE: 'table',\n  TEXT: 'text',\n};\n","import RuleBasedVisualisationPicker from './rule-based-visualisation-picker';\nexport default RuleBasedVisualisationPicker;\n","import React from 'react';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport styles from './dashboard-loading-spinner-style.scss';\n\nconst DashboardLoadingSpinner = () => (\n  <div className={styles.spinnerWrapper}>\n    <LoadingSpinner\n      size={LoadingSpinner.SIZES.LARGE}\n      theme={LoadingSpinner.THEMES.DARK}\n    />\n  </div>\n);\n\nexport default DashboardLoadingSpinner;\n","import DashboardLoadingSpinner from './dashboard-loading-spinner-component';\nexport default DashboardLoadingSpinner;\n","// This can be removed when we upgrade to Lodash 4.\nconst toString = value => {\n  if (value === null) {\n    return '';\n  }\n\n  return `${value}`;\n};\n\nconst pluralize = (n, str) => {\n  if (n === 0 || n > 1) return `${str}s`;\n  return str;\n};\n\nexport { toString, pluralize };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"link\":\"link---9NUh1\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1mcEx\",\"content\":\"content---goMOm\",\"heading\":\"heading---1tdi9\",\"serviceIcon\":\"serviceIcon---fjeRI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---YzQYP\",\"beta\":\"beta---2EcjK label---YzQYP\",\"alpha\":\"alpha---3LXez label---YzQYP\",\"legacy\":\"legacy---9c4is label---YzQYP\",\"new\":\"new---ICeUb label---YzQYP\",\"universal\":\"universal---UpnTO label---YzQYP\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"error\":\"error---7BSMJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"list---1Xtdi\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseID\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"query\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseQuery\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseID\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseID\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"query\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"query\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"columns\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"dataType\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"rows\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"values\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseFloatValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"float\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseStringValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"string\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseIntegerValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"integer\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseTimestampValue\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timestamp\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":482}};\n    doc.loc.source = {\"body\":\"query DatabaseQuery($databaseID: ID!, $query: String!) {\\n  databaseQuery(databaseID: $databaseID, query: $query) {\\n    columns {\\n      name, dataType,\\n    },\\n    rows {\\n      values {\\n        __typename,\\n        ...on DatabaseFloatValue {\\n          float\\n        }\\n        ...on DatabaseStringValue {\\n          string\\n        }\\n        ...on DatabaseIntegerValue {\\n          integer\\n        }\\n        ...on DatabaseTimestampValue {\\n          timestamp\\n        }\\n      }\\n    }\\n  }\\n} \",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DatabaseQuery\"] = oneQuery(doc, \"DatabaseQuery\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"textarea\":\"textarea---k5Jep\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---1VEhn\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconContainer\":\"iconContainer---3pwXA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"liteToggle\":\"liteToggle---24eXP\"};","import React from 'react';\nimport FormattedMessage from '../lib/i18n';\nimport PropTypes from 'prop-types';\nimport Button from '@UI/button';\nimport Icon from '@UI/icon';\nimport AsyncComponentLoader from '../async-component-loader';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport Border from '@UI/playground/border';\nimport SegmentTracker from '../tracking/segment-tracker';\nimport { Row } from '../components/layout';\nimport style from './in-app-help-style.scss';\nimport { intercomContextTypes, withIntercomContext } from '../intercom';\n\nexport const importHelpCentreSearch = () =>\n  import('../components/help-centre-search');\n\nexport const InAppHelpComponent = ({\n  onClose,\n  intercomContext: { intercom, available: isIntercomAvailable },\n}) => (\n  <Border rounded shadow className={style.container}>\n    <section>\n      <AsyncComponentLoader\n        importComponent={importHelpCentreSearch}\n        renderComponent={({ isLoading, component }) => {\n          if (isLoading) {\n            return (\n              <Row marginY={4}>\n                <LoadingSpinner size={LoadingSpinner.SIZES.LARGE} />\n              </Row>\n            );\n          }\n\n          return <component.default />;\n        }}\n      />\n    </section>\n    {isIntercomAvailable && (\n      <section className={style.intercom}>\n        <div className={style.heading}>\n          <FormattedMessage id=\"help.intercom.heading\" />\n        </div>\n        <div className={style.content}>\n          <span className={style.description}>\n            <FormattedMessage id=\"help.intercom.description\" />\n          </span>\n          <span className={style.button}>\n            <Button\n              onClick={() => {\n                onClose();\n                SegmentTracker.getInstance().track('In-app Help - Chat');\n                intercom('showMessages');\n              }}\n            >\n              {[\n                <span key=\"icon\" className={style.icon}>\n                  <Icon name=\"comment-dots\" />\n                </span>,\n                <FormattedMessage key=\"label\" id=\"help.intercom.button\" />,\n              ]}\n            </Button>\n          </span>\n        </div>\n      </section>\n    )}\n  </Border>\n);\n\nInAppHelpComponent.propTypes = {\n  intercomContext: intercomContextTypes,\n  onClose: PropTypes.func,\n};\n\nexport default withIntercomContext(InAppHelpComponent);\n","module.exports = (__webpack_require__(28))(1132);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loader\":\"loader---37wDn\"};","module.exports = (__webpack_require__(28))(729);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wedge\":\"wedge---AM9GC\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"iconContainer\":\"iconContainer---3889g\"};","module.exports = (__webpack_require__(28))(1140);","// extracted by mini-css-extract-plugin\nmodule.exports = {\"input\":\"input---2qXEJ\"};","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport Layout from '../../../components/layout';\nimport PromoCard, {\n  PromoCardHeader,\n  PromoCardFooter,\n  PromoCardLink,\n} from '../../../components/promo-card';\nimport Button from '@UI/button';\n\nconst customizeLearnMoreUrl =\n  'https://support.geckoboard.com/hc/en-us/articles/115003899087#customizationfeaturesbyplan';\n\nconst TrialPromoCard = () => {\n  return (\n    <Layout marginTop={1}>\n      <PromoCard>\n        <FormattedMessage id=\"customize.trialPromo.body\" />\n        <PromoCardFooter>\n          <PromoCardLink\n            label={<FormattedMessage id=\"customize.learnMore\" />}\n            href={customizeLearnMoreUrl}\n            target=\"_blank\"\n          />\n        </PromoCardFooter>\n      </PromoCard>\n    </Layout>\n  );\n};\n\nconst upgradeUrl = '/account/plans';\nconst UpgradePromoCard = ({ onUpgradeClick }) => {\n  return (\n    <Layout marginTop={1}>\n      <PromoCard>\n        <PromoCardHeader>\n          <FormattedMessage id=\"customize.upgrade.header\" />\n        </PromoCardHeader>\n        <FormattedMessage id=\"customize.upgrade.body\" />\n        <PromoCardFooter>\n          <span style={{ marginRight: '1rem' }}>\n            <Button href={upgradeUrl} onClick={onUpgradeClick}>\n              <FormattedMessage id=\"customize.upgrade\" />\n            </Button>\n          </span>\n          <PromoCardLink\n            label={<FormattedMessage id=\"customize.learnMore\" />}\n            href={customizeLearnMoreUrl}\n            target=\"_blank\"\n          />\n        </PromoCardFooter>\n      </PromoCard>\n    </Layout>\n  );\n};\n\nUpgradePromoCard.propTypes = {\n  onUpgradeClick: PropTypes.func,\n};\n\nexport { TrialPromoCard, UpgradePromoCard };\n","import { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { isUndefined, flowRight as compose } from 'lodash';\n\n/*\n * Allowed HOC\n * Allows components to be conditionally rendered depending on\n * whether a user has the correct allowances\n *\n * @param {func} allowancesTest - which is passed the user allowances and should return a boolean\n * @param {component} FallbackComponent - which is rendered if the “allowancesTest” function returns false\n *\n * @returns {function} into which you will pass the Component that\n * you want to render if the user has the appropriate allowances\n * (ie. if the “allowancesTest” function returns true).\n */\n\nconst rawAllowed = (allowancesTest, FallbackComponent) => PrimaryComponent => {\n  const displayName =\n    PrimaryComponent.displayName || PrimaryComponent.name || 'Component';\n\n  class Allowed extends Component {\n    static get displayName() {\n      return `Allowed(${displayName})`;\n    }\n\n    render() {\n      const { allowances, usages, ...remainingProps } = this.props;\n\n      if (isUndefined(allowances)) {\n        return null;\n      }\n\n      if (allowancesTest({ allowances, usages })) {\n        return <PrimaryComponent {...remainingProps} />;\n      }\n\n      if (FallbackComponent) {\n        return <FallbackComponent {...remainingProps} />;\n      }\n\n      return null;\n    }\n  }\n\n  Allowed.propTypes = {\n    allowances: PropTypes.object,\n    usages: PropTypes.object,\n  };\n\n  return Allowed;\n};\n\nconst connectAllowed = PrimaryComponent => {\n  return connect((state, props) => {\n    const {\n      user: { organization: { allowances, usages } = {} },\n    } = state;\n    return { ...props, allowances, usages };\n  })(PrimaryComponent);\n};\n\nconst allowed = (allowancesTest, FallbackComponent) => {\n  return compose(connectAllowed, rawAllowed(allowancesTest, FallbackComponent));\n};\n\n//\n// As a component rather than a hoc.\n//\nconst RawAllowed = ({\n  allowances,\n  usages,\n  test,\n  children,\n  render,\n  fallback,\n}) => {\n  if (isUndefined(allowances)) {\n    return null;\n  }\n\n  if (!test({ allowances, usages })) {\n    return fallback ? fallback() : null;\n  }\n\n  return render ? render() : children;\n};\n\nRawAllowed.propTypes = {\n  test: PropTypes.func.isRequired,\n  allowances: PropTypes.object,\n  children: PropTypes.node,\n  fallback: PropTypes.func,\n  render: PropTypes.func,\n  usages: PropTypes.object,\n};\n\nconst Allowed = connect(state => {\n  const {\n    user: { organization: { allowances, usages } = {} },\n  } = state;\n  return { allowances, usages };\n})(RawAllowed);\n\nexport default allowed;\nexport { Allowed };\n","import LabelledSwatchComponent from './labelled-swatch-component';\n\nexport default LabelledSwatchComponent;\n","import IconUpgrade from './icon-upgrade-component';\nexport default IconUpgrade;\n","import React from 'react';\nimport style from './icon-upgrade-style.scss';\nimport Icon from '@UI/icon';\n\nconst IconUpgrade = () => {\n  return (\n    <span className={style.wedge}>\n      <Icon name={'arrow-circle-up'} />\n    </span>\n  );\n};\n\nexport default IconUpgrade;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { noop, get, partialRight } from 'lodash';\nimport FormattedMessage from '../../../../lib/i18n';\nimport { Row, Column } from '../../../../components/layout';\nimport LabelledSwatch from '../../../../components/swatch/labelled-swatch';\nimport {\n  DARK_THEME,\n  LIGHT_THEME,\n  NAVY_THEME,\n  PURPLE_THEME,\n  VALID_THEMES,\n} from '../../../../dashboard/themes/theme-constants';\nimport IconUpgrade from '../../../../components/icon-upgrade';\nimport allowed from '../../../../hoc/allowed';\nimport Tooltip from '../../../../components/tooltip';\nimport styles from './premade-theme-picker.scss';\n\nconst UpgradeIcon = allowed(\n  partialRight(get, 'allowances.advanced_dashboard_customization'),\n  ({ children }) => (\n    <Row flexWrap={false}>\n      {children}\n      <Tooltip\n        tooltip={<FormattedMessage id=\"customize.upgrade.themes.tooltip\" />}\n      >\n        <span className={styles.iconContainer}>\n          <IconUpgrade />\n        </span>\n      </Tooltip>\n    </Row>\n  ),\n)(({ children }) => children);\n\nconst PremadeThemePickerComponent = ({ active, onChange }) => {\n  return (\n    <div>\n      <Row>\n        <Column flexEqualWidth>\n          <LabelledSwatch\n            label={<FormattedMessage id=\"customize.dark\" />}\n            onClick={() => onChange(DARK_THEME)}\n            checked={active === DARK_THEME}\n            colorStops={['#2a2a2a', '#101214']}\n            borderColor=\"#727272\"\n          />\n        </Column>\n        <Column flexEqualWidth>\n          <LabelledSwatch\n            label={<FormattedMessage id=\"customize.light\" />}\n            onClick={() => onChange(LIGHT_THEME)}\n            checked={active === LIGHT_THEME}\n            colorStops={['#ffffff', '#f0f0f0']}\n            borderColor=\"#7b7b7b\"\n            type=\"light\"\n          />\n        </Column>\n      </Row>\n      <Row marginTop={1}>\n        <Column flexEqualWidth>\n          <LabelledSwatch\n            label={\n              <UpgradeIcon>\n                <FormattedMessage id=\"customize.navy\" />\n              </UpgradeIcon>\n            }\n            onClick={() => onChange(NAVY_THEME)}\n            checked={active === NAVY_THEME}\n            colorStops={['#2E354D', '#191E30']}\n            borderColor=\"#7284BF\"\n          />\n        </Column>\n        <Column flexEqualWidth>\n          <LabelledSwatch\n            label={\n              <UpgradeIcon>\n                <FormattedMessage id=\"customize.purple\" />\n              </UpgradeIcon>\n            }\n            onClick={() => onChange(PURPLE_THEME)}\n            checked={active === PURPLE_THEME}\n            colorStops={['#3C2E47', '#2C1F33']}\n            borderColor=\"#9971B8\"\n          />\n        </Column>\n      </Row>\n    </div>\n  );\n};\n\nPremadeThemePickerComponent.propTypes = {\n  active: PropTypes.oneOf(VALID_THEMES),\n  onChange: PropTypes.func,\n};\n\nPremadeThemePickerComponent.defaultProps = {\n  onChange: noop,\n};\n\nexport default PremadeThemePickerComponent;\n","import PremadeThemePicker from './premade-theme-picker-component';\n\nexport default PremadeThemePicker;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { getWidgetColor } from '../../../dashboard/themes/utilities';\nimport { Row, Column } from '../../../components/layout';\nimport {\n  AUTO_WIDGET_STYLE,\n  DARK_WIDGET_STYLE,\n  LIGHT_WIDGET_STYLE,\n  VALID_WIDGET_STYLES,\n  LIGHT_THEME,\n  DARK_THEME,\n} from '../../../dashboard/themes/theme-constants';\nimport Swatch from '../../../components/swatch';\n\nconst DARK_THEME_WIDGET_COLOR = getWidgetColor(DARK_THEME);\nconst LIGHT_THEME_WIDGET_COLOR = getWidgetColor(LIGHT_THEME);\n\nconst WidgetStylePickerComponent = ({\n  autoWidgetColor,\n  onChange,\n  widgetStyle,\n}) => {\n  const createClickHandler = value => () => onChange(value);\n\n  return (\n    <Row>\n      <Column marginRight={0.5} marginBottom={0.5}>\n        <Swatch\n          value={AUTO_WIDGET_STYLE}\n          colorStops={[autoWidgetColor]}\n          checked={widgetStyle === AUTO_WIDGET_STYLE}\n          onClick={createClickHandler(AUTO_WIDGET_STYLE)}\n        />\n      </Column>\n      <Column marginRight={0.5} marginBottom={0.5}>\n        <Swatch\n          value={DARK_WIDGET_STYLE}\n          colorStops={[DARK_THEME_WIDGET_COLOR]}\n          checked={widgetStyle === DARK_WIDGET_STYLE}\n          onClick={createClickHandler(DARK_WIDGET_STYLE)}\n        />\n      </Column>\n      <Column marginBottom={0.5}>\n        <Swatch\n          value={LIGHT_WIDGET_STYLE}\n          colorStops={[LIGHT_THEME_WIDGET_COLOR]}\n          checked={widgetStyle === LIGHT_WIDGET_STYLE}\n          onClick={createClickHandler(LIGHT_WIDGET_STYLE)}\n        />\n      </Column>\n    </Row>\n  );\n};\n\nWidgetStylePickerComponent.propTypes = {\n  autoWidgetColor: PropTypes.string.isRequired,\n  widgetStyle: PropTypes.oneOf(VALID_WIDGET_STYLES).isRequired,\n  onChange: PropTypes.func.isRequired,\n};\n\nexport default WidgetStylePickerComponent;\n","import WidgetStylePicker from './widget-style-picker-connector';\n\nexport default WidgetStylePicker;\n","import { connect } from 'react-redux';\nimport WidgetStylePicker from './widget-style-picker-component';\nimport { generateAutoWidgetColor } from '../../../dashboard/themes/utilities';\nimport { setThemeWidgetStyle } from '../../actions/customize-actions';\n\nconst mapStateToProps = state => {\n  const { themeWidgetStyle, themeBackgroundColor } = state.customize.values;\n\n  return {\n    widgetStyle: themeWidgetStyle,\n    autoWidgetColor: generateAutoWidgetColor(themeBackgroundColor),\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onChange: value => dispatch(setThemeWidgetStyle(value)),\n  };\n};\n\nconst WidgetStylePickerConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetStylePicker);\n\nexport default WidgetStylePickerConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Layout, { Row, Column } from '../../../../components/layout';\nimport ColorPickerInput from '../../../../components/color-picker/color-picker-input';\nimport WidgetStylePicker from '../../widget-style-picker';\nimport Input from '../../../../components/form/input';\n\nimport style from './custom-theme-editor-style.scss';\n\nconst CustomThemeEditor = ({\n  themeBackgroundColor,\n  themeBackgroundColorInput,\n  onBackgroundColorChange,\n}) => {\n  return (\n    <Row flexAuto>\n      <Column col={6}>\n        <p>Background</p>\n        <Row flexAuto align=\"flex-start\">\n          <ColorPickerInput\n            color={themeBackgroundColor}\n            onChange={onBackgroundColorChange}\n          />\n          <Layout\n            flexFill\n            marginLeft={0.5}\n            marginRight={0.5}\n            className={style.input}\n          >\n            <Input\n              name=\"themeBackgroundColor\"\n              maxLength={7}\n              value={themeBackgroundColorInput}\n              onChange={({ value }) => onBackgroundColorChange(value)}\n              onBlur={() => onBackgroundColorChange(themeBackgroundColor)}\n            />\n          </Layout>\n        </Row>\n      </Column>\n      <Column col={6}>\n        <p>Widgets</p>\n        <Layout marginLeft={0.5}>\n          <WidgetStylePicker />\n        </Layout>\n      </Column>\n    </Row>\n  );\n};\n\nCustomThemeEditor.propTypes = {\n  themeBackgroundColor: PropTypes.string.isRequired,\n  themeBackgroundColorInput: PropTypes.string.isRequired,\n  onBackgroundColorChange: PropTypes.func.isRequired,\n};\n\nexport default CustomThemeEditor;\n","import CustomThemeEditor from './custom-theme-editor-component';\nexport default CustomThemeEditor;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Dropzone from 'react-dropzone';\nimport FormattedMessage, { formatMessage } from '../../../../lib/i18n';\nimport Button from '@UI/button';\nimport Layout, { Row } from '../../../../components/layout';\nimport Input from '../../../../components/form/input';\n\nimport style from './custom-css-upload-style.scss';\n\nconst CustomCSSUpload = ({ src, onChange }) => {\n  const value = src ? formatMessage('customize.css.filename') : '';\n  return (\n    <Dropzone\n      multiple={false}\n      className={style.dropzone}\n      accept=\"text/css\"\n      onDrop={onChange}\n    >\n      {({ isDragActive }) => {\n        return (\n          <Row>\n            {!isDragActive && (\n              <Row flexAuto>\n                <Layout flexFill marginRight={1}>\n                  <Input\n                    name=\"custom-css\"\n                    value={value}\n                    placeholder={formatMessage('customize.css.uploadFile')}\n                  />\n                </Layout>\n                <Layout flex>\n                  <Button intent={Button.INTENT.SECONDARY}>\n                    {formatMessage('customize.css.chooseFile')}\n                  </Button>\n                </Layout>\n              </Row>\n            )}\n            {isDragActive && (\n              <div className={style.dropHere}>\n                <FormattedMessage id=\"customize.css.dropHere\" />\n              </div>\n            )}\n          </Row>\n        );\n      }}\n    </Dropzone>\n  );\n};\n\nCustomCSSUpload.propTypes = {\n  onChange: PropTypes.func.isRequired,\n  src: PropTypes.string,\n};\n\nexport default CustomCSSUpload;\n","import CustomCssUpload from './custom-css-upload-component';\nexport default CustomCssUpload;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Card from '../../../components/card';\nimport { TabList, Tab, Tabs, TabPanel } from '../../../components/tabs';\nimport {\n  DARK_THEME,\n  USER_THEME,\n  CUSTOM_THEME,\n  VALID_THEMES,\n} from '../../../dashboard/themes/theme-constants';\nimport FormattedMessage from '../../../lib/i18n';\nimport PremadeThemePicker from './premade-theme-picker';\nimport CustomThemeEditor from './custom-theme-editor';\nimport CustomCSSUpload from './custom-css-upload';\n\nexport const THEME_TAB = 0;\nexport const CUSTOM_TAB = 1;\nexport const CSS_TAB = 2;\n\nconst tabToTheme = tab => {\n  if (tab === CSS_TAB) {\n    return CUSTOM_THEME;\n  }\n  if (tab === CUSTOM_TAB) {\n    return USER_THEME;\n  }\n  return DARK_THEME;\n};\n\nconst themeToTab = theme => {\n  if (theme === CUSTOM_THEME) {\n    return CSS_TAB;\n  }\n  if (theme === USER_THEME) {\n    return CUSTOM_TAB;\n  }\n  return THEME_TAB;\n};\n\nconst ThemePickerComponent = ({\n  isCustomCSSEnabled,\n  theme,\n  themeBackgroundColor,\n  themeBackgroundColorInput,\n  cssFile,\n  onCustomCSSChange,\n  onSelectTheme,\n  onBackgroundColorChange,\n}) => {\n  return (\n    <Card>\n      <Tabs\n        onSelect={i => onSelectTheme(tabToTheme(i))}\n        selectedIndex={themeToTab(theme)}\n      >\n        <TabList>\n          <Tab>\n            <FormattedMessage id=\"customize.theme\" />\n          </Tab>\n          <Tab>\n            <FormattedMessage id=\"customize.custom\" />\n          </Tab>\n          {isCustomCSSEnabled && (\n            <Tab>\n              <FormattedMessage id=\"customize.css\" />\n            </Tab>\n          )}\n        </TabList>\n        <TabPanel>\n          <PremadeThemePicker active={theme} onChange={onSelectTheme} />\n        </TabPanel>\n        <TabPanel>\n          <CustomThemeEditor\n            themeBackgroundColor={themeBackgroundColor}\n            themeBackgroundColorInput={themeBackgroundColorInput}\n            onBackgroundColorChange={onBackgroundColorChange}\n          />\n        </TabPanel>\n        {isCustomCSSEnabled && (\n          <TabPanel>\n            <CustomCSSUpload src={cssFile} onChange={onCustomCSSChange} />\n          </TabPanel>\n        )}\n      </Tabs>\n    </Card>\n  );\n};\n\nThemePickerComponent.propTypes = {\n  isCustomCSSEnabled: PropTypes.bool.isRequired,\n  onBackgroundColorChange: PropTypes.func.isRequired,\n  onCustomCSSChange: PropTypes.func.isRequired,\n  onSelectTheme: PropTypes.func.isRequired,\n  cssFile: PropTypes.string,\n  theme: PropTypes.oneOf(VALID_THEMES),\n  themeBackgroundColor: PropTypes.string,\n  themeBackgroundColorInput: PropTypes.string,\n};\n\nexport default ThemePickerComponent;\n","import ThemePicker from './theme-picker-connector';\n\nexport default ThemePicker;\n","import { connect } from 'react-redux';\nimport { getBackgroundColor } from '../../../dashboard/themes/utilities';\nimport { DARK_THEME } from '../../../dashboard/themes/theme-constants';\nimport ThemePicker from './theme-picker-component';\nimport * as customizeActions from '../../actions/customize-actions';\nimport { includes } from 'lodash';\n\nconst mapStateToProps = ({ dashboard, customize, user }) => {\n  const { values = {}, themeBackgroundColorInput } = customize;\n  const { user: { allowances = {} } = {} } = user;\n  const { dashboard: { toggles = [] } = {} } = dashboard;\n  const isCustomCSSEnabled =\n    !!allowances.custom_css && !includes(toggles, 'grid');\n\n  const {\n    theme,\n    themeBackgroundColor = getBackgroundColor(DARK_THEME),\n    cssFile,\n  } = values;\n\n  return {\n    theme,\n    themeBackgroundColor,\n    themeBackgroundColorInput,\n    cssFile,\n    isCustomCSSEnabled,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onSelectTheme: theme => dispatch(customizeActions.setTheme(theme)),\n  onBackgroundColorChange: value =>\n    dispatch(customizeActions.setThemeBackground(value)),\n  onCustomCSSChange: files => dispatch(customizeActions.setCustomCSS(files[0])),\n});\n\nconst ThemePickerConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(ThemePicker);\n\nexport default ThemePickerConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport ButtonGroup from '@UI/button-group';\nimport Button from '@UI/button';\nimport InlineSettings from '../../../components/form/inline-settings';\n\nconst WidgetTitleSizeCard = ({\n  largeTitles,\n  onLargeTitlesChange,\n  isDisabled,\n}) => {\n  return (\n    <InlineSettings label={<FormattedMessage id=\"customize.widgetTitles\" />}>\n      <ButtonGroup theme={ButtonGroup.THEMES.DARK}>\n        <Button\n          onClick={() => onLargeTitlesChange(false)}\n          checked={!largeTitles}\n          size={Button.SIZES.SMALL}\n          disabled={isDisabled}\n        >\n          <FormattedMessage id=\"customize.small\" />\n        </Button>\n        <Button\n          onClick={() => onLargeTitlesChange(true)}\n          checked={largeTitles}\n          size={Button.SIZES.SMALL}\n          disabled={isDisabled}\n        >\n          <FormattedMessage id=\"customize.large\" />\n        </Button>\n      </ButtonGroup>\n    </InlineSettings>\n  );\n};\n\nWidgetTitleSizeCard.defaultProps = {\n  isDisabled: false,\n};\nWidgetTitleSizeCard.propTypes = {\n  onLargeTitlesChange: PropTypes.func.isRequired,\n  isDisabled: PropTypes.bool,\n  largeTitles: PropTypes.bool,\n};\n\nexport default WidgetTitleSizeCard;\n","import WidgetTitleSizeCard from './widget-title-size-card-component';\nexport default WidgetTitleSizeCard;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { get, partialRight } from 'lodash';\nimport classNames from 'classnames';\nimport Dropzone from 'react-dropzone';\nimport allowed from '../../../hoc/allowed';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../../lib/i18n';\nimport Layout, { Row } from '../../../components/layout';\nimport Card from '../../../components/card';\nimport ToggleInput from '../../../components/form/toggle-input';\nimport Tooltip from '../../../components/tooltip';\nimport IconUpgrade from '../../../components/icon-upgrade';\nimport Alert from '@UI/alert';\n\nimport style from '../customize/customize-style.scss';\n\nconst UploadLogo = ({ logoSrc, onLogoChange }) => {\n  return (\n    <Dropzone\n      multiple={false}\n      className={style.logoDropzone}\n      accept=\"image/jpeg,image/gif,image/png\"\n      onDrop={onLogoChange}\n      disableClick={!!logoSrc}\n    >\n      {({ isDragActive }) => {\n        const className = classNames(style.logoUpload, {\n          [style.logoDragActive]: isDragActive,\n        });\n\n        return (\n          <div className={className}>\n            {logoSrc && !isDragActive && (\n              <div className={style.logoPreview}>\n                <img src={logoSrc} />\n                <div\n                  role=\"button\"\n                  onClick={() => onLogoChange([])}\n                  className={style.logoRemove}\n                >\n                  <FormattedMessage id=\"customize.logoRemove\" />\n                </div>\n              </div>\n            )}\n            {!logoSrc && !isDragActive && (\n              <div className={style.logoUploadInstructions}>\n                <div className={style.logoDropNote}>\n                  <FormattedHTMLMessage id=\"customize.logoDropInstructions\" />\n                </div>\n                <div className={style.logoUploadNote}>\n                  <FormattedMessage id=\"customize.logoDropInstructionsNote\" />\n                </div>\n              </div>\n            )}\n            {isDragActive && (\n              <div className={style.logoUploadInstructions}>\n                <FormattedMessage id=\"customize.logoDropHere\" />\n              </div>\n            )}\n          </div>\n        );\n      }}\n    </Dropzone>\n  );\n};\n\nUploadLogo.propTypes = {\n  onLogoChange: PropTypes.func.isRequired,\n  logoSrc: PropTypes.string,\n};\n\nconst FooterLabelComponent = allowed(\n  partialRight(get, 'allowances.can_disable_branding'),\n  () => (\n    <Row inlineFlex>\n      <span className={style.footerCardTitle}>\n        <FormattedMessage id=\"customize.showFooter\" />\n      </span>\n      <Tooltip\n        tooltip={<FormattedMessage id=\"customize.upgrade.showFooter.tooltip\" />}\n      >\n        <span className={style.iconContainer}>\n          <IconUpgrade />\n        </span>\n      </Tooltip>\n    </Row>\n  ),\n)(() => (\n  <span className={style.footerCardTitle}>\n    <FormattedMessage id=\"customize.showFooter\" />\n  </span>\n));\n\nconst LogoLabel = allowed(\n  partialRight(get, 'allowances.advanced_dashboard_customization'),\n  () => (\n    <Row>\n      <FormattedMessage id=\"customize.logo\" />\n      <Tooltip\n        tooltip={<FormattedMessage id=\"customize.upgrade.showLogo.tooltip\" />}\n      >\n        <span className={style.iconContainer}>\n          <IconUpgrade />\n        </span>\n      </Tooltip>\n    </Row>\n  ),\n)(() => <FormattedMessage id=\"customize.logo\" />);\n\nconst CustomizeFooter = props => {\n  const {\n    onShowLogoChange,\n    showLogo,\n    showClock,\n    onShowClockChange,\n    logoError,\n    logoSrc,\n    onLogoChange,\n  } = props;\n\n  return (\n    <div>\n      <Layout marginBottom={1}>\n        <ToggleInput\n          name=\"showLogo\"\n          title={<LogoLabel />}\n          checked={showLogo}\n          onToggle={onShowLogoChange}\n        />\n      </Layout>\n      {showLogo && (\n        <Layout marginBottom={2}>\n          <UploadLogo logoSrc={logoSrc} onLogoChange={onLogoChange} />\n          {logoError && (\n            <Layout marginTop={1}>\n              <Alert\n                type={Alert.TYPES.ERROR}\n                message={<FormattedMessage id={logoError} />}\n              />\n            </Layout>\n          )}\n        </Layout>\n      )}\n      <Layout marginBottom={1}>\n        <ToggleInput\n          name=\"showClock\"\n          title={<FormattedMessage id=\"customize.clock\" />}\n          checked={showClock}\n          onToggle={onShowClockChange}\n        />\n      </Layout>\n    </div>\n  );\n};\nCustomizeFooter.propTypes = {\n  showClock: PropTypes.bool.isRequired,\n  showLogo: PropTypes.bool.isRequired,\n  onLogoChange: PropTypes.func.isRequired,\n  onShowClockChange: PropTypes.func.isRequired,\n  onShowLogoChange: PropTypes.func.isRequired,\n  logoError: PropTypes.string,\n  logoSrc: PropTypes.string,\n};\n\nconst DashboardFooterControlComponent = ({\n  showFooter,\n  onShowFooterChange,\n  onShowLogoChange,\n  showLogo,\n  showClock,\n  onShowClockChange,\n  logoError,\n  logoSrc,\n  onLogoChange,\n}) => {\n  return (\n    <Card\n      header={\n        <ToggleInput\n          title={<FooterLabelComponent />}\n          checked={showFooter}\n          onToggle={onShowFooterChange}\n        />\n      }\n    >\n      {showFooter && (\n        <CustomizeFooter\n          onShowLogoChange={onShowLogoChange}\n          showLogo={showLogo}\n          showClock={showClock}\n          onShowClockChange={onShowClockChange}\n          logoError={logoError}\n          logoSrc={logoSrc}\n          onLogoChange={onLogoChange}\n        />\n      )}\n    </Card>\n  );\n};\n\nDashboardFooterControlComponent.propTypes = {\n  logoError: PropTypes.string,\n  logoSrc: PropTypes.string,\n  showClock: PropTypes.bool,\n  showFooter: PropTypes.bool,\n  showLogo: PropTypes.bool,\n  onLogoChange: PropTypes.func,\n  onShowClockChange: PropTypes.func,\n  onShowFooterChange: PropTypes.func,\n  onShowLogoChange: PropTypes.func,\n};\n\nexport default DashboardFooterControlComponent;\nexport { CustomizeFooter, UploadLogo };\n","import DashboardFooterControl from './dashboard-footer-control-connector';\n\nexport default DashboardFooterControl;\n","import { connect } from 'react-redux';\nimport DashboardFooterControl from './dashboard-footer-control-component';\nimport * as customizeActions from '../../actions/customize-actions';\n\nconst mapStateToProps = ({ customize }) => {\n  const { values = {}, logoError } = customize;\n  const { showFooter, showClock, showLogo, logoSrc } = values;\n\n  return {\n    showFooter,\n    showClock,\n    showLogo,\n    logoSrc,\n    logoError,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onShowFooterChange: value => dispatch(customizeActions.setShowFooter(value)),\n  onShowClockChange: value => dispatch(customizeActions.setShowClock(value)),\n  onShowLogoChange: value => dispatch(customizeActions.setShowLogo(value)),\n  onLogoChange: files => dispatch(customizeActions.setLogo(files[0])),\n});\n\nconst DashboardFooterControlConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DashboardFooterControl);\n\nexport default DashboardFooterControlConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../lib/i18n';\nimport Layout, { Row, Column } from '../../../components/layout';\nimport InfoBubble from '../../../components/info-bubble';\nimport Image from '@UI/image';\nimport ButtonGroupVisual, {\n  ButtonVisual,\n} from '../../../components/button-group-visual';\nimport config from '../../../universal/config';\n\nimport style from '../customize/customize-style.scss';\n\nconst FontSizeControlComponent = ({ value, onChange }) => {\n  const baseUrl = `${config.get().StaticAssetBaseURL}/images/`;\n\n  return (\n    <Row marginBottom={1}>\n      <Column marginRight={1} justify=\"center\">\n        <Row>\n          <FormattedMessage id=\"customize.fontSize\" />\n          <Layout marginLeft={0.5} tag=\"span\">\n            <InfoBubble isBubbleWide>\n              <FormattedMessage id=\"customize.fontSize.tooltip\" />\n            </InfoBubble>\n          </Layout>\n        </Row>\n      </Column>\n      <Column flexAuto>\n        <ButtonGroupVisual>\n          <ButtonVisual\n            isActive={value === 'small'}\n            onClick={() => onChange('small')}\n          >\n            <Image\n              src={\n                value === 'small'\n                  ? `${baseUrl}font_toggle_small_color.svg`\n                  : `${baseUrl}font_toggle_small_off.svg`\n              }\n              className={\n                value === 'small'\n                  ? style.activeControlImage\n                  : style.controlImage\n              }\n              width={37}\n              height={38}\n            />\n            <FormattedMessage id=\"customize.smallFont\" />\n          </ButtonVisual>\n          <ButtonVisual\n            isActive={value === 'large'}\n            onClick={() => onChange('large')}\n          >\n            <Image\n              src={\n                value === 'large'\n                  ? `${baseUrl}font_toggle_big_color.svg`\n                  : `${baseUrl}font_toggle_big_off.svg`\n              }\n              className={\n                value === 'large'\n                  ? style.activeControlImage\n                  : style.controlImage\n              }\n              width={37}\n              height={38}\n            />\n            <FormattedMessage id=\"customize.largeFont\" />\n          </ButtonVisual>\n        </ButtonGroupVisual>\n      </Column>\n    </Row>\n  );\n};\n\nFontSizeControlComponent.propTypes = {\n  value: PropTypes.oneOf(['small', 'large']).isRequired,\n  onChange: PropTypes.func,\n};\n\nexport default FontSizeControlComponent;\n","import FontSizeControl from './font-size-control-component';\n\nexport default FontSizeControl;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../lib/i18n';\nimport Layout, { Row, Column } from '../../../components/layout';\nimport InfoBubble from '../../../components/info-bubble';\nimport Image from '@UI/image';\nimport ButtonGroupVisual, {\n  ButtonVisual,\n} from '../../../components/button-group-visual';\nimport config from '../../../universal/config';\n\nimport style from '../customize/customize-style.scss';\n\nexport const VALUES = {\n  STANDARD: 'standard',\n  DENSE: 'dense',\n};\n\nconst GridSizeControlComponent = ({ value, onChange }) => {\n  const baseUrl = `${config.get().StaticAssetBaseURL}/images/`;\n\n  return (\n    <Row>\n      <Column marginRight={1} justify=\"center\">\n        <Row>\n          <FormattedMessage id=\"customize.gridSize\" />\n          <Layout marginLeft={0.5} tag=\"span\">\n            <InfoBubble isBubbleWide>\n              <FormattedMessage id=\"customize.gridSize.tooltip\" />\n            </InfoBubble>\n          </Layout>\n        </Row>\n      </Column>\n      <Column flexAuto>\n        <ButtonGroupVisual>\n          <ButtonVisual\n            isActive={value === VALUES.STANDARD}\n            onClick={() => onChange(VALUES.STANDARD)}\n          >\n            <Image\n              src={\n                value === VALUES.STANDARD\n                  ? `${baseUrl}grid_standard.svg`\n                  : `${baseUrl}grid_standard_off.svg`\n              }\n              className={\n                value === VALUES.STANDARD\n                  ? style.activeControlImage\n                  : style.controlImage\n              }\n              width={32}\n              height={32}\n            />\n            <FormattedMessage id=\"customize.gridSize.sixCol\" />\n          </ButtonVisual>\n          <ButtonVisual\n            isActive={value === VALUES.DENSE}\n            onClick={() => onChange(VALUES.DENSE)}\n          >\n            <Image\n              src={\n                value === VALUES.DENSE\n                  ? `${baseUrl}grid_dense.svg`\n                  : `${baseUrl}grid_dense_off.svg`\n              }\n              className={\n                value === VALUES.DENSE\n                  ? style.activeControlImage\n                  : style.controlImage\n              }\n              width={32}\n              height={32}\n            />\n            <FormattedMessage id=\"customize.gridSize.eightCol\" />\n          </ButtonVisual>\n        </ButtonGroupVisual>\n      </Column>\n    </Row>\n  );\n};\n\nGridSizeControlComponent.propTypes = {\n  value: PropTypes.oneOf([VALUES.STANDARD, VALUES.DENSE]).isRequired,\n  onChange: PropTypes.func,\n};\n\nexport default GridSizeControlComponent;\n","import GridSizeControl from './grid-size-control-connector';\nimport { VALUES } from './grid-size-control-component';\n\nexport default GridSizeControl;\nexport { VALUES };\n","import { connect } from 'react-redux';\nimport GridSizeControl, { VALUES } from './grid-size-control-component';\nimport * as customizeActions from '../../actions/customize-actions';\n\nconst mapStateToProps = ({ customize: { values = {} } }) => {\n  return {\n    value: values.gridSize === 240 ? VALUES.DENSE : VALUES.STANDARD,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onChange: value => {\n    const gridSize = value === VALUES.DENSE ? 240 : 320;\n\n    dispatch(customizeActions.setGridSize(gridSize));\n  },\n});\n\nconst GridSizeControlConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(GridSizeControl);\n\nexport default GridSizeControlConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport Layout, { Row, Column } from '../../../components/layout';\nimport Button from '@UI/button';\nimport { CardGroup, TogglableCard } from '../../../components/card';\nimport SelectDropdown from '../../../components/select-dropdown';\nimport ToggleInput from '../../../components/form/toggle-input';\nimport { TrialPromoCard, UpgradePromoCard } from '../promo-cards';\nimport { Allowed } from '../../../hoc/allowed';\nimport ThemePicker from '../theme-picker';\nimport WidgetTitleSizeCard from '../widget-title-size-card';\nimport { OnMount } from '../../../hoc/on-mount';\nimport InfoBubble from '../../../components/info-bubble';\nimport DashboardFooterControl from '../dashboard-footer-control';\nimport FontSizeControl from '../font-size-control';\nimport GridSizeControl from '../grid-size-control';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './customize-style.scss';\n\nconst CustomizeComponent = ({\n  isLoading,\n  scaleToFit,\n  tvMode,\n  largeTitles,\n  columns,\n  columnOptions,\n  isSaving,\n  showTrialPromo,\n  showUpgradePromo,\n  isBoxLayout,\n  onColumnsChange,\n  onScaleToFitChange,\n  onTvModeChange,\n  onLargeTitlesChange,\n  onCancel,\n  onSave,\n  onUpgradeClick,\n  onMount,\n  onPreviewGrid,\n}) => {\n  return (\n    <Column flexAuto className={style.customizePanelContent}>\n      <OnMount do={onMount} />\n      {isLoading && (\n        <Column flexAuto justify=\"center\">\n          <LoadingSpinner />\n        </Column>\n      )}\n      {!isLoading && (\n        <Column flexAuto className={style.container}>\n          <Column flexAuto className={style.inner}>\n            <Layout>\n              <ThemePicker />\n            </Layout>\n            <Layout marginTop={1}>\n              <DashboardFooterControl />\n            </Layout>\n            <Layout marginTop={1}>\n              <TogglableCard header=\"Layout and display\">\n                <div>\n                  <CardGroup marginBottom={1}>\n                    <FontSizeControl\n                      onChange={value => onTvModeChange(value === 'large')}\n                      value={tvMode ? 'large' : 'small'}\n                    />\n                  </CardGroup>\n                  {!isBoxLayout && (\n                    <CardGroup marginBottom={1}>\n                      <Allowed\n                        test={({ allowances }) =>\n                          allowances.can_toggle_widget_title_size\n                        }\n                      >\n                        <Layout marginBottom={1}>\n                          <WidgetTitleSizeCard\n                            largeTitles={largeTitles}\n                            onLargeTitlesChange={onLargeTitlesChange}\n                            isDisabled={tvMode}\n                          />\n                        </Layout>\n                      </Allowed>\n                    </CardGroup>\n                  )}\n                  {isBoxLayout && (\n                    <CardGroup>\n                      <GridSizeControl />\n                    </CardGroup>\n                  )}\n                  {!isBoxLayout && (\n                    <div\n                      id=\"column-control\"\n                      onMouseEnter={() => onPreviewGrid(true)}\n                      onMouseLeave={() => onPreviewGrid(false)}\n                    >\n                      <CardGroup\n                        flex\n                        flexWrap\n                        marginBottom={1.5}\n                        paddingBottom={1}\n                      >\n                        <Column justify=\"center\" flexFill>\n                          <Row>\n                            <FormattedMessage id=\"customize.columns\" />\n                            <Layout marginLeft={0.5} tag=\"span\">\n                              <InfoBubble isBubbleWide>\n                                <FormattedMessage id=\"customize.columns.tooltip\" />\n                              </InfoBubble>\n                            </Layout>\n                          </Row>\n                        </Column>\n                        <Column>\n                          <SelectDropdown\n                            name=\"columns\"\n                            options={columnOptions}\n                            selected={columns}\n                            onChange={onColumnsChange}\n                          />\n                        </Column>\n                      </CardGroup>\n                      <CardGroup paddingBottom={0.5}>\n                        <ToggleInput\n                          name=\"scaleToFit\"\n                          title={\n                            <span>\n                              <FormattedMessage id=\"customize.scaleToFit\" />\n                              <Layout marginLeft={0.5} tag=\"span\">\n                                <InfoBubble isBubbleWide>\n                                  <FormattedMessage id=\"customize.scaleToFit.tooltip\" />\n                                </InfoBubble>\n                              </Layout>\n                            </span>\n                          }\n                          checked={scaleToFit}\n                          onToggle={onScaleToFitChange}\n                        />\n                      </CardGroup>\n                    </div>\n                  )}\n                </div>\n              </TogglableCard>\n            </Layout>\n            {showTrialPromo && <TrialPromoCard />}\n            {showUpgradePromo && (\n              <UpgradePromoCard onUpgradeClick={onUpgradeClick} />\n            )}\n          </Column>\n          <Row justify=\"flex-end\" flexNone className={style.buttonPanel}>\n            <Column>\n              <Button intent={Button.INTENT.SECONDARY} onClick={onCancel}>\n                <FormattedMessage id=\"customize.cancel\" />\n              </Button>\n            </Column>\n            <Column marginLeft={1}>\n              <Button loading={isSaving} onClick={onSave}>\n                {isSaving ? (\n                  <FormattedMessage id=\"customize.saving\" />\n                ) : (\n                  <FormattedMessage id=\"customize.saveAndApply\" />\n                )}\n              </Button>\n            </Column>\n          </Row>\n        </Column>\n      )}\n    </Column>\n  );\n};\n\nCustomizeComponent.propTypes = {\n  isBoxLayout: PropTypes.bool.isRequired,\n  isLoading: PropTypes.bool.isRequired,\n  isSaving: PropTypes.bool.isRequired,\n  showTrialPromo: PropTypes.bool.isRequired,\n  showUpgradePromo: PropTypes.bool.isRequired,\n  onCancel: PropTypes.func.isRequired,\n  onColumnsChange: PropTypes.func.isRequired,\n  onLargeTitlesChange: PropTypes.func.isRequired,\n  onSave: PropTypes.func.isRequired,\n  onScaleToFitChange: PropTypes.func.isRequired,\n  onTvModeChange: PropTypes.func.isRequired,\n  columnOptions: PropTypes.arrayOf(\n    PropTypes.shape({\n      label: PropTypes.string,\n      value: PropTypes.number,\n    }),\n  ),\n  columns: PropTypes.number,\n  largeTitles: PropTypes.bool,\n  scaleToFit: PropTypes.bool,\n  tvMode: PropTypes.bool,\n  onMount: PropTypes.func,\n  onPreviewGrid: PropTypes.func,\n  onUpgradeClick: PropTypes.func,\n};\n\nexport default CustomizeComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Tooltip from '../components/tooltip';\nimport ServiceIcon from '../components/service-icon';\n\nimport style from './widget-footer-style.scss';\n\nconst WidgetFooter = ({ serviceName, title, serviceTitleClass }) => {\n  // Because we use fake duplicated services for Universal widgets that rely on\n  // inquisitor service and that compared to Salesforce & Pegasus, we've got\n  // more than one service using Inquisitor we cannot just create an Inquisitor\n  // logo.\n  // See here\n  // https://github.com/geckoboard/gecko-models/commit/ad21cbf6f390dc925eedbe8d0dc5189133c6a107\n  // For now we'll rely on the className injected here:\n  // https://github.com/geckoboard/gecko-js/blob/276d5b7eacf1f2f6dde018d4da233c0ea11409b8/src/dashboard/views/widget-container-view.js#L45\n  // that must be around for deprecated custom CSS but this should be\n  // revisited when dealing with the next big refactoring on how we create services.\n  const fileName =\n    serviceName === 'inquisitor' ? serviceTitleClass : serviceName;\n\n  return (\n    <footer className={style.widgetFooter}>\n      <span className={style.serviceIcon}>\n        <Tooltip isLight tooltip={title}>\n          <ServiceIcon\n            serviceName={fileName}\n            className={style.logo}\n            size={24}\n          />\n        </Tooltip>\n      </span>\n    </footer>\n  );\n};\n\nWidgetFooter.propTypes = {\n  serviceName: PropTypes.string,\n  serviceTitleClass: PropTypes.string,\n  title: PropTypes.string,\n};\n\nexport default WidgetFooter;\n","import WidgetFooter from './widget-footer';\nexport default WidgetFooter;\n","import { connect } from 'react-redux';\nimport * as widgetActions from '../widget/actions/widget-actions';\nimport WidgetTitle from './widget-title-component';\nimport { dispatchToGeckoJS } from '../lib/gecko-view';\nimport { getCustomizeValues } from '../customize/helpers';\n\nconst mapStateToProps = state => {\n  const {\n    customize,\n    dashboard: { dashboard },\n  } = state;\n  const { toggles = [] } = dashboard;\n\n  const isFixieboard = toggles.includes('grid');\n  const { largeTitles } = getCustomizeValues(dashboard, customize);\n\n  return {\n    isSmall: !largeTitles && !isFixieboard,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { widgetKey }) => {\n  return {\n    onUpdate: title => {\n      dispatch(\n        widgetActions.widgetUpdateConfig({\n          key: widgetKey,\n          attributes: { title },\n        }),\n      );\n\n      dispatchToGeckoJS('widget:title:change', {\n        widgetKey,\n        title,\n      });\n    },\n  };\n};\n\nconst WidgetTitleConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetTitle);\n\nexport default WidgetTitleConnector;\n","import { connect } from 'react-redux';\nimport { setConfig } from '../universal-config/actions/universal-config-actions';\nimport WidgetTitle from './widget-title-component';\nimport { getCustomizeValues } from '../customize/helpers';\n\nconst mapStateToProps = state => {\n  const {\n    customize,\n    dashboard: { dashboard },\n    universal: { config: { title } = {} },\n  } = state;\n\n  const { largeTitles } = getCustomizeValues(dashboard, customize);\n\n  return {\n    isSmall: !largeTitles,\n    title,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onUpdate: title => {\n      dispatch(setConfig({ title }));\n    },\n  };\n};\n\nconst WidgetTitleUniversalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetTitle);\nWidgetTitleUniversalConnector.displayName = 'WidgetTitleUniversalConnector';\n\nexport default WidgetTitleUniversalConnector;\n","import WidgetTitleConnector from './widget-title-connector';\nimport WidgetTitleUniversal from './widget-title-universal-connector';\n\nexport default WidgetTitleConnector;\nexport { WidgetTitleUniversal };\n","import { get } from 'lodash';\nimport WidgetMenu from './widget-menu-component';\nimport { connect } from 'react-redux';\nimport * as widgetActions from '../widget/actions/widget-actions';\nimport * as widgetMenuActions from './actions/widget-menu-actions';\nimport { LOCATION_CHANGE_CLICK } from '../widget/constants/widget-location-constants';\n\nconst getRefreshDelay = widget => {\n  const { isDataRequired, config = {} } = widget;\n\n  if (!isDataRequired || config.method === 'push') {\n    return undefined;\n  }\n\n  return widget.refresh_interval;\n};\n\nconst mapStateToProps = (state, props) => {\n  const { widgetKey, canSetIndicators } = props;\n  const { widgetMenu, allDashboards, dashboard, widgets } = state;\n  const { dashboard: currentDashboard } = dashboard;\n  const isGridDashboard = currentDashboard.toggles.includes('grid');\n  const widget = widgets[widgetKey] || {};\n  const { widgetKey: focusedWidgetKey, view } = widgetMenu;\n  const isFocused = widgetKey === focusedWidgetKey;\n  const widgetTitle = get(state, `widgets[${widgetKey}].config.title`);\n\n  const isStatusIndicatorsSet =\n    !!canSetIndicators &&\n    get(widget.config, 'indicators.thresholds', []).length > 0;\n\n  return {\n    isGridDashboard,\n    location: widget.location,\n    widgetTitle,\n    refreshDelay: getRefreshDelay(widget),\n    realTimeUpdates: widget.real_time_updates,\n    // Only used for creating the onCopy handler\n    showCopyModal: Object.keys(allDashboards).length > 1,\n    currentDashboard,\n    isStatusIndicatorsSet,\n    view: isFocused ? view : WidgetMenu.VIEWS.CLOSED,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => ({\n  onEdit: () => {\n    dispatch(widgetActions.editWidget(props.widgetKey));\n  },\n  onOpenDeleteModal: () => {\n    dispatch(widgetMenuActions.openDeleteModal());\n  },\n  onCloseDeleteModal: () => {\n    dispatch(widgetMenuActions.closeMenu());\n  },\n  onDeleteWidget: () => {\n    props.onClose();\n    dispatch(widgetActions.deleteWidget(props.widgetKey));\n  },\n  onOpenWidgetStatusIndicator: () => {\n    dispatch(widgetMenuActions.openWidgetStatusIndicator(props.widgetKey));\n  },\n  onFormatNumber: () => {\n    dispatch(widgetMenuActions.openNumberFormatter(props.widgetKey));\n  },\n  onMoveWidgetOffCanvas: () => {\n    props.onClose();\n    dispatch(\n      widgetActions.moveOffCanvas(props.widgetKey, LOCATION_CHANGE_CLICK),\n    );\n  },\n  createOnCopyHandler: (shouldShowCopyModal, currentDashboard) => () => {\n    if (shouldShowCopyModal) {\n      dispatch(widgetMenuActions.openCopyModal());\n    } else {\n      dispatch(widgetMenuActions.closeMenu());\n      dispatch(\n        widgetActions.copyWidget({\n          dashboard: currentDashboard,\n          widgetKey: props.widgetKey,\n        }),\n      );\n    }\n  },\n});\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { showCopyModal, currentDashboard, ...filteredStateProps } = stateProps;\n  const { createOnCopyHandler, ...filteredDispatchProps } = dispatchProps;\n\n  const onCopy = createOnCopyHandler(showCopyModal, currentDashboard);\n\n  return {\n    ...ownProps,\n    ...filteredStateProps,\n    ...filteredDispatchProps,\n    onCopy,\n  };\n};\n\nconst WidgetMenuConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(WidgetMenu);\n\nexport default WidgetMenuConnector;\n","import WidgetMenuConnector from './widget-menu-connector';\n\nexport default WidgetMenuConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\n\nimport './widget-menu-overlay-style.scss';\n\nclass WidgetMenuOverlayPortal extends Component {\n  constructor(props) {\n    super(props);\n\n    this.domHostId = 'dashboard-overlay-container';\n    this.el = document.createElement('div');\n    this.el.id = 'footer-overlay';\n  }\n\n  componentDidMount() {\n    const host = document.getElementById(this.domHostId);\n\n    if (host) {\n      host.appendChild(this.el);\n    }\n  }\n\n  componentWillUnmount() {\n    const host = document.getElementById(this.domHostId);\n\n    if (host) {\n      host.removeChild(this.el);\n    }\n  }\n\n  render() {\n    return createPortal(<WidgetMenuOverlay {...this.props} />, this.el);\n  }\n}\n\nclass WidgetMenuOverlay extends Component {\n  constructor(props) {\n    super(props);\n    this.headerId = 'masthead';\n    this.handleClose = this.handleClose.bind(this);\n    this._listenForEsc = this._listenForEsc.bind(this);\n  }\n\n  componentDidMount() {\n    window.addEventListener('keydown', this._listenForEsc);\n\n    // close overlay when clicking on masthead\n    const header = document.getElementById(this.headerId);\n    if (header) {\n      header.addEventListener('click', this.handleClose);\n    }\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('keydown', this._listenForEsc);\n\n    const header = document.getElementById(this.headerId);\n    if (header) {\n      header.removeEventListener('click', this.handleClose);\n    }\n  }\n\n  handleClose() {\n    this.props.onClose();\n  }\n\n  render() {\n    return (\n      <TransitionGroup>\n        {!!this.props.visible && (\n          <CSSTransition in classNames=\"footer-overlay\" timeout={100}>\n            <div className=\"modal\" onClick={this.handleClose} />\n          </CSSTransition>\n        )}\n      </TransitionGroup>\n    );\n  }\n\n  _listenForEsc(event) {\n    if (event.key === 'Escape' || event.keyCode === 27) {\n      this.handleClose(event);\n    }\n  }\n}\n\nWidgetMenuOverlay.propTypes = {\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nexport default WidgetMenuOverlayPortal;\n","import WidgetMenuOverlayPortal from './widget-menu-overlay';\nexport default WidgetMenuOverlayPortal;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport WidgetTitle, { WidgetTitleUniversal } from '../widget-title';\nimport WidgetMenu from '../widget-menu';\nimport WidgetMenuOverlay from '../widget-menu/widget-menu-overlay';\nimport { bindAll } from 'lodash';\n\nimport styles from './widget-header-style.scss';\n\nclass WidgetHeaderComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleMenuToggle');\n  }\n\n  handleMenuToggle() {\n    const { isMenuOpen, onCloseMenu, onOpenMenu } = this.props;\n\n    isMenuOpen ? onCloseMenu() : onOpenMenu();\n  }\n\n  render() {\n    const {\n      canBeRefreshed,\n      canEdit,\n      canFormatNumber,\n      canSetIndicators,\n      friendlyDataUpdatedAt,\n      isEditingFromDashboard,\n      isExpired,\n      isImporting,\n      isMenuOpen,\n      onCloseMenu,\n      isTitleEnabled,\n      isWidgetFocused,\n      title,\n      tvMode,\n      widgetKey,\n    } = this.props;\n    const className = classNames('widget-header', styles.container, {\n      'has-title': !!title,\n      [styles.open]: isMenuOpen,\n      [styles.draggable]: !isWidgetFocused,\n    });\n\n    return (\n      <header className={className}>\n        <WidgetMenuOverlay\n          visible={this.props.isMenuOpen}\n          onClose={onCloseMenu}\n        />\n        <div className={styles.title}>\n          {isTitleEnabled &&\n            (isEditingFromDashboard ? (\n              <WidgetTitleUniversal\n                widgetKey={widgetKey}\n                title={title}\n                canEdit={canEdit}\n                tvMode={tvMode}\n              />\n            ) : (\n              <WidgetTitle\n                widgetKey={widgetKey}\n                title={title}\n                canEdit={canEdit}\n                tvMode={tvMode}\n              />\n            ))}\n        </div>\n        <div className={styles.options}>\n          {canBeRefreshed && (\n            <a\n              className={`${styles.statusIndicator} refresh-widget`}\n              href=\"#\"\n            />\n          )}\n          {friendlyDataUpdatedAt && (\n            <button className={`${styles.staleData} refresh-widget`}>\n              {friendlyDataUpdatedAt}\n            </button>\n          )}\n          {canEdit && (\n            <button\n              ref={settingsNode => (this.settingsNode = settingsNode)}\n              className={`${styles.settingsButton} settings-button fa fa-ellipsis-v`}\n              onClick={this.handleMenuToggle}\n            />\n          )}\n        </div>\n        {canEdit && (\n          <div className={styles.menu}>\n            <WidgetMenu\n              widgetKey={widgetKey}\n              isExpired={isExpired}\n              isImporting={isImporting}\n              canFormatNumber={canFormatNumber}\n              canSetIndicators={canSetIndicators}\n              onClose={this.props.onCloseMenu}\n            />\n          </div>\n        )}\n      </header>\n    );\n  }\n}\n\nWidgetHeaderComponent.defaultProps = {\n  isMenuOpen: false,\n  isTitleEnabled: true,\n};\n\nWidgetHeaderComponent.propTypes = {\n  widgetKey: PropTypes.string.isRequired,\n  canBeRefreshed: PropTypes.bool,\n  canEdit: PropTypes.bool,\n  canFormatNumber: PropTypes.bool,\n  canSetIndicators: PropTypes.bool,\n  friendlyDataUpdatedAt: PropTypes.string,\n  isEditingFromDashboard: PropTypes.bool,\n  isExpired: PropTypes.bool,\n  isImporting: PropTypes.bool,\n  isMenuOpen: PropTypes.bool,\n  isTitleEnabled: PropTypes.bool,\n  isWidgetFocused: PropTypes.bool,\n  title: PropTypes.string,\n  tvMode: PropTypes.bool,\n  onCloseMenu: PropTypes.func,\n  onOpenMenu: PropTypes.func,\n};\n\nexport default WidgetHeaderComponent;\n","import PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport WidgetHeader from './widget-header-component';\nimport WidgetMenu from '../widget-menu/widget-menu-component';\nimport * as widgetMenuActions from '../widget-menu/actions/widget-menu-actions';\nimport { dispatchToGeckoJS } from '../lib/gecko-view';\n\nconst mapStateToProps = (state, props) => {\n  const { widgetKey } = props;\n  const {\n    widgetMenu: { widgetKey: editedKey, view },\n    universal: { isConfigReady } = {},\n  } = state;\n  const isWidgetFocused = editedKey === widgetKey;\n  const isMenuOpen = view !== WidgetMenu.VIEWS.CLOSED && isWidgetFocused;\n  const isEditingFromDashboard =\n    isWidgetFocused && view === WidgetMenu.VIEWS.EDIT && isConfigReady;\n\n  return {\n    isMenuOpen,\n    isWidgetFocused,\n    isEditingFromDashboard,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { widgetKey } = props;\n\n  const onOpenMenu = () => {\n    dispatch(widgetMenuActions.openMenu({ widgetKey }));\n    dispatchToGeckoJS('widget-menu', {\n      open: true,\n      widgetKey,\n    });\n  };\n  const onCloseMenu = () => {\n    dispatch(widgetMenuActions.closeAndSave());\n  };\n\n  return {\n    ...props,\n    onOpenMenu,\n    onCloseMenu,\n  };\n};\n\nconst WidgetHeaderConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(WidgetHeader);\n\nWidgetHeaderConnector.propTypes = {\n  widgetKey: PropTypes.string.isRequired,\n  configuration: PropTypes.object,\n};\n\nexport default WidgetHeaderConnector;\n","import WidgetHeader from './widget-header-connector';\n\nexport default WidgetHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport DragInteraction from '../../components/drag-interaction';\nimport { clamp } from 'lodash';\n\nimport style from './resizable-widget-style.scss';\n\nconst SLIM_HEIGHT = 72;\nconst MAX_WIDGET_SIZE = 1910; // 8 columns wide\n\nconst snap = (size, scaledGridSize, scaledGridGapSize) => {\n  const remainder = size % scaledGridSize;\n  let cellSpan = Math.floor(size / scaledGridSize);\n\n  if (remainder > 30 || cellSpan === 0) {\n    cellSpan++;\n  }\n\n  return cellSpan * scaledGridSize - scaledGridGapSize;\n};\n\nconst snapValue = (max, value, scaledGridSize, scaledGridGapSize, min) => {\n  let snappedValue = snap(value, scaledGridSize, scaledGridGapSize);\n\n  if (max) {\n    snappedValue = snappedValue > max ? max : snappedValue;\n  }\n\n  if (min) {\n    snappedValue = snappedValue < min ? min - scaledGridGapSize : snappedValue;\n  }\n\n  return snappedValue;\n};\n\nconst snapHeight = (\n  hasSlimSupport,\n  maxHeight,\n  height,\n  scaledGridSize,\n  scaledGridGapSize,\n  gridIncrements,\n  minHeight,\n) => {\n  if (hasSlimSupport && height < SLIM_HEIGHT + 30) {\n    return SLIM_HEIGHT;\n  }\n\n  return snapValue(\n    maxHeight,\n    height,\n    scaledGridSize * gridIncrements,\n    scaledGridGapSize,\n    minHeight,\n  );\n};\n\nconst ResizableWidgetComponent = props => {\n  const {\n    width,\n    height,\n    maxWidth,\n    maxHeight,\n    scaledGridSize,\n    scaledGridGapSize,\n    gridIncrements,\n    minHeight,\n  } = props;\n\n  const onDragMove = delta => {\n    const newWidth = clamp(width + delta.x, 0, MAX_WIDGET_SIZE);\n    const newHeight = clamp(height + delta.y, 0, MAX_WIDGET_SIZE);\n\n    props.onResizeChange({\n      raw: {\n        width: newWidth,\n        height: newHeight,\n      },\n      snap: {\n        width: snapValue(maxWidth, newWidth, scaledGridSize, scaledGridGapSize),\n        height: snapHeight(\n          props.hasSlimSupport,\n          maxHeight,\n          newHeight,\n          scaledGridSize,\n          scaledGridGapSize,\n          gridIncrements,\n          minHeight,\n        ),\n      },\n    });\n  };\n\n  return (\n    <DragInteraction\n      onDragStart={props.onResizeStart}\n      onDragMove={onDragMove}\n      onDragEnd={props.onResizeEnd}\n    >\n      <div className={style.handleWrapper}>\n        <div className={style.handle} />\n      </div>\n    </DragInteraction>\n  );\n};\n\nResizableWidgetComponent.defaultProps = {\n  hasSlimSupport: false,\n};\n\nResizableWidgetComponent.propTypes = {\n  height: PropTypes.number.isRequired,\n  // We can expect only a number once we're using `pixel_width`\n  width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  onResizeChange: PropTypes.func.isRequired,\n  onResizeEnd: PropTypes.func.isRequired,\n  onResizeStart: PropTypes.func.isRequired,\n  gridIncrements: PropTypes.number,\n  hasSlimSupport: PropTypes.bool,\n  maxHeight: PropTypes.number,\n  maxWidth: PropTypes.number,\n  minHeight: PropTypes.number,\n  scaledGridGapSize: PropTypes.number,\n  scaledGridSize: PropTypes.number,\n};\n\nexport default ResizableWidgetComponent;\n","import { connect } from 'react-redux';\nimport ResizableWidget from './resizable-widget-component';\nimport { isUndefined } from 'lodash';\nimport { getMinimumHeight } from '../../visualisation/helpers';\nimport {\n  GRID_WIDTH,\n  GRID_HEIGHT,\n} from '../../dashboard/box-layout/box-layout-constants';\n\nconst getMaxSize = (dashboardMax, widgetOffset, widgetSize, gridSize) => {\n  const maxColumns = Math.floor((dashboardMax + 10 - widgetOffset) / gridSize);\n\n  // If the widget is off the bounds of the dashboard\n  // limit the width to smaller than or equal to\n  // the current width\n  if (maxColumns < 1) {\n    return widgetSize;\n  }\n\n  return maxColumns * gridSize - 10;\n};\n\nconst scale = (prop, scaleFactor) =>\n  isUndefined(scaleFactor) ? prop : prop * scaleFactor;\n\nconst mapStateToProps = (state, props) => {\n  const { dashboard = {}, scaleFactor, gridSize } = state.dashboard;\n  const {\n    config: { template: { type: templateType } = {} },\n    visualisation: { type: visualisationType } = {},\n  } = state.widgets[props.widgetKey];\n\n  const vizType = templateType || visualisationType;\n\n  /*\n   * NEW GRID BASED LAYOUT\n   */\n  if (dashboard.toggles.includes('grid')) {\n    const maxWidth = getMaxSize(\n      GRID_WIDTH,\n      props.layout.left,\n      props.layout.pixel_width,\n      gridSize,\n    );\n\n    const maxHeight = getMaxSize(\n      GRID_HEIGHT,\n      props.layout.top,\n      props.layout.pixel_height,\n      gridSize * 0.5,\n    );\n\n    return {\n      maxWidth: scale(maxWidth, scaleFactor),\n      maxHeight: scale(maxHeight, scaleFactor),\n      scaledGridSize: scale(gridSize, scaleFactor),\n      scaledGridGapSize: scale(10, scaleFactor),\n      gridIncrements: 0.5,\n      minHeight: scale(getMinimumHeight(vizType) * gridSize, scaleFactor),\n    };\n  }\n\n  /*\n   * OLD DASHBOARD LAYOUT\n   */\n  const width = 240 * dashboard.columns - 10;\n\n  const maxWidth = getMaxSize(\n    width,\n    props.layout.left,\n    props.layout.pixel_width,\n    240,\n  );\n\n  return {\n    maxWidth,\n    maxHeight: 1910,\n    scaledGridSize: 240,\n    scaledGridGapSize: 10,\n    gridIncrements: 1,\n    minHeight: 240,\n  };\n};\n\nconst ResizableWidgetConnector = connect(mapStateToProps)(ResizableWidget);\n\nexport default ResizableWidgetConnector;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { layoutType } from '../../visualisation/prop-types';\nimport ResizableWidgetComponent from './resizable-widget-connector';\nimport classNames from 'classnames';\n\nimport style from '../widget-style.scss';\n\nconst ALLOWED_WIDGET_TYPES = [\n  'line',\n  'bar',\n  'column',\n  'polymorphic',\n  'bullet',\n  'image',\n  'clock',\n  'rag',\n  'ragcolumn',\n  'leaderboard',\n  'geckometer',\n  'text',\n  'map',\n  'monitoring',\n  'number',\n  'pie',\n  'funnel',\n  'highcharts',\n  'list',\n  'table',\n];\n\nclass WidgetWrapperComponent extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      preview: null,\n      snap: null,\n    };\n  }\n\n  handleResizeChange({ raw, snap }) {\n    this.setState({\n      preview: raw,\n      snap,\n    });\n  }\n\n  handleResizeEnd() {\n    // The pointer has not moved since we started the resize so we can bail out\n    if (!this.state.snap) {\n      return;\n    }\n\n    this.props.onResize(this.state.snap);\n    this.setState({ preview: null, snap: null });\n  }\n\n  render() {\n    const {\n      canEdit,\n      children,\n      hasSlimSupport,\n      id,\n      isMovable,\n      isResizable,\n      isWidgetFocused,\n      layout,\n      layout: { pixel_width: pixelWidth, pixel_height: pixelHeight },\n      onResizeStart,\n      isPreviewLoading,\n      scaleFactor,\n      status,\n      tvMode,\n      widgetKey,\n      widgetType,\n    } = this.props;\n    const { preview, snap } = this.state;\n\n    const widgetHeight = pixelHeight * scaleFactor;\n    const widgetWidth = pixelWidth * scaleFactor;\n    const height = preview ? preview.height : widgetHeight;\n    const width = preview ? preview.width : widgetWidth;\n\n    const hasTransparentBackground = widgetType === 'image';\n\n    const widgetClassName = classNames(\n      style.widget,\n      'widget loadable',\n      status,\n      widgetType,\n      {\n        [style.resizing]: !!preview,\n        loading:\n          status === 'waitingInitialServerSideRefresh' || isPreviewLoading,\n        // The `instrument-loading-exposure` class's existence is used by exposure to detect if a widget has finished loading in order to take a screenshot\n        'instrument-loading-exposure':\n          status === 'waitingInitialServerSideRefresh' ||\n          status === 'loading' ||\n          isPreviewLoading,\n        [style.editable]: canEdit,\n        [style.transparent]: hasTransparentBackground,\n        [style.focused]: isWidgetFocused,\n        [style.draggable]: isMovable,\n        'tv-mode': tvMode,\n      },\n    );\n    const sizeStyle = {\n      width: widgetWidth ? width : '100%',\n      height: widgetHeight ? height : '100%',\n    };\n    const resizeHandleStyle = classNames(style.resizeHandle, {\n      [style.disabled]: isWidgetFocused,\n    });\n\n    return (\n      <article className={widgetClassName} data-id={id} id={`widget-${id}`}>\n        <div className={style.size} style={sizeStyle}>\n          {children}\n          {canEdit && isResizable && (\n            <div className={resizeHandleStyle}>\n              <ResizableWidgetComponent\n                layout={layout}\n                height={widgetHeight}\n                width={widgetWidth}\n                onResizeStart={onResizeStart}\n                onResizeChange={size => this.handleResizeChange(size)}\n                onResizeEnd={() => this.handleResizeEnd()}\n                widgetKey={widgetKey}\n                hasSlimSupport={hasSlimSupport}\n              />\n            </div>\n          )}\n        </div>\n        {snap && <div className={style.ghostPreview} style={snap} />}\n      </article>\n    );\n  }\n}\n\nWidgetWrapperComponent.propTypes = {\n  canEdit: PropTypes.bool.isRequired,\n  hasSlimSupport: PropTypes.bool.isRequired,\n  widgetType: PropTypes.oneOf(ALLOWED_WIDGET_TYPES).isRequired,\n  onResize: PropTypes.func.isRequired,\n  onResizeStart: PropTypes.func.isRequired,\n  children: PropTypes.node,\n  id: PropTypes.number,\n  isMovable: PropTypes.bool,\n  isPreviewLoading: PropTypes.bool,\n  isResizable: PropTypes.bool,\n  isWidgetFocused: PropTypes.bool,\n  layout: layoutType,\n  scaleFactor: PropTypes.number,\n  status: PropTypes.oneOf([\n    'importing',\n    'loading',\n    'waitingInitialServerSideRefresh',\n    'ready',\n    'failed',\n    'warning',\n    'warningThresholdReached',\n    'positiveThresholdReached',\n  ]),\n  tvMode: PropTypes.bool,\n  widgetKey: PropTypes.string,\n};\n\nWidgetWrapperComponent.defaultProps = {\n  isResizable: false,\n  isPreviewLoading: false,\n  scaleFactor: 1, // Old dashboards don't have a scaleFactor, so default to 1\n};\n\nexport default WidgetWrapperComponent;\n","import PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { layoutType } from '../../visualisation/prop-types';\nimport { dispatchToGeckoJS } from '../../lib/gecko-view';\nimport {\n  widgetDragStart,\n  widgetDragEnd,\n  resizeWidget,\n} from '../actions/widget-actions';\nimport WidgetWrapperComponent from './widget-wrapper-component';\nimport WidgetMenu from '../../widget-menu/widget-menu-component';\nimport { includes } from 'lodash';\n\nconst reverseScale = (value, scaleFactor) => {\n  return Math.round(value / scaleFactor);\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const createOnResizeHandler = (scaleFactor = 1) => size => {\n    dispatch(widgetDragEnd());\n    dispatchToGeckoJS('widget:resize:end', {\n      widgetKey: props.widgetKey,\n    });\n    dispatch(\n      resizeWidget({\n        widgetKey: props.widgetKey,\n        size: {\n          width: reverseScale(size.width, scaleFactor),\n          height: reverseScale(size.height, scaleFactor),\n        },\n      }),\n    );\n  };\n  const onResizeStart = () => {\n    dispatch(widgetDragStart(props.widgetKey));\n    dispatchToGeckoJS('widget:resize:start', {\n      widgetKey: props.widgetKey,\n    });\n  };\n\n  return { createOnResizeHandler, onResizeStart };\n};\n\nconst mapStateToProps = (state, props) => {\n  const { widgetMenu, dashboard, universal = {} } = state;\n  const { scaleFactor, dashboard: { toggles } = {} } = dashboard;\n  const { widgetKey, canEdit, widgetType } = props;\n  const isWidgetFocused = !!(\n    widgetMenu.widgetKey === widgetKey &&\n    widgetMenu.view !== WidgetMenu.VIEWS.CLOSED\n  );\n\n  const isFixedLayout = includes(toggles, 'grid');\n  const hasSlimSupport = widgetType === 'text' && !isFixedLayout;\n\n  return {\n    ...props,\n    isWidgetFocused,\n    scaleFactor,\n    isMovable: canEdit,\n    hasSlimSupport,\n    isPreviewLoading:\n      widgetMenu.widgetKey === widgetKey &&\n      widgetMenu.view === WidgetMenu.VIEWS.EDIT &&\n      universal.visualisationNotificationType === 'loading',\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { scaleFactor } = stateProps;\n  const { createOnResizeHandler, ...remainingDispatchProps } = dispatchProps;\n  const onResize = createOnResizeHandler(scaleFactor);\n  return {\n    onResize,\n    ...stateProps,\n    ...remainingDispatchProps,\n    ...ownProps,\n  };\n};\n\nconst WidgetConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(WidgetWrapperComponent);\n\nWidgetConnector.propTypes = {\n  layout: layoutType.isRequired,\n  widgetKey: PropTypes.string.isRequired,\n  widgetType: PropTypes.string,\n};\n\nexport default WidgetConnector;\n","import WidgetWrapperConnector from './widget-wrapper-connector';\n\nexport default WidgetWrapperConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './css-scale-style.scss';\n\n/*\n * CSS Scale Component\n *\n * This component scales its children by whatever scale\n * factor is given using a CSS scale transform.\n *\n * IMPORTANT: For this component to work properly\n * it must be placed inside an element that is\n * relatively or absolutely positioned.\n */\nconst CssScaleComponent = ({ children, width, height, scale }) => (\n  <div className={styles.frame}>\n    <div className={styles.fullSize} style={{ width, height }}>\n      <div className={styles.scaled} style={{ transform: `scale(${scale})` }}>\n        {children}\n      </div>\n    </div>\n  </div>\n);\n\nCssScaleComponent.defaultPropTypes = {\n  scale: 1,\n};\n\nCssScaleComponent.propTypes = {\n  height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  scale: PropTypes.number.isRequired,\n  width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,\n  children: PropTypes.node,\n};\n\nexport default CssScaleComponent;\n","import CssScale from './css-scale-component';\n\nexport default CssScale;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getWindow } from '../../lib/global';\n\nclass ScrollTo extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.setDomRef = element => {\n      this.domRef = element;\n    };\n\n    this.scrollTo = () => {\n      const { offset = 0 } = this.props;\n      if (this.domRef) {\n        getWindow().scrollTo(\n          0,\n          this.domRef.getBoundingClientRect().top - offset,\n        );\n      }\n    };\n  }\n\n  componentDidMount() {\n    const { scrollTo } = this.props;\n    if (scrollTo) {\n      this.scrollTo();\n    }\n  }\n\n  render() {\n    return <div ref={this.setDomRef}>{this.props.children}</div>;\n  }\n}\n\nScrollTo.propTypes = {\n  children: PropTypes.node,\n  offset: PropTypes.number,\n  scrollTo: PropTypes.bool,\n};\n\nexport default ScrollTo;\n","import ScrollTo from './scroll-to-component';\nexport default ScrollTo;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { layoutType } from '../visualisation/prop-types';\nimport WidgetFooter from '../widget-footer';\nimport WidgetHeader from '../widget-header';\nimport WidgetWrapper from './widget-wrapper';\nimport TvMode from '../hoc/tv-mode';\nimport classNames from 'classnames';\nimport CssScale from '../dashboard/box-layout/css-scale';\nimport ScrollTo from '../components/scroll-to';\nimport { getWindow } from '../lib/global';\nimport { get, includes, some } from 'lodash';\n\nimport style from './widget-style.scss';\n\nconst MASTHEAD_HEIGHT = 96;\n\nconst ALLOWED_WIDGET_TYPES = [\n  'line',\n  'bar',\n  'column',\n  'polymorphic',\n  'bullet',\n  'image',\n  'clock',\n  'rag',\n  'ragcolumn',\n  'leaderboard',\n  'geckometer',\n  'text',\n  'map',\n  'monitoring',\n  'number',\n  'pie',\n  'funnel',\n  'highcharts',\n  'list',\n  'table',\n];\n\nconst NUMBER_FORMAT_VISUALISATIONS = [\n  'line',\n  'bar',\n  'column',\n  'leaderboard',\n  'geckometer',\n  'number',\n  'table',\n];\n\nconst NUMERIC_FORMATS = ['percent', 'currency', 'decimal'];\n\nconst hasSlimHeight = pixelHeight => pixelHeight < 230;\n\nconst isDurationData = data => {\n  // number widget duration based data\n  if (get(data, 'item[0].type') === 'time_duration') {\n    return true;\n  }\n  // line and bar\n  if (get(data, 'y_axis.format') === 'duration') {\n    return true;\n  }\n  // leaderboard\n  if (get(data, 'format') === 'duration') {\n    return true;\n  }\n  return false;\n};\n\nconst canFormatTable = (data, serviceName) => {\n  const { columns = [] } = data || {};\n\n  if (serviceName === 'spreadsheets') {\n    return !!columns.length;\n  }\n\n  // Columns have to be numeric\n  return some(columns, column => includes(NUMERIC_FORMATS, column.format));\n};\n\nconst canConfigAndDataAllowNumberFormat = (type, data, status, serviceName) => {\n  return (\n    status !== 'failed' &&\n    !!data &&\n    includes(NUMBER_FORMAT_VISUALISATIONS, type) &&\n    !isDurationData(data) &&\n    (type === 'table' ? canFormatTable(data, serviceName) : true)\n  );\n};\n\nclass WidgetComponent extends PureComponent {\n  render() {\n    const {\n      id,\n      widgetKey,\n      data,\n      configuration: { title = '', template: { type: visualisationType } = {} },\n      layout: {\n        pixel_height: pixelHeight = '100%',\n        pixel_width: pixelWidth = '100%',\n      },\n      canEdit,\n      widgetType,\n      layout,\n      canBeRefreshed,\n      serviceName,\n      serviceTitle,\n      children,\n      bodyClassName,\n      status,\n      friendlyDataUpdatedAt,\n      isPublic,\n      isExpired,\n      isImporting,\n      isResizable,\n      scaleFactor,\n      showPreview,\n      canScrollTo,\n    } = this.props;\n    const hasTitle = title.trim().length > 0;\n    const isSlimHeight = hasSlimHeight(pixelHeight);\n    const serviceTitleClass = serviceTitle.toLowerCase().replace(/\\W+/g, '-');\n    const getInnerClassName = tvMode =>\n      classNames(\n        style.widgetInner,\n        'widget-inner loadable',\n        serviceTitleClass,\n        {\n          'widget-height-slim': isSlimHeight,\n          'tv-mode': tvMode,\n        },\n      );\n    const wrapperClassName = classNames(\n      'widget-body visualisation-positioner',\n      bodyClassName,\n      {\n        'no-title': !hasTitle,\n      },\n    );\n\n    const type = widgetType === 'polymorphic' ? visualisationType : widgetType;\n    const canSetIndicators =\n      (type === 'number' || type === 'geckometer') &&\n      !!data &&\n      status !== 'failed';\n    const canFormatNumber =\n      canConfigAndDataAllowNumberFormat(type, data, status, serviceName) ||\n      type === 'funnel';\n    const { location: { hash = '' } = {} } = getWindow();\n    const scrollTo = !!(canScrollTo && hash === `#${id}`);\n\n    return (\n      <TvMode>\n        {tvMode => (\n          <ScrollTo offset={MASTHEAD_HEIGHT} scrollTo={scrollTo}>\n            <WidgetWrapper\n              id={id}\n              canEdit={canEdit}\n              layout={layout}\n              widgetKey={widgetKey}\n              widgetType={widgetType}\n              status={status}\n              tvMode={tvMode}\n              isResizable={isResizable}\n              ref={this.setDomref}\n            >\n              <WidgetHeader\n                widgetKey={widgetKey}\n                title={hasTitle ? title : undefined}\n                canEdit={canEdit}\n                friendlyDataUpdatedAt={friendlyDataUpdatedAt}\n                canBeRefreshed={canBeRefreshed}\n                isTitleEnabled={!isSlimHeight}\n                canFormatNumber={canFormatNumber}\n                canSetIndicators={canSetIndicators}\n                isExpired={isExpired}\n                isImporting={isImporting}\n                configuration={this.props.configuration}\n                data={data}\n                tvMode={tvMode}\n              />\n              <CssScale\n                width={pixelWidth}\n                height={pixelHeight}\n                scale={scaleFactor}\n              >\n                <div className={getInnerClassName(tvMode)}>\n                  <div className={wrapperClassName}>\n                    <div className=\"widget-canvas\">{children}</div>\n                  </div>\n                </div>\n              </CssScale>\n              {!isPublic && canEdit && !showPreview && (\n                <div className=\"widget-footer\">\n                  <WidgetFooter\n                    title={serviceTitle}\n                    serviceName={serviceName}\n                    serviceTitleClass={serviceTitleClass}\n                  />\n                </div>\n              )}\n            </WidgetWrapper>\n          </ScrollTo>\n        )}\n      </TvMode>\n    );\n  }\n}\n\nWidgetComponent.defaultProps = {\n  scaleFactor: 1,\n  showPreview: false,\n};\n\nWidgetComponent.propTypes = {\n  canEdit: PropTypes.bool.isRequired,\n  isPublic: PropTypes.bool.isRequired,\n  serviceName: PropTypes.string.isRequired,\n  serviceTitle: PropTypes.string.isRequired,\n  widgetKey: PropTypes.string.isRequired,\n  widgetType: PropTypes.oneOf(ALLOWED_WIDGET_TYPES).isRequired,\n  bodyClassName: PropTypes.string,\n  canBeRefreshed: PropTypes.bool,\n  canScrollTo: PropTypes.bool,\n  children: PropTypes.node,\n  configuration: PropTypes.shape({\n    template: PropTypes.shape({\n      type: PropTypes.string,\n    }),\n    title: PropTypes.string,\n  }),\n  data: PropTypes.oneOfType([\n    PropTypes.object,\n    PropTypes.string,\n    PropTypes.array,\n  ]),\n  friendlyDataUpdatedAt: PropTypes.string,\n  id: PropTypes.number,\n  isExpired: PropTypes.bool,\n  isImporting: PropTypes.bool,\n  isResizable: PropTypes.bool,\n  layout: layoutType,\n  scaleFactor: PropTypes.number,\n  showPreview: PropTypes.bool,\n  status: PropTypes.oneOf([\n    'importing',\n    'loading',\n    'waitingInitialServerSideRefresh',\n    'ready',\n    'failed',\n    'warning',\n    'warningThresholdReached',\n    'positiveThresholdReached',\n  ]),\n};\n\nexport default WidgetComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport MenuLabel from '../../../../../components/menu/menu-label';\nimport DropMenu from '../../../../../components/menu/drop-menu';\nimport DropItem from '../../../../../components/menu/drop-item';\nimport FormattedMessage from '../../../../../lib/i18n';\n\nconst DataSourceDropMenu = ({ onOpenDeleteConfirmModal }) => {\n  return (\n    <div>\n      <DropMenu label={<MenuLabel />} origin=\"top left\" isAnchored={false}>\n        <DropItem onClick={onOpenDeleteConfirmModal} isSmall>\n          <FormattedMessage id=\"datasources.delete\" />\n        </DropItem>\n      </DropMenu>\n    </div>\n  );\n};\n\nDataSourceDropMenu.propTypes = {\n  onOpenDeleteConfirmModal: PropTypes.func,\n};\n\nexport default DataSourceDropMenu;\n","import DataSourceDropMenu from './data-source-drop-menu-component';\n\nexport default DataSourceDropMenu;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Column } from '../../components/layout';\nimport Button from '@UI/button';\nimport Warning from '../../components/warning';\nimport ServiceIcon from '../../components/service-icon';\nimport ListItem, { ListItemMeta } from '../../components/list-item';\nimport DataSourceDropMenu from '../../admin/pages/data-sources-group-page/components/data-source-drop-menu';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './data-source-list-item-style.scss';\n\nconst DataSourceListItem = ({\n  dataSource,\n  onReconnect,\n  onOpenDeleteConfirmModal,\n}) => {\n  const {\n    service: { title: serviceTitle, name: serviceName },\n    name: accountName,\n    expired,\n  } = dataSource;\n\n  return (\n    <ListItem hasHoverState={false}>\n      <Column flexNone justify=\"center\" marginRight={1}>\n        <ServiceIcon\n          className={style.logo}\n          serviceName={serviceName}\n          size={32}\n        />\n      </Column>\n      <Column flex justify=\"center\" marginRight={1}>\n        <div className={style.serviceTitle}>{serviceTitle}</div>\n      </Column>\n      <Column flexNone justify=\"center\" marginRight={1}>\n        <ListItemMeta>{accountName}</ListItemMeta>\n      </Column>\n      <Column flexAuto justify=\"center\" />\n      {expired && (\n        <Column flexAuto justify=\"center\" align=\"flex-end\" marginRight={1}>\n          <Warning>\n            <FormattedMessage id=\"datasources.connectionExpired\" />\n          </Warning>\n        </Column>\n      )}\n      {expired && (\n        <Column flexNone justify=\"center\" align=\"flex-end\" marginRight={1}>\n          <Button onClick={onReconnect} intent={Button.INTENT.SECONDARY}>\n            <FormattedMessage id=\"datasources.reconnect\" />\n          </Button>\n        </Column>\n      )}\n      <Column flexNone justify=\"center\" align=\"flex-end\">\n        <DataSourceDropMenu\n          onOpenDeleteConfirmModal={onOpenDeleteConfirmModal}\n        />\n      </Column>\n    </ListItem>\n  );\n};\n\nDataSourceListItem.propTypes = {\n  dataSource: PropTypes.shape({\n    expired: PropTypes.bool,\n    name: PropTypes.string,\n    service: PropTypes.shape({\n      name: PropTypes.string,\n      title: PropTypes.string,\n    }),\n  }),\n  onOpenDeleteConfirmModal: PropTypes.func,\n  onReconnect: PropTypes.func,\n};\n\nexport default DataSourceListItem;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\n\nimport style from './text-area-style.scss';\n\nclass TextAreaComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.onChange = this.onChange.bind(this);\n  }\n\n  onChange(e) {\n    const { value } = e.target;\n    this.props.onChange({ value });\n  }\n\n  render() {\n    const { name, value } = this.props;\n\n    return (\n      <textarea\n        className={style.textarea}\n        name={name}\n        value={value}\n        onChange={this.onChange}\n      />\n    );\n  }\n}\n\nTextAreaComponent.propTypes = {\n  name: PropTypes.string.isRequired,\n  value: PropTypes.string,\n  onChange: PropTypes.func,\n};\n\nexport default TextAreaComponent;\n","import TextAreaComponent from './text-area-component';\nexport default TextAreaComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { partial, isUndefined, sortBy } from 'lodash';\nimport ListItem from '../../components/list-item';\nimport { Column } from '../../components/layout';\nimport Editable from '../../components/form/editable-input/editable-component';\nimport MenuLabel from '../../components/menu/menu-label';\nimport DropMenu from '../../components/menu/drop-menu';\nimport DropItem from '../../components/menu/drop-item';\nimport Select from '../../components/form/select';\n\nimport styles from './device-list-item-style.scss';\n\nconst renderOptions = options =>\n  options.map(({ key, name }) => (\n    <option key={key} value={key}>\n      {name}\n    </option>\n  ));\n\nconst DeviceListItem = ({\n  device,\n  dashboards,\n  sharingLoops,\n  onRename,\n  onDelete,\n  onRefresh,\n  onSetContent,\n}) => {\n  const { content = {} } = device;\n  const typeIsDashboard = content.type === 'dashboard';\n\n  const handleSelectChange = connectionId => {\n    if (!isUndefined(connectionId)) {\n      const isDashboard = connectionId.indexOf('dashboard_') === 0;\n\n      if (isDashboard) {\n        const dashboardId = connectionId.split('dashboard_')[1];\n        onSetContent(device.id, parseInt(dashboardId, 10), 'dashboard');\n      } else {\n        const sharingLoopId = connectionId.split('loop_')[1];\n        onSetContent(device.id, parseInt(sharingLoopId, 10), 'sharing_loop');\n      }\n    }\n  };\n\n  const renderDashboardSelect = () => {\n    if (!dashboards && !sharingLoops) return null;\n\n    const sortedDashboards = sortBy(dashboards, [\n      dashboard => dashboard.title.toLowerCase(),\n    ]);\n    let selected = '';\n\n    const dashboardOptions = sortedDashboards.map(({ id, title }) => {\n      if (typeIsDashboard && parseInt(id, 10) === content.id) {\n        selected = `dashboard_${id}`;\n      }\n      return {\n        key: `dashboard_${id}`,\n        name: title,\n      };\n    });\n\n    // If the dashboard / sharing loop has been deleted, prompt user to select a new one\n    if (isUndefined(content.id)) {\n      dashboardOptions.unshift({\n        key: '',\n        name: 'Select dashboard',\n      });\n      selected = '';\n    }\n\n    const sortedSharingLoops =\n      sharingLoops &&\n      sharingLoops.length > 0 &&\n      sortBy(sharingLoops, [loop => loop.title.toLowerCase()]);\n\n    const loopOptions =\n      sortedSharingLoops &&\n      sortedSharingLoops.map(({ id, title }) => {\n        if (!typeIsDashboard && parseInt(id, 10) === content.id) {\n          selected = `loop_${id}`;\n        }\n        return {\n          key: `loop_${id}`,\n          name: title,\n        };\n      });\n\n    return (\n      <Select\n        name=\"dashboardSelect\"\n        onChange={(_, value) => handleSelectChange(value)}\n        value={selected}\n      >\n        {dashboards && (\n          <optgroup label=\"Dashboards\">\n            {renderOptions(dashboardOptions)}\n          </optgroup>\n        )}\n        {sortedSharingLoops && (\n          <optgroup label=\"Dashboard Loops\">\n            {renderOptions(loopOptions)}\n          </optgroup>\n        )}\n      </Select>\n    );\n  };\n\n  const renderRefreshButton = () => {\n    return (\n      <DropItem onClick={partial(onRefresh, device.id)} isSmall>\n        Refresh\n      </DropItem>\n    );\n  };\n\n  return (\n    <ListItem hasHoverState={false}>\n      <Column\n        flexAuto\n        justify=\"center\"\n        marginRight={0.5}\n        marginLeft={0.5}\n        className={styles.editableContainer}\n      >\n        <Editable\n          inputClassName={styles.editableInput}\n          text={device.name}\n          onSubmit={partial(onRename, device.id)}\n        />\n      </Column>\n      <Column flexNone marginRight={0.5} className={styles.selectContainer}>\n        {renderDashboardSelect()}\n      </Column>\n      <Column justify=\"center\">\n        <DropMenu label={<MenuLabel />} origin=\"top left\" isAnchored={false}>\n          {renderRefreshButton()}\n          <DropItem onClick={partial(onDelete, device.id)} isSmall>\n            Delete\n          </DropItem>\n        </DropMenu>\n      </Column>\n    </ListItem>\n  );\n};\n\nDeviceListItem.propTypes = {\n  device: PropTypes.object.isRequired,\n  onDelete: PropTypes.func.isRequired,\n  onRefresh: PropTypes.func.isRequired,\n  onRename: PropTypes.func.isRequired,\n  onSetContent: PropTypes.func.isRequired,\n  dashboards: PropTypes.array,\n  sharingLoops: PropTypes.array,\n};\n\nexport default DeviceListItem;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport gql from 'graphql-tag';\nimport { Query } from 'react-apollo';\nimport { includes } from 'lodash';\nimport { useParams } from 'react-router-dom';\nimport Button from '@UI/button';\nimport List from '../../components/list';\nimport Layout, { Row, Column } from '../../components/layout';\nimport { ModalSection, ModalHeading, ModalText } from '../../components/modal';\nimport Error from '../../components/error';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport DeviceListItem from './device-list-item-component';\nimport PromoCard, {\n  PromoCardHeader,\n  PromoCardFooter,\n} from '../../components/promo-card';\nimport ToggleInput from '../../components/form/toggle-input';\nimport Label from '../../components/form/label';\nimport StatusLabel from '../../components/status-label';\nimport { useFeatureFlags } from '../../hooks/';\nimport { LAYOUT_TYPES } from '../../dashboard/dashboard-layout/constants';\n\nimport styles from './manage-screens-view-style.scss';\n\nconst renderDevicesList = (\n  devices,\n  dashboards,\n  sharingLoops,\n  onSetDeviceName,\n  onDeleteDevice,\n  onRefreshDevice,\n  onSetDeviceConnection,\n) => {\n  if (devices.length === 0) {\n    return null;\n  }\n\n  const devicesList = devices.map(device => (\n    <DeviceListItem\n      key={device.id}\n      device={device}\n      dashboards={dashboards}\n      sharingLoops={sharingLoops}\n      onRename={onSetDeviceName}\n      onDelete={onDeleteDevice}\n      onRefresh={onRefreshDevice}\n      onSetContent={onSetDeviceConnection}\n    />\n  ));\n\n  return <List>{devicesList}</List>;\n};\n\nconst renderError = error => {\n  if (error) {\n    return <Error errorMessage={error} />;\n  }\n\n  return null;\n};\n\nconst renderAddButton = (onShowAddView, error) => {\n  if (error) {\n    return null;\n  }\n\n  return (\n    <Row marginTop={1} justify=\"flex-start\">\n      <Column>\n        <Button\n          onClick={onShowAddView}\n          icon=\"plus\"\n          intent={Button.INTENT.SECONDARY}\n          size={Button.SIZES.SMALL}\n        >\n          <FormattedMessage id=\"masthead.manageScreens.addScreenButton\" />\n        </Button>\n      </Column>\n    </Row>\n  );\n};\n\nconst ManageScreensView = ({\n  devices,\n  dashboards,\n  sharingLoops,\n  error,\n  onClose,\n  onShowAddView,\n  onDeleteDevice,\n  onRefreshDevice,\n  onSetDeviceName,\n  onSetDeviceConnection,\n  onCreateLoop,\n  isLiteEnabled,\n  onToggleLite,\n  dashboardLayout,\n}) => {\n  const noSharingLoops = sharingLoops ? sharingLoops.length === 0 : false;\n  const isContainerLayout = dashboardLayout === LAYOUT_TYPES.ContainerLayout;\n\n  const hasPromo = noSharingLoops && !isContainerLayout;\n\n  return (\n    <ModalSection>\n      <ModalHeading>\n        <FormattedMessage id=\"masthead.manageScreens.heading\" />\n      </ModalHeading>\n      <ModalText>\n        <FormattedMessage id=\"masthead.manageScreens.text\" />\n      </ModalText>\n\n      <Row marginTop={2} flexColumn>\n        {renderDevicesList(\n          devices,\n          dashboards,\n          sharingLoops,\n          onSetDeviceName,\n          onDeleteDevice,\n          onRefreshDevice,\n          onSetDeviceConnection,\n        )}\n        {renderError(error)}\n        {renderAddButton(onShowAddView, error)}\n      </Row>\n\n      {!isContainerLayout && (\n        <Row marginTop={2}>\n          <Column flexFill paddingRight={2}>\n            <Label htmlFor=\"liteToggle\">\n              <Row>\n                <Column className={styles.liteToggle} flexFill>\n                  <FormattedHTMLMessage id=\"screens.liteToggle\" />\n                </Column>\n              </Row>\n            </Label>\n          </Column>\n          <Column justify=\"space-around\">\n            <Row>\n              <StatusLabel type=\"beta\" />\n            </Row>\n            <Row>\n              <ToggleInput\n                onToggle={onToggleLite}\n                checked={isLiteEnabled}\n                name=\"liteToggle\"\n              />\n            </Row>\n          </Column>\n        </Row>\n      )}\n\n      {hasPromo && (\n        <Layout marginTop={1}>\n          <PromoCard>\n            <PromoCardHeader>\n              <FormattedMessage id=\"screens.loopsPromo.header\" />\n            </PromoCardHeader>\n            <FormattedMessage id=\"screens.loopsPromo.body\" />\n            <PromoCardFooter>\n              <Button onClick={onCreateLoop}>\n                <FormattedMessage id=\"screens.loopsPromo.link\" />\n              </Button>\n            </PromoCardFooter>\n          </PromoCard>\n        </Layout>\n      )}\n\n      <Row marginTop={2} justify=\"flex-end\">\n        <Column>\n          <Button onClick={onClose}>\n            <FormattedMessage id=\"masthead.manageScreens.doneButton\" />\n          </Button>\n        </Column>\n      </Row>\n    </ModalSection>\n  );\n};\n\nManageScreensView.defaultProps = {\n  devices: [],\n  dashboardLayout: '',\n};\n\nManageScreensView.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  onDeleteDevice: PropTypes.func.isRequired,\n  onRefreshDevice: PropTypes.func.isRequired,\n  onSetDeviceConnection: PropTypes.func.isRequired,\n  onSetDeviceName: PropTypes.func.isRequired,\n  onShowAddView: PropTypes.func.isRequired,\n  // it's not really required, you only get it for graphql + dashies users and\n  // is only used when on a ContainerLayout dashboard\n  dashboardLayout: PropTypes.string,\n  dashboards: PropTypes.array,\n  devices: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n      name: PropTypes.string,\n    }),\n  ),\n  error: PropTypes.string,\n  isLiteEnabled: PropTypes.bool,\n  sharingLoops: PropTypes.array,\n  onCreateLoop: PropTypes.func,\n  onToggleLite: PropTypes.func,\n};\n\nconst QueriedManageScreensView = props => {\n  const { dashboardId } = useParams();\n  const { flags } = useFeatureFlags();\n\n  const canQuery = includes(flags, 'graphql');\n\n  if (!canQuery || !dashboardId) {\n    return <ManageScreensView {...props} />;\n  }\n\n  const variables = { id: dashboardId };\n\n  return (\n    <Query\n      query={QueriedManageScreensView.dashboardLayoutQuery}\n      variables={variables}\n    >\n      {({ data, loading, error }) => {\n        if (loading || error || !data.dashboard) {\n          return null;\n        }\n\n        const {\n          dashboard: {\n            layoutType: { __typename: layoutType },\n          },\n        } = data;\n\n        return <ManageScreensView {...props} dashboardLayout={layoutType} />;\n      }}\n    </Query>\n  );\n};\n\nQueriedManageScreensView.dashboardLayoutQuery = gql`\n  query Dashboard($id: ID!) {\n    dashboard(id: $id) {\n      layoutType {\n        __typename\n      }\n    }\n  }\n`;\n\nexport { ManageScreensView };\nexport default QueriedManageScreensView;\n","import React from 'react';\nimport List from '../list';\nimport DraggableContext from '../draggable-context';\n\nconst SortableListComponent = props => {\n  return (\n    <DraggableContext>\n      <List {...props} />\n    </DraggableContext>\n  );\n};\n\nexport default SortableListComponent;\n","import SortableListComponent from './sortable-list-component';\nexport default SortableListComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport List from '../list';\nimport ListItem from '../list-item';\nimport Sortable, { SortablePreview } from '../sortable';\n\nimport style from './sortable-list-item-style.scss';\n\nconst SortableListItemComponent = props => {\n  const {\n    children,\n    onMove,\n    onBeginDrag,\n    onDrop,\n    index,\n    id,\n    itemClass,\n    sortableWrapperClass,\n  } = props;\n\n  const classes = classNames(style.item, {\n    [sortableWrapperClass]: sortableWrapperClass,\n  });\n\n  return (\n    <ListItem hasHoverState={false} className={itemClass}>\n      <div className={classes}>\n        <Sortable\n          className={style.sortable}\n          id={id}\n          index={index}\n          onMove={onMove}\n          onDrop={onDrop}\n          onBeginDrag={onBeginDrag}\n        >\n          <div className={style.innerItem}>{children}</div>\n        </Sortable>\n        <SortablePreview index={index} id={id}>\n          <div className={style.previewItem}>\n            <List>\n              <ListItem className={itemClass}>{children}</ListItem>\n            </List>\n          </div>\n        </SortablePreview>\n      </div>\n    </ListItem>\n  );\n};\nSortableListItemComponent.propTypes = {\n  children: PropTypes.node,\n  id: PropTypes.number,\n  index: PropTypes.number,\n  itemClass: PropTypes.string,\n  sortableWrapperClass: PropTypes.string,\n  onBeginDrag: PropTypes.func,\n  onDrop: PropTypes.func,\n  onMove: PropTypes.func,\n};\n\nexport default SortableListItemComponent;\n","import SortableListItemComponent from './sortable-list-item-component';\nexport { SortableListItemComponent as default };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"featureList\":\"featureList---3E909\",\"featureIcon\":\"featureIcon---29YZc\",\"featureTitle\":\"featureTitle---1dkO4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"breadcrumb\":\"breadcrumb---oIzOu\",\"path\":\"path---1_qOd\",\"clickablePath\":\"clickablePath---1swxZ path---1_qOd\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"sidebar\":\"sidebar---3Sw_u\",\"initialState\":\"initialState---3h6KA\",\"lItem\":\"lItem---3ezDY\",\"lItemInitial\":\"lItemInitial---2R4lH\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"datasetsConnector\":\"datasetsConnector---2GNul\",\"header\":\"header---2bbhy\",\"footer\":\"footer---3WOkw\",\"content\":\"content---10_U9\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"connection\":\"connection---1uYgH\",\"deleteButton\":\"deleteButton---x8hEu\",\"connectionName\":\"connectionName---1KQVJ\",\"connectionIcon\":\"connectionIcon---qtCR4\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dashboardLinkWrapper\":\"dashboardLinkWrapper---wwYcr\",\"link\":\"link---Oa77l\",\"heading\":\"heading---1iGf5\",\"body\":\"body---2Tk5C\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropItem\":\"dropItem---3qYHR\",\"metaInfo\":\"metaInfo---1VD9S\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button\":\"button---3vzNn\",\"text\":\"text---18-sd\",\"spinnerContainer\":\"spinnerContainer---3QGuh\",\"spinner\":\"spinner---KNKw8\",\"icon\":\"icon---s83lW\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---wHacI\",\"content\":\"content---2ve5X\",\"logo\":\"logo---2EWIa\",\"label\":\"label---37Vxg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"section\":\"section---3HsiE\",\"buttonIconProvider\":\"buttonIconProvider---3vHZK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---dU2hW\",\"smallWidth\":\"smallWidth---2XDol\",\"smallHeight\":\"smallHeight---3ENRh\",\"largeHeight\":\"largeHeight---2XRNP\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery } from '@apollo/react-hooks';\nimport bugsnag from '../../lib/bugsnag';\nimport { TrackingPropsLegacyIdQuery } from '../../services/concierge-service/graphql/dashboard-tracking-props-query.graphql';\n\n/**\n * Only use this component on non-graphql dashboards to\n * fetch the properties that we want to track from Concierge.\n */\n\nconst DashboardTrackingProps = ({ children, legacyId }) => {\n  if (!legacyId) {\n    // Legacy ID won't be defined on screens and sharing URLs.\n    // For now simply don't track graphql props in these cases.\n    // If we were to query GraphQL here using the sharingHash and\n    // screenID queries they would fail because the AuthStrategy\n    // hasn't been set yet (it's set by gecko-js).\n    return <div>{children}</div>;\n  }\n\n  const { data, error, loading } = useQuery(TrackingPropsLegacyIdQuery, {\n    variables: { legacyId },\n  });\n\n  if (loading) {\n    return <div>{children}</div>;\n  }\n\n  if (error || !data || !data.dashboard) {\n    // We render the dashboard even if there is an error so\n    // that we don't break the experience just because something\n    // went wrong in this call.\n    const errorMessage = `Tracking properties for dashboard with legacy ID ${legacyId} weren't returned from Concierge. Tracking will be missing dashboard properties.`;\n    console.warn(errorMessage, error);\n    bugsnag.send(errorMessage);\n  }\n\n  return <div>{children}</div>;\n};\n\nDashboardTrackingProps.propTypes = {\n  children: PropTypes.node,\n  legacyId: PropTypes.string,\n};\n\nexport default DashboardTrackingProps;\n","import DashboardTrackingProps from './dashboard-tracking-props-component';\n\nexport default DashboardTrackingProps;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport ServiceIcon from '../../components/service-icon';\nimport styles from './data-source-header-styles.scss';\n\nclass DataSourceHeaderComponent extends Component {\n  render() {\n    const { children, serviceName, title } = this.props;\n\n    return (\n      <header className={styles.container}>\n        <div className={styles.content}>\n          <ServiceIcon\n            serviceName={serviceName}\n            size={40}\n            className={styles.serviceIcon}\n            rounded\n          />\n          <h3 className={`heading ${styles.heading}`}>{title}</h3>\n        </div>\n        {children}\n      </header>\n    );\n  }\n}\n\nDataSourceHeaderComponent.propTypes = {\n  children: PropTypes.node,\n  serviceName: PropTypes.string,\n  title: PropTypes.node,\n};\n\nexport default DataSourceHeaderComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { bindAll, partition } from 'lodash';\nimport FormField from '../../../components/form-field';\nimport Button from '@UI/button';\nimport FormattedMessage from '../../../lib/i18n';\nimport { checkValidity } from '../../../lib/dom-helper';\nimport { trackEvent } from '@Tracking';\nimport { integrationClickedConnect } from '@Tracking/events';\nimport styles from './account-connector-form-styles.scss';\n\nclass AccountConnectorFormComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(\n      this,\n      'renderMemorableFields',\n      'renderConnectFields',\n      'handleSubmit',\n    );\n  }\n\n  handleSubmit(e) {\n    const { fields = [], onConnect, title, name, authType } = this.props;\n\n    trackEvent(\n      integrationClickedConnect({\n        'Auth type': authType,\n        'Integration name': title,\n        'Integration slug': name,\n      }),\n    );\n\n    e.preventDefault();\n    if (checkValidity(e.target)) {\n      const formData = {};\n\n      fields.forEach(field => {\n        formData[field.name] = this.refs[field.name].getValue();\n      });\n\n      onConnect(formData);\n    } else {\n      fields.forEach(field => {\n        this.refs[field.name].updateValidity();\n      });\n    }\n  }\n\n  renderField(field) {\n    const type = field.type === 'password' ? 'password' : 'text';\n    return (\n      <FormField key={field.name} ref={field.name} {...field} type={type} />\n    );\n  }\n\n  renderMemorableFields(fields) {\n    if (!fields.length) {\n      return null;\n    }\n\n    return (\n      <fieldset className=\"memorable-info\">\n        {fields.map(this.renderField)}\n      </fieldset>\n    );\n  }\n\n  renderConnectFields(fields) {\n    if (!fields.length) {\n      return null;\n    }\n\n    const { title, options: { connectScreen = {} } = {} } = this.props;\n    const { legend } = connectScreen;\n\n    const formTitle = legend || `Your ${title} account details`;\n\n    return (\n      <fieldset>\n        <legend>{formTitle}</legend>\n        {fields.map(this.renderField)}\n      </fieldset>\n    );\n  }\n\n  render() {\n    const { fields, isOauthWindowOpen, usesOAuth, title } = this.props;\n\n    const [memorableFields, connectFields] = partition(fields, {\n      group: 'memorable_info',\n    });\n\n    const label = usesOAuth ? (\n      <FormattedMessage id=\"datasources.connectVia\" values={{ title }} />\n    ) : (\n      <FormattedMessage id=\"datasources.connect\" />\n    );\n\n    return (\n      <form onSubmit={this.handleSubmit} noValidate className={styles.form}>\n        {this.renderMemorableFields(memorableFields)}\n        {this.renderConnectFields(connectFields)}\n        <div className=\"form-actions\">\n          <Button\n            type={Button.TYPES.SUBMIT}\n            disabled={isOauthWindowOpen}\n            stretched\n          >\n            {label}\n          </Button>\n        </div>\n      </form>\n    );\n  }\n\n  dispatch(detail) {\n    const domNode = findDOMNode(this);\n    const evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent('action', true, false, detail);\n    domNode.dispatchEvent(evt);\n  }\n}\n\nAccountConnectorFormComponent.propTypes = {\n  authType: PropTypes.string,\n  fields: PropTypes.array,\n  isOauthWindowOpen: PropTypes.bool,\n  name: PropTypes.string,\n  options: PropTypes.object,\n  title: PropTypes.string,\n  usesOAuth: PropTypes.bool,\n  onConnect: PropTypes.func,\n};\n\nexport default AccountConnectorFormComponent;\n","import AccountConnectorFormComponent from './account-connector-form-component';\nexport default AccountConnectorFormComponent;\n","import DataSourceEducationalFooter from './data-source-educational-footer-component';\n\nexport default DataSourceEducationalFooter;\n","import React from 'react';\nimport styles from './data-source-educational-footer-styles.scss';\nimport FormattedMessage from '../../../lib/i18n';\nimport { track } from '../../../lib/tracker';\nimport config from '../../../universal/config';\nimport Image from '@UI/image';\n\nconst DataSourceEducationalFooter = () => (\n  <div className={styles.DataSourceEducationalFooter}>\n    <Image\n      width={53}\n      height={50}\n      className={styles.icon}\n      src={`${\n        config.get().StaticAssetBaseURL\n      }/images/light-grey-connect-plug.svg`}\n    />\n    <div className={styles.text}>\n      <p>\n        <FormattedMessage id=\"datasources.notReady.message\" />\n      </p>\n      <a\n        href=\"https://www.geckoboard.com/product/\"\n        target=\"_blank\"\n        onClick={() => track('Connect - View not ready article')}\n      >\n        <FormattedMessage id=\"datasources.notReady.link\" />\n      </a>\n    </div>\n  </div>\n);\n\nexport default DataSourceEducationalFooter;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport DataSourceHeader from '../components/data-source-header-component';\nimport AccountConnectorForm from './account-connector-form';\nimport DataSourceEducationalFooter from '../components/data-source-educational-footer';\nimport FormattedMessage from '../../lib/i18n';\nimport { requiresImport } from '../../imports/helpers';\nimport { track } from '../../lib/tracker';\nimport Alert from '@UI/alert';\nimport Icon from '@UI/icon';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport styles from './default-data-source-connector-style.scss';\n\nconst DefaultDataSourceConnectorComponent = props => {\n  const {\n    service: { name, title, options, auth_type: authType },\n    errorMessage,\n    hasEducationalFooter,\n    fields,\n    onConnect,\n    isOauthWindowOpen,\n    usesOAuth,\n  } = props;\n\n  if (!name) {\n    return (\n      <LoadingSpinner\n        size={LoadingSpinner.SIZES.MEDIUM}\n        theme={LoadingSpinner.THEMES.DARK}\n      />\n    );\n  }\n\n  return (\n    <div className={styles.defaultDataSourceConnector}>\n      <div className={styles.header}>\n        <DataSourceHeader\n          serviceName={name}\n          title={\n            <FormattedMessage\n              id=\"datasources.connectHeader\"\n              values={{ title }}\n            />\n          }\n        >\n          <div className={styles.protection}>\n            <p className={styles.protectionMessage}>\n              <span className={`${styles.protectionIcon}`}>\n                <Icon name=\"eye\" />\n              </span>\n              <FormattedMessage id=\"datasources.viewAccountData\" />\n            </p>\n            {requiresImport(name) && (\n              <p className={styles.protectionMessage}>\n                <span className={`${styles.protectionIcon} ${styles.eye}`}>\n                  <Icon name=\"download\" />\n                </span>\n                <FormattedMessage id=\"datasources.importingMessage\" />\n              </p>\n            )}\n            <p className={styles.protectionMessage}>\n              <span>\n                <span className={`${styles.protectionIcon} ${styles.lock}`}>\n                  <Icon name=\"lock-alt\" />\n                </span>\n                <FormattedMessage id=\"datasources.privateAndSecure.message\" />\n              </span>\n              <br />\n              <a\n                onClick={() => track('Connect - View data protection article')}\n                href=\"https://support.geckoboard.com/hc/en-us/articles/203759278-Geckoboard-Security\"\n                target=\"_blank\"\n              >\n                <FormattedMessage id=\"datasources.privateAndSecure.link\" />\n              </a>\n            </p>\n          </div>\n        </DataSourceHeader>\n      </div>\n      <div className={styles.content}>\n        {!!errorMessage && (\n          <div className={styles.error}>\n            <Alert type={Alert.TYPES.ERROR} message={errorMessage} />\n          </div>\n        )}\n        <AccountConnectorForm\n          fields={fields}\n          name={name}\n          title={title}\n          authType={authType}\n          options={options}\n          onConnect={onConnect}\n          isOauthWindowOpen={isOauthWindowOpen}\n          usesOAuth={usesOAuth}\n        />\n      </div>\n      {hasEducationalFooter && (\n        <div className={styles.footer}>\n          <DataSourceEducationalFooter />\n        </div>\n      )}\n    </div>\n  );\n};\n\nDefaultDataSourceConnectorComponent.propTypes = {\n  errorMessage: PropTypes.string,\n  fields: PropTypes.array,\n  hasEducationalFooter: PropTypes.bool,\n  isOauthWindowOpen: PropTypes.bool,\n  service: PropTypes.object,\n  usesOAuth: PropTypes.bool,\n  onConnect: PropTypes.func,\n};\n\nDefaultDataSourceConnectorComponent.defaultProps = {\n  service: {},\n  hasEducationalFooter: false,\n};\n\nexport default DefaultDataSourceConnectorComponent;\n","import React from 'react';\nimport { useHistory, useRouteMatch } from 'react-router-dom';\nimport Modal, { ModalSection, ModalHeading, ModalText } from '../modal';\nimport MarketingButton from '../marketing-button';\nimport FormattedMessage from '../../lib/i18n';\n\nimport styles from './trial-modal-component-style.scss';\n\nconst TRIAL_MODAL_ROUTES = {\n  TV: 'tv',\n  PEOPLE: 'people',\n  DASHBOARDS: 'dashboards',\n};\n\nconst TRIAL_MODAL_CONTENTS = {\n  // These can use the formatted message\n  // when we have some content.\n  [TRIAL_MODAL_ROUTES.TV]: {\n    title: 'Send to TV',\n  },\n  [TRIAL_MODAL_ROUTES.PEOPLE]: {\n    title: 'People',\n  },\n  [TRIAL_MODAL_ROUTES.DASHBOARDS]: {\n    title: 'Dashboards',\n  },\n};\n\nconst TrialModal = () => {\n  const history = useHistory();\n  const match = useRouteMatch({\n    path: [\n      '/edit/dashboards/:dashboardId/trial/:content',\n      '/v4/dashboards/:dashboardId/trial',\n      '/v4/dashboards/:dashboardId/trial/:content',\n    ],\n    exact: true,\n  });\n\n  const closeModal = () => history.goBack();\n\n  const { content } = (match && match.params) || {};\n  const modalContent = TRIAL_MODAL_CONTENTS[content];\n\n  return (\n    <Modal visible={!!match} onClose={closeModal} hasCloseButton>\n      <ModalSection>\n        <ModalHeading>{modalContent && `${modalContent.title} `}</ModalHeading>\n        <ModalHeading>\n          <FormattedMessage id=\"trialModal.heading\" />\n        </ModalHeading>\n        <ModalText>\n          <FormattedMessage id=\"trialModal.description\" />\n        </ModalText>\n        <div className={styles.buttons}>\n          <div className={styles.startTrialButton}>\n            <MarketingButton>\n              <FormattedMessage id=\"trialModal.button.trial\" />\n            </MarketingButton>\n          </div>\n          <div className={styles.upgradeButton}>\n            <MarketingButton\n              intent={MarketingButton.INTENT.SECONDARY}\n              href=\"/account/plans\"\n            >\n              <FormattedMessage id=\"trialModal.button.upgrade\" />\n            </MarketingButton>\n          </div>\n        </div>\n      </ModalSection>\n    </Modal>\n  );\n};\n\nexport { TrialModal as default, TRIAL_MODAL_ROUTES, TRIAL_MODAL_CONTENTS };\n","import TrialModal, { TRIAL_MODAL_ROUTES } from './trial-modal-component';\nexport { TrialModal as default, TRIAL_MODAL_ROUTES };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport classNames from 'classnames';\nimport { find, bindAll, isEmpty } from 'lodash';\nimport { checkValidity } from '../../lib/dom-helper';\n\nimport styles from './form-field-style.scss';\n\nfunction getDefaultErrorMessage(type, label) {\n  switch (type) {\n    case 'url':\n      return 'Must be a valid URL (e.g. starts with http://...)';\n    default:\n      return `Enter a value for ${label}`;\n  }\n}\n\nclass FormFieldComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleChange', 'handleToggleHelp');\n    this.state = { valid: true };\n  }\n\n  handleChange() {\n    this.updateValidity();\n  }\n\n  handleToggleHelp() {\n    this.setState({ showHelp: !this.state.showHelp });\n  }\n\n  getValue() {\n    const { regex, sanitize } =\n      find(this.props.validation, { type: 'pattern' }) || {};\n    const { value } = findDOMNode(this.refs.input);\n    if (sanitize) {\n      return value.replace(new RegExp(regex), sanitize);\n    }\n    return value;\n  }\n\n  renderHelp(help) {\n    if (!help) {\n      return null;\n    }\n\n    const { showHelp } = this.state;\n\n    const classes = classNames('form-item-help', {\n      'form-item-help-active': showHelp,\n    });\n\n    return (\n      <div\n        className={classes}\n        onFocus={this.handleToggleHelp}\n        onBlur={this.handleToggleHelp}\n        tabIndex={-1}\n      >\n        <span className=\"help-icon\" />\n        <span\n          className=\"help-text\"\n          dangerouslySetInnerHTML={{ __html: help }}\n        />\n      </div>\n    );\n  }\n\n  render() {\n    const {\n      validation,\n      required,\n      name,\n      label,\n      help,\n      placeholder,\n      type,\n      suffix_label: suffixLabel,\n    } = this.props;\n    const { valid } = this.state;\n    const classes = classNames('form-item', { invalid: !valid });\n    const inputClasses = classNames('form-item-input', {\n      [styles.inputWithSuffix]: suffixLabel,\n    });\n\n    let requiredIndicator = null;\n    let validationMessage = null;\n    let { regex, message = getDefaultErrorMessage(type, label) } =\n      find(validation, { type: 'pattern' }) || {};\n\n    if (required) {\n      requiredIndicator = <span className=\"form-item-required\">*</span>;\n\n      // Prevent submission of whitespaces only\n      if (!regex && type === 'text') {\n        regex = '^.*\\\\S.*$';\n      }\n    }\n\n    if (!valid) {\n      validationMessage = (\n        <span className={styles.validationMessage}>{message}</span>\n      );\n    }\n\n    return (\n      <div key={name} className={classes}>\n        {!suffixLabel && label && <label htmlFor={name}>{label}</label>}\n        <input\n          type={type}\n          className={inputClasses}\n          ref=\"input\"\n          id={name}\n          name={name}\n          pattern={regex}\n          required={required}\n          placeholder={placeholder}\n          onBlur={this.handleChange}\n        />\n        {suffixLabel && (\n          <label htmlFor={name} className={styles.suffixLabel}>\n            {suffixLabel}\n          </label>\n        )}\n        {this.renderHelp(help)}\n        {validationMessage}\n        {requiredIndicator}\n      </div>\n    );\n  }\n\n  updateValidity() {\n    const domEl = findDOMNode(this.refs.input);\n    const valid = checkValidity(domEl);\n\n    this.setState({ valid });\n  }\n}\n\nFormFieldComponent.propTypes = {\n  help: PropTypes.string,\n  label: PropTypes.string,\n  name: PropTypes.string,\n  placeholder: PropTypes.string,\n  required: PropTypes.bool,\n  suffix_label: props => {\n    const { suffix_label: suffixLabel, label } = props;\n\n    // Show an error if label and suffix_label are defined\n    if (!isEmpty(suffixLabel) && !isEmpty(label)) {\n      return new Error(\n        '`FormFieldComponent` does not accept a `label` and a `suffix_label`',\n      );\n    }\n\n    // Show an error if suffix_label is not a string\n    if (!isEmpty(suffixLabel) && typeof suffixLabel !== 'string') {\n      return new Error(\n        '`FormFieldComponent`: `suffix_label` must be of type string',\n      );\n    }\n\n    return null;\n  },\n  type: PropTypes.string,\n  validation: PropTypes.array,\n};\n\nFormFieldComponent.defaultProps = {\n  type: 'text',\n};\n\nexport default FormFieldComponent;\n","import FormFieldComponent from './form-field-component';\nexport default FormFieldComponent;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"inputWithSuffix\":\"inputWithSuffix---1yKjc\",\"suffixLabel\":\"suffixLabel---1PKFg\",\"validationMessage\":\"validationMessage---3B2wF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"DataSourceEducationalFooter\":\"DataSourceEducationalFooter---30X-P\",\"icon\":\"icon----662P\",\"text\":\"text---2JXb5\"};","// If we change any countries or timezones\n// we have to make sure to udpate\n// countryCodeByTimezone as well.\n\nexport const countries = [\n  { name: 'Afghanistan', code: 'AF' },\n  { name: 'Åland Islands', code: 'AX' },\n  { name: 'Albania', code: 'AL' },\n  { name: 'Algeria', code: 'DZ' },\n  { name: 'American Samoa', code: 'AS' },\n  { name: 'Andorra', code: 'AD' },\n  { name: 'Angola', code: 'AO' },\n  { name: 'Anguilla', code: 'AI' },\n  { name: 'Antarctica', code: 'AQ' },\n  { name: 'Antigua and Barbuda', code: 'AG' },\n  { name: 'Argentina', code: 'AR' },\n  { name: 'Armenia', code: 'AM' },\n  { name: 'Aruba', code: 'AW' },\n  { name: 'Australia', code: 'AU' },\n  { name: 'Austria', code: 'AT' },\n  { name: 'Azerbaijan', code: 'AZ' },\n  { name: 'Bahamas', code: 'BS' },\n  { name: 'Bahrain', code: 'BH' },\n  { name: 'Bangladesh', code: 'BD' },\n  { name: 'Barbados', code: 'BB' },\n  { name: 'Belarus', code: 'BY' },\n  { name: 'Belgium', code: 'BE' },\n  { name: 'Belize', code: 'BZ' },\n  { name: 'Benin', code: 'BJ' },\n  { name: 'Bermuda', code: 'BM' },\n  { name: 'Bhutan', code: 'BT' },\n  { name: 'Bolivia, Plurinational State of', code: 'BO' },\n  { name: 'Bonaire, Sint Eustatius and Saba', code: 'BQ' },\n  { name: 'Bosnia and Herzegovina', code: 'BA' },\n  { name: 'Botswana', code: 'BW' },\n  { name: 'Bouvet Island', code: 'BV' },\n  { name: 'Brazil', code: 'BR' },\n  { name: 'British Indian Ocean Territory', code: 'IO' },\n  { name: 'Brunei Darussalam', code: 'BN' },\n  { name: 'Bulgaria', code: 'BG' },\n  { name: 'Burkina Faso', code: 'BF' },\n  { name: 'Burundi', code: 'BI' },\n  { name: 'Cambodia', code: 'KH' },\n  { name: 'Cameroon', code: 'CM' },\n  { name: 'Canada', code: 'CA' },\n  { name: 'Cape Verde', code: 'CV' },\n  { name: 'Cayman Islands', code: 'KY' },\n  { name: 'Central African Republic', code: 'CF' },\n  { name: 'Chad', code: 'TD' },\n  { name: 'Chile', code: 'CL' },\n  { name: 'China', code: 'CN' },\n  { name: 'Christmas Island', code: 'CX' },\n  { name: 'Cocos (Keeling) Islands', code: 'CC' },\n  { name: 'Colombia', code: 'CO' },\n  { name: 'Comoros', code: 'KM' },\n  { name: 'Congo', code: 'CG' },\n  { name: 'Congo, the Democratic Republic of the', code: 'CD' },\n  { name: 'Cook Islands', code: 'CK' },\n  { name: 'Costa Rica', code: 'CR' },\n  { name: \"Côte d'Ivoire\", code: 'CI' },\n  { name: 'Croatia', code: 'HR' },\n  { name: 'Cuba', code: 'CU' },\n  { name: 'Curaçao', code: 'CW' },\n  { name: 'Cyprus', code: 'CY' },\n  { name: 'Czech Republic', code: 'CZ' },\n  { name: 'Denmark', code: 'DK' },\n  { name: 'Djibouti', code: 'DJ' },\n  { name: 'Dominica', code: 'DM' },\n  { name: 'Dominican Republic', code: 'DO' },\n  { name: 'Ecuador', code: 'EC' },\n  { name: 'Egypt', code: 'EG' },\n  { name: 'El Salvador', code: 'SV' },\n  { name: 'Equatorial Guinea', code: 'GQ' },\n  { name: 'Eritrea', code: 'ER' },\n  { name: 'Estonia', code: 'EE' },\n  { name: 'Ethiopia', code: 'ET' },\n  { name: 'Falkland Islands (Malvinas)', code: 'FK' },\n  { name: 'Faroe Islands', code: 'FO' },\n  { name: 'Fiji', code: 'FJ' },\n  { name: 'Finland', code: 'FI' },\n  { name: 'France', code: 'FR' },\n  { name: 'French Guiana', code: 'GF' },\n  { name: 'French Polynesia', code: 'PF' },\n  { name: 'French Southern Territories', code: 'TF' },\n  { name: 'Gabon', code: 'GA' },\n  { name: 'Gambia', code: 'GM' },\n  { name: 'Georgia', code: 'GE' },\n  { name: 'Germany', code: 'DE' },\n  { name: 'Ghana', code: 'GH' },\n  { name: 'Gibraltar', code: 'GI' },\n  { name: 'Greece', code: 'GR' },\n  { name: 'Greenland', code: 'GL' },\n  { name: 'Grenada', code: 'GD' },\n  { name: 'Guadeloupe', code: 'GP' },\n  { name: 'Guam', code: 'GU' },\n  { name: 'Guatemala', code: 'GT' },\n  { name: 'Guernsey', code: 'GG' },\n  { name: 'Guinea', code: 'GN' },\n  { name: 'Guinea-Bissau', code: 'GW' },\n  { name: 'Guyana', code: 'GY' },\n  { name: 'Haiti', code: 'HT' },\n  { name: 'Heard Island and McDonald Islands', code: 'HM' },\n  { name: 'Holy See (Vatican City State)', code: 'VA' },\n  { name: 'Honduras', code: 'HN' },\n  { name: 'Hong Kong', code: 'HK' },\n  { name: 'Hungary', code: 'HU' },\n  { name: 'Iceland', code: 'IS' },\n  { name: 'India', code: 'IN' },\n  { name: 'Indonesia', code: 'ID' },\n  { name: 'Iran, Islamic Republic of', code: 'IR' },\n  { name: 'Iraq', code: 'IQ' },\n  { name: 'Ireland', code: 'IE' },\n  { name: 'Isle of Man', code: 'IM' },\n  { name: 'Israel', code: 'IL' },\n  { name: 'Italy', code: 'IT' },\n  { name: 'Jamaica', code: 'JM' },\n  { name: 'Japan', code: 'JP' },\n  { name: 'Jersey', code: 'JE' },\n  { name: 'Jordan', code: 'JO' },\n  { name: 'Kazakhstan', code: 'KZ' },\n  { name: 'Kenya', code: 'KE' },\n  { name: 'Kiribati', code: 'KI' },\n  { name: \"Korea, Democratic People's Republic of\", code: 'KP' },\n  { name: 'Korea, Republic of', code: 'KR' },\n  { name: 'Kuwait', code: 'KW' },\n  { name: 'Kyrgyzstan', code: 'KG' },\n  { name: \"Lao People's Democratic Republic\", code: 'LA' },\n  { name: 'Latvia', code: 'LV' },\n  { name: 'Lebanon', code: 'LB' },\n  { name: 'Lesotho', code: 'LS' },\n  { name: 'Liberia', code: 'LR' },\n  { name: 'Libya', code: 'LY' },\n  { name: 'Liechtenstein', code: 'LI' },\n  { name: 'Lithuania', code: 'LT' },\n  { name: 'Luxembourg', code: 'LU' },\n  { name: 'Macao', code: 'MO' },\n  { name: 'Macedonia, the former Yugoslav Republic of', code: 'MK' },\n  { name: 'Madagascar', code: 'MG' },\n  { name: 'Malawi', code: 'MW' },\n  { name: 'Malaysia', code: 'MY' },\n  { name: 'Maldives', code: 'MV' },\n  { name: 'Mali', code: 'ML' },\n  { name: 'Malta', code: 'MT' },\n  { name: 'Marshall Islands', code: 'MH' },\n  { name: 'Martinique', code: 'MQ' },\n  { name: 'Mauritania', code: 'MR' },\n  { name: 'Mauritius', code: 'MU' },\n  { name: 'Mayotte', code: 'YT' },\n  { name: 'Mexico', code: 'MX' },\n  { name: 'Micronesia, Federated States of', code: 'FM' },\n  { name: 'Moldova, Republic of', code: 'MD' },\n  { name: 'Monaco', code: 'MC' },\n  { name: 'Mongolia', code: 'MN' },\n  { name: 'Montenegro', code: 'ME' },\n  { name: 'Montserrat', code: 'MS' },\n  { name: 'Morocco', code: 'MA' },\n  { name: 'Mozambique', code: 'MZ' },\n  { name: 'Myanmar', code: 'MM' },\n  { name: 'Namibia', code: 'NA' },\n  { name: 'Nauru', code: 'NR' },\n  { name: 'Nepal', code: 'NP' },\n  { name: 'Netherlands', code: 'NL' },\n  { name: 'New Caledonia', code: 'NC' },\n  { name: 'New Zealand', code: 'NZ' },\n  { name: 'Nicaragua', code: 'NI' },\n  { name: 'Niger', code: 'NE' },\n  { name: 'Nigeria', code: 'NG' },\n  { name: 'Niue', code: 'NU' },\n  { name: 'Norfolk Island', code: 'NF' },\n  { name: 'Northern Mariana Islands', code: 'MP' },\n  { name: 'Norway', code: 'NO' },\n  { name: 'Oman', code: 'OM' },\n  { name: 'Pakistan', code: 'PK' },\n  { name: 'Palau', code: 'PW' },\n  { name: 'Palestinian Territory, Occupied', code: 'PS' },\n  { name: 'Panama', code: 'PA' },\n  { name: 'Papua New Guinea', code: 'PG' },\n  { name: 'Paraguay', code: 'PY' },\n  { name: 'Peru', code: 'PE' },\n  { name: 'Philippines', code: 'PH' },\n  { name: 'Pitcairn', code: 'PN' },\n  { name: 'Poland', code: 'PL' },\n  { name: 'Portugal', code: 'PT' },\n  { name: 'Puerto Rico', code: 'PR' },\n  { name: 'Qatar', code: 'QA' },\n  { name: 'Réunion', code: 'RE' },\n  { name: 'Romania', code: 'RO' },\n  { name: 'Russian Federation', code: 'RU' },\n  { name: 'Rwanda', code: 'RW' },\n  { name: 'Saint Barthélemy', code: 'BL' },\n  { name: 'Saint Helena, Ascension and Tristan da Cunha', code: 'SH' },\n  { name: 'Saint Kitts and Nevis', code: 'KN' },\n  { name: 'Saint Lucia', code: 'LC' },\n  { name: 'Saint Martin (French part)', code: 'MF' },\n  { name: 'Saint Pierre and Miquelon', code: 'PM' },\n  { name: 'Saint Vincent and the Grenadines', code: 'VC' },\n  { name: 'Samoa', code: 'WS' },\n  { name: 'San Marino', code: 'SM' },\n  { name: 'Sao Tome and Principe', code: 'ST' },\n  { name: 'Saudi Arabia', code: 'SA' },\n  { name: 'Senegal', code: 'SN' },\n  { name: 'Serbia', code: 'RS' },\n  { name: 'Seychelles', code: 'SC' },\n  { name: 'Sierra Leone', code: 'SL' },\n  { name: 'Singapore', code: 'SG' },\n  { name: 'Sint Maarten (Dutch part)', code: 'SX' },\n  { name: 'Slovakia', code: 'SK' },\n  { name: 'Slovenia', code: 'SI' },\n  { name: 'Solomon Islands', code: 'SB' },\n  { name: 'Somalia', code: 'SO' },\n  { name: 'South Africa', code: 'ZA' },\n  { name: 'South Georgia and the South Sandwich Islands', code: 'GS' },\n  { name: 'South Sudan', code: 'SS' },\n  { name: 'Spain', code: 'ES' },\n  { name: 'Sri Lanka', code: 'LK' },\n  { name: 'Sudan', code: 'SD' },\n  { name: 'Suriname', code: 'SR' },\n  { name: 'Svalbard and Jan Mayen', code: 'SJ' },\n  { name: 'Swaziland', code: 'SZ' },\n  { name: 'Sweden', code: 'SE' },\n  { name: 'Switzerland', code: 'CH' },\n  { name: 'Syrian Arab Republic', code: 'SY' },\n  { name: 'Taiwan, Province of China', code: 'TW' },\n  { name: 'Tajikistan', code: 'TJ' },\n  { name: 'Tanzania, United Republic of', code: 'TZ' },\n  { name: 'Thailand', code: 'TH' },\n  { name: 'Timor-Leste', code: 'TL' },\n  { name: 'Togo', code: 'TG' },\n  { name: 'Tokelau', code: 'TK' },\n  { name: 'Tonga', code: 'TO' },\n  { name: 'Trinidad and Tobago', code: 'TT' },\n  { name: 'Tunisia', code: 'TN' },\n  { name: 'Turkey', code: 'TR' },\n  { name: 'Turkmenistan', code: 'TM' },\n  { name: 'Turks and Caicos Islands', code: 'TC' },\n  { name: 'Tuvalu', code: 'TV' },\n  { name: 'Uganda', code: 'UG' },\n  { name: 'Ukraine', code: 'UA' },\n  { name: 'United Arab Emirates', code: 'AE' },\n  { name: 'United Kingdom', code: 'GB' },\n  { name: 'United States', code: 'US' },\n  { name: 'United States Minor Outlying Islands', code: 'UM' },\n  { name: 'Uruguay', code: 'UY' },\n  { name: 'Uzbekistan', code: 'UZ' },\n  { name: 'Vanuatu', code: 'VU' },\n  { name: 'Venezuela, Bolivarian Republic of', code: 'VE' },\n  { name: 'Viet Nam', code: 'VN' },\n  { name: 'Virgin Islands, British', code: 'VG' },\n  { name: 'Virgin Islands, U.S.', code: 'VI' },\n  { name: 'Wallis and Futuna', code: 'WF' },\n  { name: 'Western Sahara', code: 'EH' },\n  { name: 'Yemen', code: 'YE' },\n  { name: 'Zambia', code: 'ZM' },\n  { name: 'Zimbabwe', code: 'ZW' },\n];\n\nexport const timezones = {\n  AF: [{ name: 'Kabul', code: 'Asia/Kabul' }],\n  AX: [{ name: 'Mariehamn', code: 'Europe/Mariehamn' }],\n  AL: [{ name: 'Tirane', code: 'Europe/Tirane' }],\n  DZ: [{ name: 'Algiers', code: 'Africa/Algiers' }],\n  AS: [{ name: 'Pago Pago', code: 'Pacific/Pago_Pago' }],\n  AD: [{ name: 'Andorra', code: 'Europe/Andorra' }],\n  AO: [{ name: 'Luanda', code: 'Africa/Luanda' }],\n  AI: [{ name: 'Anguilla', code: 'America/Anguilla' }],\n  AQ: [\n    { name: 'McMurdo', code: 'Antarctica/McMurdo' },\n    { name: 'South Pole', code: 'Antarctica/South_Pole' },\n    { name: 'Rothera', code: 'Antarctica/Rothera' },\n    { name: 'Palmer', code: 'Antarctica/Palmer' },\n    { name: 'Mawson', code: 'Antarctica/Mawson' },\n    { name: 'Davis', code: 'Antarctica/Davis' },\n    { name: 'Casey', code: 'Antarctica/Casey' },\n    { name: 'Vostok', code: 'Antarctica/Vostok' },\n    { name: \"Dumont D'Urville\", code: 'Antarctica/DumontDUrville' },\n    { name: 'Syowa', code: 'Antarctica/Syowa' },\n    { name: 'Macquarie', code: 'Antarctica/Macquarie' },\n  ],\n  AG: [{ name: 'Antigua', code: 'America/Antigua' }],\n  AR: [\n    {\n      name: 'Buenos Aires, Argentina',\n      code: 'America/Argentina/Buenos_Aires',\n    },\n    { name: 'Cordoba, Argentina', code: 'America/Argentina/Cordoba' },\n    { name: 'Salta, Argentina', code: 'America/Argentina/Salta' },\n    { name: 'Jujuy, Argentina', code: 'America/Argentina/Jujuy' },\n    { name: 'Tucuman, Argentina', code: 'America/Argentina/Tucuman' },\n    { name: 'Catamarca, Argentina', code: 'America/Argentina/Catamarca' },\n    { name: 'La Rioja, Argentina', code: 'America/Argentina/La_Rioja' },\n    { name: 'San Juan, Argentina', code: 'America/Argentina/San_Juan' },\n    { name: 'Mendoza, Argentina', code: 'America/Argentina/Mendoza' },\n    { name: 'San Luis, Argentina', code: 'America/Argentina/San_Luis' },\n    {\n      name: 'Rio Gallegos, Argentina',\n      code: 'America/Argentina/Rio_Gallegos',\n    },\n    { name: 'Ushuaia, Argentina', code: 'America/Argentina/Ushuaia' },\n  ],\n  AM: [{ name: 'Yerevan', code: 'Asia/Yerevan' }],\n  AW: [{ name: 'Aruba', code: 'America/Aruba' }],\n  AU: [\n    { name: 'Lord Howe', code: 'Australia/Lord_Howe' },\n    { name: 'Hobart', code: 'Australia/Hobart' },\n    { name: 'Currie', code: 'Australia/Currie' },\n    { name: 'Melbourne', code: 'Australia/Melbourne' },\n    { name: 'Sydney', code: 'Australia/Sydney' },\n    { name: 'Broken Hill', code: 'Australia/Broken_Hill' },\n    { name: 'Brisbane', code: 'Australia/Brisbane' },\n    { name: 'Lindeman', code: 'Australia/Lindeman' },\n    { name: 'Adelaide', code: 'Australia/Adelaide' },\n    { name: 'Darwin', code: 'Australia/Darwin' },\n    { name: 'Perth', code: 'Australia/Perth' },\n    { name: 'Eucla', code: 'Australia/Eucla' },\n  ],\n  AT: [{ name: 'Vienna', code: 'Europe/Vienna' }],\n  AZ: [{ name: 'Baku', code: 'Asia/Baku' }],\n  BS: [{ name: 'Nassau', code: 'America/Nassau' }],\n  BH: [{ name: 'Bahrain', code: 'Asia/Bahrain' }],\n  BD: [{ name: 'Dhaka', code: 'Asia/Dhaka' }],\n  BB: [{ name: 'Barbados', code: 'America/Barbados' }],\n  BY: [{ name: 'Minsk', code: 'Europe/Minsk' }],\n  BE: [{ name: 'Brussels', code: 'Europe/Brussels' }],\n  BZ: [{ name: 'Belize', code: 'America/Belize' }],\n  BJ: [{ name: 'Porto-Novo', code: 'Africa/Porto-Novo' }],\n  BM: [{ name: 'Bermuda', code: 'Atlantic/Bermuda' }],\n  BT: [{ name: 'Thimphu', code: 'Asia/Thimphu' }],\n  BO: [{ name: 'La Paz', code: 'America/La_Paz' }],\n  BQ: [{ name: 'Kralendijk', code: 'America/Kralendijk' }],\n  BA: [{ name: 'Sarajevo', code: 'Europe/Sarajevo' }],\n  BW: [{ name: 'Gaborone', code: 'Africa/Gaborone' }],\n  BV: [],\n  BR: [\n    { name: 'Noronha', code: 'America/Noronha' },\n    { name: 'Belem', code: 'America/Belem' },\n    { name: 'Fortaleza', code: 'America/Fortaleza' },\n    { name: 'Recife', code: 'America/Recife' },\n    { name: 'Araguaina', code: 'America/Araguaina' },\n    { name: 'Maceio', code: 'America/Maceio' },\n    { name: 'Bahia', code: 'America/Bahia' },\n    { name: 'Sao Paulo', code: 'America/Sao_Paulo' },\n    { name: 'Campo Grande', code: 'America/Campo_Grande' },\n    { name: 'Cuiaba', code: 'America/Cuiaba' },\n    { name: 'Santarem', code: 'America/Santarem' },\n    { name: 'Porto Velho', code: 'America/Porto_Velho' },\n    { name: 'Boa Vista', code: 'America/Boa_Vista' },\n    { name: 'Manaus', code: 'America/Manaus' },\n    { name: 'Eirunepe', code: 'America/Eirunepe' },\n    { name: 'Rio Branco', code: 'America/Rio_Branco' },\n  ],\n  IO: [{ name: 'Chagos', code: 'Indian/Chagos' }],\n  BN: [{ name: 'Brunei', code: 'Asia/Brunei' }],\n  BG: [{ name: 'Sofia', code: 'Europe/Sofia' }],\n  BF: [{ name: 'Ouagadougou', code: 'Africa/Ouagadougou' }],\n  BI: [{ name: 'Bujumbura', code: 'Africa/Bujumbura' }],\n  KH: [{ name: 'Phnom Penh', code: 'Asia/Phnom_Penh' }],\n  CM: [{ name: 'Douala', code: 'Africa/Douala' }],\n  CA: [\n    { name: 'St Johns', code: 'America/St_Johns' },\n    { name: 'Halifax', code: 'America/Halifax' },\n    { name: 'Glace Bay', code: 'America/Glace_Bay' },\n    { name: 'Moncton', code: 'America/Moncton' },\n    { name: 'Goose Bay', code: 'America/Goose_Bay' },\n    { name: 'Blanc-Sablon', code: 'America/Blanc-Sablon' },\n    { name: 'Montreal', code: 'America/Montreal' },\n    { name: 'Toronto', code: 'America/Toronto' },\n    { name: 'Nipigon', code: 'America/Nipigon' },\n    { name: 'Thunder Bay', code: 'America/Thunder_Bay' },\n    { name: 'Iqaluit', code: 'America/Iqaluit' },\n    { name: 'Pangnirtung', code: 'America/Pangnirtung' },\n    { name: 'Resolute', code: 'America/Resolute' },\n    { name: 'Atikokan', code: 'America/Atikokan' },\n    { name: 'Rankin Inlet', code: 'America/Rankin_Inlet' },\n    { name: 'Winnipeg', code: 'America/Winnipeg' },\n    { name: 'Rainy River', code: 'America/Rainy_River' },\n    { name: 'Regina', code: 'America/Regina' },\n    { name: 'Swift Current', code: 'America/Swift_Current' },\n    { name: 'Edmonton', code: 'America/Edmonton' },\n    { name: 'Cambridge Bay', code: 'America/Cambridge_Bay' },\n    { name: 'Yellowknife', code: 'America/Yellowknife' },\n    { name: 'Inuvik', code: 'America/Inuvik' },\n    { name: 'Creston', code: 'America/Creston' },\n    { name: 'Dawson Creek', code: 'America/Dawson_Creek' },\n    { name: 'Vancouver', code: 'America/Vancouver' },\n    { name: 'Whitehorse', code: 'America/Whitehorse' },\n    { name: 'Dawson', code: 'America/Dawson' },\n  ],\n  CV: [{ name: 'Cape Verde', code: 'Atlantic/Cape_Verde' }],\n  KY: [{ name: 'Cayman', code: 'America/Cayman' }],\n  CF: [{ name: 'Bangui', code: 'Africa/Bangui' }],\n  TD: [{ name: 'Ndjamena', code: 'Africa/Ndjamena' }],\n  CL: [\n    { name: 'Santiago', code: 'America/Santiago' },\n    { name: 'Easter', code: 'Pacific/Easter' },\n  ],\n  CN: [\n    { name: 'Shanghai', code: 'Asia/Shanghai' },\n    { name: 'Harbin', code: 'Asia/Harbin' },\n    { name: 'Chongqing', code: 'Asia/Chongqing' },\n    { name: 'Urumqi', code: 'Asia/Urumqi' },\n    { name: 'Kashgar', code: 'Asia/Kashgar' },\n  ],\n  CX: [{ name: 'Christmas', code: 'Indian/Christmas' }],\n  CC: [{ name: 'Cocos', code: 'Indian/Cocos' }],\n  CO: [{ name: 'Bogota', code: 'America/Bogota' }],\n  KM: [{ name: 'Comoro', code: 'Indian/Comoro' }],\n  CG: [{ name: 'Brazzaville', code: 'Africa/Brazzaville' }],\n  CD: [\n    { name: 'Kinshasa', code: 'Africa/Kinshasa' },\n    { name: 'Lubumbashi', code: 'Africa/Lubumbashi' },\n  ],\n  CK: [{ name: 'Rarotonga', code: 'Pacific/Rarotonga' }],\n  CR: [{ name: 'Costa Rica', code: 'America/Costa_Rica' }],\n  CI: [{ name: 'Abidjan', code: 'Africa/Abidjan' }],\n  HR: [{ name: 'Zagreb', code: 'Europe/Zagreb' }],\n  CU: [{ name: 'Havana', code: 'America/Havana' }],\n  CW: [{ name: 'Curacao', code: 'America/Curacao' }],\n  CY: [{ name: 'Nicosia', code: 'Asia/Nicosia' }],\n  CZ: [{ name: 'Prague', code: 'Europe/Prague' }],\n  DK: [{ name: 'Copenhagen', code: 'Europe/Copenhagen' }],\n  DJ: [{ name: 'Djibouti', code: 'Africa/Djibouti' }],\n  DM: [{ name: 'Dominica', code: 'America/Dominica' }],\n  DO: [{ name: 'Santo Domingo', code: 'America/Santo_Domingo' }],\n  EC: [\n    { name: 'Guayaquil', code: 'America/Guayaquil' },\n    { name: 'Galapagos', code: 'Pacific/Galapagos' },\n  ],\n  EG: [{ name: 'Cairo', code: 'Africa/Cairo' }],\n  SV: [{ name: 'El Salvador', code: 'America/El_Salvador' }],\n  GQ: [{ name: 'Malabo', code: 'Africa/Malabo' }],\n  ER: [{ name: 'Asmara', code: 'Africa/Asmara' }],\n  EE: [{ name: 'Tallinn', code: 'Europe/Tallinn' }],\n  ET: [{ name: 'Addis Ababa', code: 'Africa/Addis_Ababa' }],\n  FK: [{ name: 'Stanley', code: 'Atlantic/Stanley' }],\n  FO: [{ name: 'Faroe', code: 'Atlantic/Faroe' }],\n  FJ: [{ name: 'Fiji', code: 'Pacific/Fiji' }],\n  FI: [{ name: 'Helsinki', code: 'Europe/Helsinki' }],\n  FR: [{ name: 'Paris', code: 'Europe/Paris' }],\n  GF: [{ name: 'Cayenne', code: 'America/Cayenne' }],\n  PF: [\n    { name: 'Tahiti', code: 'Pacific/Tahiti' },\n    { name: 'Marquesas', code: 'Pacific/Marquesas' },\n    { name: 'Gambier', code: 'Pacific/Gambier' },\n  ],\n  TF: [{ name: 'Kerguelen', code: 'Indian/Kerguelen' }],\n  GA: [{ name: 'Libreville', code: 'Africa/Libreville' }],\n  GM: [{ name: 'Banjul', code: 'Africa/Banjul' }],\n  GE: [{ name: 'Tbilisi', code: 'Asia/Tbilisi' }],\n  DE: [{ name: 'Berlin', code: 'Europe/Berlin' }],\n  GH: [{ name: 'Accra', code: 'Africa/Accra' }],\n  GI: [{ name: 'Gibraltar', code: 'Europe/Gibraltar' }],\n  GR: [{ name: 'Athens', code: 'Europe/Athens' }],\n  GL: [\n    { name: 'Godthab', code: 'America/Godthab' },\n    { name: 'Danmarkshavn', code: 'America/Danmarkshavn' },\n    { name: 'Scoresbysund', code: 'America/Scoresbysund' },\n    { name: 'Thule', code: 'America/Thule' },\n  ],\n  GD: [{ name: 'Grenada', code: 'America/Grenada' }],\n  GP: [{ name: 'Guadeloupe', code: 'America/Guadeloupe' }],\n  GU: [{ name: 'Guam', code: 'Pacific/Guam' }],\n  GT: [{ name: 'Guatemala', code: 'America/Guatemala' }],\n  GG: [{ name: 'Guernsey', code: 'Europe/Guernsey' }],\n  GN: [{ name: 'Conakry', code: 'Africa/Conakry' }],\n  GW: [{ name: 'Bissau', code: 'Africa/Bissau' }],\n  GY: [{ name: 'Guyana', code: 'America/Guyana' }],\n  HT: [{ name: 'Port-au-Prince', code: 'America/Port-au-Prince' }],\n  HM: [],\n  VA: [{ name: 'Vatican', code: 'Europe/Vatican' }],\n  HN: [{ name: 'Tegucigalpa', code: 'America/Tegucigalpa' }],\n  HK: [{ name: 'Hong Kong', code: 'Asia/Hong_Kong' }],\n  HU: [{ name: 'Budapest', code: 'Europe/Budapest' }],\n  IS: [{ name: 'Reykjavik', code: 'Atlantic/Reykjavik' }],\n  IN: [{ name: 'Kolkata', code: 'Asia/Kolkata' }],\n  ID: [\n    { name: 'Jakarta', code: 'Asia/Jakarta' },\n    { name: 'Pontianak', code: 'Asia/Pontianak' },\n    { name: 'Makassar', code: 'Asia/Makassar' },\n    { name: 'Jayapura', code: 'Asia/Jayapura' },\n  ],\n  IR: [{ name: 'Tehran', code: 'Asia/Tehran' }],\n  IQ: [{ name: 'Baghdad', code: 'Asia/Baghdad' }],\n  IE: [{ name: 'Dublin', code: 'Europe/Dublin' }],\n  IM: [{ name: 'Isle of Man', code: 'Europe/Isle_of_Man' }],\n  IL: [{ name: 'Jerusalem', code: 'Asia/Jerusalem' }],\n  IT: [{ name: 'Rome', code: 'Europe/Rome' }],\n  JM: [{ name: 'Jamaica', code: 'America/Jamaica' }],\n  JP: [{ name: 'Tokyo', code: 'Asia/Tokyo' }],\n  JE: [{ name: 'Jersey', code: 'Europe/Jersey' }],\n  JO: [{ name: 'Amman', code: 'Asia/Amman' }],\n  KZ: [\n    { name: 'Almaty', code: 'Asia/Almaty' },\n    { name: 'Qyzylorda', code: 'Asia/Qyzylorda' },\n    { name: 'Aqtobe', code: 'Asia/Aqtobe' },\n    { name: 'Aqtau', code: 'Asia/Aqtau' },\n    { name: 'Oral', code: 'Asia/Oral' },\n  ],\n  KE: [{ name: 'Nairobi', code: 'Africa/Nairobi' }],\n  KI: [\n    { name: 'Tarawa', code: 'Pacific/Tarawa' },\n    { name: 'Enderbury', code: 'Pacific/Enderbury' },\n    { name: 'Kiritimati', code: 'Pacific/Kiritimati' },\n  ],\n  KP: [{ name: 'Pyongyang', code: 'Asia/Pyongyang' }],\n  KR: [{ name: 'Seoul', code: 'Asia/Seoul' }],\n  KW: [{ name: 'Kuwait', code: 'Asia/Kuwait' }],\n  KG: [{ name: 'Bishkek', code: 'Asia/Bishkek' }],\n  LA: [{ name: 'Vientiane', code: 'Asia/Vientiane' }],\n  LV: [{ name: 'Riga', code: 'Europe/Riga' }],\n  LB: [{ name: 'Beirut', code: 'Asia/Beirut' }],\n  LS: [{ name: 'Maseru', code: 'Africa/Maseru' }],\n  LR: [{ name: 'Monrovia', code: 'Africa/Monrovia' }],\n  LY: [{ name: 'Tripoli', code: 'Africa/Tripoli' }],\n  LI: [{ name: 'Vaduz', code: 'Europe/Vaduz' }],\n  LT: [{ name: 'Vilnius', code: 'Europe/Vilnius' }],\n  LU: [{ name: 'Luxembourg', code: 'Europe/Luxembourg' }],\n  MO: [{ name: 'Macau', code: 'Asia/Macau' }],\n  MK: [{ name: 'Skopje', code: 'Europe/Skopje' }],\n  MG: [{ name: 'Antananarivo', code: 'Indian/Antananarivo' }],\n  MW: [{ name: 'Blantyre', code: 'Africa/Blantyre' }],\n  MY: [\n    { name: 'Kuala Lumpur', code: 'Asia/Kuala_Lumpur' },\n    { name: 'Kuching', code: 'Asia/Kuching' },\n  ],\n  MV: [{ name: 'Maldives', code: 'Indian/Maldives' }],\n  ML: [{ name: 'Bamako', code: 'Africa/Bamako' }],\n  MT: [{ name: 'Malta', code: 'Europe/Malta' }],\n  MH: [\n    { name: 'Majuro', code: 'Pacific/Majuro' },\n    { name: 'Kwajalein', code: 'Pacific/Kwajalein' },\n  ],\n  MQ: [{ name: 'Martinique', code: 'America/Martinique' }],\n  MR: [{ name: 'Nouakchott', code: 'Africa/Nouakchott' }],\n  MU: [{ name: 'Mauritius', code: 'Indian/Mauritius' }],\n  YT: [{ name: 'Mayotte', code: 'Indian/Mayotte' }],\n  MX: [\n    { name: 'Mexico City', code: 'America/Mexico_City' },\n    { name: 'Cancun', code: 'America/Cancun' },\n    { name: 'Merida', code: 'America/Merida' },\n    { name: 'Monterrey', code: 'America/Monterrey' },\n    { name: 'Matamoros', code: 'America/Matamoros' },\n    { name: 'Mazatlan', code: 'America/Mazatlan' },\n    { name: 'Chihuahua', code: 'America/Chihuahua' },\n    { name: 'Ojinaga', code: 'America/Ojinaga' },\n    { name: 'Hermosillo', code: 'America/Hermosillo' },\n    { name: 'Tijuana', code: 'America/Tijuana' },\n    { name: 'Santa Isabel', code: 'America/Santa_Isabel' },\n    { name: 'Bahia Banderas', code: 'America/Bahia_Banderas' },\n  ],\n  FM: [\n    { name: 'Chuuk', code: 'Pacific/Chuuk' },\n    { name: 'Pohnpei', code: 'Pacific/Pohnpei' },\n    { name: 'Kosrae', code: 'Pacific/Kosrae' },\n  ],\n  MD: [{ name: 'Chisinau', code: 'Europe/Chisinau' }],\n  MC: [{ name: 'Monaco', code: 'Europe/Monaco' }],\n  MN: [\n    { name: 'Ulaanbaatar', code: 'Asia/Ulaanbaatar' },\n    { name: 'Hovd', code: 'Asia/Hovd' },\n    { name: 'Choibalsan', code: 'Asia/Choibalsan' },\n  ],\n  ME: [{ name: 'Podgorica', code: 'Europe/Podgorica' }],\n  MS: [{ name: 'Montserrat', code: 'America/Montserrat' }],\n  MA: [{ name: 'Casablanca', code: 'Africa/Casablanca' }],\n  MZ: [{ name: 'Maputo', code: 'Africa/Maputo' }],\n  MM: [{ name: 'Rangoon', code: 'Asia/Rangoon' }],\n  NA: [{ name: 'Windhoek', code: 'Africa/Windhoek' }],\n  NR: [{ name: 'Nauru', code: 'Pacific/Nauru' }],\n  NP: [{ name: 'Kathmandu', code: 'Asia/Kathmandu' }],\n  NL: [{ name: 'Amsterdam', code: 'Europe/Amsterdam' }],\n  NC: [{ name: 'Noumea', code: 'Pacific/Noumea' }],\n  NZ: [\n    { name: 'Auckland', code: 'Pacific/Auckland' },\n    { name: 'Chatham', code: 'Pacific/Chatham' },\n  ],\n  NI: [{ name: 'Managua', code: 'America/Managua' }],\n  NE: [{ name: 'Niamey', code: 'Africa/Niamey' }],\n  NG: [{ name: 'Lagos', code: 'Africa/Lagos' }],\n  NU: [{ name: 'Niue', code: 'Pacific/Niue' }],\n  NF: [{ name: 'Norfolk', code: 'Pacific/Norfolk' }],\n  MP: [{ name: 'Saipan', code: 'Pacific/Saipan' }],\n  NO: [{ name: 'Oslo', code: 'Europe/Oslo' }],\n  OM: [{ name: 'Muscat', code: 'Asia/Muscat' }],\n  PK: [{ name: 'Karachi', code: 'Asia/Karachi' }],\n  PW: [{ name: 'Palau', code: 'Pacific/Palau' }],\n  PS: [\n    { name: 'Gaza', code: 'Asia/Gaza' },\n    { name: 'Hebron', code: 'Asia/Hebron' },\n  ],\n  PA: [{ name: 'Panama', code: 'America/Panama' }],\n  PG: [{ name: 'Port Moresby', code: 'Pacific/Port_Moresby' }],\n  PY: [{ name: 'Asuncion', code: 'America/Asuncion' }],\n  PE: [{ name: 'Lima', code: 'America/Lima' }],\n  PH: [{ name: 'Manila', code: 'Asia/Manila' }],\n  PN: [{ name: 'Pitcairn', code: 'Pacific/Pitcairn' }],\n  PL: [{ name: 'Warsaw', code: 'Europe/Warsaw' }],\n  PT: [\n    { name: 'Lisbon', code: 'Europe/Lisbon' },\n    { name: 'Madeira', code: 'Atlantic/Madeira' },\n    { name: 'Azores', code: 'Atlantic/Azores' },\n  ],\n  PR: [{ name: 'Puerto Rico', code: 'America/Puerto_Rico' }],\n  QA: [{ name: 'Qatar', code: 'Asia/Qatar' }],\n  RE: [{ name: 'Reunion', code: 'Indian/Reunion' }],\n  RO: [{ name: 'Bucharest', code: 'Europe/Bucharest' }],\n  RU: [\n    { name: 'Kaliningrad', code: 'Europe/Kaliningrad' },\n    { name: 'Moscow', code: 'Europe/Moscow' },\n    { name: 'Volgograd', code: 'Europe/Volgograd' },\n    { name: 'Samara', code: 'Europe/Samara' },\n    { name: 'Yekaterinburg', code: 'Asia/Yekaterinburg' },\n    { name: 'Omsk', code: 'Asia/Omsk' },\n    { name: 'Novosibirsk', code: 'Asia/Novosibirsk' },\n    { name: 'Novokuznetsk', code: 'Asia/Novokuznetsk' },\n    { name: 'Krasnoyarsk', code: 'Asia/Krasnoyarsk' },\n    { name: 'Irkutsk', code: 'Asia/Irkutsk' },\n    { name: 'Yakutsk', code: 'Asia/Yakutsk' },\n    { name: 'Vladivostok', code: 'Asia/Vladivostok' },\n    { name: 'Sakhalin', code: 'Asia/Sakhalin' },\n    { name: 'Magadan', code: 'Asia/Magadan' },\n    { name: 'Kamchatka', code: 'Asia/Kamchatka' },\n    { name: 'Anadyr', code: 'Asia/Anadyr' },\n  ],\n  RW: [{ name: 'Kigali', code: 'Africa/Kigali' }],\n  BL: [{ name: 'St Barthelemy', code: 'America/St_Barthelemy' }],\n  SH: [{ name: 'St Helena', code: 'Atlantic/St_Helena' }],\n  KN: [{ name: 'St Kitts', code: 'America/St_Kitts' }],\n  LC: [{ name: 'St Lucia', code: 'America/St_Lucia' }],\n  MF: [{ name: 'Marigot', code: 'America/Marigot' }],\n  PM: [{ name: 'Miquelon', code: 'America/Miquelon' }],\n  VC: [{ name: 'St Vincent', code: 'America/St_Vincent' }],\n  WS: [{ name: 'Apia', code: 'Pacific/Apia' }],\n  SM: [{ name: 'San Marino', code: 'Europe/San_Marino' }],\n  ST: [{ name: 'Sao Tome', code: 'Africa/Sao_Tome' }],\n  SA: [{ name: 'Riyadh', code: 'Asia/Riyadh' }],\n  SN: [{ name: 'Dakar', code: 'Africa/Dakar' }],\n  RS: [{ name: 'Belgrade', code: 'Europe/Belgrade' }],\n  SC: [{ name: 'Mahe', code: 'Indian/Mahe' }],\n  SL: [{ name: 'Freetown', code: 'Africa/Freetown' }],\n  SG: [{ name: 'Singapore', code: 'Asia/Singapore' }],\n  SX: [{ name: 'Lower Princes', code: 'America/Lower_Princes' }],\n  SK: [{ name: 'Bratislava', code: 'Europe/Bratislava' }],\n  SI: [{ name: 'Ljubljana', code: 'Europe/Ljubljana' }],\n  SB: [{ name: 'Guadalcanal', code: 'Pacific/Guadalcanal' }],\n  SO: [{ name: 'Mogadishu', code: 'Africa/Mogadishu' }],\n  ZA: [{ name: 'Johannesburg', code: 'Africa/Johannesburg' }],\n  GS: [{ name: 'South Georgia', code: 'Atlantic/South_Georgia' }],\n  SS: [{ name: 'Juba', code: 'Africa/Juba' }],\n  ES: [\n    { name: 'Madrid', code: 'Europe/Madrid' },\n    { name: 'Ceuta', code: 'Africa/Ceuta' },\n    { name: 'Canary', code: 'Atlantic/Canary' },\n  ],\n  LK: [{ name: 'Colombo', code: 'Asia/Colombo' }],\n  SD: [{ name: 'Khartoum', code: 'Africa/Khartoum' }],\n  SR: [{ name: 'Paramaribo', code: 'America/Paramaribo' }],\n  SJ: [{ name: 'Longyearbyen', code: 'Arctic/Longyearbyen' }],\n  SZ: [{ name: 'Mbabane', code: 'Africa/Mbabane' }],\n  SE: [{ name: 'Stockholm', code: 'Europe/Stockholm' }],\n  CH: [{ name: 'Zurich', code: 'Europe/Zurich' }],\n  SY: [{ name: 'Damascus', code: 'Asia/Damascus' }],\n  TW: [{ name: 'Taipei', code: 'Asia/Taipei' }],\n  TJ: [{ name: 'Dushanbe', code: 'Asia/Dushanbe' }],\n  TZ: [{ name: 'Dar es Salaam', code: 'Africa/Dar_es_Salaam' }],\n  TH: [{ name: 'Bangkok', code: 'Asia/Bangkok' }],\n  TL: [{ name: 'Dili', code: 'Asia/Dili' }],\n  TG: [{ name: 'Lome', code: 'Africa/Lome' }],\n  TK: [{ name: 'Fakaofo', code: 'Pacific/Fakaofo' }],\n  TO: [{ name: 'Tongatapu', code: 'Pacific/Tongatapu' }],\n  TT: [{ name: 'Port of Spain', code: 'America/Port_of_Spain' }],\n  TN: [{ name: 'Tunis', code: 'Africa/Tunis' }],\n  TR: [{ name: 'Istanbul', code: 'Europe/Istanbul' }],\n  TM: [{ name: 'Ashgabat', code: 'Asia/Ashgabat' }],\n  TC: [{ name: 'Grand Turk', code: 'America/Grand_Turk' }],\n  TV: [{ name: 'Funafuti', code: 'Pacific/Funafuti' }],\n  UG: [{ name: 'Kampala', code: 'Africa/Kampala' }],\n  UA: [\n    { name: 'Kiev', code: 'Europe/Kiev' },\n    { name: 'Uzhgorod', code: 'Europe/Uzhgorod' },\n    { name: 'Zaporozhye', code: 'Europe/Zaporozhye' },\n    { name: 'Simferopol', code: 'Europe/Simferopol' },\n  ],\n  AE: [{ name: 'Dubai', code: 'Asia/Dubai' }],\n  GB: [{ name: 'London', code: 'Europe/London' }],\n  US: [\n    { name: 'New York', code: 'America/New_York' },\n    { name: 'Detroit', code: 'America/Detroit' },\n    { name: 'Louisville, Kentucky', code: 'America/Kentucky/Louisville' },\n    { name: 'Monticello, Kentucky', code: 'America/Kentucky/Monticello' },\n    { name: 'Indianapolis, Indiana', code: 'America/Indiana/Indianapolis' },\n    { name: 'Vincennes, Indiana', code: 'America/Indiana/Vincennes' },\n    { name: 'Winamac, Indiana', code: 'America/Indiana/Winamac' },\n    { name: 'Marengo, Indiana', code: 'America/Indiana/Marengo' },\n    { name: 'Petersburg, Indiana', code: 'America/Indiana/Petersburg' },\n    { name: 'Vevay, Indiana', code: 'America/Indiana/Vevay' },\n    { name: 'Chicago', code: 'America/Chicago' },\n    { name: 'Tell City, Indiana', code: 'America/Indiana/Tell_City' },\n    { name: 'Knox, Indiana', code: 'America/Indiana/Knox' },\n    { name: 'Menominee', code: 'America/Menominee' },\n    { name: 'Center, North Dakota', code: 'America/North_Dakota/Center' },\n    {\n      name: 'New Salem, North Dakota',\n      code: 'America/North_Dakota/New_Salem',\n    },\n    { name: 'Beulah, North Dakota', code: 'America/North_Dakota/Beulah' },\n    { name: 'Denver', code: 'America/Denver' },\n    { name: 'Boise', code: 'America/Boise' },\n    { name: 'Shiprock', code: 'America/Shiprock' },\n    { name: 'Phoenix', code: 'America/Phoenix' },\n    { name: 'Los Angeles', code: 'America/Los_Angeles' },\n    { name: 'Anchorage', code: 'America/Anchorage' },\n    { name: 'Juneau', code: 'America/Juneau' },\n    { name: 'Sitka', code: 'America/Sitka' },\n    { name: 'Yakutat', code: 'America/Yakutat' },\n    { name: 'Nome', code: 'America/Nome' },\n    { name: 'Adak', code: 'America/Adak' },\n    { name: 'Metlakatla', code: 'America/Metlakatla' },\n    { name: 'Honolulu', code: 'Pacific/Honolulu' },\n  ],\n  UM: [\n    { name: 'Johnston', code: 'Pacific/Johnston' },\n    { name: 'Midway', code: 'Pacific/Midway' },\n    { name: 'Wake', code: 'Pacific/Wake' },\n  ],\n  UY: [{ name: 'Montevideo', code: 'America/Montevideo' }],\n  UZ: [\n    { name: 'Samarkand', code: 'Asia/Samarkand' },\n    { name: 'Tashkent', code: 'Asia/Tashkent' },\n  ],\n  VU: [{ name: 'Efate', code: 'Pacific/Efate' }],\n  VE: [{ name: 'Caracas', code: 'America/Caracas' }],\n  VN: [{ name: 'Ho Chi Minh', code: 'Asia/Ho_Chi_Minh' }],\n  VG: [{ name: 'Tortola', code: 'America/Tortola' }],\n  VI: [{ name: 'St Thomas', code: 'America/St_Thomas' }],\n  WF: [{ name: 'Wallis', code: 'Pacific/Wallis' }],\n  EH: [{ name: 'El Aaiun', code: 'Africa/El_Aaiun' }],\n  YE: [{ name: 'Aden', code: 'Asia/Aden' }],\n  ZM: [{ name: 'Lusaka', code: 'Africa/Lusaka' }],\n  ZW: [{ name: 'Harare', code: 'Africa/Harare' }],\n};\n\nexport const countryCodeByTimezone = {\n  'Africa/Abidjan': 'CI',\n  'Africa/Accra': 'GH',\n  'Africa/Addis_Ababa': 'ET',\n  'Africa/Algiers': 'DZ',\n  'Africa/Asmara': 'ER',\n  'Africa/Bamako': 'ML',\n  'Africa/Bangui': 'CF',\n  'Africa/Banjul': 'GM',\n  'Africa/Bissau': 'GW',\n  'Africa/Blantyre': 'MW',\n  'Africa/Brazzaville': 'CG',\n  'Africa/Bujumbura': 'BI',\n  'Africa/Cairo': 'EG',\n  'Africa/Casablanca': 'MA',\n  'Africa/Ceuta': 'ES',\n  'Africa/Conakry': 'GN',\n  'Africa/Dakar': 'SN',\n  'Africa/Dar_es_Salaam': 'TZ',\n  'Africa/Djibouti': 'DJ',\n  'Africa/Douala': 'CM',\n  'Africa/El_Aaiun': 'EH',\n  'Africa/Freetown': 'SL',\n  'Africa/Gaborone': 'BW',\n  'Africa/Harare': 'ZW',\n  'Africa/Johannesburg': 'ZA',\n  'Africa/Juba': 'SS',\n  'Africa/Kampala': 'UG',\n  'Africa/Khartoum': 'SD',\n  'Africa/Kigali': 'RW',\n  'Africa/Kinshasa': 'CD',\n  'Africa/Lagos': 'NG',\n  'Africa/Libreville': 'GA',\n  'Africa/Lome': 'TG',\n  'Africa/Luanda': 'AO',\n  'Africa/Lubumbashi': 'CD',\n  'Africa/Lusaka': 'ZM',\n  'Africa/Malabo': 'GQ',\n  'Africa/Maputo': 'MZ',\n  'Africa/Maseru': 'LS',\n  'Africa/Mbabane': 'SZ',\n  'Africa/Mogadishu': 'SO',\n  'Africa/Monrovia': 'LR',\n  'Africa/Nairobi': 'KE',\n  'Africa/Ndjamena': 'TD',\n  'Africa/Niamey': 'NE',\n  'Africa/Nouakchott': 'MR',\n  'Africa/Ouagadougou': 'BF',\n  'Africa/Porto-Novo': 'BJ',\n  'Africa/Sao_Tome': 'ST',\n  'Africa/Tripoli': 'LY',\n  'Africa/Tunis': 'TN',\n  'Africa/Windhoek': 'NA',\n  'America/Adak': 'US',\n  'America/Anchorage': 'US',\n  'America/Anguilla': 'AI',\n  'America/Antigua': 'AG',\n  'America/Araguaina': 'BR',\n  'America/Argentina/Buenos_Aires': 'AR',\n  'America/Argentina/Catamarca': 'AR',\n  'America/Argentina/Cordoba': 'AR',\n  'America/Argentina/Jujuy': 'AR',\n  'America/Argentina/La_Rioja': 'AR',\n  'America/Argentina/Mendoza': 'AR',\n  'America/Argentina/Rio_Gallegos': 'AR',\n  'America/Argentina/Salta': 'AR',\n  'America/Argentina/San_Juan': 'AR',\n  'America/Argentina/San_Luis': 'AR',\n  'America/Argentina/Tucuman': 'AR',\n  'America/Argentina/Ushuaia': 'AR',\n  'America/Aruba': 'AW',\n  'America/Asuncion': 'PY',\n  'America/Atikokan': 'CA',\n  'America/Bahia': 'BR',\n  'America/Bahia_Banderas': 'MX',\n  'America/Barbados': 'BB',\n  'America/Belem': 'BR',\n  'America/Belize': 'BZ',\n  'America/Blanc-Sablon': 'CA',\n  'America/Boa_Vista': 'BR',\n  'America/Bogota': 'CO',\n  'America/Boise': 'US',\n  'America/Cambridge_Bay': 'CA',\n  'America/Campo_Grande': 'BR',\n  'America/Cancun': 'MX',\n  'America/Caracas': 'VE',\n  'America/Cayenne': 'GF',\n  'America/Cayman': 'KY',\n  'America/Chicago': 'US',\n  'America/Chihuahua': 'MX',\n  'America/Costa_Rica': 'CR',\n  'America/Creston': 'CA',\n  'America/Cuiaba': 'BR',\n  'America/Curacao': 'CW',\n  'America/Danmarkshavn': 'GL',\n  'America/Dawson': 'CA',\n  'America/Dawson_Creek': 'CA',\n  'America/Denver': 'US',\n  'America/Detroit': 'US',\n  'America/Dominica': 'DM',\n  'America/Edmonton': 'CA',\n  'America/Eirunepe': 'BR',\n  'America/El_Salvador': 'SV',\n  'America/Fortaleza': 'BR',\n  'America/Glace_Bay': 'CA',\n  'America/Godthab': 'GL',\n  'America/Goose_Bay': 'CA',\n  'America/Grand_Turk': 'TC',\n  'America/Grenada': 'GD',\n  'America/Guadeloupe': 'GP',\n  'America/Guatemala': 'GT',\n  'America/Guayaquil': 'EC',\n  'America/Guyana': 'GY',\n  'America/Halifax': 'CA',\n  'America/Havana': 'CU',\n  'America/Hermosillo': 'MX',\n  'America/Indiana/Indianapolis': 'US',\n  'America/Indiana/Knox': 'US',\n  'America/Indiana/Marengo': 'US',\n  'America/Indiana/Petersburg': 'US',\n  'America/Indiana/Tell_City': 'US',\n  'America/Indiana/Vevay': 'US',\n  'America/Indiana/Vincennes': 'US',\n  'America/Indiana/Winamac': 'US',\n  'America/Inuvik': 'CA',\n  'America/Iqaluit': 'CA',\n  'America/Jamaica': 'JM',\n  'America/Juneau': 'US',\n  'America/Kentucky/Louisville': 'US',\n  'America/Kentucky/Monticello': 'US',\n  'America/Kralendijk': 'BQ',\n  'America/La_Paz': 'BO',\n  'America/Lima': 'PE',\n  'America/Los_Angeles': 'US',\n  'America/Lower_Princes': 'SX',\n  'America/Maceio': 'BR',\n  'America/Managua': 'NI',\n  'America/Manaus': 'BR',\n  'America/Marigot': 'MF',\n  'America/Martinique': 'MQ',\n  'America/Matamoros': 'MX',\n  'America/Mazatlan': 'MX',\n  'America/Menominee': 'US',\n  'America/Merida': 'MX',\n  'America/Metlakatla': 'US',\n  'America/Mexico_City': 'MX',\n  'America/Miquelon': 'PM',\n  'America/Moncton': 'CA',\n  'America/Monterrey': 'MX',\n  'America/Montevideo': 'UY',\n  'America/Montreal': 'CA',\n  'America/Montserrat': 'MS',\n  'America/Nassau': 'BS',\n  'America/New_York': 'US',\n  'America/Nipigon': 'CA',\n  'America/Nome': 'US',\n  'America/Noronha': 'BR',\n  'America/North_Dakota/Beulah': 'US',\n  'America/North_Dakota/Center': 'US',\n  'America/North_Dakota/New_Salem': 'US',\n  'America/Ojinaga': 'MX',\n  'America/Panama': 'PA',\n  'America/Pangnirtung': 'CA',\n  'America/Paramaribo': 'SR',\n  'America/Phoenix': 'US',\n  'America/Port-au-Prince': 'HT',\n  'America/Port_of_Spain': 'TT',\n  'America/Porto_Velho': 'BR',\n  'America/Puerto_Rico': 'PR',\n  'America/Rainy_River': 'CA',\n  'America/Rankin_Inlet': 'CA',\n  'America/Recife': 'BR',\n  'America/Regina': 'CA',\n  'America/Resolute': 'CA',\n  'America/Rio_Branco': 'BR',\n  'America/Santa_Isabel': 'MX',\n  'America/Santarem': 'BR',\n  'America/Santiago': 'CL',\n  'America/Santo_Domingo': 'DO',\n  'America/Sao_Paulo': 'BR',\n  'America/Scoresbysund': 'GL',\n  'America/Shiprock': 'US',\n  'America/Sitka': 'US',\n  'America/St_Barthelemy': 'BL',\n  'America/St_Johns': 'CA',\n  'America/St_Kitts': 'KN',\n  'America/St_Lucia': 'LC',\n  'America/St_Thomas': 'VI',\n  'America/St_Vincent': 'VC',\n  'America/Swift_Current': 'CA',\n  'America/Tegucigalpa': 'HN',\n  'America/Thule': 'GL',\n  'America/Thunder_Bay': 'CA',\n  'America/Tijuana': 'MX',\n  'America/Toronto': 'CA',\n  'America/Tortola': 'VG',\n  'America/Vancouver': 'CA',\n  'America/Whitehorse': 'CA',\n  'America/Winnipeg': 'CA',\n  'America/Yakutat': 'US',\n  'America/Yellowknife': 'CA',\n  'Antarctica/Casey': 'AQ',\n  'Antarctica/Davis': 'AQ',\n  'Antarctica/DumontDUrville': 'AQ',\n  'Antarctica/Macquarie': 'AQ',\n  'Antarctica/Mawson': 'AQ',\n  'Antarctica/McMurdo': 'AQ',\n  'Antarctica/Palmer': 'AQ',\n  'Antarctica/Rothera': 'AQ',\n  'Antarctica/South_Pole': 'AQ',\n  'Antarctica/Syowa': 'AQ',\n  'Antarctica/Vostok': 'AQ',\n  'Arctic/Longyearbyen': 'SJ',\n  'Asia/Aden': 'YE',\n  'Asia/Almaty': 'KZ',\n  'Asia/Amman': 'JO',\n  'Asia/Anadyr': 'RU',\n  'Asia/Aqtau': 'KZ',\n  'Asia/Aqtobe': 'KZ',\n  'Asia/Ashgabat': 'TM',\n  'Asia/Baghdad': 'IQ',\n  'Asia/Bahrain': 'BH',\n  'Asia/Baku': 'AZ',\n  'Asia/Bangkok': 'TH',\n  'Asia/Beirut': 'LB',\n  'Asia/Bishkek': 'KG',\n  'Asia/Brunei': 'BN',\n  'Asia/Choibalsan': 'MN',\n  'Asia/Chongqing': 'CN',\n  'Asia/Colombo': 'LK',\n  'Asia/Damascus': 'SY',\n  'Asia/Dhaka': 'BD',\n  'Asia/Dili': 'TL',\n  'Asia/Dubai': 'AE',\n  'Asia/Dushanbe': 'TJ',\n  'Asia/Gaza': 'PS',\n  'Asia/Harbin': 'CN',\n  'Asia/Hebron': 'PS',\n  'Asia/Ho_Chi_Minh': 'VN',\n  'Asia/Hong_Kong': 'HK',\n  'Asia/Hovd': 'MN',\n  'Asia/Irkutsk': 'RU',\n  'Asia/Jakarta': 'ID',\n  'Asia/Jayapura': 'ID',\n  'Asia/Jerusalem': 'IL',\n  'Asia/Kabul': 'AF',\n  'Asia/Kamchatka': 'RU',\n  'Asia/Karachi': 'PK',\n  'Asia/Kashgar': 'CN',\n  'Asia/Kathmandu': 'NP',\n  'Asia/Kolkata': 'IN',\n  'Asia/Krasnoyarsk': 'RU',\n  'Asia/Kuala_Lumpur': 'MY',\n  'Asia/Kuching': 'MY',\n  'Asia/Kuwait': 'KW',\n  'Asia/Macau': 'MO',\n  'Asia/Magadan': 'RU',\n  'Asia/Makassar': 'ID',\n  'Asia/Manila': 'PH',\n  'Asia/Muscat': 'OM',\n  'Asia/Nicosia': 'CY',\n  'Asia/Novokuznetsk': 'RU',\n  'Asia/Novosibirsk': 'RU',\n  'Asia/Omsk': 'RU',\n  'Asia/Oral': 'KZ',\n  'Asia/Phnom_Penh': 'KH',\n  'Asia/Pontianak': 'ID',\n  'Asia/Pyongyang': 'KP',\n  'Asia/Qatar': 'QA',\n  'Asia/Qyzylorda': 'KZ',\n  'Asia/Rangoon': 'MM',\n  'Asia/Riyadh': 'SA',\n  'Asia/Sakhalin': 'RU',\n  'Asia/Samarkand': 'UZ',\n  'Asia/Seoul': 'KR',\n  'Asia/Shanghai': 'CN',\n  'Asia/Singapore': 'SG',\n  'Asia/Taipei': 'TW',\n  'Asia/Tashkent': 'UZ',\n  'Asia/Tbilisi': 'GE',\n  'Asia/Tehran': 'IR',\n  'Asia/Thimphu': 'BT',\n  'Asia/Tokyo': 'JP',\n  'Asia/Ulaanbaatar': 'MN',\n  'Asia/Urumqi': 'CN',\n  'Asia/Vientiane': 'LA',\n  'Asia/Vladivostok': 'RU',\n  'Asia/Yakutsk': 'RU',\n  'Asia/Yekaterinburg': 'RU',\n  'Asia/Yerevan': 'AM',\n  'Atlantic/Azores': 'PT',\n  'Atlantic/Bermuda': 'BM',\n  'Atlantic/Canary': 'ES',\n  'Atlantic/Cape_Verde': 'CV',\n  'Atlantic/Faroe': 'FO',\n  'Atlantic/Madeira': 'PT',\n  'Atlantic/Reykjavik': 'IS',\n  'Atlantic/South_Georgia': 'GS',\n  'Atlantic/St_Helena': 'SH',\n  'Atlantic/Stanley': 'FK',\n  'Australia/Adelaide': 'AU',\n  'Australia/Brisbane': 'AU',\n  'Australia/Broken_Hill': 'AU',\n  'Australia/Currie': 'AU',\n  'Australia/Darwin': 'AU',\n  'Australia/Eucla': 'AU',\n  'Australia/Hobart': 'AU',\n  'Australia/Lindeman': 'AU',\n  'Australia/Lord_Howe': 'AU',\n  'Australia/Melbourne': 'AU',\n  'Australia/Perth': 'AU',\n  'Australia/Sydney': 'AU',\n  'Europe/Amsterdam': 'NL',\n  'Europe/Andorra': 'AD',\n  'Europe/Athens': 'GR',\n  'Europe/Belgrade': 'RS',\n  'Europe/Berlin': 'DE',\n  'Europe/Bratislava': 'SK',\n  'Europe/Brussels': 'BE',\n  'Europe/Bucharest': 'RO',\n  'Europe/Budapest': 'HU',\n  'Europe/Chisinau': 'MD',\n  'Europe/Copenhagen': 'DK',\n  'Europe/Dublin': 'IE',\n  'Europe/Gibraltar': 'GI',\n  'Europe/Guernsey': 'GG',\n  'Europe/Helsinki': 'FI',\n  'Europe/Isle_of_Man': 'IM',\n  'Europe/Istanbul': 'TR',\n  'Europe/Jersey': 'JE',\n  'Europe/Kaliningrad': 'RU',\n  'Europe/Kiev': 'UA',\n  'Europe/Lisbon': 'PT',\n  'Europe/Ljubljana': 'SI',\n  'Europe/London': 'GB',\n  'Europe/Luxembourg': 'LU',\n  'Europe/Madrid': 'ES',\n  'Europe/Malta': 'MT',\n  'Europe/Mariehamn': 'AX',\n  'Europe/Minsk': 'BY',\n  'Europe/Monaco': 'MC',\n  'Europe/Moscow': 'RU',\n  'Europe/Oslo': 'NO',\n  'Europe/Paris': 'FR',\n  'Europe/Podgorica': 'ME',\n  'Europe/Prague': 'CZ',\n  'Europe/Riga': 'LV',\n  'Europe/Rome': 'IT',\n  'Europe/Samara': 'RU',\n  'Europe/San_Marino': 'SM',\n  'Europe/Sarajevo': 'BA',\n  'Europe/Simferopol': 'UA',\n  'Europe/Skopje': 'MK',\n  'Europe/Sofia': 'BG',\n  'Europe/Stockholm': 'SE',\n  'Europe/Tallinn': 'EE',\n  'Europe/Tirane': 'AL',\n  'Europe/Uzhgorod': 'UA',\n  'Europe/Vaduz': 'LI',\n  'Europe/Vatican': 'VA',\n  'Europe/Vienna': 'AT',\n  'Europe/Vilnius': 'LT',\n  'Europe/Volgograd': 'RU',\n  'Europe/Warsaw': 'PL',\n  'Europe/Zagreb': 'HR',\n  'Europe/Zaporozhye': 'UA',\n  'Europe/Zurich': 'CH',\n  'Indian/Antananarivo': 'MG',\n  'Indian/Chagos': 'IO',\n  'Indian/Christmas': 'CX',\n  'Indian/Cocos': 'CC',\n  'Indian/Comoro': 'KM',\n  'Indian/Kerguelen': 'TF',\n  'Indian/Mahe': 'SC',\n  'Indian/Maldives': 'MV',\n  'Indian/Mauritius': 'MU',\n  'Indian/Mayotte': 'YT',\n  'Indian/Reunion': 'RE',\n  'Pacific/Apia': 'WS',\n  'Pacific/Auckland': 'NZ',\n  'Pacific/Chatham': 'NZ',\n  'Pacific/Chuuk': 'FM',\n  'Pacific/Easter': 'CL',\n  'Pacific/Efate': 'VU',\n  'Pacific/Enderbury': 'KI',\n  'Pacific/Fakaofo': 'TK',\n  'Pacific/Fiji': 'FJ',\n  'Pacific/Funafuti': 'TV',\n  'Pacific/Galapagos': 'EC',\n  'Pacific/Gambier': 'PF',\n  'Pacific/Guadalcanal': 'SB',\n  'Pacific/Guam': 'GU',\n  'Pacific/Honolulu': 'US',\n  'Pacific/Johnston': 'UM',\n  'Pacific/Kiritimati': 'KI',\n  'Pacific/Kosrae': 'FM',\n  'Pacific/Kwajalein': 'MH',\n  'Pacific/Majuro': 'MH',\n  'Pacific/Marquesas': 'PF',\n  'Pacific/Midway': 'UM',\n  'Pacific/Nauru': 'NR',\n  'Pacific/Niue': 'NU',\n  'Pacific/Norfolk': 'NF',\n  'Pacific/Noumea': 'NC',\n  'Pacific/Pago_Pago': 'AS',\n  'Pacific/Palau': 'PW',\n  'Pacific/Pitcairn': 'PN',\n  'Pacific/Pohnpei': 'FM',\n  'Pacific/Port_Moresby': 'PG',\n  'Pacific/Rarotonga': 'CK',\n  'Pacific/Saipan': 'MP',\n  'Pacific/Tahiti': 'PF',\n  'Pacific/Tarawa': 'KI',\n  'Pacific/Tongatapu': 'TO',\n  'Pacific/Wake': 'UM',\n  'Pacific/Wallis': 'WF',\n};\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"DatabaseConnectionDelete\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseConnectionDelete\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"databaseConnectionId\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":127}};\n    doc.loc.source = {\"body\":\"mutation DatabaseConnectionDelete(\\n  $id: ID!\\n) {\\n  databaseConnectionDelete(\\n    id: $id,\\n  ) {\\n    databaseConnectionId\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"DatabaseConnectionDelete\"] = oneQuery(doc, \"DatabaseConnectionDelete\");\n        \n","import { includes } from 'lodash';\n\nconst POLECAT_SERVICES = ['spreadsheets', 'salesforce', 'datasets'];\n\nfunction isPolecatService(serviceName, serviceType) {\n  if (serviceType === 'universal') {\n    return true;\n  }\n  if (includes(POLECAT_SERVICES, serviceName)) {\n    return true;\n  }\n\n  return false;\n}\n\nexport { isPolecatService };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---nAy5K\"};","import React from 'react';\n\nimport style from './bar-loading-animation-styles.scss';\n\nconst BarLoadingAnimation = () => {\n  return (\n    <div className={style.loadAnimationContainer}>\n      <div className={style.loaderBar} />\n      <div className={style.loaderBar} />\n      <div className={style.loaderBar} />\n      <div className={style.loaderBar} />\n      <div className={style.loaderBar} />\n    </div>\n  );\n};\n\nexport default BarLoadingAnimation;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../lib/i18n';\nimport BarLoadingAnimation from './bar-loading-animation';\n\nimport style from './widget-loader-styles.scss';\n\nclass WidgetLoader extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      showSlowLoadingMsg: false,\n    };\n  }\n\n  componentDidMount() {\n    const { status } = this.props;\n    if (status === 'waitingInitialServerSideRefresh') {\n      this.startSlowLoadingTimer();\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.timer) {\n      clearTimeout(this.timer);\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (\n      nextProps.status === 'waitingInitialServerSideRefresh' &&\n      this.props.status !== nextProps.status\n    ) {\n      this.startSlowLoadingTimer();\n    }\n  }\n\n  renderLoadingMessage() {\n    const { showSlowLoadingMsg } = this.state;\n    const { status, serviceTitle } = this.props;\n\n    if (showSlowLoadingMsg) {\n      return <FormattedMessage id=\"widget.loader.fetching.data\" />;\n    }\n\n    if (status === 'waitingInitialServerSideRefresh') {\n      return (\n        <FormattedMessage\n          id=\"widget.loader.waiting.data\"\n          values={{ integration: serviceTitle }}\n        />\n      );\n    }\n\n    return <FormattedMessage id=\"widget.loader.building\" />;\n  }\n\n  render() {\n    return (\n      <div className={style.widgetLoader}>\n        <div className={style.test}>\n          <BarLoadingAnimation />\n          <div className={style.message}>{this.renderLoadingMessage()}</div>\n        </div>\n      </div>\n    );\n  }\n\n  startSlowLoadingTimer() {\n    const { showSlowLoadingMsg } = this.state;\n\n    if (!this.timer && !showSlowLoadingMsg) {\n      this.timer = setTimeout(() => {\n        this.setState({ showSlowLoadingMsg: true });\n      }, 15000);\n    }\n  }\n}\n\nWidgetLoader.propTypes = {\n  serviceTitle: PropTypes.string,\n  status: PropTypes.oneOf(['loading', 'waitingInitialServerSideRefresh']),\n};\n\nexport default WidgetLoader;\n","import WidgetLoader from './widget-loader-component';\n\nexport default WidgetLoader;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../lib/i18n';\n\nclass ServiceAccountNotFoundComponent extends PureComponent {\n  render() {\n    const { canEdit, serviceTitle, onEdit } = this.props;\n\n    return (\n      <div>\n        <FormattedMessage\n          id=\"widget.error.serviceAccountNotFound.description\"\n          values={{ serviceTitle }}\n        />{' '}\n        {canEdit && (\n          <a onClick={onEdit}>\n            <FormattedMessage id=\"widget.error.serviceAccountNotFound.reconnect\" />\n          </a>\n        )}\n      </div>\n    );\n  }\n}\n\nServiceAccountNotFoundComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  serviceTitle: PropTypes.string,\n  onEdit: PropTypes.func,\n};\n\nexport default ServiceAccountNotFoundComponent;\n","import { connect } from 'react-redux';\nimport ServiceAccountNotFoundErrorComponent from './service-account-not-found-error-component';\nimport * as widgetActions from '../../actions/widget-actions';\n\nconst mapStateToProps = (state, { widgetKey, canEdit, serviceTitle }) => {\n  return {\n    widgetKey,\n    canEdit,\n    serviceTitle,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  return {\n    onEdit: () => dispatch(widgetActions.editWidget(props.widgetKey)),\n  };\n};\n\nconst ServiceAccountNotFoundErrorConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(ServiceAccountNotFoundErrorComponent);\n\nexport default ServiceAccountNotFoundErrorConnector;\n","import ServiceAccountNotFound from './service-account-not-found-error-connector';\nexport default ServiceAccountNotFound;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../lib/i18n';\n\nclass OAuthTokenExpiredOrInvalidErrorComponent extends PureComponent {\n  render() {\n    const { canEdit, serviceTitle, dataSourcesLink } = this.props;\n\n    return (\n      <div>\n        <FormattedMessage\n          id=\"widget.error.oauthTokenExpiredOrInvalid.description\"\n          values={{ serviceTitle }}\n        />{' '}\n        {canEdit && (\n          <a href={dataSourcesLink}>\n            <FormattedMessage id=\"widget.error.oauthTokenExpiredOrInvalid.reconnect\" />\n          </a>\n        )}\n      </div>\n    );\n  }\n}\n\nOAuthTokenExpiredOrInvalidErrorComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  dataSourcesLink: PropTypes.string,\n  serviceTitle: PropTypes.string,\n};\n\nexport default OAuthTokenExpiredOrInvalidErrorComponent;\n","import { connect } from 'react-redux';\nimport OauthTokenExpiredOrInvalidErrorComponent from './oauth-token-expired-or-invalid-error-component';\n\nconst mapStateToProps = ({ user }) => {\n  const {\n    user: { default_group_id: groupId },\n  } = user;\n\n  const dataSourcesLink = `/admin/groups/${groupId}/data-sources`;\n  return { dataSourcesLink };\n};\n\nconst OauthTokenExpiredOrInvalidErrorConnector = connect(mapStateToProps)(\n  OauthTokenExpiredOrInvalidErrorComponent,\n);\n\nexport default OauthTokenExpiredOrInvalidErrorConnector;\n","import OAuthTokenExpiredOrInvalidError from './oauth-token-expired-or-invalid-error-connector';\nexport default OAuthTokenExpiredOrInvalidError;\n","import React from 'react';\nimport FormattedMessage from '../../lib/i18n';\nimport style from './widget-importing-style.scss';\n\nconst WidgetImporting = () => (\n  <div className={style.widgetImporting}>\n    <FormattedMessage id=\"widget.importingData\" />\n  </div>\n);\n\nexport default WidgetImporting;\n","import WidgetImporting from './widget-importing-component';\nexport default WidgetImporting;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../../lib/i18n';\nimport copy from '../../../lib/copy-to-clipboard';\nimport classNames from 'classnames';\n\nimport style from './no-data-pushed-error-style.scss';\n\nclass NoDataPushedComponent extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = { copied: false };\n\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  componentWillUnmount() {\n    clearTimeout(this.timeout);\n  }\n\n  async handleClick() {\n    const { widgetKey } = this.props;\n\n    try {\n      await copy(widgetKey);\n      this.setState({ copied: true });\n\n      this.timeout = setTimeout(() => {\n        this.setState({ copied: false });\n      }, 1e3);\n    } catch (error) {\n      throw error;\n    }\n  }\n\n  render() {\n    const { widgetKey, canEdit } = this.props;\n    const linkClassNames = classNames(style.copieable, {\n      [style.copied]: !!this.state.copied,\n    });\n\n    if (!canEdit) {\n      return (\n        <span>\n          <FormattedMessage id=\"widget.error.noDataPushed.noEdit.description\" />\n        </span>\n      );\n    }\n\n    return (\n      <div>\n        <FormattedHTMLMessage\n          id=\"widget.error.noDataPushed.description\"\n          values={{ widgetKey }}\n        />\n        <br />\n        <a className={linkClassNames} onClick={this.handleClick}>\n          <FormattedMessage id=\"widget.error.noDataPushed.copyText\" />\n        </a>\n      </div>\n    );\n  }\n}\n\nNoDataPushedComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  widgetKey: PropTypes.string,\n};\n\nexport default NoDataPushedComponent;\n","import NoDataPushedError from './no-data-pushed-error-component';\nexport default NoDataPushedError;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../lib/i18n';\n\nclass WidgetDataError extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = { showModal: false };\n  }\n\n  render() {\n    const { message } = this.props;\n\n    return (\n      <div>\n        <FormattedMessage id=\"widget.error.dataError.description\" />\n        <br />\n        <span>{message}</span>\n      </div>\n    );\n  }\n\n  toggleModal() {\n    this.setState({ showModal: !this.state.showModal });\n  }\n}\n\nWidgetDataError.propTypes = {\n  message: PropTypes.string,\n};\n\nexport default WidgetDataError;\n","import WidgetDataError from './widget-data-error-component';\nexport default WidgetDataError;\n","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getNavigator, getWindow } from '../../lib/global';\n\nclass MobileDetectorComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOffline: getNavigator() ? !getNavigator().onLine : false,\n    };\n\n    this.onOnlineStatusChange = this.onOnlineStatusChange.bind(this);\n  }\n\n  componentDidMount() {\n    getWindow().addEventListener('online', this.onOnlineStatusChange);\n    getWindow().addEventListener('offline', this.onOnlineStatusChange);\n  }\n\n  componentWillUnmount() {\n    getWindow().removeEventListener('online', this.onOnlineStatusChange);\n    getWindow().removeEventListener('offline', this.onOnlineStatusChange);\n  }\n\n  onOnlineStatusChange() {\n    this.setState({\n      isOffline: !getNavigator().onLine,\n    });\n  }\n\n  render() {\n    return this.props.render(this.state.isOffline);\n  }\n}\n\nMobileDetectorComponent.propTypes = {\n  render: PropTypes.func.isRequired,\n  features: PropTypes.array,\n};\n\nexport default MobileDetectorComponent;\n","import OfflineDetector from './offline-detector-component';\n\nexport default OfflineDetector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport FormattedMessage from '../../lib/i18n';\n\nimport style from './offline-banner-styles.scss';\n\nconst OfflineBanner = ({ bannerClass }) => {\n  const classes = classNames(style.offlineBanner, {\n    [bannerClass]: bannerClass,\n  });\n  return (\n    <div className={classes}>\n      <FormattedMessage id=\"mobile.noConnection\" />\n    </div>\n  );\n};\n\nOfflineBanner.propTypes = {\n  bannerClass: PropTypes.string,\n};\n\nexport default OfflineBanner;\n","import OfflineBanner from './offline-banner-component';\n\nexport default OfflineBanner;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"account\":\"account---1Iehd\",\"addBtn\":\"addBtn---2K-eQ\",\"selectAccount\":\"selectAccount---3CKB1\",\"error\":\"error---3NJZT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---2hDu6\",\"files\":\"files---2nxRE\",\"noResult\":\"noResult---18vGq\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"salesforceConnector\":\"salesforceConnector---3EnQ8\",\"header\":\"header---1szw8\",\"content\":\"content---2PNLl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"helpLink\":\"helpLink---jj9lc\",\"helpLinkContainer\":\"helpLinkContainer---2eW3f\",\"helpLinkIcon\":\"helpLinkIcon---BFsvl\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"logo\":\"logo---1cX8i\",\"link\":\"link---27l8X\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"buttons\":\"buttons---lL_IW\",\"startTrialButton\":\"startTrialButton---Net3-\",\"upgradeButton\":\"upgradeButton---13NpL\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"CreateScheduledPost\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPostInput\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ScheduledPostInput\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"createScheduledPost\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPostInput\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPostInput\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPost\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"UpdateScheduledPost\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"updateScheduledPost\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scheduledPost\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannelId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"timeHour\"},\"arguments\":[],\"directives\":[]}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"RemoveScheduledPost\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"deleteScheduledPost\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"postId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"success\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":580}};\n    doc.loc.source = {\"body\":\"mutation CreateScheduledPost($scheduledPostInput: ScheduledPostInput!) {\\n  createScheduledPost(scheduledPostInput: $scheduledPostInput) {\\n    scheduledPost {\\n      id,\\n      slackChannelId,\\n      timeHour\\n    }\\n  }\\n}\\n\\nmutation UpdateScheduledPost($postId: ID!, $slackChannelId: ID!, $timeHour: Int!) {\\n  updateScheduledPost(postId: $postId, slackChannelId: $slackChannelId, timeHour: $timeHour) {\\n    scheduledPost {\\n      id,\\n      slackChannelId,\\n      timeHour\\n    }\\n  }\\n}\\n\\nmutation RemoveScheduledPost($postId: ID!) {\\n  deleteScheduledPost(postId: $postId) {\\n    success\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"CreateScheduledPost\"] = oneQuery(doc, \"CreateScheduledPost\");\n        \n        module.exports[\"UpdateScheduledPost\"] = oneQuery(doc, \"UpdateScheduledPost\");\n        \n        module.exports[\"RemoveScheduledPost\"] = oneQuery(doc, \"RemoveScheduledPost\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"fullscreen\":\"fullscreen---3Nq21\",\"preview\":\"preview---JDEJI\",\"customizeLink\":\"customizeLink---2_UTb\",\"sharingMenu\":\"sharingMenu---1DmuN\",\"mobileBeta\":\"mobileBeta---2RaGA\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"crumb\":\"crumb---1VJw-\",\"groupName\":\"groupName---3un65 crumb---1VJw-\",\"masthead\":\"masthead---SzbU2\",\"dashifyButton\":\"dashifyButton---3RZ-h\",\"setContainerLayoutButton\":\"setContainerLayoutButton---2c-Su\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"fileTitle\":\"fileTitle---18Iy9\",\"dropMenu\":\"dropMenu---33PE4\",\"dropList\":\"dropList---1E6hT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"ServiceList\":\"ServiceList---1vhcs\",\"wrapper\":\"wrapper---UxnXJ\",\"manageLink\":\"manageLink---2zTqF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"widgetLoader\":\"widgetLoader---1esTh\",\"test\":\"test---3Ss36\",\"message\":\"message---1E8E5\"};","// expected hue range: [0, 360)\n// expected saturation range: [0, 1]\n// expected lightness range: [0, 1]\nvar hslToRgb = function(hue, saturation, lightness){\n  // based on algorithm from http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB\n  if( hue == undefined ){\n    return [0, 0, 0];\n  }\n\n  var chroma = (1 - Math.abs((2 * lightness) - 1)) * saturation;\n  var huePrime = hue / 60;\n  var secondComponent = chroma * (1 - Math.abs((huePrime % 2) - 1));\n\n  huePrime = Math.floor(huePrime);\n  var red;\n  var green;\n  var blue;\n\n  if( huePrime === 0 ){\n    red = chroma;\n    green = secondComponent;\n    blue = 0;\n  }else if( huePrime === 1 ){\n    red = secondComponent;\n    green = chroma;\n    blue = 0;\n  }else if( huePrime === 2 ){\n    red = 0;\n    green = chroma;\n    blue = secondComponent;\n  }else if( huePrime === 3 ){\n    red = 0;\n    green = secondComponent;\n    blue = chroma;\n  }else if( huePrime === 4 ){\n    red = secondComponent;\n    green = 0;\n    blue = chroma;\n  }else if( huePrime === 5 ){\n    red = chroma;\n    green = 0;\n    blue = secondComponent;\n  }\n\n  var lightnessAdjustment = lightness - (chroma / 2);\n  red += lightnessAdjustment;\n  green += lightnessAdjustment;\n  blue += lightnessAdjustment;\n\n  return [\n      Math.abs(Math.round(red * 255)),\n      Math.abs(Math.round(green * 255)),\n      Math.abs(Math.round(blue * 255))\n  ];\n\n};\n\nmodule.exports = hslToRgb;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spreadsheetsConnector\":\"spreadsheetsConnector---2L9-f\",\"header\":\"header---24MET\",\"serviceIcon\":\"serviceIcon---1aJRC\",\"body\":\"body---1gEGN\",\"lSidebar\":\"lSidebar---2mkKk\",\"lSwitchingService\":\"lSwitchingService---3XiOZ\",\"content\":\"content---rKR0v\"};","module.exports = (__webpack_require__(28))(1416);","module.exports = (__webpack_require__(28))(1419);","module.exports = (__webpack_require__(28))(1425);","module.exports = (__webpack_require__(28))(1428);","module.exports = (__webpack_require__(28))(1431);","module.exports = (__webpack_require__(28))(1434);","module.exports = (__webpack_require__(28))(1438);","module.exports = (__webpack_require__(28))(1441);","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport _, { partial } from 'lodash';\nimport { connect } from 'react-redux';\nimport DefaultDataSourceConnectorComponent from './default-data-source-connector-component';\nimport {\n  addConnection,\n  initConnector,\n} from '../actions/data-source-connector-actions';\n\nclass DefaultDataSourceInit extends Component {\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillMount() {\n    this.props.onInit();\n  }\n\n  render() {\n    return <DefaultDataSourceConnectorComponent {...this.props} />;\n  }\n}\nDefaultDataSourceInit.propTypes = {\n  onInit: PropTypes.func,\n};\n\nconst DefaultDataSourceConnectorRedux = connect(\n  state => state.defaultDataSourceConnector,\n  (dispatch, { dashboardId, serviceId, onConnect: inheritedOnConnect }) => {\n    let onConnect = inheritedOnConnect;\n\n    if (!onConnect) {\n      onConnect = (...args) => {\n        dispatch(addConnection(...args));\n      };\n    }\n\n    const onInit = () => {\n      dispatch(initConnector(dashboardId, serviceId));\n    };\n\n    return { onConnect, onInit };\n  },\n  (stateProps, dispatchProps, ownProps) => {\n    const { groupId, service } = stateProps;\n    const { onConnect } = dispatchProps;\n    const { onConnectionSuccess } = ownProps;\n\n    return {\n      ...stateProps,\n      ...dispatchProps,\n      ...ownProps,\n      onConnect: partial(onConnect, groupId, service, _, onConnectionSuccess),\n    };\n  },\n)(DefaultDataSourceInit);\n\nexport default DefaultDataSourceConnectorRedux;\n","import DefaultDataSourceConnectorConnector from './default-data-source-connector-connector';\nexport default DefaultDataSourceConnectorConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport SelectDropdown from '../components/select-dropdown';\nimport Button from '@UI/button';\nimport { find } from 'lodash';\nimport style from './account-selector-style.scss';\n\nclass AccountSelectorComponent extends Component {\n  renderError() {\n    const {\n      accounts,\n      selectedId,\n      isServiceAccountExpired,\n      dataSourcesLink,\n    } = this.props;\n    const account = find(accounts, { id: selectedId });\n\n    if (isServiceAccountExpired && account) {\n      const {\n        service: { title },\n      } = account;\n\n      return (\n        <div className={style.error}>\n          {`Your ${title} account has expired. `}\n          <a href={dataSourcesLink}>Reconnect</a>\n        </div>\n      );\n    }\n\n    return null;\n  }\n\n  render() {\n    const { accounts, selectedId, selectAction, addAction } = this.props;\n    const options = accounts.map(({ id, name }) => ({\n      value: id,\n      label: name,\n    }));\n\n    return (\n      <div>\n        <div className={style.account}>\n          <SelectDropdown\n            options={options}\n            selected={selectedId}\n            onChange={selectAction}\n            layoutClassName={style.selectAccount}\n          />\n          <Button\n            onClick={addAction}\n            intent={Button.INTENT.SECONDARY}\n            icon=\"plus\"\n          >\n            Add account\n          </Button>\n        </div>\n        {this.renderError()}\n      </div>\n    );\n  }\n}\n\nAccountSelectorComponent.propTypes = {\n  accounts: PropTypes.array,\n  addAction: PropTypes.func,\n  dataSourcesLink: PropTypes.string,\n  isServiceAccountExpired: PropTypes.bool,\n  selectAction: PropTypes.func,\n  selectedId: PropTypes.number,\n};\n\nexport default AccountSelectorComponent;\n","import AccountSelectorComponent from './account-selector-connector';\nexport default AccountSelectorComponent;\n","import { connect } from 'react-redux';\nimport AccountSelectorComponent from './account-selector-component';\n\nconst mapStateToProps = ({ user }) => {\n  const {\n    user: { default_group_id: groupId },\n  } = user;\n\n  const dataSourcesLink = `/admin/groups/${groupId}/data-sources`;\n  return { dataSourcesLink };\n};\n\nconst AccountSelectorConnector = connect(mapStateToProps)(\n  AccountSelectorComponent,\n);\n\nexport default AccountSelectorConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport moment from 'moment';\nimport { bindAll } from 'lodash';\nimport Tooltip from '../../components/tooltip';\nimport StatusLabelComponent from '../../components/status-label';\nimport Layout from '../../components/layout';\n\nimport style from './file-row-style.scss';\n\nclass FileRowComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { isLoading: false };\n\n    bindAll(this, 'handleClick', 'renderBetaLabel');\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (!nextProps.isSelected || nextProps.errorMessage) {\n      this.setState({ isLoading: false });\n    }\n  }\n\n  handleClick() {\n    const { id, onFileSelected, disabled } = this.props;\n\n    if (disabled) return;\n\n    onFileSelected(id);\n\n    this.setState({ isLoading: true });\n  }\n\n  renderDate(date) {\n    if (!date) return null;\n\n    const lastModified = moment(date);\n    const formatted = lastModified.format('MMM DD YYYY');\n\n    return (\n      <time className={style.info} dateTime={lastModified.format()}>\n        {formatted}\n      </time>\n    );\n  }\n\n  renderFolder(folder) {\n    if (!folder) return null;\n\n    return <span className={style.folder}>in {folder}</span>;\n  }\n\n  renderTooltip() {\n    const { disabled, wrongTypeMsg } = this.props;\n\n    if (!disabled) return null;\n\n    return (\n      <Tooltip className={style.tooltip} tooltip={wrongTypeMsg}>\n        <i className=\"fa-question-circle\" />\n      </Tooltip>\n    );\n  }\n\n  renderBetaLabel() {\n    const { isBeta } = this.props;\n    if (isBeta) {\n      return (\n        <Layout inlineFlex marginLeft={1}>\n          <StatusLabelComponent type=\"beta\" />\n        </Layout>\n      );\n    }\n    return null;\n  }\n\n  render() {\n    if (!this.props.title) return null;\n\n    const {\n      title,\n      modified_at: modifiedAt,\n      folder,\n      disabled,\n      isDemo,\n      isTabular,\n    } = this.props;\n    const info = folder\n      ? this.renderFolder(folder)\n      : this.renderDate(modifiedAt);\n\n    const classes = classNames({\n      loading: this.state.isLoading,\n      [style.enabled]: !disabled,\n      [style.disabled]: disabled,\n      [style.isDemo]: isDemo,\n      [style.isTabular]: isTabular,\n    });\n\n    return (\n      <li onClick={this.handleClick} className={classes}>\n        <button className={style.title}>\n          {title}\n          {this.renderBetaLabel()}\n        </button>\n        {this.renderTooltip()}\n        {info}\n      </li>\n    );\n  }\n}\n\nFileRowComponent.defaultProps = {\n  isDemo: false,\n};\n\nFileRowComponent.propTypes = {\n  disabled: PropTypes.bool,\n  errorMessage: PropTypes.string,\n  folder: PropTypes.string,\n  id: PropTypes.string,\n  isBeta: PropTypes.bool,\n  isDemo: PropTypes.bool,\n  isSelected: PropTypes.bool,\n  isTabular: PropTypes.bool,\n  modified_at: PropTypes.string,\n  title: PropTypes.string,\n  wrongTypeMsg: PropTypes.string,\n  onFileSelected: PropTypes.func,\n};\n\nexport default FileRowComponent;\n","import FileRowComponent from './file-row-component';\nexport default FileRowComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './folder-row-style.scss';\n\nconst FolderRowComponent = ({ title, onSelectFolder }) => {\n  if (!title) return null;\n\n  return (\n    <li onClick={onSelectFolder} className={style.item}>\n      {title}\n    </li>\n  );\n};\n\nFolderRowComponent.propTypes = {\n  title: PropTypes.string,\n  onSelectFolder: PropTypes.func,\n};\n\nexport default FolderRowComponent;\n","import FolderRowConnector from './folder-row-connector';\nexport default FolderRowConnector;\n","import { connect } from 'react-redux';\nimport { setSelectedFolder } from '../actions/picker-actions';\nimport FolderRowComponent from './folder-row-component';\n\nexport default connect(undefined, (dispatch, { title }) => {\n  const onSelectFolder = () => {\n    dispatch(setSelectedFolder(title));\n  };\n\n  return { onSelectFolder };\n})(FolderRowComponent);\n","/* eslint camelcase: 0 */\nimport PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll, chain, uniqueId, includes } from 'lodash';\nimport FileRowComponent from '../file-row';\nimport FolderRowComponent from '../folder-row';\n\nimport style from './list-style.scss';\n\nclass ListComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, 'renderFileRow', 'renderFolderRow', 'renderItems');\n  }\n\n  renderFileRow({\n    id,\n    title,\n    type,\n    label,\n    modified_at,\n    last_modified,\n    folder,\n    demo = false,\n  } = {}) {\n    const {\n      selected,\n      onFileSelected,\n      errorMessage,\n      folder: currentFolder,\n      isFiltered,\n      hasFolder,\n      supportedTypes,\n      betaTypes,\n      tabularTypes,\n      wrongTypeMsg,\n    } = this.props;\n\n    const folderName =\n      hasFolder && isFiltered && !currentFolder ? folder : null;\n    const isSelected = selected && selected === id;\n    const isBeta = includes(betaTypes, type);\n    const isTabular = includes(tabularTypes, type);\n    const disabled =\n      !isBeta &&\n      !isTabular &&\n      supportedTypes &&\n      type &&\n      !includes(supportedTypes, type);\n\n    return (\n      <FileRowComponent\n        id={id}\n        key={id}\n        title={title || label}\n        modified_at={modified_at || last_modified}\n        folder={folderName}\n        isSelected={isSelected}\n        errorMessage={errorMessage}\n        onFileSelected={onFileSelected}\n        disabled={disabled}\n        isBeta={isBeta}\n        isTabular={isTabular}\n        wrongTypeMsg={wrongTypeMsg}\n        isDemo={demo}\n      />\n    );\n  }\n\n  renderFolderRow(title) {\n    return <FolderRowComponent key={uniqueId('folder_')} title={title} />;\n  }\n\n  renderItems() {\n    const { files, hasFolder, folder, isFiltered } = this.props;\n    const groupByFolder = hasFolder && !folder && !isFiltered;\n\n    let items;\n\n    if (!files.length) {\n      return <div className={style.noResult}>No results found</div>;\n    }\n\n    if (groupByFolder) {\n      const folders = chain(files)\n        .groupBy('folder')\n        .keys()\n        .sort()\n        .value();\n\n      items = folders.map(this.renderFolderRow);\n    } else {\n      items = files.map(this.renderFileRow);\n    }\n\n    return <ol className={style.files}>{items}</ol>;\n  }\n\n  render() {\n    const { files } = this.props;\n\n    if (!files) return null;\n\n    return <div className={style.wrapper}>{this.renderItems()}</div>;\n  }\n}\n\nListComponent.propTypes = {\n  betaTypes: PropTypes.array,\n  errorMessage: PropTypes.string,\n  files: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  folder: PropTypes.string,\n  hasFolder: PropTypes.bool,\n  id: PropTypes.string,\n  isFiltered: PropTypes.bool,\n  label: PropTypes.string,\n  last_modified: PropTypes.string,\n  modified_at: PropTypes.string,\n  selected: PropTypes.string,\n  supportedTypes: PropTypes.array,\n  tabularTypes: PropTypes.array,\n  title: PropTypes.string,\n  type: PropTypes.string,\n  wrongTypeMsg: PropTypes.string,\n  onFileSelected: PropTypes.func,\n};\n\nexport default ListComponent;\n","import ListComponent from './list-component';\nexport default ListComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\n\nimport style from './breadcrumb-style.scss';\n\nclass BreadcrumbComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'goToRoot');\n  }\n\n  renderFolder(folder) {\n    if (!folder) return null;\n    return <span className={style.path}>{folder}</span>;\n  }\n\n  render() {\n    const { folder } = this.props;\n    const rootClass = folder ? `${style.clickablePath}` : `${style.path}`;\n\n    return (\n      <div className={style.breadcrumb}>\n        <span className={rootClass} onClick={this.goToRoot}>\n          All Folders\n        </span>\n        {this.renderFolder(folder)}\n      </div>\n    );\n  }\n\n  goToRoot() {\n    const { folder, onFolderSelected } = this.props;\n\n    if (!folder) return;\n    onFolderSelected(null);\n  }\n}\n\nBreadcrumbComponent.propTypes = {\n  folder: PropTypes.string,\n  onFolderSelected: PropTypes.func,\n};\n\nexport default BreadcrumbComponent;\n","import BreadcrumbComponent from './breadcrumb-component';\nexport default BreadcrumbComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport List from '../list';\nimport Breadcrumb from '../breadcrumb';\nimport classNames from 'classnames';\nimport ErrorComponent from '../../components/error';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport { isString } from 'lodash';\n\nimport style from './file-picker-style.scss';\n\nclass FilePickerComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.handleChange = this.handleChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.state = { query: props.query || '' };\n  }\n\n  static getDerivedStateFromProps(props) {\n    if (isString(props.query)) {\n      return { query: props.query };\n    }\n\n    if (props.isLoadingList) {\n      return { query: '' };\n    }\n\n    return null;\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n    const { filterAttribute, onSearch } = this.props;\n\n    onSearch(this.state.query, filterAttribute);\n  }\n\n  handleChange(e) {\n    const { filterAttribute, onSearch } = this.props;\n    const query = e.target.value;\n    this.setState({ query });\n\n    onSearch(query, filterAttribute);\n  }\n\n  renderInput() {\n    const { serviceName } = this.props;\n\n    return (\n      <input\n        type=\"search\"\n        key={serviceName}\n        placeholder=\"Search\"\n        onChange={this.handleChange}\n        value={this.state.query}\n      />\n    );\n  }\n\n  renderSearch() {\n    const { isFetching } = this.props;\n    const classes = classNames(style.search, { loading: isFetching });\n\n    return (\n      <form className={classes} onSubmit={this.handleSubmit}>\n        {this.renderInput()}\n      </form>\n    );\n  }\n\n  renderBreadcrumb() {\n    const { hasFolder, folder, errorMessage, onFolderSelected } = this.props;\n\n    if (errorMessage) return null;\n    if (!hasFolder) return null;\n\n    return <Breadcrumb folder={folder} onFolderSelected={onFolderSelected} />;\n  }\n\n  renderList() {\n    const { errorMessage } = this.props;\n\n    if (errorMessage) return null;\n\n    return (\n      <List\n        {...this.props}\n        files={this.props.files}\n        selected={this.props.selected}\n        errorMessage={this.props.importErrorMessage}\n        hasFolder={this.props.hasFolder}\n        isFiltered={!!this.props.query}\n        onFileSelected={this.props.onFileSelected}\n        supportedTypes={this.props.supportedTypes}\n        wrongTypeMsg={this.props.wrongTypeMsg}\n      />\n    );\n  }\n\n  render() {\n    const { isLoadingList, errorMessage, importErrorMessage } = this.props;\n\n    if (isLoadingList) {\n      return (\n        <div className={style.picker}>\n          <LoadingSpinner\n            className={style.lLoadingList}\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </div>\n      );\n    }\n\n    return (\n      <div className={style.picker}>\n        {this.renderSearch()}\n        <ErrorComponent\n          className={style.error}\n          errorMessage={errorMessage || importErrorMessage}\n        />\n        {this.renderBreadcrumb()}\n        {this.renderList()}\n      </div>\n    );\n  }\n}\n\nFilePickerComponent.propTypes = {\n  accountId: PropTypes.number,\n  errorMessage: PropTypes.string,\n  files: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n  filterAttribute: PropTypes.string,\n  folder: PropTypes.string,\n  hasFolder: PropTypes.bool,\n  importErrorMessage: PropTypes.string,\n  isFetching: PropTypes.bool,\n  isLoadingList: PropTypes.bool,\n  query: PropTypes.string,\n  selected: PropTypes.string,\n  serviceName: PropTypes.string,\n  supportedTypes: PropTypes.array,\n  wrongTypeMsg: PropTypes.string,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n  onSearch: PropTypes.func,\n};\n\nexport default FilePickerComponent;\n","import { connect } from 'react-redux';\nimport { isFunction } from 'lodash';\nimport FilePickerComponent from './file-picker-component';\nimport { filterSearch, searchFiles } from '../actions/picker-actions';\n\nconst mapStateToProps = ({ filePicker }, ownProps) => {\n  const { comparer } = ownProps;\n  let { files } = filePicker;\n  if (isFunction(comparer)) {\n    files = files.sort(comparer);\n  }\n\n  return { ...filePicker, files };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  const { serviceName, accountId } = ownProps;\n  const onSearch = (query, filterAttribute) => {\n    if (filterAttribute) {\n      dispatch(filterSearch(filterAttribute, query));\n    } else {\n      dispatch(searchFiles(serviceName, accountId, query));\n    }\n  };\n\n  return { onSearch };\n};\n\nconst FilePickerConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(FilePickerComponent);\n\nexport default FilePickerConnector;\n","import FilePicker from './file-picker';\nexport default FilePicker;\n","const comparerGenerator = (key, order = 'asc') => {\n  return (a, b) => {\n    const valA = a[key];\n    const valB = b[key];\n\n    // Don't sort when we have no modified date\n    // unstable sorts (like Chrome's) will move\n    // stuff around\n    if (valA === undefined || valB === undefined) {\n      return 0;\n    }\n\n    if (order === 'desc') {\n      return valA < valB ? 1 : -1;\n    }\n\n    return valA > valB ? 1 : -1;\n  };\n};\n\nexport default comparerGenerator;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport AccountSelector from '../../../../../account-selector';\nimport FilePicker from '../../../../../file-picker';\nimport ErrorComponent from '../../../../../components/error';\nimport comparerGenerator from '../../../../../lib/comparer-generator';\nimport ServiceIcon from '../../../../../components/service-icon';\n\nimport style from './salesforce-popover-style.scss';\n\nconst COMPARER = comparerGenerator('last_modified', 'desc');\n\nexport const TITLE = 'Choose Report';\nexport const SUBTITLE =\n  'Choose the Salesforce report you would like to visualise.';\nexport const SUPPORTED_REPORT_TYPES = ['Summary', 'Matrix'];\nexport const TABULAR_REPORT_TYPES = ['Tabular'];\nexport const WRONG_TYPE_MSG = `This is a tabular or joined report.\nOnly summary and matrix\nreports can be visualised.`;\n\nclass SalesforcePopoverComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'renderContent');\n  }\n\n  renderHeader() {\n    return (\n      <header className={style.header}>\n        <ServiceIcon serviceName=\"salesforce\" size={73} />\n        <h3>{TITLE}</h3>\n        <p>{SUBTITLE}</p>\n      </header>\n    );\n  }\n\n  renderContent() {\n    const {\n      accountId,\n      isSwitchingAccount,\n      onFileSelected,\n      onFolderSelected,\n    } = this.props;\n\n    return (\n      <FilePicker\n        accountId={accountId}\n        serviceName=\"salesforce\"\n        filterAttribute=\"label\"\n        comparer={COMPARER}\n        hasFolder\n        isLoadingList={isSwitchingAccount}\n        onFileSelected={onFileSelected}\n        onFolderSelected={onFolderSelected}\n        supportedTypes={SUPPORTED_REPORT_TYPES}\n        wrongTypeMsg={WRONG_TYPE_MSG}\n        betaTypes={TABULAR_REPORT_TYPES}\n        tabularTypes={TABULAR_REPORT_TYPES}\n      />\n    );\n  }\n\n  render() {\n    const {\n      accountId,\n      accounts,\n      onConnect,\n      onSwitchAccount,\n      errorMessage,\n    } = this.props;\n\n    return (\n      <div className={style.salesforceConnector}>\n        {this.renderHeader()}\n        <div className={style.content}>\n          <AccountSelector\n            accounts={accounts}\n            selectedId={accountId}\n            selectAction={onSwitchAccount}\n            addAction={onConnect}\n          />\n          <ErrorComponent errorMessage={errorMessage} />\n          {this.renderContent()}\n        </div>\n      </div>\n    );\n  }\n}\n\nSalesforcePopoverComponent.propTypes = {\n  accountId: PropTypes.number,\n  accounts: PropTypes.array,\n  errorMessage: PropTypes.string,\n  groupId: PropTypes.number,\n  isSwitchingAccount: PropTypes.bool,\n  service: PropTypes.object,\n  onConnect: PropTypes.func,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n  onSwitchAccount: PropTypes.func,\n};\n\nexport { SalesforcePopoverComponent as default, COMPARER };\n","import SalesforcePopoverComponent from './salesforce-popover-component';\nexport default SalesforcePopoverComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport DefaultDataSourceConnectorComponent from '../../../default-data-source-connector/default-data-source-connector-component';\nimport SalesforcePopover from './salesforce-popover';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './salesforce-connector-style.scss';\n\nclass SalesforceConnectorComponent extends Component {\n  render() {\n    const {\n      accounts,\n      accountId,\n      service,\n      groupId,\n      errorMessage,\n      isSwitchingAccount,\n      isSwitchingService,\n      isLoading,\n      onConnect,\n      onFileSelected,\n      onFolderSelected,\n      onSwitchAccount,\n      isOauthWindowOpen,\n    } = this.props;\n\n    if (!accounts) {\n      return null;\n    }\n\n    if (isSwitchingService || isLoading) {\n      return (\n        <span className={style.lFetchingInitialList}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </span>\n      );\n    }\n\n    if (!accounts.length) {\n      return (\n        <DefaultDataSourceConnectorComponent\n          service={service}\n          onConnect={onConnect}\n          errorMessage={errorMessage}\n          usesOAuth\n          isOauthWindowOpen={isOauthWindowOpen}\n        />\n      );\n    }\n\n    return (\n      <SalesforcePopover\n        accountId={accountId}\n        groupId={groupId}\n        accounts={accounts}\n        service={service}\n        errorMessage={errorMessage}\n        isSwitchingAccount={isSwitchingAccount}\n        onFileSelected={onFileSelected}\n        onFolderSelected={onFolderSelected}\n        onSwitchAccount={onSwitchAccount}\n        onConnect={onConnect}\n      />\n    );\n  }\n}\n\nSalesforceConnectorComponent.propTypes = {\n  accountId: PropTypes.number,\n  accounts: PropTypes.array,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  errorMessage: PropTypes.string,\n  groupId: PropTypes.number,\n  isLoading: PropTypes.bool,\n  isOauthWindowOpen: PropTypes.bool,\n  isSwitchingAccount: PropTypes.bool,\n  isSwitchingService: PropTypes.bool,\n  service: PropTypes.object,\n  onConnect: PropTypes.func,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n  onSwitchAccount: PropTypes.func,\n};\n\nexport default SalesforceConnectorComponent;\n","import { connect } from 'react-redux';\nimport SalesforceConnectorComponent from './salesforce-connector-component';\nimport {\n  addAccount,\n  switchAccount,\n} from '../../../actions/data-source-connector-actions';\nimport {\n  changeFile,\n  openFile,\n  setSelectedFolder,\n} from '../../../../file-picker/actions/picker-actions';\nimport { omit, get, find, partial } from 'lodash';\nimport { track } from '../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelectedFile } from '@Tracking/events';\n\nconst mapStateToProps = ({\n  dataSources,\n  dataSourceConnector = {},\n  serviceAccounts,\n}) => {\n  const { services = [] } = dataSources;\n  const {\n    isSwitchingService,\n    isSwitchingAccount,\n    isLoading,\n    groupId,\n    errorMessage,\n    isOauthWindowOpen,\n  } = dataSourceConnector;\n  let { serviceAccountId: accountId } = dataSourceConnector;\n\n  const service = find(services, { name: 'salesforce' });\n  let accounts;\n\n  if (serviceAccounts) {\n    accounts = get(serviceAccounts, 'salesforce', []);\n  }\n\n  if (!accountId) {\n    accountId = get(accounts, '[0].id');\n  }\n\n  if (accountId) {\n    // Apparently we store it as a string. OH WHAT A MERRY TANGLE WE WEAVE\n    accountId = parseInt(accountId, 10);\n  }\n\n  return {\n    accounts,\n    groupId,\n    accountId,\n    isSwitchingService,\n    isSwitchingAccount,\n    isLoading,\n    errorMessage,\n    isOauthWindowOpen,\n    service,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, { dashboardId, widgetId }) => {\n  const onSwitchAccount = serviceAccountId => {\n    dispatch(switchAccount('salesforce', serviceAccountId));\n  };\n  const onFileSelected = async (service, accountId, id) => {\n    await trackEvent(\n      integrationSelectedFile({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n      }),\n    );\n    const serviceAccountId = accountId.toString();\n    const fileDetails = { id, serviceAccountId };\n\n    if (widgetId) {\n      dispatch(changeFile('salesforce', fileDetails, 'salesforce'));\n    } else {\n      // When creating a widget we redirect to the new file\n      dispatch(\n        openFile(\n          'salesforce',\n          fileDetails,\n          uuid => `/v4/dashboards/${dashboardId}/salesforce/${uuid}`,\n        ),\n      );\n    }\n\n    track('Salesforce new - Select report');\n  };\n  const onFolderSelected = folderTitle => {\n    dispatch(setSelectedFolder(folderTitle));\n  };\n  const createOnConnectHandler = accounts => (groupId, service) => {\n    const trackingProps = {\n      service_name: 'salesforce',\n      salesforce_version: 2016,\n      type: !accounts || !accounts.length ? 'initial' : 'additional',\n    };\n\n    dispatch(addAccount(groupId, service, trackingProps));\n  };\n\n  return {\n    onSwitchAccount,\n    onFileSelected,\n    onFolderSelected,\n    createOnConnectHandler,\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { groupId, accountId, accounts, service } = stateProps;\n  const { onFileSelected, createOnConnectHandler } = dispatchProps;\n  const dispatchPropsToPropagate = omit(\n    dispatchProps,\n    'createOnConnectHandler',\n  );\n\n  return {\n    ...ownProps,\n    ...stateProps,\n    ...dispatchPropsToPropagate,\n    onConnect: partial(createOnConnectHandler(accounts), groupId, service),\n    onFileSelected: partial(onFileSelected, service, accountId),\n  };\n};\n\nconst SalesforceConnectorConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(SalesforceConnectorComponent);\n\nexport default SalesforceConnectorConnector;\n","import SalesforceConnectorConnector from './salesforce-connector-connector';\nexport default SalesforceConnectorConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\nimport { track } from '../../../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  integrationSelectedDataSource,\n  integrationClickedConnect,\n} from '@Tracking/events';\nimport ErrorComponent from '../../../../../../components/error';\nimport ServiceIcon from '../../../../../../components/service-icon';\n\nimport style from './sidebar-item-style.scss';\n\nexport const LOGO_SOURCE = {\n  gsheets: 'gdrive',\n  onedrivebusiness: 'onedrive',\n  dropbox: 'dropbox',\n};\n\nexport const STORAGE_TITLE = {\n  gsheets: 'Google Drive',\n  onedrivebusiness: 'OneDrive for Business',\n  dropbox: 'Dropbox',\n};\n\nclass SidebarItemComponent extends Component {\n  constructor() {\n    super();\n    bindAll(this, 'handleClick', 'renderDetails');\n  }\n\n  handleClick() {\n    const { service, spreadsheetsService, isConnected } = this.props;\n    const backtrackProps = {\n      'Auth type': spreadsheetsService.auth_type,\n      'Integration name': spreadsheetsService.title,\n      'Integration slug': spreadsheetsService.name,\n      'Data source': service.name,\n    };\n\n    if (isConnected) {\n      const { handleSwitchService } = this.props;\n      trackEvent(\n        integrationSelectedDataSource({\n          ...backtrackProps,\n        }),\n      );\n      handleSwitchService(service);\n    } else {\n      const { onConnect } = this.props;\n      trackEvent(integrationClickedConnect({ ...backtrackProps }));\n      onConnect(service);\n    }\n\n    track('Spreadsheets - Select cloud storage provider', {\n      properties: { data_source: service.name },\n    });\n  }\n\n  renderDetails(isInitialState) {\n    if (!isInitialState) {\n      return null;\n    }\n\n    const {\n      service: { name },\n      errorMessage,\n    } = this.props;\n    return (\n      <div className={style.detail}>\n        <div className={style.serviceName}>\n          {STORAGE_TITLE[name]}\n          <ErrorComponent errorMessage={errorMessage} />\n        </div>\n        <div className={style.connectBtn}>Connect</div>\n      </div>\n    );\n  }\n\n  render() {\n    const {\n      className,\n      isInitialState,\n      isSelected,\n      service: { name },\n      isConnected,\n    } = this.props;\n\n    const classes = classNames(className, {\n      [style.item]: !isInitialState,\n      [style.extendedItem]: isInitialState,\n      [style.notConnected]: !isConnected,\n      selected: isSelected,\n    });\n\n    return (\n      <li className={classes} onClick={this.handleClick}>\n        <span className={style.imgWrapper}>\n          <ServiceIcon serviceName={LOGO_SOURCE[name]} size={48} />\n        </span>\n        {this.renderDetails(isInitialState)}\n      </li>\n    );\n  }\n}\n\nSidebarItemComponent.defaultProps = {\n  isInitialState: false,\n};\n\nSidebarItemComponent.propTypes = {\n  className: PropTypes.string,\n  errorMessage: PropTypes.string,\n  groupId: PropTypes.number,\n  handleSwitchService: PropTypes.func,\n  isConnected: PropTypes.bool,\n  isInitialState: PropTypes.bool,\n  isSelected: PropTypes.bool,\n  service: PropTypes.object,\n  spreadsheetsService: PropTypes.object,\n  onConnect: PropTypes.func,\n};\n\nexport default SidebarItemComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport Button from '@UI/button';\nimport Image from '@UI/image';\nimport FormField from '../../../../components/form-field';\nimport ErrorComponent from '../../../../components/error';\nimport ExternalLink from '../../../../components/external-link';\nimport config from '../../../../universal/config';\n\nimport { checkValidity } from '../../../../lib/dom-helper';\n\nimport styles from './spreadsheet-file-import-style.scss';\n\nconst SPREADSHEETS_SHAREPOINT_HELP = {\n  url: 'https://support.geckoboard.com/hc/en-us/articles/360011099932',\n  text: 'How to link to a file in Sharepoint',\n  eventName: 'Clicked Excel Sharepoint',\n  icon: 'ms_office_sharepoint.svg',\n};\nconst SPREADSHEETS_ONEDRIVE_HELP = {\n  url: 'https://support.geckoboard.com/hc/en-us/articles/360006953997',\n  text: 'How to link to a file in a OneDrive personal account',\n  eventName: 'Clicked Excel OneDrive Personal',\n  icon: 'ms_office_onedrive.svg',\n};\nconst SPREADSHEETS_LOCAL_FILE_HELP = {\n  url: 'https://support.geckoboard.com/hc/en-us/articles/360011811551',\n  text: 'How to link to a file stored locally on your computer',\n  eventName: 'Clicked Excel local storage',\n  icon: 'laptop.svg',\n};\n\n// exported for testing\nexport const SPREADSHEETS_HELP_LINKS = [\n  SPREADSHEETS_SHAREPOINT_HELP,\n  SPREADSHEETS_ONEDRIVE_HELP,\n  SPREADSHEETS_LOCAL_FILE_HELP,\n];\n\nclass SpreadsheetFileImportComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { isImporting: false, isValid: false };\n\n    bindAll(this, 'handleSubmit', 'handleChange');\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (nextProps.importErrorMessage !== this.props.importErrorMessage) {\n      this.setState({ isImporting: false });\n    }\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n\n    if (checkValidity(e.target)) {\n      const spreadsheetUrl = this.refs.spreadsheetUrl.getValue();\n      this.setState({ isImporting: true });\n      this.props.onFileImport(spreadsheetUrl);\n    }\n  }\n\n  handleChange(e) {\n    this.setState({ isValid: checkValidity(e.target) });\n  }\n\n  renderButton() {\n    const { isImporting, isValid } = this.state;\n\n    if (!isValid) return null;\n\n    return (\n      <div className=\"form-actions\">\n        <Button type={Button.TYPES.SUBMIT} loading={isImporting}>\n          {isImporting ? 'Importing' : 'Connect'}\n        </Button>\n      </div>\n    );\n  }\n\n  renderHelpLinks() {\n    return (\n      <div>\n        To create a link to your file please follow the appropriate steps below:\n        {SPREADSHEETS_HELP_LINKS.map(({ url, text, eventName, icon }) => {\n          return (\n            <div key={url} className={styles.helpLinkContainer}>\n              <Image\n                src={`${config.get().StaticAssetBaseURL}/images/${icon}`}\n                className={`${styles.helpLinkIcon}`}\n              />\n              <ExternalLink\n                className={styles.helpLink}\n                href={url}\n                eventName={eventName}\n              >\n                <div className=\"import-help-text\">{text}</div>\n              </ExternalLink>\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n\n  render() {\n    const { importErrorMessage } = this.props;\n\n    return (\n      <form\n        noValidate\n        onChange={this.handleChange}\n        onSubmit={this.handleSubmit}\n      >\n        <ErrorComponent errorMessage={importErrorMessage} />\n        <FormField\n          ref=\"spreadsheetUrl\"\n          label=\"Link to file\"\n          name=\"spreadsheet_url\"\n          placeholder=\"For example http://... or https://...\"\n          required\n          type=\"url\"\n        />\n        {this.renderButton()}\n        {this.renderHelpLinks()}\n      </form>\n    );\n  }\n}\n\nSpreadsheetFileImportComponent.propTypes = {\n  importErrorMessage: PropTypes.string,\n  onFileImport: PropTypes.func,\n};\n\nexport default SpreadsheetFileImportComponent;\n","import SpreadsheetFileImportConnector from './spreadsheet-file-import-connector';\nexport default SpreadsheetFileImportConnector;\n","import { connect } from 'react-redux';\nimport SpreadsheetFileImportComponent from './spreadsheet-file-import-component';\nimport { track } from '../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { spreadsheetsSubmittedUrl } from '@Tracking/events';\n\nconst SpreadsheetFileImportConnector = connect(\n  ({ filePicker }) => {\n    const { importErrorMessage } = filePicker;\n    return { importErrorMessage };\n  },\n  (dispatch, { onImport }) => {\n    const onFileImport = spreadsheetUrl => {\n      onImport({ spreadsheetUrl });\n\n      track('Spreadsheets - Submit URL', {\n        properties: {\n          data_source: 'hostedexcel',\n          file_url: spreadsheetUrl,\n        },\n      });\n\n      trackEvent(\n        spreadsheetsSubmittedUrl({\n          'Auth type': 'null',\n          'Integration name': 'Spreadsheets',\n          'Integration slug': 'spreadsheets',\n          'Data source': 'hostedexcel',\n        }),\n      );\n    };\n\n    return { onFileImport };\n  },\n)(SpreadsheetFileImportComponent);\n\nexport default SpreadsheetFileImportConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport classNames from 'classnames';\nimport SpreadsheetFileImport from '../../../spreadsheet-file-import';\nimport { track } from '../../../../../../lib/tracker';\nimport ServiceIcon from '../../../../../../components/service-icon';\n\nimport baseStyle from './sidebar-item-style.scss';\nimport style from './sidebar-link-style.scss';\n\nclass SidebarLinkComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'handleClick', 'renderDetails');\n  }\n\n  handleClick() {\n    const { handleSwitchService, service } = this.props;\n    handleSwitchService(service);\n\n    track('Spreadsheets - Select cloud storage provider', {\n      properties: { data_source: 'hostedexcel' },\n    });\n  }\n\n  renderDetails(isInitialState) {\n    if (!isInitialState) {\n      return null;\n    }\n    const { onFileSelected } = this.props;\n\n    return (\n      <div className={style.fiWrapper}>\n        <SpreadsheetFileImport onImport={onFileSelected} />\n      </div>\n    );\n  }\n\n  render() {\n    const { isInitialState, className, isSelected } = this.props;\n\n    const classes = classNames(className, {\n      [baseStyle.item]: !isInitialState,\n      [style.extendedItem]: isInitialState,\n      selected: isSelected,\n    });\n\n    return (\n      <li className={classes} onClick={this.handleClick}>\n        <ServiceIcon serviceName=\"link\" size={48} />\n        {this.renderDetails(isInitialState)}\n      </li>\n    );\n  }\n}\n\nSidebarLinkComponent.defaultProps = {\n  isInitialState: false,\n};\n\nSidebarLinkComponent.propTypes = {\n  className: PropTypes.string,\n  handleSwitchService: PropTypes.func,\n  isInitialState: PropTypes.bool,\n  isSelected: PropTypes.bool,\n  service: PropTypes.object,\n  onFileSelected: PropTypes.func,\n};\n\nexport default SidebarLinkComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll, partial, partition } from 'lodash';\nimport classNames from 'classnames';\nimport SidebarItemComponent from './sidebar-item-component';\nimport SidebarLinkComponent from './sidebar-link-component';\n\nimport style from './sidebar-style.scss';\n\nclass SidebarComponent extends Component {\n  constructor() {\n    super();\n    bindAll(this, 'renderService');\n  }\n\n  renderService(isInitialState, itemClass, service) {\n    const { id, serviceAccounts } = service;\n\n    const {\n      groupId,\n      serviceName,\n      errorMessage,\n      onConnect,\n      switchService,\n      spreadsheetsService,\n    } = this.props;\n\n    const isSelected = serviceName === service.name;\n    const serviceErrorMessage = isSelected ? errorMessage : undefined;\n\n    return (\n      <SidebarItemComponent\n        className={itemClass}\n        key={id}\n        groupId={groupId}\n        service={service}\n        isConnected={!!serviceAccounts.length}\n        isSelected={isSelected}\n        handleSwitchService={switchService}\n        isInitialState={isInitialState}\n        errorMessage={serviceErrorMessage}\n        onConnect={onConnect}\n        spreadsheetsService={spreadsheetsService}\n      />\n    );\n  }\n\n  render() {\n    const {\n      availableServices,\n      isInitialState,\n      className,\n      serviceName,\n      onFileSelected,\n      switchService,\n    } = this.props;\n\n    const [[hostedExcelService], services] = partition(\n      availableServices,\n      s => s.name === 'hostedexcel',\n    );\n\n    const itemClass = classNames({\n      [style.lItem]: !isInitialState,\n      [style.lItemInitial]: isInitialState,\n    });\n\n    const renderService = partial(\n      this.renderService,\n      isInitialState,\n      itemClass,\n    );\n\n    const classes = classNames(className, style.sidebar, {\n      [style.initialState]: isInitialState,\n    });\n\n    return (\n      <ul className={classes}>\n        {services.map(renderService)}\n        <SidebarLinkComponent\n          className={itemClass}\n          service={hostedExcelService}\n          handleSwitchService={switchService}\n          isInitialState={isInitialState}\n          isSelected={serviceName === 'hostedexcel'}\n          onFileSelected={onFileSelected}\n        />\n      </ul>\n    );\n  }\n}\n\nSidebarComponent.defaultProps = {\n  isInitialState: false,\n};\n\nSidebarComponent.propTypes = {\n  availableServices: PropTypes.arrayOf(PropTypes.object),\n  className: PropTypes.string,\n  errorMessage: PropTypes.string,\n  groupId: PropTypes.number,\n  isInitialState: PropTypes.bool,\n  serviceName: PropTypes.string,\n  spreadsheetsService: PropTypes.object,\n  switchService: PropTypes.func,\n  onConnect: PropTypes.func,\n  onFileSelected: PropTypes.func,\n};\n\nexport default SidebarComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { bindAll } from 'lodash';\nimport AccountSelectorComponent from '../../../../../../account-selector';\nimport ErrorComponent from '../../../../../../components/error';\nimport FilePickerComponent from '../../../../../../file-picker';\nimport SpreadsheetFileImport from '../../../spreadsheet-file-import';\nimport comparerGenerator from '../../../../../../lib/comparer-generator';\n\nimport style from './content-component.scss';\n\nconst COMPARER = comparerGenerator('modified_at', 'desc');\n\nclass ContentComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'render', 'handleSelectAccount');\n  }\n\n  handleSelectAccount(serviceAccountId) {\n    const {\n      extendedService: { name },\n      switchAccount,\n    } = this.props;\n    switchAccount(name, serviceAccountId);\n  }\n\n  renderFileList() {\n    const {\n      extendedService: { name },\n      serviceAccountId,\n      isSwitchingAccount,\n      onFileSelected,\n      onFolderSelected,\n      isServiceAccountExpired,\n    } = this.props;\n\n    if (isServiceAccountExpired) {\n      return null;\n    }\n\n    const onServiceFileSelected = id => {\n      onFileSelected({\n        id,\n        serviceAccountId: serviceAccountId.toString(),\n      });\n    };\n\n    return (\n      <FilePickerComponent\n        accountId={serviceAccountId}\n        isLoadingList={isSwitchingAccount}\n        serviceName={name}\n        comparer={COMPARER}\n        onFileSelected={onServiceFileSelected}\n        onFolderSelected={onFolderSelected}\n      />\n    );\n  }\n\n  render() {\n    const {\n      serviceAccountId,\n      extendedService,\n      onFileSelected,\n      onConnect,\n      isServiceAccountExpired,\n      errorMessage,\n    } = this.props;\n\n    const { serviceAccounts, name } = extendedService;\n    const isHostedExcel = name === 'hostedexcel';\n\n    if (!serviceAccountId && !isHostedExcel) {\n      return null;\n    }\n\n    if (isHostedExcel) {\n      return <SpreadsheetFileImport onImport={onFileSelected} />;\n    }\n\n    return (\n      <div className={style.filePickerWrapper}>\n        <AccountSelectorComponent\n          accounts={serviceAccounts}\n          selectedId={serviceAccountId}\n          selectAction={this.handleSelectAccount}\n          addAction={() => {\n            onConnect(extendedService);\n          }}\n          isServiceAccountExpired={isServiceAccountExpired}\n        />\n        <ErrorComponent errorMessage={errorMessage} className={style.error} />\n        {this.renderFileList()}\n      </div>\n    );\n  }\n}\n\nContentComponent.propTypes = {\n  errorMessage: PropTypes.string,\n  extendedService: PropTypes.object,\n  groupId: PropTypes.number,\n  isServiceAccountExpired: PropTypes.bool,\n  isSwitchingAccount: PropTypes.bool,\n  serviceAccountId: PropTypes.number,\n  switchAccount: PropTypes.func,\n  onConnect: PropTypes.func,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n};\n\nContentComponent.defaultProps = {\n  extendedService: {},\n};\n\nexport { ContentComponent as default, COMPARER };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport SidebarComponent from './components/sidebar/sidebar-component';\nimport ContentComponent from './components/content/content-component';\nimport ServiceIcon from '../../../../components/service-icon';\nimport ErrorComponent from '../../../../components/error';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport { find, some, chain, indexOf } from 'lodash';\nimport classNames from 'classnames';\n\nimport style from './spreadsheets-connector.scss';\n\nexport const TITLE_INITIAL_STATE = 'Select a data source';\nexport const SUBTITLE_INITIAL_STATE =\n  'Create a connection to access your spreadsheet file';\nexport const TITLE = 'Choose File';\nexport const SUBTITLE = \"Choose the spreadsheet file you'd like to visualise\";\n\nfunction filterAndSortServices(services, filters) {\n  return chain(services)\n    .filter(s => filters.indexOf(s.name) !== -1)\n    .sortBy(s => indexOf(filters, s.name))\n    .value();\n}\n\nclass SpreadsheetsConnectorComponent extends Component {\n  renderHeader(isInitialState) {\n    const title = isInitialState ? TITLE_INITIAL_STATE : TITLE;\n    const subtitle = isInitialState ? SUBTITLE_INITIAL_STATE : SUBTITLE;\n    const { serviceName, errorMessage: error } = this.props;\n    const errorMessage = serviceName ? null : error;\n\n    return (\n      <header className={style.header}>\n        <div className={style.serviceIcon}>\n          <ServiceIcon serviceName=\"spreadsheets\" size={40} />\n        </div>\n        <div className={style.titles}>\n          <h3>{title}</h3>\n          <p>{subtitle}</p>\n        </div>\n        <ErrorComponent errorMessage={errorMessage} />\n      </header>\n    );\n  }\n\n  renderContent(isInitialState, service) {\n    const {\n      isSwitchingService,\n      onFileSelected,\n      onFolderSelected,\n      onConnect,\n      switchAccount,\n      serviceAccountId,\n      groupId,\n      isSwitchingAccount,\n      errorMessage,\n      isServiceAccountExpired,\n      spreadsheetsService,\n    } = this.props;\n\n    if (isInitialState || !service) {\n      return null;\n    }\n\n    if (isSwitchingService) {\n      return (\n        <span className={style.lSwitchingService}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </span>\n      );\n    }\n\n    return (\n      <div className={style.content}>\n        <ContentComponent\n          serviceAccountId={serviceAccountId}\n          groupId={groupId}\n          extendedService={service}\n          isSwitchingAccount={isSwitchingAccount}\n          errorMessage={errorMessage}\n          onFileSelected={onFileSelected}\n          onFolderSelected={onFolderSelected}\n          onConnect={onConnect}\n          switchAccount={switchAccount}\n          isServiceAccountExpired={isServiceAccountExpired}\n          spreadsheetsService={spreadsheetsService}\n        />\n      </div>\n    );\n  }\n\n  render() {\n    const {\n      extendedServices,\n      serviceName,\n      groupId,\n      serviceNames,\n      errorMessage,\n      isLoading,\n      onFileSelected,\n      onConnect,\n      switchService,\n      spreadsheetsService,\n    } = this.props;\n\n    const service = find(extendedServices, { name: serviceName });\n    const availableServices = filterAndSortServices(\n      extendedServices,\n      serviceNames,\n    );\n    const isInitialState = !some(\n      availableServices,\n      s => s.serviceAccounts.length,\n    );\n\n    const sidebarClasses = classNames(style.lSidebar, {\n      initialState: isInitialState,\n    });\n\n    if (isLoading) {\n      return (\n        <span className={style.lSwitchingService}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </span>\n      );\n    }\n\n    return (\n      <div className={style.spreadsheetsConnector}>\n        {this.renderHeader(isInitialState)}\n        <div className={style.body}>\n          <SidebarComponent\n            className={sidebarClasses}\n            serviceName={serviceName}\n            availableServices={availableServices}\n            isInitialState={isInitialState}\n            errorMessage={errorMessage}\n            groupId={groupId}\n            onFileSelected={onFileSelected}\n            onConnect={onConnect}\n            switchService={switchService}\n            spreadsheetsService={spreadsheetsService}\n          />\n          {this.renderContent(isInitialState, service)}\n        </div>\n      </div>\n    );\n  }\n}\n\nSpreadsheetsConnectorComponent.defaultProps = {\n  services: [],\n};\n\nSpreadsheetsConnectorComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  errorMessage: PropTypes.string,\n  extendedServices: PropTypes.arrayOf(PropTypes.object),\n  groupId: PropTypes.number,\n  isLoading: PropTypes.bool,\n  isServiceAccountExpired: PropTypes.bool,\n  isSwitchingAccount: PropTypes.bool,\n  isSwitchingService: PropTypes.bool,\n  serviceAccountId: PropTypes.number,\n  serviceName: PropTypes.string,\n  serviceNames: PropTypes.arrayOf(PropTypes.string),\n  services: PropTypes.arrayOf(PropTypes.object),\n  spreadsheetsService: PropTypes.object,\n  switchAccount: PropTypes.func,\n  switchService: PropTypes.func,\n  onConnect: PropTypes.func,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n};\n\nexport default SpreadsheetsConnectorComponent;\n","import { connect } from 'react-redux';\nimport { partial } from 'lodash';\nimport SpreadsheetsConnectorComponent from './spreadsheets-connector-component';\nimport {\n  addAccount,\n  switchAccount,\n  switchService,\n} from '../../../actions/data-source-connector-actions';\nimport {\n  changeFile,\n  openFile,\n  setSelectedFolder,\n} from '../../../../file-picker/actions/picker-actions';\nimport { track } from '../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelectedFile } from '@Tracking/events';\nimport canUseSpreadsheetsBeta from '../../../../spreadsheet-config-beta/can-use-beta';\n\nconst mapStateToProps = (\n  { dataSources, serviceAccounts, dataSourceConnector = {}, user },\n  { serviceName: spreadsheetsServiceName },\n) => {\n  const { services = [] } = dataSources;\n  const {\n    serviceAccountId,\n    serviceName,\n    errorMessage,\n    isLoading,\n    groupId,\n    isSwitchingService,\n    isSwitchingAccount,\n    isServiceAccountExpired,\n  } = dataSourceConnector;\n  let extendedServices;\n  // Group service accounts along services\n  if (services.length && serviceAccounts) {\n    extendedServices = services.map(service => {\n      const { name } = service;\n      const sa = serviceAccounts[name] || [];\n      return { ...service, serviceAccounts: sa };\n    });\n  }\n  const spreadsheetsService = services.find(\n    ({ name }) => name === spreadsheetsServiceName,\n  );\n  return {\n    serviceAccounts,\n    serviceAccountId,\n    serviceName,\n    errorMessage,\n    isLoading,\n    groupId,\n    isSwitchingService,\n    isSwitchingAccount,\n    isServiceAccountExpired,\n    services,\n    extendedServices,\n    spreadsheetsService,\n    user: user.user,\n    organization: user.organization,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { widgetId, dashboardId } = props;\n\n  const onFileSelected = async (\n    serviceName,\n    service,\n    user,\n    organization,\n    fileDetails,\n  ) => {\n    await trackEvent(\n      integrationSelectedFile({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n        'Data source': serviceName,\n      }),\n    );\n    if (widgetId) {\n      // When editing we just replace the worksheet with the first worksheet\n      // in the new file\n      dispatch(changeFile(serviceName, fileDetails, 'spreadsheets'));\n    } else {\n      const pathCreator = uuid =>\n        canUseSpreadsheetsBeta(user, organization)\n          ? `/v4/dashboards/${dashboardId}/spreadsheetsbeta/${uuid}/select-data`\n          : `/v4/dashboards/${dashboardId}/spreadsheets/${uuid}`;\n\n      // When creating a widget we just redirect to the new file\n      dispatch(openFile(serviceName, fileDetails, pathCreator));\n    }\n    track('Spreadsheets - Select file', {\n      properties: { data_source: serviceName },\n    });\n  };\n\n  const onFolderSelected = folderTitle => {\n    dispatch(setSelectedFolder(folderTitle));\n  };\n\n  const onConnect = (groupId, service) => {\n    const { serviceAccounts: accounts, name } = service;\n    const trackingProps = {\n      service_name: name,\n      type: !accounts || !accounts.length ? 'initial' : 'additional',\n    };\n    dispatch(addAccount(groupId, service, trackingProps));\n  };\n\n  const onSwitchAccount = (name, newServiceAccountId) => {\n    dispatch(switchAccount(name, newServiceAccountId));\n  };\n\n  const onSwitchService = service => dispatch(switchService(service));\n\n  return {\n    onFileSelected,\n    onConnect,\n    onFolderSelected,\n    switchAccount: onSwitchAccount,\n    switchService: onSwitchService,\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { user, organization, ...remainingStateProps } = stateProps;\n  const { onConnect, onFileSelected } = dispatchProps;\n\n  return {\n    ...ownProps,\n    ...remainingStateProps,\n    ...dispatchProps,\n    onConnect: partial(onConnect, stateProps.groupId),\n    onFileSelected: partial(\n      onFileSelected,\n      stateProps.serviceName,\n      stateProps.spreadsheetsService,\n      user,\n      organization,\n    ),\n  };\n};\n\nconst SpreadsheetsConnectorConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(SpreadsheetsConnectorComponent);\n\nexport default SpreadsheetsConnectorConnector;\n","import SpreadsheetsConnectorConnector from './spreadsheets-connector-connector';\nexport default SpreadsheetsConnectorConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport FilePicker from '../../../../file-picker';\nimport style from './dataset-connector.scss';\nimport comparerGenerator from '../../../../lib/comparer-generator';\nimport FormattedMessage from '../../../../lib/i18n';\nimport ServiceIcon from '../../../../components/service-icon';\n\nconst COMPARER = comparerGenerator('created_at', 'desc');\n\nclass DatasetsConnectorComponent extends Component {\n  render() {\n    return (\n      <div className={style.datasetsConnector}>\n        <header className={style.header}>\n          <ServiceIcon serviceName=\"datasets\" size={40} />\n          <div>\n            <h3>\n              <FormattedMessage\n                id=\"datasets.connector.headerTitle\"\n                defaultMessage=\"Choose Dataset\"\n              />\n            </h3>\n            <p>\n              <FormattedMessage\n                id=\"datasets.connector.headerText\"\n                defaultMessage=\"Choose the dataset you would like to visualise\"\n              />\n            </p>\n          </div>\n        </header>\n        <div className={style.content}>\n          <FilePicker\n            serviceName=\"datasets\"\n            comparer={COMPARER}\n            isLoadingList={this.props.isLoading}\n            onFileSelected={this.props.onFileSelected}\n            onFolderSelected={this.props.onFolderSelected}\n          />\n        </div>\n        <footer className={style.footer}>\n          <h3>\n            <FormattedMessage\n              id=\"datasets.connector.footerTitle\"\n              defaultMessage=\"Create a Dataset\"\n            />\n          </h3>\n          <p>\n            <FormattedMessage\n              id=\"datasets.connector.footerText\"\n              defaultMessage=\"Dataset are a simple, powerful way to access your most important data with Geckoboard.\"\n            />{' '}\n            <a\n              href=\"https://developer.geckoboard.com/\"\n              target=\"_blank\"\n              rel=\"external\"\n            >\n              <FormattedMessage\n                id=\"datasets.connector.footerLink\"\n                defaultMessage=\"Learn about using the Datasets API\"\n              />\n            </a>\n          </p>\n        </footer>\n      </div>\n    );\n  }\n}\n\nDatasetsConnectorComponent.propTypes = {\n  isLoading: PropTypes.bool,\n  onFileSelected: PropTypes.func,\n  onFolderSelected: PropTypes.func,\n};\n\nexport { DatasetsConnectorComponent as default, COMPARER };\n","import { connect } from 'react-redux';\nimport DatasetConnectorComponent from './dataset-connector-component';\nimport * as datasetActions from '../../../../dataset-config/actions/dataset-actions';\nimport { setSelectedFolder } from '../../../../file-picker/actions/picker-actions';\n\nimport { router } from '../../../../router';\nimport { track } from '../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelectedFile } from '@Tracking/events';\n\nconst DATASETS_SERVICE_NAME = 'datasets';\n\nconst mapStateToProps = state => {\n  const { dataSources, dataSourceConnector = {}, filePicker } = state;\n  const { isLoading } = dataSourceConnector;\n  const { services = [] } = dataSources;\n\n  const service = services.find(({ name }) => name === DATASETS_SERVICE_NAME);\n\n  return { service, isLoading, ...filePicker };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  const { dashboardId, widgetId } = ownProps;\n\n  const createOnFileSelected = service => async id => {\n    await trackEvent(\n      integrationSelectedFile({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n      }),\n    );\n\n    if (widgetId) {\n      // Then we're editing\n      dispatch(datasetActions.initConfig(id, dashboardId));\n    } else {\n      dispatch(datasetActions.toggleFilePicker(false));\n\n      router.navigate(`/v4/dashboards/${dashboardId}/datasets/${id}`);\n    }\n\n    track('Custom new - Select dataset', {\n      properties: {\n        dataset_id: id,\n      },\n    });\n  };\n\n  const onFolderSelected = folderTitle => {\n    dispatch(setSelectedFolder(folderTitle));\n  };\n\n  return { createOnFileSelected, onFolderSelected };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { service, ...remainingStateProps } = stateProps;\n  const { createOnFileSelected, ...remainingDispatchProps } = dispatchProps;\n\n  const onFileSelected = createOnFileSelected(service);\n\n  return {\n    ...ownProps,\n    ...remainingDispatchProps,\n    ...remainingStateProps,\n    onFileSelected,\n  };\n};\n\nconst DatasetConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(DatasetConnectorComponent);\n\nexport default DatasetConnector;\n","import DatasetConnectorConnector from './dataset-connector-connector';\nexport default DatasetConnectorConnector;\n","import PresetList from './preset-list-component';\nexport default PresetList;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { noop, map } from 'lodash';\nimport classNames from 'classnames';\nimport config from '../../../universal/config';\nimport { Row, Column } from '../../layout';\nimport FormattedMessage from '../../../lib/i18n';\nimport PresetList from '../preset-list';\nimport PresetListItem from '../preset-list-item';\nimport ServiceIcon from '../../service-icon';\nimport Icon from '@UI/icon';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport styles from './preset-panel-styles.scss';\n\nconst servicePropTypes = PropTypes.shape({\n  name: PropTypes.string.isRequired,\n  title: PropTypes.string.isRequired,\n});\n\nclass PresetFetcher extends Component {\n  componentDidMount() {\n    if (this.props.service.name) {\n      this.props.getPresets();\n    }\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.service.name !== prevProps.service.name) {\n      this.props.getPresets();\n    }\n  }\n\n  render() {\n    return this.props.children;\n  }\n}\n\nPresetFetcher.defaultProps = {\n  children: null,\n};\n\nPresetFetcher.propTypes = {\n  getPresets: PropTypes.func.isRequired,\n  service: servicePropTypes.isRequired,\n  children: PropTypes.node,\n};\n\nconst PresetPanelComponent = props => {\n  const { service, presets, loading, onSelect, hideFooter } = props;\n\n  const panelClasses = classNames(styles.presetPanel, {\n    [styles.scrollHidden]: loading,\n  });\n\n  return (\n    <Column className={panelClasses}>\n      {loading && (\n        <div className={styles.loadingOverlay}>\n          <LoadingSpinner size={LoadingSpinner.SIZES.LARGE} />\n        </div>\n      )}\n      <Row className={styles.presetPanelHeader} align=\"center\">\n        <ServiceIcon\n          className={styles.logo}\n          serviceName={service.name}\n          size={34}\n        />\n        <FormattedMessage\n          id=\"presets.panel.title\"\n          values={{ serviceName: service.title }}\n        />\n      </Row>\n      <div className={styles.presetPanelContentOuter}>\n        <div className={styles.presetPanelContentInner}>\n          {map(presets, (values, key) => (\n            <PresetList header={key} key={key}>\n              {presets[key].map(preset => (\n                <PresetListItem\n                  key={preset.id}\n                  preset={preset}\n                  onClick={e => {\n                    e.preventDefault();\n                    onSelect(preset);\n                  }}\n                />\n              ))}\n            </PresetList>\n          ))}\n        </div>\n      </div>\n      {!hideFooter && (\n        <button className={styles.presetPanelButton} onClick={() => onSelect()}>\n          <Row align=\"center\" className={styles.presetPanelFooter}>\n            <img\n              className={styles.logo}\n              src={`${\n                config.get().StaticAssetBaseURL\n              }/images/icon-learn-dashboard-examples.svg`}\n            />\n            <FormattedMessage id=\"presets.panel.footer\" />\n            <Column marginLeft={1}>\n              <Icon name=\"angle-right\" />\n            </Column>\n          </Row>\n        </button>\n      )}\n    </Column>\n  );\n};\n\nPresetPanelComponent.defaultPropTypes = {\n  onSelect: noop,\n};\n\nPresetPanelComponent.propTypes = {\n  service: servicePropTypes.isRequired,\n  hideFooter: PropTypes.bool,\n  loading: PropTypes.bool,\n  presets: PropTypes.object,\n  onSelect: PropTypes.func,\n};\n\nconst PresetPanelComposition = props => (\n  <PresetFetcher getPresets={props.getPresets} service={props.service}>\n    <PresetPanelComponent\n      loading={props.loading}\n      onSelect={props.onSelect}\n      presets={props.presets}\n      service={props.service}\n    />\n  </PresetFetcher>\n);\n\nPresetPanelComposition.propTypes = {\n  ...PresetFetcher.propTypes,\n  ...PresetPanelComponent.propTypes,\n};\n\nexport default PresetPanelComposition;\nexport { PresetPanelComponent, PresetFetcher };\n","import PresetPanel from './preset-panel-connector';\n\nexport default PresetPanel;\n","import { connect } from 'react-redux';\nimport PresetPanelComponent from './preset-panel-component';\nimport { getPresets } from '../presets-actions';\nimport { groupBy } from 'lodash';\n\nconst mapStateToProps = (state, props) => {\n  const { service } = props;\n  const _presets = state.presets[service.name] || [];\n  const groupedPresets = groupBy(_presets, 'category');\n\n  return {\n    presets: groupedPresets,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { service } = props;\n\n  return {\n    getPresets: () => {\n      dispatch(getPresets(service.name));\n    },\n  };\n};\n\nconst PresetPanelConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(PresetPanelComponent);\n\nexport default PresetPanelConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport DefaultDataSourceConnector from '../../../default-data-source-connector';\nimport Layout from '../../../../components/layout';\nimport PresetPanel from '../../../../components/presets/preset-panel';\nimport { track } from '../../../../lib/tracker';\nimport { isMirageService } from '../../../../universal-config/mirage/mirage-helpers';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelectedWidget } from '@Tracking/events';\n\nclass UniversalConnectorComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      showPresetPanel: !props.addingAnotherAccount && !props.hasMirageWidget,\n      isCreatingWidget: false,\n      preset: undefined,\n    };\n\n    this.handlePresetSelection = this.handlePresetSelection.bind(this);\n  }\n\n  handlePresetSelection(preset) {\n    const { accountId, service, onAccountsAvailable } = this.props;\n\n    // If we're dealing with Mirage, we don't need to worry about presets\n    if (isMirageService(service)) {\n      onAccountsAvailable(service);\n      return;\n    }\n\n    this.trackPresetSelection(preset);\n\n    if (accountId) {\n      onAccountsAvailable(service, preset);\n      this.setState({ preset, isCreatingWidget: true });\n    } else {\n      this.setState({ showPresetPanel: false, preset });\n    }\n  }\n\n  render() {\n    const {\n      service,\n      usesOAuth,\n      serviceId,\n      dashboardId,\n      errorMessage,\n      isLoading,\n      onConnect,\n      isOauthWindowOpen,\n    } = this.props;\n\n    if (isLoading) {\n      return (\n        <Layout marginTop={4}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </Layout>\n      );\n    }\n\n    if (this.state.showPresetPanel) {\n      return (\n        <PresetPanel\n          service={service}\n          onSelect={this.handlePresetSelection}\n          loading={this.state.isCreatingWidget}\n        />\n      );\n    }\n\n    return (\n      <DefaultDataSourceConnector\n        dashboardId={dashboardId}\n        serviceId={serviceId}\n        service={service}\n        usesOAuth={usesOAuth}\n        onConnect={(groupId, selectedService, extraParams) =>\n          onConnect(groupId, selectedService, extraParams, this.state.preset)\n        }\n        errorMessage={errorMessage}\n        isOauthWindowOpen={isOauthWindowOpen}\n        hasEducationalFooter\n      />\n    );\n  }\n\n  trackPresetSelection(preset) {\n    const { service } = this.props;\n\n    trackEvent(\n      integrationSelectedWidget({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n        'Widget name': preset ? preset.title : 'Build your own',\n      }),\n    );\n\n    if (preset) {\n      track(`${service.name} - Selected preset`, {\n        properties: {\n          preset_id: preset.id,\n          preset_name: preset.title,\n        },\n      });\n    } else {\n      track(`${service.name} - Selected custom`);\n    }\n  }\n}\n\nUniversalConnectorComponent.defaultProps = {\n  service: {},\n};\n\nUniversalConnectorComponent.propTypes = {\n  accountId: PropTypes.number,\n  addingAnotherAccount: PropTypes.bool,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  errorMessage: PropTypes.string,\n  hasMirageWidget: PropTypes.bool,\n  isLoading: PropTypes.bool,\n  isOauthWindowOpen: PropTypes.bool,\n  service: PropTypes.object,\n  serviceId: PropTypes.number,\n  usesOAuth: PropTypes.bool,\n  onAccountsAvailable: PropTypes.func,\n  onConnect: PropTypes.func,\n};\n\nexport default UniversalConnectorComponent;\n","import { connect } from 'react-redux';\nimport UniversalConnectorComponent from './universal-connector-component';\nimport { get, find, includes, isEmpty } from 'lodash';\nimport { addConnection } from '../../../actions/data-source-connector-actions';\nimport { getServiceAccounts } from '../../../../services/management-service';\nimport {\n  updateServiceAccounts,\n  toggleDataSourcePanel,\n} from '../../../../universal-config/actions/universal-query-actions';\nimport { addStraightToDashboard } from '../../../../universal-config/actions/universal-config-save-actions';\nimport { canServiceUseMirage } from '../../../../universal-config/mirage/mirage-helpers';\nimport { usesOAuth } from '../../../../lib/service';\nimport { redirect } from '../../../../lib/global';\n\nconst mapStateToProps = (\n  {\n    dataSources,\n    dataSourceConnector = {},\n    serviceAccounts,\n    universal = {},\n    user,\n  },\n  { serviceNames = [] },\n) => {\n  const { formattedServices = [] } = dataSources;\n  const {\n    isLoading,\n    groupId,\n    errorMessage,\n    isOauthWindowOpen,\n    serviceName: accountServiceName,\n  } = dataSourceConnector;\n  const { service: currentUniversalService, addingNewConnection } = universal;\n  let { serviceAccountId: accountId } = dataSourceConnector;\n  const { user: { features } = { features: [] } } = user;\n  // Use the first service\n  const [serviceName] = serviceNames;\n\n  const areFormattedServicesLoading =\n    formattedServices.length === 0 && !addingNewConnection;\n\n  // If we're addingNewConnection we're on the config screen and have to grab the\n  // service from universal config since formattedServices doesn't exist.\n  const service = !addingNewConnection\n    ? find(formattedServices, {\n        name: serviceName,\n        isUniversal: true,\n      })\n    : currentUniversalService;\n  const serviceId = service && service.id;\n\n  let accounts;\n\n  if (serviceAccounts) {\n    accounts = get(serviceAccounts, serviceName, []);\n  }\n\n  if (!accountId || accountServiceName !== serviceName) {\n    accountId = get(accounts, '[0].id');\n  }\n\n  if (accountId) {\n    // Apparently we store it as a string. OH WHAT A MERRY TANGLE WE WEAVE\n    accountId = parseInt(accountId, 10);\n  }\n\n  let hasMirageWidget;\n  // For Mirage-activated services (and with the feature flag), we want to initially show the Connection screen\n  // instead of the Preset panel as we normally do\n  if (\n    canServiceUseMirage(serviceName) &&\n    isEmpty(accounts) &&\n    includes(features, 'ff:mirage')\n  ) {\n    hasMirageWidget = true;\n  }\n\n  return {\n    groupId,\n    accountId,\n    addingAnotherAccount: addingNewConnection,\n    hasMirageWidget,\n    isLoading: isLoading || areFormattedServicesLoading,\n    errorMessage,\n    isOauthWindowOpen,\n    service,\n    serviceId,\n    usesOAuth: !!service && usesOAuth(service),\n    hasPresets: !!(service && service.hasPresets),\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { dashboardId } = props;\n\n  const createWidget = (service, preset) => {\n    if (!service) {\n      // Fix race with router\n      return;\n    }\n\n    if (!preset) {\n      dispatch(addStraightToDashboard(service, dashboardId));\n    } else if (preset.heirloom) {\n      redirect(preset.link);\n    } else {\n      dispatch(addStraightToDashboard(service, dashboardId, preset.id));\n    }\n  };\n\n  const onConnect = addingAnotherAccount => (\n    groupId,\n    service = {},\n    extraParams,\n    preset,\n  ) => {\n    const onAddConnectionSuccess = async () => {\n      if (addingAnotherAccount) {\n        const serviceAccounts = await getServiceAccounts(groupId, [\n          service.name,\n        ]);\n        dispatch(updateServiceAccounts(serviceAccounts));\n        dispatch(toggleDataSourcePanel({ showDataSourcePanel: false }));\n      } else {\n        createWidget(service, preset);\n      }\n    };\n    dispatch(\n      addConnection(groupId, service, extraParams, onAddConnectionSuccess),\n    );\n  };\n\n  const onAccountsAvailable = (service, preset) =>\n    createWidget(service, preset);\n\n  return {\n    onConnect,\n    onAccountsAvailable,\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { addingAnotherAccount } = stateProps;\n\n  return {\n    ...ownProps,\n    ...stateProps,\n    ...dispatchProps,\n    onConnect: dispatchProps.onConnect(addingAnotherAccount),\n  };\n};\n\nconst UniversalConnectorConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(UniversalConnectorComponent);\n\nexport default UniversalConnectorConnector;\n","import UniversalConnectorConnector from './universal-connector-connector';\nexport default UniversalConnectorConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { some, isUndefined, orderBy } from 'lodash';\nimport { redirect } from '../../../../lib/global';\nimport { usesOAuth } from '../../../../lib/service';\nimport { getWidgetTypePath } from '../../../../lib/path';\nimport {\n  getService,\n  getServiceWidgetTypes,\n  getServiceAccounts,\n  getDashboard,\n} from '../../../../services/management-service';\nimport { PresetPanelComponent } from '../../../../components/presets/preset-panel/preset-panel-component';\nimport DefaultDataSourceConnector from '../../../default-data-source-connector';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport Layout from '../../../../components/layout';\nimport ErrorComponent from '../../../../components/error';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelectedWidget } from '@Tracking/events';\n\nclass HeirloomConnectorComponent extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      redirecting: false,\n      hasValidServiceAccount: undefined,\n      preset: undefined,\n      error: undefined,\n      service: undefined,\n      widgetTypes: undefined,\n    };\n\n    this.handlePresetSelection = this.handlePresetSelection.bind(this);\n  }\n\n  componentDidMount() {\n    const { serviceId } = this.props;\n    const { service, widgetTypes } = this.state;\n\n    if (serviceId && !service && !widgetTypes) {\n      this.getPresetData(serviceId);\n    }\n  }\n\n  componentDidUpdate() {\n    const { dashboardId } = this.props;\n    const { service, preset } = this.state;\n\n    if (dashboardId && service && preset) {\n      const { hasValidServiceAccount } = this.state;\n\n      if (hasValidServiceAccount) {\n        this.redirectToConfigPage(preset);\n      }\n    }\n  }\n\n  redirectToConfigPage(preset) {\n    const { redirecting } = this.state;\n\n    if (!redirecting) {\n      this.setState({ redirecting: true });\n\n      const { dashboardId, serviceId } = this.props;\n      const { service } = this.state;\n      const { id: widgetTypeId } = preset;\n\n      const heirloomPresetConfigPageUrl = getWidgetTypePath(service.name, {\n        dashboardId,\n        serviceId,\n        widgetTypeId,\n      });\n      redirect(heirloomPresetConfigPageUrl);\n    }\n  }\n\n  handlePresetSelection(preset) {\n    const { dashboardId } = this.props;\n    const { service } = this.state;\n\n    if (dashboardId && service && preset) {\n      const { requires_account: requiresAccount } = service;\n\n      trackEvent(\n        integrationSelectedWidget({\n          'Auth type': service.auth_type,\n          'Integration name': service.title,\n          'Integration slug': service.name,\n          'Widget name': preset.title,\n        }),\n      );\n\n      if (requiresAccount) {\n        this.getValidServiceAccount(dashboardId, service, preset);\n      } else {\n        this.redirectToConfigPage(preset);\n      }\n    }\n  }\n\n  async getValidServiceAccount(dashboardId, service, preset) {\n    try {\n      const dashboard = await getDashboard(dashboardId);\n      const { group_id: groupId } = dashboard;\n\n      const serviceAccounts = await getServiceAccounts(groupId, [service.name]);\n\n      this.setState({\n        hasValidServiceAccount: some(serviceAccounts, ['expired', false]),\n        preset,\n      });\n    } catch (error) {\n      this.setState({ error });\n    }\n  }\n\n  async getPresetData(serviceId) {\n    try {\n      const service = await getService(serviceId);\n      const widgetTypes = await getServiceWidgetTypes(serviceId);\n\n      const orderedWidgetTypes = orderBy(widgetTypes, 'rank');\n\n      /* \n      / The PresetPanelComponent is built around a Universal Widget data model\n      / The PresetPanelComponent expects an Icon property with a type and value\n      / We can reuse the Heirloom tempate.type property to render a Icon\n      */\n      const widgetTypesWithIcon = orderedWidgetTypes.map(widgetType => {\n        return {\n          ...widgetType,\n          icon: { type: 'icon', value: widgetType.template.type },\n        };\n      });\n\n      this.setState({\n        service,\n        widgetTypes: { [service.title]: widgetTypesWithIcon },\n      });\n    } catch (error) {\n      this.setState({ error });\n    }\n  }\n\n  render() {\n    const { error } = this.state;\n    if (error) {\n      return <ErrorComponent error={error} />;\n    }\n\n    const { widgetTypes, service, redirecting } = this.state;\n    const loading = !widgetTypes && !service;\n\n    if (loading || redirecting) {\n      return (\n        <Layout marginTop={4}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </Layout>\n      );\n    }\n\n    const { preset } = this.state;\n\n    if (isUndefined(preset)) {\n      return (\n        <PresetPanelComponent\n          service={service}\n          presets={widgetTypes}\n          onSelect={this.handlePresetSelection}\n          hideFooter\n        />\n      );\n    }\n\n    const { dashboardId, serviceId } = this.props;\n\n    return (\n      <DefaultDataSourceConnector\n        dashboardId={dashboardId}\n        serviceId={serviceId}\n        usesOAuth={usesOAuth(service)}\n        hasEducationalFooter\n        onConnectionSuccess={() => this.redirectToConfigPage(preset)}\n      />\n    );\n  }\n}\n\nHeirloomConnectorComponent.propTypes = {\n  dashboardId: PropTypes.number.isRequired,\n  serviceId: PropTypes.number.isRequired,\n};\n\nexport default HeirloomConnectorComponent;\n","import HeirloomConnectorComponent from './heirloom-connector-component';\nexport default HeirloomConnectorComponent;\n","import { createElement } from 'react';\nimport PropTypes from 'prop-types';\n\nimport styles from './align-style.scss';\n\nconst Align = ({ as, children, className, vertical, ...props }) => {\n  const options = vertical ? styles.vertical : '';\n  return createElement(\n    as,\n    {\n      ...props,\n      className: `${styles.container} ${options} ${className}`,\n    },\n    children,\n  );\n};\n\nAlign.defaultProps = {\n  as: 'div',\n  className: '',\n  vertical: false,\n};\n\nAlign.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  tag: PropTypes.string,\n};\n\nexport default Align;\n","import { default as Align } from './align-component';\nexport default Align;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Query } from 'react-apollo';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport Alert from '@UI/alert';\n\nimport { DatabaseConnections } from '../../../../database-config/database-connections-query.graphql';\n\nimport Align from '../../../../components/align';\n\nconst DatabaseConnectionsQuery = ({ children }) => (\n  <Query query={DatabaseConnections}>\n    {({ data, error, loading }) => {\n      if (loading) {\n        return (\n          <Align vertical>\n            <LoadingSpinner theme={LoadingSpinner.THEMES.DARK} />\n          </Align>\n        );\n      }\n\n      if (error) {\n        return (\n          <Alert\n            type={Alert.TYPES.ERROR}\n            title=\"Something went wrong\"\n            message=\"We couldn't fetch your database connections.\"\n          />\n        );\n      }\n\n      return children(data);\n    }}\n  </Query>\n);\n\nDatabaseConnectionsQuery.propTypes = {\n  children: PropTypes.func.isRequired,\n};\n\nexport const withDatabaseConnections = Component => props => (\n  <DatabaseConnectionsQuery>\n    {data => <Component {...props} connections={data.databaseConnections} />}\n  </DatabaseConnectionsQuery>\n);\n\nexport default DatabaseConnectionsQuery;\n","import QueryEditorModal from './query-editor-modal-component';\n\nexport default QueryEditorModal;\n","export const ENGINES = {\n  MYSQL: {\n    value: 'MYSQL',\n    name: 'MySQL',\n    port: '3306',\n  },\n  POSTGRESQL: {\n    value: 'POSTGRESQL',\n    name: 'PostgreSQL',\n    port: '5432',\n  },\n  REDSHIFT: {\n    value: 'REDSHIFT',\n    name: 'Redshift',\n    port: '5439',\n  },\n};\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { Mutation } from 'react-apollo';\nimport {\n  filter,\n  isEmpty,\n  isNil,\n  isString,\n  mapValues,\n  noop,\n  omit,\n  trim,\n  upperFirst,\n} from 'lodash';\nimport Alert from '@UI/alert';\nimport Icon from '@UI/icon';\nimport SelectDropdown from '../../../../../components/select-dropdown';\nimport Input from '../../../../../components/form/input';\nimport Button from '@UI/button';\nimport ServiceIcon from '../../../../../components/service-icon';\nimport FormattedMessage, {\n  FormattedHTMLMessage,\n  formatMessage,\n} from '../../../../../lib/i18n';\nimport { intercom } from '../../../../../lib/global';\nimport {\n  getApolloErrorType,\n  ERROR_TYPES,\n} from '../../../../../services/concierge-service/error-types';\nimport { ENGINES } from '../../../../../database-config/constants';\nimport DatabaseConnectionCreate from '../../../../../database-config/database-connection-create.graphql';\nimport DatabaseConnections from '../../../../../database-config/database-connections-query.graphql';\n\nimport styles from './database-connector-form-style.scss';\n\nconst databaseOptions = [\n  { value: '', label: 'Please select...' },\n  ...Object.values(ENGINES).map(({ value, name: label }) => ({ value, label })),\n];\n\nexport const getErrorMessage = apolloError => {\n  const error = getApolloErrorType(apolloError);\n  return Object.keys(ERROR_TYPES).indexOf(error) > -1 &&\n    error !== ERROR_TYPES.UNKNOWN\n    ? upperFirst(apolloError.graphQLErrors[0].message)\n    : formatMessage('database.connect.error.message');\n};\n\nconst handleRequestClick = e => {\n  e.preventDefault();\n  intercom('showNewMessage', \"Hi! I'd like to request support for: \");\n};\n\nclass DatabaseConnectorFormComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      isLoading: false,\n      error: null,\n      values: {\n        databaseType: props.databaseType, // if no previous selection from sticker, then empty\n        connectionName: '',\n        port: props.databaseType !== '' ? ENGINES[props.databaseType].port : '',\n        host: '',\n        databaseName: '',\n        username: '',\n        password: '',\n      },\n    };\n\n    this.handleInputChange = this.handleInputChange.bind(this);\n  }\n\n  handleInputChange(newValue) {\n    this.setState({\n      values: {\n        ...this.state.values,\n        ...newValue,\n      },\n    });\n  }\n\n  async handleSubmit(createMutation) {\n    this.props.onSubmit(this.state.values);\n\n    try {\n      const response = await createMutation({\n        variables: this.getMutationVariables(),\n        update: (cache, { data: { databaseConnectionCreate } }) => {\n          try {\n            // Read the database connection list from cache\n            const { databaseConnections } = cache.readQuery({\n              query: DatabaseConnections,\n            });\n\n            // Add the new connection to the cache\n            cache.writeQuery({\n              query: DatabaseConnections,\n              data: {\n                databaseConnections: databaseConnections.concat(\n                  databaseConnectionCreate,\n                ),\n              },\n            });\n          } catch (e) {\n            // swallow cache errors\n          }\n        },\n      });\n\n      this.props.onConnect(response.data.databaseConnectionCreate);\n    } catch (e) {\n      const error = new Error(getErrorMessage(e));\n      error.type = getApolloErrorType(e);\n      this.props.onError(error, this.state.values);\n    }\n  }\n\n  getMutationVariables() {\n    const { values } = this.state;\n\n    return {\n      name: trim(values.connectionName),\n      engine: values.databaseType,\n      configInput: {\n        ...mapValues(\n          {\n            host: values.host,\n            port: parseInt(values.port, 10),\n            database: values.databaseName,\n            user: values.username,\n            password: values.password,\n          },\n          v => (isString(v) ? trim(v) : v),\n        ),\n      },\n    };\n  }\n\n  render() {\n    const { values } = this.state;\n\n    return (\n      <Mutation mutation={DatabaseConnectionCreate}>\n        {(createConnection, { loading, error }) => (\n          <form\n            className={styles.container}\n            onSubmit={e => {\n              e.preventDefault();\n              if (!loading) {\n                this.handleSubmit(createConnection);\n              }\n            }}\n          >\n            <div className={styles.headerContainer}>\n              <header className={styles.header}>\n                <ServiceIcon\n                  serviceName=\"database\"\n                  size={40}\n                  className={styles.icon}\n                  rounded\n                />\n                <h3>\n                  <FormattedMessage id=\"database.connect.title\" />\n                </h3>\n              </header>\n              <div>\n                <strong className={styles.subtitle}>\n                  <FormattedHTMLMessage id=\"database.connect.requirements.title\" />\n                </strong>\n                <ul className={styles.requirements}>\n                  <FormattedHTMLMessage id=\"database.connect.requirements\" />\n                </ul>\n                <FormattedHTMLMessage id=\"database.connect.requirements.sub\" />\n              </div>\n            </div>\n            <div className={styles.form}>\n              <div className={styles.field}>\n                <label>\n                  <FormattedMessage id=\"database.connect.form.databaseType\" />\n                </label>\n                <SelectDropdown\n                  options={databaseOptions}\n                  name=\"databaseType\"\n                  layoutClassName={styles.select}\n                  selected={values.databaseType}\n                  onChange={value => {\n                    this.handleInputChange({\n                      databaseType: value,\n                      port: !!value ? ENGINES[value].port : '',\n                    });\n                  }}\n                />\n                <span className={styles.supplementary}>\n                  Looking for another type of database?{' '}\n                  <a href=\"#\" onClick={handleRequestClick}>\n                    Request support for it\n                  </a>\n                  .\n                </span>\n              </div>\n              <div className={styles.field}>\n                <label>\n                  <FormattedMessage id=\"database.connect.form.connectionName\" />\n                </label>\n                <span className={styles.supplementary}>\n                  <FormattedMessage id=\"database.connect.form.connectionName.sub\" />\n                </span>\n                <Input\n                  name=\"connectionName\"\n                  value={values.connectionName}\n                  placeholder={formatMessage(\n                    'database.connect.form.connectionName.placeholder',\n                  )}\n                  onChange={({ value }) =>\n                    this.handleInputChange({ connectionName: value })\n                  }\n                />\n              </div>\n              <div className={styles.halfFields}>\n                <div className={styles.field}>\n                  <label>\n                    <FormattedMessage id=\"database.connect.form.host\" />\n                  </label>\n                  <Input\n                    name=\"host\"\n                    value={values.host}\n                    placeholder={formatMessage(\n                      'database.connect.form.host.placeholder',\n                    )}\n                    onChange={({ value }) =>\n                      this.handleInputChange({ host: value })\n                    }\n                  />\n                </div>\n                <div className={styles.field}>\n                  <label>\n                    <FormattedMessage id=\"database.connect.form.port\" />\n                  </label>\n                  <Input\n                    name=\"port\"\n                    value={values.port}\n                    type=\"number\"\n                    onChange={({ value }) =>\n                      this.handleInputChange({ port: value })\n                    }\n                  />\n                </div>\n              </div>\n              <div className={styles.field}>\n                <label>\n                  <FormattedMessage id=\"database.connect.form.databaseName\" />\n                </label>\n                <Input\n                  name=\"databaseName\"\n                  value={values.databaseName}\n                  placeholder={formatMessage(\n                    'database.connect.form.databaseName.placeholder',\n                  )}\n                  onChange={({ value }) =>\n                    this.handleInputChange({ databaseName: value })\n                  }\n                />\n              </div>\n              <div className={styles.halfFields}>\n                <div className={styles.field}>\n                  <label>\n                    <FormattedMessage id=\"database.connect.form.username\" />\n                  </label>\n                  <Input\n                    name=\"username\"\n                    value={values.username}\n                    placeholder={formatMessage(\n                      'database.connect.form.username.placeholder',\n                    )}\n                    onChange={({ value }) =>\n                      this.handleInputChange({ username: value })\n                    }\n                  />\n                </div>\n                <div className={styles.field}>\n                  <label>\n                    <FormattedMessage id=\"database.connect.form.password\" />\n                  </label>\n                  <Input\n                    name=\"password\"\n                    value={values.password}\n                    type=\"password\"\n                    onChange={({ value }) =>\n                      this.handleInputChange({ password: value })\n                    }\n                  />\n                </div>\n              </div>\n              <span className={styles.supplementary}>\n                <span className={styles.supplementaryIcon}>\n                  <Icon name=\"lock\" fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR} />\n                </span>\n                <FormattedMessage id=\"database.connect.encrypted\" />\n              </span>\n              <span className={styles.supplementary}>\n                <span className={styles.supplementaryIcon}>\n                  <Icon\n                    name=\"info-circle\"\n                    fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR}\n                  />\n                </span>\n                <FormattedHTMLMessage id=\"database.connect.access\" />\n              </span>\n\n              {error && (\n                <Alert\n                  type={Alert.TYPES.ERROR}\n                  title={<FormattedMessage id=\"database.connect.error.title\" />}\n                  message={getErrorMessage(error)}\n                />\n              )}\n\n              <div className={styles.actions}>\n                <Button\n                  type={Button.TYPES.SUBMIT}\n                  size={Button.SIZES.LARGE}\n                  loading={loading}\n                  disabled={!this.isFormFilled()}\n                >\n                  Connect\n                </Button>\n              </div>\n            </div>\n          </form>\n        )}\n      </Mutation>\n    );\n  }\n\n  isFormFilled() {\n    // Check that all the fields in state have a value, except password, as it\n    // could be blank\n    return (\n      filter(omit(this.state.values, 'password'), v => isNil(v) || isEmpty(v))\n        .length === 0\n    );\n  }\n}\n\nDatabaseConnectorFormComponent.defaultProps = {\n  databaseType: '',\n  onConnect: noop,\n  onError: noop,\n  onSubmit: noop,\n};\n\nDatabaseConnectorFormComponent.propTypes = {\n  databaseType: PropTypes.string,\n  onConnect: PropTypes.func,\n  onError: PropTypes.func,\n  onSubmit: PropTypes.func,\n};\n\nexport default DatabaseConnectorFormComponent;\n","import DatabaseConnectorForm from './database-connector-form-component';\n\nexport default DatabaseConnectorForm;\n","import React from 'react';\nimport { noop } from 'lodash';\nimport PropTypes from 'prop-types';\nimport Image from '@UI/image';\nimport { formatMessage } from '../../../../../lib/i18n';\n\nimport DataSourceHeader from '../../../data-source-header-component';\nimport Icon from '@UI/icon';\nimport { Row, Column } from '../../../../../components/layout';\nimport config from '../../../../../universal/config';\nimport { ENGINES } from '../../../../../database-config/constants';\n\nimport {\n  withIntercomContext,\n  intercomContextTypes,\n} from '../../../../../intercom';\n\nimport styles from './intro-panel-styles.scss';\n\nexport const IntroPanel = ({\n  onContinue,\n  intercomContext: {\n    intercom,\n    messages: { support: supportMessage },\n  },\n}) => {\n  const engines = Object.values(ENGINES);\n\n  const handleRequestClick = e => {\n    e.preventDefault();\n    intercom('showNewMessage', supportMessage);\n  };\n\n  return (\n    <DataSourceHeader\n      serviceName=\"database\"\n      title={<span>Connect to Database</span>}\n    >\n      <ul className={styles.list}>\n        <li>\n          <span className={styles.iconContainer}>\n            <Icon name=\"eye\" />\n          </span>{' '}\n          Pull data from your Database in Geckoboard.\n        </li>\n        <li>\n          <span className={styles.iconContainer}>\n            <Icon name=\"lock\" />\n          </span>{' '}\n          Your data is encrypted and secure at all times.\n        </li>\n      </ul>\n      <Row marginTop={3} justify=\"center\" marginBottom={3}>\n        {engines.map(({ value }, i) => {\n          const type = value.toLowerCase();\n\n          return (\n            <Column\n              key={i}\n              align=\"center\"\n              col={12 / engines.length}\n              paddingLeft={0.5}\n              paddingRight={0.5}\n            >\n              <button\n                key={value}\n                className={styles.button}\n                onClick={() => onContinue(value)}\n              >\n                <Image\n                  className={styles.engineLogo}\n                  src={`${\n                    config.get().StaticAssetBaseURL\n                  }/logos/database-${type}.png`}\n                  width={40}\n                  height={40}\n                />\n                <span>\n                  {formatMessage(`database.connect.form.engines.${type}`)}\n                </span>\n              </button>\n            </Column>\n          );\n        })}\n      </Row>\n      <p className={styles.footer}>\n        Looking for another type of Database?{' '}\n        <a href=\"#\" onClick={handleRequestClick}>\n          Request support for it.\n        </a>\n      </p>\n    </DataSourceHeader>\n  );\n};\n\nIntroPanel.defaultProps = {\n  intercomContext: { intercom: noop, messages: {} },\n};\n\nIntroPanel.propTypes = {\n  onContinue: PropTypes.func.isRequired,\n  intercomContext: intercomContextTypes,\n};\n\nexport default withIntercomContext(IntroPanel);\n","import IntroPanel from './intro-panel-component';\n\nexport default IntroPanel;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Image from '@UI/image';\nimport Alert from '@UI/alert';\nimport config from '../../../../../universal/config';\nimport List from '../../../../../components/list';\nimport ListItem from '../../../../../components/list-item';\nimport Icon from '@UI/icon';\nimport ConfirmModal from '../../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../../lib/i18n';\nimport styles from './connection-list-style.scss';\n\nclass ConnectionList extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      toBeDeleted: undefined,\n    };\n\n    this.closeDeleteModal = this.closeDeleteModal.bind(this);\n    this.deleteConnection = this.deleteConnection.bind(this);\n  }\n\n  render() {\n    const { connections, onSelect } = this.props;\n    const { toBeDeleted } = this.state;\n    const iconBase = `${config.get().StaticAssetBaseURL}/logos`;\n\n    if (!connections.length) {\n      return null;\n    }\n\n    return (\n      <List>\n        {connections.map(connection => (\n          <ListItem\n            hasHoverState={false}\n            key={connection.id}\n            className={styles.connection}\n          >\n            <button\n              onClick={() => onSelect(connection)}\n              className={styles.connectionName}\n            >\n              <Image\n                src={`${iconBase}/database-${connection.engine.toLowerCase()}.png`}\n                width={25}\n                height={25}\n                className={styles.connectionIcon}\n              />\n              {connection.name}\n            </button>\n            <button\n              className={styles.deleteButton}\n              onClick={() => this.openDeleteModal(connection)}\n            >\n              <Icon\n                name=\"trash-alt\"\n                fontWeight={Icon.FONT_WEIGHTS.FA_REGULAR}\n              />\n            </button>\n          </ListItem>\n        ))}\n        <ConfirmModal\n          visible={!!toBeDeleted}\n          isNegative\n          confirmButtonLabel={<FormattedMessage id=\"button.delete\" />}\n          heading={\n            <FormattedMessage\n              id=\"database.delete.confirmModal.title\"\n              values={{\n                connectionName: toBeDeleted ? toBeDeleted.name : 'the',\n              }}\n            />\n          }\n          onClose={this.closeDeleteModal}\n          onConfirm={this.deleteConnection}\n        >\n          <Alert\n            type={Alert.TYPES.WARNING}\n            title={\n              <FormattedMessage id=\"database.delete.confirmModal.alert.title\" />\n            }\n            message={\n              <FormattedMessage id=\"database.delete.confirmModal.alert.message\" />\n            }\n          />\n        </ConfirmModal>\n      </List>\n    );\n  }\n\n  openDeleteModal(connection) {\n    this.setState({ toBeDeleted: connection });\n  }\n\n  closeDeleteModal() {\n    this.setState({ toBeDeleted: undefined });\n  }\n\n  deleteConnection() {\n    const connection = this.state.toBeDeleted;\n    this.props.onDelete(connection);\n    this.closeDeleteModal();\n  }\n}\n\nConnectionList.defaultProps = {\n  connections: [],\n};\n\nConnectionList.propTypes = {\n  connections: PropTypes.array,\n  onDelete: PropTypes.func,\n  onSelect: PropTypes.func,\n};\n\nexport default ConnectionList;\n","import React from 'react';\nimport { Mutation } from 'react-apollo';\nimport ConnectionList from './connection-list-component';\nimport { DatabaseConnectionsQuery } from '../';\nimport { DatabaseConnections } from '../../../../../database-config/database-connections-query.graphql';\nimport { DatabaseConnectionDelete } from '../../../../../database-config/database-connection-delete.graphql';\n\nconst deleteConnection = (connectionId, mutation) => {\n  mutation({\n    variables: { id: connectionId },\n    update: proxy => {\n      // Read the database connection list from cache\n      const cache = proxy.readQuery({\n        query: DatabaseConnections,\n      });\n\n      // Remove the connection we want to delete\n      cache.databaseConnections = cache.databaseConnections.filter(\n        c => c.id !== connectionId,\n      );\n\n      // Write to the cache\n      proxy.writeQuery({\n        query: DatabaseConnections,\n        data: cache,\n      });\n    },\n  });\n};\n\nconst ConnectionListConnector = props => (\n  <DatabaseConnectionsQuery>\n    {data => (\n      <Mutation mutation={DatabaseConnectionDelete}>\n        {mutation => (\n          <ConnectionList\n            {...props}\n            connections={data.databaseConnections}\n            onDelete={({ id }) => deleteConnection(id, mutation)}\n          />\n        )}\n      </Mutation>\n    )}\n  </DatabaseConnectionsQuery>\n);\n\nexport default ConnectionListConnector;\n","import ConnectionList from './connection-list-connector';\nexport default ConnectionList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ServiceIcon from '../../../../../components/service-icon';\nimport FormattedMessage from '../../../../../lib/i18n';\nimport Button from '@UI/button';\nimport ConnectionList from '../connection-list';\n\nimport styles from './connection-list-panel-style.scss';\n\nconst ConnectionListPanel = ({ onAddConnection, onSelectConnection }) => (\n  <div className={styles.container}>\n    <div className={styles.headerContainer}>\n      <header className={styles.header}>\n        <ServiceIcon\n          serviceName=\"database\"\n          size={40}\n          className={styles.icon}\n          rounded\n        />\n        <h3>\n          <FormattedMessage id=\"database.list.title\" />\n        </h3>\n        <Button\n          intent={Button.INTENT.SECONDARY}\n          icon=\"plus\"\n          onClick={onAddConnection}\n        >\n          New connection\n        </Button>\n      </header>\n    </div>\n    <div className={styles.connectionList}>\n      <ConnectionList onSelect={onSelectConnection} />\n    </div>\n  </div>\n);\n\nConnectionListPanel.propTypes = {\n  onAddConnection: PropTypes.func.isRequired,\n  onSelectConnection: PropTypes.func.isRequired,\n};\n\nexport default ConnectionListPanel;\n","import ConnectionListPanel from './connection-list-panel-component';\n\nexport default ConnectionListPanel;\n","import { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  integrationSelectedDataSource,\n  integrationQueryStarted,\n  integrationQueryFinished,\n  integrationClickedConnect,\n  connectionCreated,\n  connectionFailed,\n  connectionSelected,\n  widgetCreated,\n} from '@Tracking/events';\n\nconst DatabaseTrackingProvider = ({\n  children,\n  dashboardId,\n  orgId,\n  service,\n  userId,\n}) => {\n  const { id: serviceId, name: serviceName } = service;\n\n  const sharedProperties = {\n    orgId,\n    userId,\n    dashboardId,\n    serviceId,\n    serviceName,\n  };\n\n  const selectConnection = connection => {\n    track('Database - Select existing connection', {\n      properties: {\n        ...sharedProperties,\n        connectionId: connection.id,\n        connectionName: connection.name,\n      },\n    });\n\n    trackSnowplow('connection_select', '1-0-0', {\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      connection_id: `${connection.id}`,\n      connection_name: `${connection.name}`,\n    });\n\n    trackEvent(\n      connectionSelected({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n        'Data source': connection.engine,\n      }),\n    );\n  };\n\n  const selectEngine = engine => {\n    track('Database - Select database engine', {\n      properties: {\n        ...sharedProperties,\n        dataSource: engine,\n      },\n    });\n\n    trackSnowplow('integration_select-data-source', '1-0-0', {\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      data_source: `${engine}`,\n    });\n\n    trackEvent(\n      integrationSelectedDataSource({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': engine,\n      }),\n    );\n  };\n\n  const submitConnectionForm = values => {\n    track('App - Click connect', {\n      properties: sharedProperties,\n    });\n\n    trackEvent(\n      integrationClickedConnect({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': values.databaseType,\n      }),\n    );\n\n    track('Database - Click connect', {\n      properties: {\n        ...sharedProperties,\n        dataSource: values.databaseType,\n      },\n    });\n    trackSnowplow('service-connect_click', '1-0-0', {\n      org_id: `${orgId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      is_universal: false,\n    });\n  };\n\n  const createConnection = connection => {\n    track('App - Authorised Service', {\n      properties: sharedProperties,\n    });\n    track('Database - Connected successfully', {\n      properties: {\n        ...sharedProperties,\n        dataSource: connection.engine,\n        connectionId: connection.id,\n        connectionName: connection.name,\n      },\n    });\n    trackSnowplow('service_authorize', '1-0-0', {\n      org_id: `${orgId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n    });\n    trackEvent(\n      connectionCreated({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n        'Data source': connection.engine,\n      }),\n    );\n  };\n\n  const createConnectionError = (error, values = {}) => {\n    track('App - Failed to authorise service', {\n      properties: sharedProperties,\n    });\n    track('Database - Failed to connect', {\n      properties: {\n        ...sharedProperties,\n        errorType: error.type,\n        errorMessage: error.message,\n      },\n    });\n    trackEvent(\n      connectionFailed({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': service.name,\n        'Data source': values.databaseType,\n        'Connection failure reason': error.message,\n      }),\n    );\n  };\n\n  const addWidget = (widget, connection) => {\n    track('Widget added', {\n      properties: {\n        widget_id: widget.id,\n        service_name: serviceName,\n        visualisation: widget.configuration.type,\n      },\n    });\n    track('Database - Widget added', {\n      properties: {\n        ...sharedProperties,\n        visualisation: widget.configuration.type,\n        widgetId: widget.id,\n      },\n    });\n    trackSnowplow('widget_add', '1-0-0', {\n      user_id: `${userId}`,\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      widget_id: `${widget.id}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      visualisation_type: `${widget.configuration.type}`,\n    });\n\n    trackEvent(\n      widgetCreated({\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': connection.engine,\n        'Legacy widget ID': `${widget.id}`,\n        Visualisation: widget.configuration.type,\n        'Widget type ID': `${widget.widget_type_id}`,\n      }),\n    );\n  };\n\n  const runQuery = (queryId, connection) => {\n    track('Database - Clicked run query', {\n      properties: sharedProperties,\n    });\n    trackSnowplow('query_click-run', '1-0-0', {\n      query_id: `${queryId}`,\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      connection_id: `${connection.id}`,\n      connection_name: `${connection.name}`,\n    });\n    trackEvent(\n      integrationQueryStarted({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': connection.engine,\n      }),\n    );\n  };\n\n  const queryError = (queryId, error, connection) => {\n    track('Database - Query failed', {\n      properties: {\n        ...sharedProperties,\n        errorType: error.type,\n        errorMessage: error.message,\n      },\n    });\n\n    trackSnowplow('query_finished', '1-0-0', {\n      query_id: `${queryId}`,\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      connection_id: `${connection.id}`,\n      connection_name: `${connection.name}`,\n      outcome_info: `${error.type}`,\n      success: false,\n    });\n\n    trackEvent(\n      integrationQueryFinished({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': connection.engine,\n        'Query success': false,\n      }),\n    );\n  };\n\n  const querySuccess = (queryId, connection) => {\n    track('Database - Query succeeded', {\n      properties: sharedProperties,\n    });\n\n    trackSnowplow('query_finished', '1-0-0', {\n      query_id: `${queryId}`,\n      org_id: `${orgId}`,\n      dashboard_id: `${dashboardId}`,\n      user_id: `${userId}`,\n      service_id: `${serviceId}`,\n      service_name: `${serviceName}`,\n      connection_id: `${connection.id}`,\n      connection_name: `${connection.name}`,\n      success: true,\n    });\n\n    trackEvent(\n      integrationQueryFinished({\n        'Auth type': service.auth_type,\n        'Integration name': service.title,\n        'Integration slug': serviceName,\n        'Data source': connection.engine,\n        'Query success': true,\n      }),\n    );\n  };\n\n  return children({\n    selectConnection,\n    selectEngine,\n    createConnection,\n    submitConnectionForm,\n    createConnectionError,\n    addWidget,\n    runQuery,\n    queryError,\n    querySuccess,\n  });\n};\n\nDatabaseTrackingProvider.propTypes = {\n  children: PropTypes.func.isRequired,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  orgId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  service: PropTypes.object,\n  userId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nconst mapStateToProps = state => {\n  const {\n    user: { user: { id: userId, organization_id: orgId } = {} } = {},\n    dataSources: { services = [] },\n  } = state;\n\n  const service = services.find(s => s.name === 'database') || {};\n\n  return {\n    userId,\n    orgId,\n    service,\n  };\n};\n\nexport default connect(mapStateToProps)(DatabaseTrackingProvider);\n","import DatabaseTrackingProvider from './database-tracking-provider';\nexport default DatabaseTrackingProvider;\n","import React from 'react';\nimport { noop } from 'lodash';\nimport PropTypes from 'prop-types';\nimport Button from '@UI/button';\nimport FormattedMessage, {\n  FormattedHTMLMessage,\n} from '../../../../../lib/i18n';\nimport config from '../../../../../universal/config';\nimport { redirect } from '../../../../../lib/global';\nimport Image from '@UI/image';\nimport style from './database-trial-style.scss';\n\nconst DatabaseTrial = ({ trialist, onDismiss }) => {\n  const onClick = trialist\n    ? onDismiss\n    : () => redirect(DatabaseTrial.redirection);\n\n  return (\n    <div className={style.featureGate}>\n      <div className={style.featureGateInner}>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/images/database-ill.svg`}\n          width=\"95\"\n          height=\"100\"\n        />\n        <strong className={style.featureGateTitle}>\n          <FormattedMessage id=\"featureGate.database.heading\" />\n        </strong>\n        <p className={style.featureGateContent}>\n          <FormattedHTMLMessage\n            id={\n              trialist\n                ? DatabaseTrial.messages.trialistContentId\n                : DatabaseTrial.messages.contentId\n            }\n          />\n        </p>\n        <div className={style.featureGateAction}>\n          <Button stretched onClick={onClick}>\n            <FormattedMessage\n              id={\n                trialist\n                  ? DatabaseTrial.messages.trialistButtonId\n                  : DatabaseTrial.messages.buttonId\n              }\n            />\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nDatabaseTrial.messages = {\n  contentId: 'featureGate.database.text',\n  trialistContentId: 'featureGate.database.trialist.text',\n  buttonId: 'featureGate.database.button',\n  trialistButtonId: 'featureGate.database.trialist.button',\n};\n\nDatabaseTrial.redirection = '/account/plans';\n\nDatabaseTrial.propTypes = {\n  trialist: PropTypes.bool.isRequired,\n  onDismiss: PropTypes.func.isRequired,\n};\n\nDatabaseTrial.defaultProps = {\n  trialist: false,\n  onDismiss: noop,\n};\n\nexport default DatabaseTrial;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { ApolloProvider } from 'react-apollo';\nimport QueryEditorModal from '../../../../database-config/components/query-editor-modal';\nimport DatabaseConnectorForm from './database-connector-form';\nimport IntroPanel from './intro-panel';\nimport ConnectionListPanel from './connection-list-panel';\nimport { redirect } from '../../../../lib/global';\nimport apolloClient from '../../../../services/concierge-service/apollo-client';\nimport DatabaseTrackingProvider from '../../../../database-config/database-tracking-provider';\nimport PricingGate from '../../../../components/pricing-gate';\nimport { create } from '../../../../lib/widget-service';\nimport { generateUniqueId } from '../../../../lib/tracker';\nimport { TEMPLATES } from '../../../../universal/serializers/services';\nimport { DatabaseConnectionsQuery } from './';\nimport { DatabaseTrial } from './trial';\nimport { getDashboardPath } from '../../../../lib/path';\n\nconst createWidget = (dashboardId, databaseId, query, vizType) =>\n  create({\n    dashboard_id: dashboardId,\n    config: {\n      type: vizType,\n      integrationName: 'database',\n      databaseId,\n      query,\n      template: TEMPLATES[vizType],\n    },\n    service_name: 'database',\n  });\n\nexport class DatabaseConnectorComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      currentView: DatabaseConnectorComponent.VIEWS.INTRO,\n      selectedEngine: '',\n      connection: null,\n      queryId: null,\n    };\n\n    this.confirmWidget = this.confirmWidget.bind(this);\n    this.closeEditor = this.closeEditor.bind(this);\n  }\n\n  render() {\n    const { hasConnections, tracker } = this.props;\n    const { currentView, selectedEngine } = this.state;\n\n    const connectionId = this.state.connection\n      ? this.state.connection.id\n      : undefined;\n\n    return (\n      <div>\n        {currentView === DatabaseConnectorComponent.VIEWS.INTRO &&\n          !hasConnections && (\n            <IntroPanel\n              onContinue={engine => {\n                this.setState({ selectedEngine: engine });\n                this.setView(DatabaseConnectorComponent.VIEWS.FORM);\n                tracker.selectEngine(engine);\n              }}\n            />\n          )}\n        {currentView === DatabaseConnectorComponent.VIEWS.INTRO &&\n          hasConnections && (\n            <ConnectionListPanel\n              onAddConnection={() =>\n                this.setView(DatabaseConnectorComponent.VIEWS.FORM)\n              }\n              onSelectConnection={connection => {\n                this.setState({ connection });\n                tracker.selectConnection(connection);\n              }}\n            />\n          )}\n        {currentView === DatabaseConnectorComponent.VIEWS.FORM && (\n          <DatabaseConnectorForm\n            databaseType={selectedEngine}\n            onSubmit={tracker.submitConnectionForm}\n            onError={tracker.createConnectionError}\n            onConnect={connection => {\n              tracker.createConnection(connection);\n              this.setState({\n                connection,\n                currentView: DatabaseConnectorComponent.VIEWS.INTRO,\n              });\n            }}\n          />\n        )}\n        <QueryEditorModal\n          databaseId={connectionId}\n          isOpen={!!connectionId}\n          onClose={this.closeEditor}\n          onRunQuery={() => {\n            const queryId = generateUniqueId();\n            this.setState({ queryId });\n            tracker.runQuery(queryId, this.state.connection);\n          }}\n          onQueryError={error => {\n            const { queryId } = this.state;\n            tracker.queryError(queryId, error, this.state.connection);\n            this.setState({ queryId: null });\n          }}\n          onQuerySuccess={() => {\n            const { queryId } = this.state;\n            tracker.querySuccess(queryId, this.state.connection);\n            this.setState({ queryId: null });\n          }}\n          onConfirm={this.confirmWidget}\n        />\n      </div>\n    );\n  }\n\n  async confirmWidget(query, vizType) {\n    const { dashboardId, tracker } = this.props;\n    const { connection } = this.state;\n\n    try {\n      const widget = await createWidget(\n        dashboardId,\n        connection.id,\n        query,\n        vizType,\n      );\n      tracker.addWidget(widget, connection);\n\n      redirect(getDashboardPath(dashboardId.toString()));\n    } catch (e) {\n      // Swallow errors for now\n    }\n  }\n\n  setView(view) {\n    this.setState({ currentView: view });\n  }\n\n  closeEditor() {\n    this.setState({ connection: null });\n  }\n}\n\nDatabaseConnectorComponent.VIEWS = {\n  INTRO: 'INTRO',\n  FORM: 'FORM',\n};\n\nDatabaseConnectorComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  hasConnections: PropTypes.bool,\n  tracker: PropTypes.any,\n};\n\nconst DatabaseConnectorComponentWrapped = ({ dashboardId }) => (\n  <PricingGate name=\"database\" allowance=\"database_integration\">\n    {({ allowed, ...gateProps }) =>\n      !allowed ? (\n        <DatabaseTrial {...gateProps} />\n      ) : (\n        <DatabaseTrackingProvider dashboardId={dashboardId}>\n          {tracker => (\n            <ApolloProvider client={apolloClient.create()}>\n              <DatabaseConnectionsQuery>\n                {({ databaseConnections }) => (\n                  <DatabaseConnectorComponent\n                    dashboardId={dashboardId}\n                    hasConnections={!!databaseConnections.length}\n                    tracker={tracker}\n                  />\n                )}\n              </DatabaseConnectionsQuery>\n            </ApolloProvider>\n          )}\n        </DatabaseTrackingProvider>\n      )\n    }\n  </PricingGate>\n);\n\nDatabaseConnectorComponentWrapped.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default DatabaseConnectorComponentWrapped;\n","export {\n  default as DatabaseConnectionsQuery,\n  withDatabaseConnections,\n} from './database-connections-query';\nimport DatabaseConnector from './database-connector-component';\n\nexport default DatabaseConnector;\n","import DefaultDataSourceConnector from './default-data-source-connector';\nimport SalesforceConnector from './components/services/salesforce-connector';\nimport SpreadsheetsConnector from './components/services/spreadsheets-connector';\nimport DatasetConnector from './components/services/dataset-connector';\nimport UniversalConnector from './components/services/universal-connector';\nimport HeirloomConnector from './components/services/heirloom-connector';\nimport DatabaseConnector from './components/services/database-connector';\nimport componentPicker from '../lib/component-picker';\n\nexport const COMPONENTS = {\n  spreadsheets: SpreadsheetsConnector,\n  salesforce: SalesforceConnector,\n  datasets: DatasetConnector,\n  universal: UniversalConnector,\n  heirloom: HeirloomConnector,\n  database: DatabaseConnector,\n  _default: DefaultDataSourceConnector,\n};\n\nfunction getComponent(components, serviceName, serviceType) {\n  // When a service type is given (e.g. zendesk2) we want to have a generic connection panel\n  // otherwise use a specific connection panel (for salesforce, spreadsheets)\n  const name = serviceType || serviceName;\n  return componentPicker(components, name, components._default);\n}\n\nexport default { getComponent };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { noop } from 'lodash';\nimport { findDOMNode } from 'react-dom';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './data-source-popover-style.scss';\n\nclass DataSourcePopoverComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.handleKeydown = this.handleKeydown.bind(this);\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  componentDidMount() {\n    document.addEventListener('keydown', this.handleKeydown);\n  }\n\n  componentWillUnmount() {\n    document.removeEventListener('keydown', this.handleKeydown);\n  }\n\n  handleKeydown(e) {\n    if (e.keyCode === 27 && this.props.isOverlayVisible) {\n      this.props.onClose();\n    }\n  }\n\n  handleClick(e) {\n    if (\n      e.target === findDOMNode(this.popover) ||\n      e.target === findDOMNode(this.container)\n    ) {\n      this.props.onClose();\n    }\n  }\n\n  renderPanel() {\n    if (!this.props.isPanelVisible) return null;\n\n    return (\n      <CSSTransition classNames=\"panel\" timeout={500}>\n        <section className={`data-source-connector ${style.content}`}>\n          {this.renderContent()}\n        </section>\n      </CSSTransition>\n    );\n  }\n\n  renderContent() {\n    const { isLoading, children } = this.props;\n\n    if (isLoading) {\n      return (\n        <span className={style.lLoading}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </span>\n      );\n    }\n\n    return children;\n  }\n\n  renderPopover() {\n    const { isOverlayVisible } = this.props;\n\n    if (!isOverlayVisible) return null;\n\n    return (\n      <CSSTransition classNames=\"popover\" timeout={500}>\n        <div\n          className={`${style.popover} ${style.sidePanel}`}\n          onClick={this.handleClick}\n          ref={e => (this.popover = e)}\n          key=\"popover\"\n        >\n          <div className={style.container} ref={e => (this.container = e)}>\n            <TransitionGroup>{this.renderPanel()}</TransitionGroup>\n          </div>\n        </div>\n      </CSSTransition>\n    );\n  }\n\n  render() {\n    return <TransitionGroup>{this.renderPopover()}</TransitionGroup>;\n  }\n}\n\nDataSourcePopoverComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  isInfoVisible: PropTypes.bool,\n  isLoading: PropTypes.bool,\n  isOverlayVisible: PropTypes.bool,\n  isPanelVisible: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nDataSourcePopoverComponent.defaultProps = {\n  isLoading: false,\n  onClose: noop,\n};\n\nexport default DataSourcePopoverComponent;\n","import DataSourcePopover from './data-source-popover-component';\nexport default DataSourcePopover;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport connectorPicker, { COMPONENTS } from './connector-picker';\nimport DataSourcePopover from './data-source-popover';\nimport { isFinite } from 'lodash';\n\nclass DataSourceConnectorComponent extends Component {\n  componentDidMount() {\n    const { serviceId, init } = this.props;\n\n    if (serviceId) {\n      init();\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    const { serviceId, init } = nextProps;\n\n    if (serviceId && serviceId !== this.props.serviceId) {\n      init();\n    }\n  }\n\n  renderConnector() {\n    let { serviceId: name } = this.props;\n\n    const { dashboardId, widgetId, serviceNames, serviceType } = this.props;\n\n    const serviceId = parseInt(name, 10);\n\n    // If we're given a string to identify the service then we pass it straight through\n    // If we're given an integer then we have to hand off to the regular connector\n    // and let it fetch the service for the given id\n    if (isFinite(serviceId)) {\n      name = '_default';\n    }\n\n    const ConnectorComponent = connectorPicker.getComponent(\n      COMPONENTS,\n      name,\n      serviceType,\n    );\n\n    if (!dashboardId || !name) {\n      return null;\n    }\n\n    return (\n      <ConnectorComponent\n        serviceId={serviceId}\n        serviceName={name}\n        dashboardId={dashboardId}\n        widgetId={widgetId}\n        serviceNames={serviceNames}\n      />\n    );\n  }\n\n  render() {\n    const {\n      onClose,\n      isOverlayVisible,\n      isInfoVisible,\n      isPanelVisible,\n    } = this.props;\n\n    return (\n      <DataSourcePopover\n        onClose={onClose}\n        isOverlayVisible={isOverlayVisible}\n        isInfoVisible={isInfoVisible}\n        isPanelVisible={isPanelVisible}\n      >\n        {this.renderConnector()}\n      </DataSourcePopover>\n    );\n  }\n}\n\nDataSourceConnectorComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  init: PropTypes.func,\n  isInfoVisible: PropTypes.bool,\n  isOverlayVisible: PropTypes.bool,\n  isPanelVisible: PropTypes.bool,\n  serviceId: PropTypes.string,\n  serviceNames: PropTypes.arrayOf(PropTypes.string),\n  serviceType: PropTypes.string,\n  widgetId: PropTypes.string,\n  onClose: PropTypes.func,\n};\n\nexport default DataSourceConnectorComponent;\n","import { connect } from 'react-redux';\nimport DataSourceConnectorComponent from './data-source-connector-component';\nimport {\n  init,\n  initPanelOldIntegration,\n  cancelConnection,\n} from './actions/data-source-connector-actions';\nimport { isPolecatService } from '../lib/is-polecat-service';\nimport { SPREADSHEET_SERVICE_NAMES } from '../data-sources/data-sources-helpers';\n\nfunction getServiceNames(serviceId, serviceType) {\n  if (serviceType === 'universal') {\n    // Spreadsheets is returning a list of services,\n    // that's why we're passing an array with only one service name here (e.g. ['zendesk2'])\n    return [serviceId];\n  }\n\n  switch (serviceId) {\n    case 'spreadsheets':\n      return SPREADSHEET_SERVICE_NAMES;\n    case 'salesforce':\n      return ['salesforce'];\n    case 'database':\n      return ['database'];\n    default:\n      return null;\n  }\n}\n\nconst DataSourceConnector = connect(\n  (state, props) => {\n    const { dataSourceConnector = {}, filePicker = {} } = state;\n    const { serviceId, serviceType } = props;\n    const {\n      isInfoVisible,\n      isPanelVisible,\n      serviceAccountId,\n    } = dataSourceConnector;\n    const serviceNames = getServiceNames(serviceId, serviceType);\n\n    return {\n      serviceNames,\n      serviceType,\n      isOverlayVisible: !!serviceId,\n      isInfoVisible,\n      isPanelVisible,\n      serviceAccountId,\n      ...filePicker,\n    };\n  },\n  (dispatch, props) => {\n    const { dashboardId, serviceId, serviceType, onCancel } = props;\n    const serviceNames = getServiceNames(serviceId, serviceType);\n\n    const onInit = () => {\n      if (isPolecatService(serviceId, serviceType)) {\n        dispatch(\n          init({\n            dashboardId,\n            services: serviceNames,\n            serviceId,\n            serviceType,\n          }),\n        );\n      } else {\n        dispatch(initPanelOldIntegration());\n      }\n    };\n    const onClose = () => {\n      if (onCancel) {\n        onCancel();\n      } else {\n        dispatch(cancelConnection());\n      }\n    };\n\n    return { init: onInit, onClose };\n  },\n)(DataSourceConnectorComponent);\n\nexport { DataSourceConnector as default };\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"extendedItem\":\"extendedItem---1KY08\",\"fiWrapper\":\"fiWrapper---pX6_q\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"filePickerWrapper\":\"filePickerWrapper---21Suc\",\"error\":\"error---1mYBT\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---_-LA_\",\"vertical\":\"vertical---2lIZs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"placeholder\":\"placeholder---34Qw5\",\"container\":\"container---2mJXh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"mastheadButton\":\"mastheadButton---3NjBd\",\"mastheadUpgradeText\":\"mastheadUpgradeText---1DAhJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"scheduledPostTimezone\":\"scheduledPostTimezone---2KZ83\",\"changeTimezoneButton\":\"changeTimezoneButton---1xyTs\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"wrapper\":\"wrapper---2BSpv\",\"overlay\":\"overlay---14mTD\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"copieable\":\"copieable---3WXip\",\"copied\":\"copied---15PpH\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"initials\":\"initials---6pxTf\",\"pending\":\"pending---28eo4 initials---6pxTf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1zWKk\",\"permissionDropMenuList\":\"permissionDropMenuList---2qnpg\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"usersListItemName\":\"usersListItemName---2-8Ju\",\"lastColumn\":\"lastColumn---2Iqb6\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"listHeading\":\"listHeading---1sIyF\",\"iconContainer\":\"iconContainer---2DiHh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"section\":\"section---2qDLf\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1nmRl\",\"offlineText\":\"offlineText---RUxZI\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"fullscreenButton\":\"fullscreenButton---sr0zT\",\"sharing\":\"sharing---3ixe_\",\"pointerActive\":\"pointerActive---2jyUt\",\"featureGate\":\"featureGate---UDXVV\",\"featureGateTitle\":\"featureGateTitle---31TdP\",\"featureGateContent\":\"featureGateContent---1gG3x\",\"featureGateAction\":\"featureGateAction---1EWli\",\"featureGateDesktopLink\":\"featureGateDesktopLink---D3J_i\"};","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { getHumanReadableName } from '../../../visualisation/helpers';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './empty-visualisation-style.scss';\n\nconst ERROR_OVERRIDES = {\n  'datasets-line-ErrIncompatibleTypes':\n    \"The Y-axis cannot be plotted because the field types don't match. Please select fields of the same type.\",\n};\n\nclass EmptyVisualisationComponent extends Component {\n  renderTitle(title) {\n    const { isLoading } = this.props;\n\n    if (!isLoading) {\n      return <h3>{title}</h3>;\n    }\n\n    return (\n      <h3>\n        <span className={style.lLoading}>\n          <LoadingSpinner />\n        </span>\n        {`Creating ${title}`}\n      </h3>\n    );\n  }\n\n  renderMessage(error) {\n    const { polecatService, type, isVisualisationDataComplete } = this.props;\n    if (error) {\n      const errorKey = `${polecatService}-${type}-${error.type}`;\n      const errorMessage = ERROR_OVERRIDES[errorKey] || error.message;\n      return ['fa-exclamation-triangle', errorMessage];\n    }\n\n    switch (polecatService) {\n      case 'spreadsheets':\n        return [\n          'fa-info-circle',\n          'You can create a visualization using data from your spreadsheet',\n        ];\n      case 'salesforce':\n        return [\n          'fa-exclamation-triangle',\n          'Your report does not contain the data required for this visualization',\n        ];\n      case 'datasets':\n        return [\n          'fa-exclamation-triangle',\n          'Your dataset does not contain the data required for this visualization',\n        ];\n      case 'universal':\n        return isVisualisationDataComplete\n          ? ['fa-exclamation-triangle', 'No data to visualize']\n          : ['', ''];\n      default:\n        return ['', ''];\n    }\n  }\n\n  renderInfo() {\n    const { isLoading, error } = this.props;\n\n    if (isLoading) return null;\n\n    const [classes, infoText] = this.renderMessage(error);\n\n    return (\n      <div className={style.text}>\n        <p>\n          <i className={`fa ${classes}`} /> {infoText}\n        </p>\n      </div>\n    );\n  }\n\n  render() {\n    const { type } = this.props;\n    const title = type ? getHumanReadableName(type) : 'Chart';\n\n    return (\n      <div className={style.emptyState}>\n        <div className={style.placeholder}>\n          <div className={style.image}>\n            <div className={`${style.illustration}`}>\n              <span className={`icon-gecko gecko-font gecko-${type}`} />\n            </div>\n            {this.renderTitle(title)}\n          </div>\n        </div>\n        {this.renderInfo()}\n      </div>\n    );\n  }\n}\n\nEmptyVisualisationComponent.propTypes = {\n  error: PropTypes.instanceOf(Error),\n  isLoading: PropTypes.bool,\n  isVisualisationDataComplete: PropTypes.bool,\n  polecatService: PropTypes.string,\n  type: PropTypes.string,\n};\n\nexport default EmptyVisualisationComponent;\n","import EmptyVisualisation from './empty-visualisation-component';\nexport default EmptyVisualisation;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport {\n  VisualisationWrapper,\n  getVisualisationStatus,\n} from '../../../visualisation';\nimport EmptyVisualisation from '../empty-visualisation';\nimport * as transformers from '../../../universal/transformers';\nimport { CSSVariables } from '../../../dashboard/customization-applicator/customization-applicator-component';\nimport themes from '../../../dashboard/themes';\n\nimport style from './preview-style.scss';\n\nclass PreviewComponent extends Component {\n  renderEmpty(type, isLoading) {\n    const { polecatService, error, isVisualisationDataComplete } = this.props;\n\n    return (\n      <div className={style.previewWrapper}>\n        <EmptyVisualisation\n          type={type}\n          isLoading={isLoading}\n          isVisualisationDataComplete={isVisualisationDataComplete}\n          error={error}\n          polecatService={polecatService}\n        />\n      </div>\n    );\n  }\n\n  renderLoading(type) {\n    return this.renderEmpty(type, true);\n  }\n\n  render() {\n    const {\n      config,\n      data,\n      transformedData,\n      features,\n      polecatService,\n      dashboard: {\n        attributes: { timezone },\n      },\n      error,\n      gridSize,\n      isLoading,\n      isContentLoading,\n      isPreviewMode,\n      isVisualisationDataComplete,\n      visualisationProps,\n    } = this.props;\n\n    const { type } = config;\n\n    if (!type || !polecatService) return null;\n\n    if (isLoading) {\n      return this.renderLoading(type);\n    }\n\n    let ctx = transformedData;\n\n    if (!ctx) {\n      ctx = transformers[polecatService][type].transform(\n        data,\n        config,\n        timezone,\n      );\n    }\n\n    if (!VisualisationWrapper.canRender(type, ctx) || error) {\n      return this.renderEmpty(type, false);\n    }\n\n    // If there are indicators in ctx it means thresholds\n    // were transformed so use these instead.\n    const newConfig = { ...config };\n    if (ctx.indicators) {\n      newConfig.indicators = {\n        ...newConfig.indicators,\n        thresholds: ctx.indicators.thresholds,\n      };\n    }\n\n    const visualisationStatus = getVisualisationStatus(type, newConfig, ctx);\n    const previewClasses = classNames(\n      style.previewWrapper,\n      visualisationStatus,\n      {\n        [style.previewMode]: isPreviewMode,\n        [style.visualisationNotComplete]: !isVisualisationDataComplete,\n      },\n    );\n\n    return (\n      <CSSVariables variables={isPreviewMode ? themes.dashiesDark : undefined}>\n        <div className={previewClasses}>\n          <div className={style.title}>{this.props.children}</div>\n          <VisualisationWrapper\n            type={type}\n            {...ctx}\n            {...visualisationProps}\n            id={1}\n            dashboardTz={timezone}\n            features={features}\n            isContentLoading={isContentLoading}\n            isPreviewMode={isPreviewMode}\n            gridSize={gridSize}\n            tvMode\n          />\n        </div>\n      </CSSVariables>\n    );\n  }\n}\n\nPreviewComponent.propTypes = {\n  children: PropTypes.node,\n  config: PropTypes.object,\n  dashboard: PropTypes.object,\n  data: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n  error: PropTypes.instanceOf(Error),\n  features: PropTypes.object,\n  gridSize: PropTypes.number,\n  height: PropTypes.number,\n  isContentLoading: PropTypes.bool,\n  isLoading: PropTypes.bool,\n  isPreviewMode: PropTypes.bool,\n  isStatusIndicatorsEnabled: PropTypes.bool,\n  isVisualisationDataComplete: PropTypes.bool,\n  polecatService: PropTypes.string,\n  style: PropTypes.object,\n  transformedData: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n  visualisationProps: PropTypes.object,\n};\n\nPreviewComponent.defaultProps = {\n  config: {},\n  dashboard: { attributes: { timezone: undefined } },\n  isPreviewMode: true,\n  isStatusIndicatorsEnabled: false,\n  isVisualisationDataComplete: true,\n  visualisationProps: {},\n};\n\nexport default PreviewComponent;\n","import Preview from './preview-component';\nexport default Preview;\n","import InputDropdownGroup from './input-dropdown-group-component';\n\nexport default InputDropdownGroup;\n","import { connect } from 'react-redux';\nimport DashboardFooterComponent from './dashboard-footer-component';\nimport filterByAllowances from '../../../customize/filter-by-allowances';\nimport connectToHistory from '../../../hoc/connect-to-history';\nimport { getCustomizeValues } from '../../../customize/helpers';\n\nconst mapStateToProps = (state, { isPreview }) => {\n  const { dashboard: { dashboard } = {}, customize, user } = state;\n  const {\n    user: {\n      allowances = {},\n      trialDaysRemaining,\n      show_trial_countdown: showTrialCountdown,\n    } = {},\n  } = user;\n\n  // Until the dashboard has been intialised we don't know whether this is\n  // enabled or not, so treat it as disabled.\n  if (!dashboard) {\n    return {\n      enabled: false,\n    };\n  }\n\n  let values = getCustomizeValues(dashboard, customize);\n\n  if (!isPreview) {\n    values = filterByAllowances(values, allowances);\n  }\n\n  const { showFooter, showClock, showLogo, logoSrc } = values;\n\n  return {\n    title: dashboard.title,\n    enabled: showFooter,\n    showClock,\n    showLogo,\n    logoSrc,\n    trialDaysRemaining,\n    showTrialCountdown,\n  };\n};\n\nexport const DashboardFooterConnector = connect(mapStateToProps)(\n  DashboardFooterComponent,\n);\n\n// We are currently unable to test components wrapped with `connectToHistory`.\n// Once we move to React Router v4 and `connectToHistory` is removed\n// it will be possible to test this.\nconst DashboardFooterHistoryConnector = connectToHistory(history => {\n  return { isPreview: !!history.pathname.match(/customize\\/?$/) };\n})(DashboardFooterConnector);\n\nexport default DashboardFooterHistoryConnector;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"form\":\"form---1lYZt\"};","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Row } from '../components/layout';\nimport Button from '@UI/button';\nimport ExternalLink from '../components/external-link';\nimport FormattedMessage from '../lib/i18n';\n\nimport styles from './empty-dashboard-style.scss';\n\nconst MARKETING_EXAMPLES_LINK =\n  'https://www.geckoboard.com/learn/dashboard-examples';\n\nconst EmptyDashboardComponent = props => {\n  const addWidgetPath = `/v4/dashboards/${props.dashboardId}`;\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.content}>\n        <h2>\n          <FormattedMessage id=\"dashboard.empty.heading\" />\n        </h2>\n        <p>\n          <FormattedMessage id=\"dashboard.empty.body\" />\n        </p>\n        <Button href={addWidgetPath} icon=\"plus\">\n          <FormattedMessage id=\"button.addWidget\" />\n        </Button>\n      </div>\n      <Row paddingTop={1}>\n        <ExternalLink\n          href={MARKETING_EXAMPLES_LINK}\n          eventName=\"Dashboard empty state - Clicked dashboard examples\"\n          className={styles.link}\n        >\n          <span className={styles.footerLink}>\n            <span className={styles.heading}>\n              <i className=\"fa fa-lightbulb\" />\n              <FormattedMessage id=\"dashboard.exampleLink.heading\" />\n            </span>{' '}\n            <FormattedMessage id=\"dashboard.exampleLink.body\" />\n            <i className={`fa fa-angle-right ${styles.angleRight}`} />\n          </span>\n        </ExternalLink>\n      </Row>\n    </div>\n  );\n};\n\nEmptyDashboardComponent.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default EmptyDashboardComponent;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport fscreen from 'fscreen';\n\nfunction fullscreenChangeListener(DecoratedComponent) {\n  const displayName =\n    DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n  class FullscreenChangeListener extends Component {\n    static get displayName() {\n      return `fullscreenChangeListener(${displayName})`;\n    }\n\n    constructor(props) {\n      super(props);\n      this.state = { isFullscreen: this.isFullscreen() };\n      this.handleFullscreenChange = this.handleFullscreenChange.bind(this);\n    }\n\n    componentDidMount() {\n      fscreen.addEventListener('fullscreenchange', this.handleFullscreenChange);\n    }\n\n    componentWillUnmount() {\n      fscreen.removeEventListener(\n        'fullscreenchange',\n        this.handleFullscreenChange,\n      );\n    }\n\n    handleFullscreenChange() {\n      const isFullscreen = this.isFullscreen();\n\n      this.setState({ isFullscreen });\n      this.props.onFullscreenChange(isFullscreen);\n    }\n\n    render() {\n      return (\n        <DecoratedComponent\n          isFullscreen={this.state.isFullscreen}\n          {...this.props}\n        />\n      );\n    }\n\n    isFullscreen() {\n      if (fscreen.fullscreenElement !== null) {\n        return true;\n      }\n\n      return false;\n    }\n  }\n\n  FullscreenChangeListener.defaultProps = {\n    onFullscreenChange: () => {},\n  };\n\n  FullscreenChangeListener.propTypes = {\n    onFullscreenChange: PropTypes.func,\n  };\n\n  return FullscreenChangeListener;\n}\n\nexport default fullscreenChangeListener;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n  formatLastUpdatedText,\n  VIEWING_CONTEXT_TYPES,\n} from '../instrument-helpers';\nimport WidgetTitle from '../../../widget-title/widget-title-component';\nimport * as widgetHelpers from '../widget-helpers/widget-helpers';\n\nimport style from './instrument-header-style.scss';\n\nclass InstrumentHeaderComponent extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      didUserReload: false,\n    };\n\n    this.onReloadClick = this.onReloadClick.bind(this);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (this.props.isLoading && !nextProps.isLoading) {\n      this.setState({ didUserReload: false });\n    }\n  }\n\n  onReloadClick() {\n    const { handleReload } = this.props;\n    this.setState({ didUserReload: true });\n    handleReload();\n  }\n\n  render() {\n    const {\n      canReload,\n      dataUpdatedAt,\n      addBackground,\n      isLoading,\n      isTitleEnabled,\n      renderLastUpdate,\n      title,\n      titleFontSize,\n      tvMode,\n      viewingContext,\n      legacyWidgetKey,\n      instrumentId,\n    } = this.props;\n\n    let lastUpdatedText;\n    if (renderLastUpdate && dataUpdatedAt) {\n      lastUpdatedText = formatLastUpdatedText(dataUpdatedAt);\n    }\n\n    const headerClassNames = classNames(style.instrumentHeader, {\n      [style.hasBackground]: addBackground,\n      [style.bringToBack]: !isTitleEnabled,\n    });\n\n    const reloadButtonClassNames = classNames(style.reloadButton, {\n      [style.rotateButton]: isLoading && this.state.didUserReload,\n    });\n\n    return (\n      <header className={headerClassNames}>\n        {isTitleEnabled && (\n          <div className={style.title}>\n            <WidgetTitle\n              title={title}\n              canEdit={viewingContext === VIEWING_CONTEXT_TYPES.EDIT}\n              tvMode={tvMode}\n              isSmall={titleFontSize === 'SMALL'}\n              onUpdate={newTitle => {\n                widgetHelpers.updateTitle(\n                  newTitle,\n                  legacyWidgetKey,\n                  instrumentId,\n                  title,\n                );\n              }}\n            />\n          </div>\n        )}\n\n        {(lastUpdatedText || canReload) && (\n          <div className={style.options}>\n            {lastUpdatedText && (\n              <button className={`${style.lastUpdated}`}>\n                {lastUpdatedText}\n              </button>\n            )}\n            {canReload && (\n              <button\n                className={reloadButtonClassNames}\n                disabled={isLoading}\n                onClick={this.onReloadClick}\n              />\n            )}\n          </div>\n        )}\n      </header>\n    );\n  }\n}\n\nInstrumentHeaderComponent.defaultProps = {\n  canReload: false,\n  addBackground: false,\n  isLoading: false,\n  handleReload: () => {},\n  isTitleEnabled: true,\n  renderLastUpdate: false,\n  titleFontSize: 'LARGE',\n  viewingContext: VIEWING_CONTEXT_TYPES.EDIT,\n};\n\nInstrumentHeaderComponent.propTypes = {\n  addBackground: PropTypes.bool,\n  canReload: PropTypes.bool,\n  dataUpdatedAt: PropTypes.instanceOf(Date),\n  handleReload: PropTypes.func,\n  instrumentId: PropTypes.string,\n  isLoading: PropTypes.bool,\n  isTitleEnabled: PropTypes.bool,\n  legacyWidgetKey: PropTypes.string,\n  renderLastUpdate: PropTypes.bool,\n  title: PropTypes.string,\n  titleFontSize: PropTypes.oneOf(['SMALL', 'LARGE']),\n  tvMode: PropTypes.bool,\n  viewingContext: PropTypes.oneOf(Object.values(VIEWING_CONTEXT_TYPES)),\n};\n\nexport default InstrumentHeaderComponent;\n","import InstrumentHeader from './instrument-header-component';\n\nexport default InstrumentHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage, {\n  FormattedHTMLMessage,\n  formatMessage,\n} from '../../../lib/i18n';\nimport NoDataPushedError from '../../../widget/widget-errors/no-data-pushed-error';\nimport OAuthTokenExpiredOrInvalidError from '../../../widget/widget-errors/oauth-token-expired-or-invalid-error';\nimport ServiceAccountNotFoundError from '../../../widget/widget-errors/service-account-not-found-error';\nimport WidgetDataError from '../../../widget/widget-errors/widget-data-error';\nimport { VIEWING_CONTEXT_TYPES } from '../instrument-helpers';\n\nimport style from './instrument-error-style.scss';\n\nconst getErrorMessage = (error, canEdit, integrationName, widgetKey) => {\n  const { user: userMessage } = error;\n  const errorMessage =\n    userMessage || formatMessage('widget.error.dataError.default');\n\n  switch (error.type) {\n    case 'ErrNoData':\n      return <FormattedMessage id=\"widget.error.noDataError.description\" />;\n    case 'ErrOutdated':\n      return (\n        <FormattedHTMLMessage id=\"widget.error.outdatedData.description\" />\n      );\n    case 'ErrNoDataPushed':\n      return <NoDataPushedError canEdit={canEdit} widgetKey={widgetKey} />;\n    case 'ErrOAuthTokenExpiredOrInvalid':\n      return (\n        <OAuthTokenExpiredOrInvalidError\n          canEdit={canEdit}\n          serviceTitle={integrationName}\n        />\n      );\n    case 'ErrServiceAccountNotFound':\n      return (\n        <ServiceAccountNotFoundError\n          canEdit={canEdit}\n          serviceTitle={integrationName}\n        />\n      );\n    case 'validation':\n      return <WidgetDataError message={errorMessage} canEdit={canEdit} />;\n    default:\n      // Message coming from error might be HTML, so dangerouslySetInnerHTML\n      return <div dangerouslySetInnerHTML={{ __html: errorMessage }} />;\n  }\n};\n\nconst InstrumentErrorComponent = ({\n  error,\n  integrationName,\n  viewingContext,\n  legacyWidgetKey,\n}) => {\n  const errorMessage = getErrorMessage(\n    error,\n    viewingContext === VIEWING_CONTEXT_TYPES.EDIT,\n    integrationName,\n    legacyWidgetKey,\n  );\n\n  return <div className={style.instrumentError}>{errorMessage}</div>;\n};\n\nInstrumentErrorComponent.propTypes = {\n  error: PropTypes.shape({ type: PropTypes.string.isRequired }).isRequired,\n  viewingContext: PropTypes.oneOf(Object.values(VIEWING_CONTEXT_TYPES))\n    .isRequired,\n  integrationName: PropTypes.string,\n  legacyWidgetKey: PropTypes.string,\n};\n\nexport default InstrumentErrorComponent;\n","import InstrumentError from './instrument-error-component';\n\nexport default InstrumentError;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\nimport classNames from 'classnames';\nimport InstrumentHeader from './instrument-header';\nimport InstrumentError from './instrument-error';\nimport InstrumentLoader from '../../widget-loader';\nimport InstrumentImporting from '../../widget/widget-importing/';\nimport { VIEWING_CONTEXT_TYPES } from './instrument-helpers';\nimport { useCanUserEdit } from '@Hooks';\nimport {\n  INSTRUMENT_STATES,\n  getInstrumentDisplayState,\n  getVisualisationComponent,\n  getVisualisationPadding,\n  mergeConfigAndData,\n  transformConfig,\n  transformData,\n  getVisualisationSize,\n  getTitleHeight,\n} from './instrument-helpers';\nimport * as widgetHelpers from './widget-helpers/widget-helpers';\nimport { LAYOUT_TYPES } from '../../dashboard/dashboard-layout/constants';\n\nimport style from './instrument.scss';\n\nconst Instrument = props => {\n  const {\n    canUseResponsiveNumberViz,\n    dashboardTz,\n    data: {\n      updatedAt: dataUpdatedAt,\n      isFromCache: isDataFromCache,\n      isPartial,\n      payload: data = {}, // transformers expect empty data object\n    },\n    error,\n    dashboardLayoutType,\n    dataSource,\n    fontSize,\n    gridSize,\n    hideTitleWhenShort,\n    id,\n    isLoading,\n    isImporting,\n    handleReload,\n    refreshMode,\n    renderTitle,\n    shouldPad,\n    size: { width, height },\n    title,\n    titleFontSize,\n    viewingContext,\n    visualisationType,\n    visualisationProps,\n    visualisationScale,\n    doNotUseLegacyWidgetKey,\n    useContentHeight,\n  } = props;\n  const {\n    dataURL,\n    integration: { name: integrationName, slug: integrationSlug } = {},\n  } = dataSource || {};\n  const canUserEdit = useCanUserEdit();\n  const hasData = !!dataURL;\n\n  // If no refresh mode is provided it's a non-data instrument\n  const isClientSideRefresh = refreshMode\n    ? refreshMode.__typename === 'ClientInitiated'\n    : false;\n\n  // Non-data instruments are always ready\n  const displayState = hasData\n    ? getInstrumentDisplayState({\n        data,\n        error,\n        isDataFromCache,\n        dataUpdatedAt,\n        isPartial,\n        isLoading,\n      })\n    : INSTRUMENT_STATES.ready;\n\n  const instrumentError =\n    displayState === INSTRUMENT_STATES.outdated\n      ? {\n          type: 'ErrOutdated',\n        }\n      : error;\n\n  const Visualisation = getVisualisationComponent(\n    visualisationType,\n    dashboardLayoutType,\n  );\n  const shouldRenderError =\n    !!instrumentError &&\n    displayState !== INSTRUMENT_STATES.stale &&\n    displayState !== INSTRUMENT_STATES.importing;\n  const shouldRenderVisualisation =\n    !shouldRenderError &&\n    !!Visualisation &&\n    (displayState === INSTRUMENT_STATES.ready ||\n      displayState === INSTRUMENT_STATES.stale ||\n      displayState === INSTRUMENT_STATES.backgroundLoading);\n\n  // 230 taken from widget-component to keep exact same functionality\n  const isShort = height < 230;\n  const useLargeFont = fontSize === 'LARGE';\n  const useWidgetSidePadding = useLargeFont && shouldPad;\n  const visualisationPadding = getVisualisationPadding(\n    visualisationType,\n    useWidgetSidePadding,\n  );\n\n  const config = transformConfig(\n    visualisationType,\n    {\n      ...visualisationProps,\n      size: getVisualisationSize(\n        width,\n        height,\n        visualisationPadding,\n        getTitleHeight(renderTitle, fontSize),\n      ),\n    },\n    canUseResponsiveNumberViz,\n    title,\n    integrationSlug,\n  );\n  const transformedData = transformData(visualisationType, data);\n\n  // Set instrument to full size and scale down so\n  // vis content is scaled properly.\n  let scalingStyle;\n  if (!useContentHeight) {\n    scalingStyle = {\n      width,\n      height,\n      transform: `scale(${visualisationScale})`,\n    };\n  }\n\n  let statusIndicatorClass;\n  if (\n    shouldRenderVisualisation &&\n    !canUseResponsiveNumberViz &&\n    visualisationType === 'Number' &&\n    Visualisation.getVisualisationStatus\n  ) {\n    // Add classes for warning or positive for number visualisation.\n    // Using getVisualisationStatus supports both legacy and new data versions.\n    const configWithThresholds = { ...config };\n    if (transformedData.indicators && transformedData.indicators.thresholds) {\n      // getVisualisationStatus only checks the config for thresholds so if\n      // thresholds are coming from data pass them in the config.\n      configWithThresholds.indicators = {\n        ...configWithThresholds.indicators,\n        thresholds: transformedData.indicators.thresholds,\n      };\n    }\n    statusIndicatorClass = Visualisation.getVisualisationStatus(\n      configWithThresholds,\n      transformedData,\n    );\n  }\n\n  const hasBackgroundColor = visualisationType !== 'Image';\n  const hasHeader = visualisationType !== 'Image' || !!title;\n  const renderHeader = !(\n    canUseResponsiveNumberViz && visualisationType === 'Number'\n  );\n\n  const instrumentClasses = classNames(style.instrument, {\n    [style.useContentHeight]: useContentHeight,\n    'tv-mode': useWidgetSidePadding,\n    [style.hasBackground]: hasBackgroundColor,\n    [style.fixedLayoutBackground]:\n      hasBackgroundColor && dashboardLayoutType === LAYOUT_TYPES.FixedLayout,\n    [style.errorState]:\n      displayState === INSTRUMENT_STATES.error ||\n      displayState === INSTRUMENT_STATES.outdated,\n    [style.warningState]:\n      displayState === INSTRUMENT_STATES.warning ||\n      displayState === INSTRUMENT_STATES.stale,\n    [style.loadingState]:\n      displayState === INSTRUMENT_STATES.foregroundLoading ||\n      displayState === INSTRUMENT_STATES.backgroundLoading ||\n      displayState === INSTRUMENT_STATES.partial,\n    // The `instrument-loading-exposure` class's existence is used by exposure to detect if a widget has finished loading in order to take a screenshot\n    'instrument-loading-exposure': isLoading,\n    [statusIndicatorClass]: !!statusIndicatorClass,\n  });\n  const visualisationClasses = classNames(style.visualisation, {\n    [style.useContentHeight]: useContentHeight,\n    [style.noHeader]: !hasHeader,\n  });\n  const vizPositionerClasses = classNames(style.visualisationPositioner, {\n    [style.useContentHeight]: useContentHeight,\n    [style.largeTitle]: renderTitle && useLargeFont,\n    [style.smallTitle]: renderTitle && !useLargeFont,\n  });\n\n  const handleComparisonLabelChange = newComparisonLabel => {\n    widgetHelpers.updateComparisonLabel(\n      newComparisonLabel,\n      doNotUseLegacyWidgetKey,\n      id,\n      visualisationProps.comparison,\n    );\n  };\n\n  const handleLabelChange = newLabel => {\n    // Because we concatenate the old widget title and label\n    // for the new number viz, we need to clear the widget\n    // title when editing the label to make the old number\n    // viz display ok on a fixieboard.\n    widgetHelpers.updateLabelAndTitle(\n      { label: newLabel, title: '' },\n      doNotUseLegacyWidgetKey,\n      id,\n      { label: visualisationProps.label, title },\n    );\n  };\n\n  // Render visualisation based on visualisationType.\n  // gridSize is only used in number viz to set the font size. We should find\n  // a better way to set the font size, visualisation shouldn't need to have\n  // gridSize passed down from the dashboard layout.\n  // isPublic is only used in highcharts, we should think about if highcharts\n  // can connect to a store instead to get this.\n  // id is used by line charts to create a unique DOM id.\n  return (\n    <article className={instrumentClasses}>\n      {renderHeader && (\n        <InstrumentHeader\n          canReload={\n            (displayState === INSTRUMENT_STATES.error ||\n              displayState === INSTRUMENT_STATES.outdated) &&\n            isClientSideRefresh\n          }\n          dataUpdatedAt={dataUpdatedAt}\n          addBackground={!hasBackgroundColor} // header needs a background when the instrument doesn't have one\n          isLoading={isLoading}\n          isTitleEnabled={\n            !!renderTitle && (hideTitleWhenShort ? !isShort : true)\n          }\n          handleReload={handleReload}\n          renderLastUpdate={displayState === INSTRUMENT_STATES.stale}\n          title={title}\n          tvMode={useLargeFont}\n          titleFontSize={titleFontSize}\n          viewingContext={viewingContext}\n          legacyWidgetKey={doNotUseLegacyWidgetKey}\n          instrumentId={id}\n        />\n      )}\n\n      <div className={visualisationClasses} style={scalingStyle}>\n        <div className={vizPositionerClasses} style={visualisationPadding}>\n          {isImporting && <InstrumentImporting />}\n          {(displayState === INSTRUMENT_STATES.foregroundLoading ||\n            displayState === INSTRUMENT_STATES.partial) && (\n            <InstrumentLoader\n              status={\n                isClientSideRefresh\n                  ? 'loading'\n                  : 'waitingInitialServerSideRefresh'\n              }\n              serviceTitle={integrationName}\n            />\n          )}\n          {shouldRenderError && (\n            <InstrumentError\n              error={instrumentError}\n              integrationName={integrationName}\n              viewingContext={viewingContext}\n              legacyWidgetKey={doNotUseLegacyWidgetKey}\n            />\n          )}\n          {shouldRenderVisualisation && (\n            <Visualisation\n              {...mergeConfigAndData(config, transformedData)}\n              dashboardTz={dashboardTz}\n              gridSize={gridSize}\n              id={id}\n              isPublic={viewingContext === VIEWING_CONTEXT_TYPES.SHARE}\n              tvMode={useLargeFont}\n              canEdit={\n                canUserEdit && viewingContext === VIEWING_CONTEXT_TYPES.EDIT\n              }\n              canUseResponsiveNumberViz={canUseResponsiveNumberViz}\n              onChangeComparisonLabel={handleComparisonLabelChange}\n              onChangeLabel={handleLabelChange}\n              useTracking={false}\n            />\n          )}\n        </div>\n      </div>\n    </article>\n  );\n};\n\nInstrument.defaultProps = {\n  data: {},\n  dashboardTz: 'UTC',\n  error: null,\n  dataSource: {},\n  fontSize: 'LARGE',\n  gridSize: 320,\n  handleReload: noop,\n  hideTitleWhenShort: false,\n  isLoading: false,\n  refreshMode: null,\n  renderTitle: true,\n  shouldPad: true,\n  title: '',\n  viewingContext: VIEWING_CONTEXT_TYPES.EDIT,\n  visualisationScale: 1,\n  useContentHeight: false,\n};\n\nInstrument.propTypes = {\n  id: PropTypes.string.isRequired,\n  size: PropTypes.shape({\n    height: PropTypes.number,\n    width: PropTypes.number,\n  }).isRequired,\n  visualisationProps: PropTypes.object.isRequired,\n  visualisationType: PropTypes.string.isRequired,\n  canUseResponsiveNumberViz: PropTypes.bool,\n  dashboardLayoutType: PropTypes.string,\n  dashboardTz: PropTypes.string,\n  data: PropTypes.shape({\n    isFromCache: PropTypes.bool,\n    isPartial: PropTypes.bool,\n    payload: PropTypes.oneOfType([PropTypes.array, PropTypes.object]),\n    updatedAt: PropTypes.instanceOf(Date),\n  }),\n  dataSource: PropTypes.shape({\n    dataURL: PropTypes.string,\n    integration: PropTypes.shape({\n      name: PropTypes.string.isRequired,\n    }),\n  }),\n  doNotUseLegacyWidgetKey: PropTypes.string,\n  error: PropTypes.object,\n  fontSize: PropTypes.oneOf(['SMALL', 'LARGE']),\n  gridSize: PropTypes.number,\n  handleReload: PropTypes.func,\n  hideTitleWhenShort: PropTypes.bool,\n  isImporting: PropTypes.bool,\n  isLoading: PropTypes.bool,\n  refreshMode: PropTypes.shape({\n    __typename: PropTypes.string.required,\n    intervalSeconds: PropTypes.number,\n  }),\n  renderTitle: PropTypes.bool,\n  shouldPad: PropTypes.bool,\n  title: PropTypes.string,\n  titleFontSize: PropTypes.oneOf(['SMALL', 'LARGE']),\n  /* useContentHeight makes the visualisation take up all the space it needs dependent\n  on its content. It is used to remove all the absolute positioning. */\n  useContentHeight: PropTypes.bool,\n  viewingContext: PropTypes.oneOf(Object.values(VIEWING_CONTEXT_TYPES)),\n  visualisationScale: PropTypes.number,\n};\n\nexport default Instrument;\n","import React, { Component, forwardRef } from 'react';\nimport PropTypes from 'prop-types';\nimport bugsnagReact from '@bugsnag/plugin-react';\n\nconst errorBoundaryPropTypes = {\n  FallbackComponent: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),\n  beforeSend: PropTypes.func,\n  children: PropTypes.element.isRequired,\n};\n\nclass ErrorBoundaryComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      hasError: false,\n    };\n  }\n\n  componentDidCatch(error, info) {\n    this.setState({ hasError: true });\n    // eslint-disable-next-line no-console\n    console.error(error, info);\n  }\n\n  render() {\n    const { children, FallbackComponent } = this.props;\n    const { hasError } = this.state;\n\n    if (hasError) {\n      return FallbackComponent && <FallbackComponent />;\n    }\n\n    return children;\n  }\n}\n\nErrorBoundaryComponent.propTypes = { ...errorBoundaryPropTypes };\nErrorBoundaryComponent.defaultProps = {\n  // maybe later we'll have to define a default FallBackComponent\n  FallbackComponent: null,\n};\n\nconst ErrorBoundaryChoiceComponent = ({ children }) => {\n  const bugsnagClient = window.bugsnagClient;\n  const reactPlugin = !!bugsnagClient\n    ? bugsnagClient.getPlugin('react')\n    : undefined;\n\n  let ErrorBoundary = reactPlugin;\n\n  /*\n   * this will check once if we have the bugsnagClient installed\n   * and install it we don't\n   */\n  if (!!bugsnagClient && !reactPlugin) {\n    bugsnagClient.use(bugsnagReact, React);\n    ErrorBoundary = bugsnagClient.getPlugin('react');\n  }\n\n  ErrorBoundary = ErrorBoundary || ErrorBoundaryComponent;\n\n  return <ErrorBoundary>{children}</ErrorBoundary>;\n};\n\nErrorBoundaryChoiceComponent.propTypes = {\n  ...errorBoundaryPropTypes,\n};\n\nErrorBoundaryChoiceComponent.defaultProps = {\n  // maybe later we'll have to define a default FallBackComponent\n  FallbackComponent: null,\n};\n\nconst withErrorBoundary = (\n  WrappedComponent,\n  { FallbackComponent, beforeSend } = {},\n) =>\n  forwardRef((props, ref) => (\n    <ErrorBoundaryChoiceComponent\n      beforeSend={beforeSend}\n      FallbackComponent={FallbackComponent || WrappedComponent.Fallback}\n    >\n      <WrappedComponent ref={ref} {...props} />\n    </ErrorBoundaryChoiceComponent>\n  ));\n\nexport { ErrorBoundaryComponent, withErrorBoundary };\nexport default ErrorBoundaryChoiceComponent;\n","import {\n  default as ErrorBoundaryComponent,\n  withErrorBoundary,\n} from './error-boundary-component';\n\nexport { withErrorBoundary };\nexport default ErrorBoundaryComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\n\nimport style from './conditional-disabled-overlay-style.scss';\n\nclass ConditionalDisabledOverlayComponent extends Component {\n  render() {\n    const { disabled, children, className } = this.props;\n\n    const classes = classNames(style.wrapper, {\n      [className]: className,\n    });\n\n    if (disabled) {\n      return (\n        <div className={classes}>\n          {children}\n          <div className={style.overlay} />\n        </div>\n      );\n    }\n\n    if (!children.length) return children;\n\n    return <div>{children}</div>;\n  }\n}\n\nConditionalDisabledOverlayComponent.propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  disabled: PropTypes.bool,\n};\n\nConditionalDisabledOverlayComponent.defaultProps = {\n  disabled: false,\n};\n\nexport default ConditionalDisabledOverlayComponent;\n","import ConditionalDisabledOverlay from './conditional-disabled-overlay-component';\nexport default ConditionalDisabledOverlay;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Query } from 'react-apollo';\nimport { omit } from 'lodash';\nimport { InstrumentQuery } from '../../../services/concierge-service/graphql/instrument-query.graphql';\n\n/**\n * Component to fetch instrument from Concierge when rendering an instrument.\n * After fetching the data it will parse the data as the props InstrumentComponent\n * expects and pass the props to its children function.\n */\nconst InstrumentQueryComponent = ({ id, children }) => {\n  return (\n    <Query query={InstrumentQuery} variables={{ id }}>\n      {({ data, loading, error, refetch }) => {\n        if (error || loading) {\n          return null;\n        }\n\n        // visualisationProps are different for each\n        // visualisation type so we just pass the rest of\n        // the props we get for the instrument as visualisationProps.\n        const {\n          instrument: {\n            __typename: visualisationType,\n            dataSource,\n            refreshMode,\n            title,\n            ...visualisationProps\n          } = {},\n        } = data;\n\n        return children({\n          dataSource,\n          refreshMode,\n          title,\n          visualisationProps: omit(visualisationProps, [\n            'id',\n            'doNotUseLegacyWidgetKey',\n          ]),\n          visualisationType,\n          refetch,\n        });\n      }}\n    </Query>\n  );\n};\n\nInstrumentQueryComponent.propTypes = {\n  children: PropTypes.func.isRequired,\n  id: PropTypes.string.isRequired,\n};\n\nexport default InstrumentQueryComponent;\n","import InstrumentQuery from './instrument-query-component';\n\nexport default InstrumentQuery;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport FooterClock from '../footer-clock';\nimport classNames from 'classnames';\nimport config from '../../../universal/config';\n\nimport style from './dashboard-footer-style.scss';\n\nconst BrandingText = () => {\n  return (\n    <div className={style.brandingText}>\n      <span className={style.brandingTextDarken}>\n        <FormattedMessage id=\"footer.poweredBy\" />{' '}\n      </span>\n      <span>Geckoboard</span>\n    </div>\n  );\n};\n\nconst Logo = ({ imageUrl, isGeckoLogo, showBrandingText }) => {\n  const renderImage = () => {\n    if (isGeckoLogo) {\n      return (\n        <a rel=\"external\" target=\"_blank\" href=\"https://www.geckoboard.com\">\n          <img className={style.brandLogo} src={imageUrl} />\n        </a>\n      );\n    }\n\n    return <img src={imageUrl} />;\n  };\n\n  const renderLogoText = () => {\n    if (isGeckoLogo && showBrandingText) {\n      return <BrandingText />;\n    }\n    return null;\n  };\n\n  return (\n    <div className={style.logoContainer}>\n      {renderLogoText()}\n      <div className={style.logo}>{renderImage()}</div>\n    </div>\n  );\n};\n\nLogo.propTypes = {\n  imageUrl: PropTypes.string,\n  isGeckoLogo: PropTypes.bool,\n  showBrandingText: PropTypes.bool,\n};\n\nconst Title = ({ children }) => {\n  return <span className={style.title}>{children}</span>;\n};\n\nTitle.propTypes = {\n  children: PropTypes.string,\n};\n\nconst TrialText = ({ trialDaysRemaining }) => {\n  let trialDaysCountdown = 0;\n\n  if (trialDaysRemaining > 0) {\n    trialDaysCountdown = trialDaysRemaining;\n  }\n\n  return (\n    <span>\n      <FormattedMessage\n        id=\"footer.trial.countdown\"\n        values={{ trialDaysCountdown }}\n      />\n    </span>\n  );\n};\n\nTrialText.propTypes = {\n  showTrialCountdown: PropTypes.bool,\n  trialDaysRemaining: PropTypes.number,\n};\n\nconst DashboardFooter = ({\n  title,\n  enabled,\n  isVisible,\n  showTrialCountdown,\n  trialDaysRemaining,\n  showClock,\n  showLogo,\n  logoSrc,\n  isFixed,\n  scaleFactor,\n  supportPortrait,\n  isFreePlan,\n}) => {\n  if (!enabled) {\n    return null;\n  }\n\n  let imageUrl = logoSrc;\n  let isGeckoLogo = false;\n\n  if (!logoSrc) {\n    imageUrl = `${config.get().AssetBaseURL}/geckoboard-dashboard-logo.svg`;\n    isGeckoLogo = true;\n  }\n\n  const classes = classNames(style.dashboardFooter, 'dashboard-footer', {\n    [style.visible]: isVisible,\n    [style.absolute]: !isFixed,\n    [style.portraitSupport]: supportPortrait,\n  });\n\n  return (\n    <div className={classes} style={{ transform: `scale(${scaleFactor})` }}>\n      <div className={style.left}>\n        {showClock && (\n          <div className={style.footerClock}>\n            <FooterClock />\n          </div>\n        )}\n        <Title>{title}</Title>\n      </div>\n      <div className={style.right}>\n        <div className={style.brandingText}>\n          {isFreePlan && !showTrialCountdown && (\n            <span className={style.plan}>\n              <FormattedMessage id=\"footer.freePlan\" />\n            </span>\n          )}\n          {showTrialCountdown && (\n            <TrialText trialDaysRemaining={trialDaysRemaining} />\n          )}\n        </div>\n        {showLogo && (\n          <Logo\n            imageUrl={imageUrl}\n            isGeckoLogo={isGeckoLogo}\n            showBrandingText={!showTrialCountdown}\n          />\n        )}\n      </div>\n    </div>\n  );\n};\n\nDashboardFooter.defaultProps = {\n  isFixed: true,\n  scaleFactor: 1,\n  supportPortrait: true,\n};\n\nDashboardFooter.propTypes = {\n  enabled: PropTypes.bool,\n  isFixed: PropTypes.bool,\n  isFreePlan: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  logoSrc: PropTypes.string,\n  scaleFactor: PropTypes.number,\n  showClock: PropTypes.bool,\n  showLogo: PropTypes.bool,\n  showTrialCountdown: PropTypes.bool,\n  supportPortrait: PropTypes.bool,\n  title: PropTypes.string,\n  trialDaysRemaining: PropTypes.number,\n};\n\nexport { DashboardFooter as default, Title, TrialText, Logo, BrandingText };\n","import FooterClock from './footer-clock-component.js';\nexport default FooterClock;\n","import React, { Component } from 'react';\n\nconst conditionalRender = test => DecoratedComponent => {\n  const displayName =\n    DecoratedComponent.displayName || DecoratedComponent.name || 'Component';\n\n  class ConditonalComponent extends Component {\n    static get displayName() {\n      return `conditionalRender(${displayName})`;\n    }\n\n    render() {\n      if (test(this.props)) {\n        return <DecoratedComponent {...this.props} />;\n      }\n      return null;\n    }\n  }\n\n  return ConditonalComponent;\n};\n\nexport default conditionalRender;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport config from '../../universal/config';\nimport Modal from '../modal';\nimport Image from '@UI/image';\nimport { ModalSection, ModalHeading } from '../modal';\nimport Layout, { Row } from '../layout';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport ToggleInput from '../form/toggle-input';\nimport Label from '../form/label';\nimport Button from '@UI/button';\nimport InfoBubble from '../info-bubble';\nimport Select from '../form/select';\nimport { sortBy } from 'lodash';\n\nimport style from './add-dashboard-modal-style.scss';\n\nconst initialState = {\n  optimiseForTV: true,\n  submitting: false,\n};\n\nclass AddDashboardModal extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = initialState;\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    let state = {};\n    if (nextProps.groups) {\n      const [firstGroup] = nextProps.groups;\n      state.selectedGroupId = firstGroup.id;\n    }\n    if (!this.props.visible && nextProps.visible) {\n      state = { ...state, ...initialState };\n    }\n    this.setState(state);\n  }\n\n  onGroupChange(selectedGroupId) {\n    this.setState({ selectedGroupId });\n  }\n  onSubmit() {\n    const { optimiseForTV, selectedGroupId } = this.state;\n    const { onSubmit, groups } = this.props;\n    this.setState({\n      submitting: true,\n    });\n\n    const submitData = { optimiseForTV };\n    if (groups) {\n      submitData.groupId = selectedGroupId;\n    }\n    onSubmit(submitData);\n  }\n\n  renderGroupsOption() {\n    const { groups } = this.props;\n    if (!groups) return undefined;\n    return (\n      <div className={style.groupSection}>\n        <h3>\n          <FormattedMessage id=\"addDashboardModal.group.heading\" />\n        </h3>\n        <Select\n          name=\"group\"\n          isFullWidth\n          onChange={(_, groupId) => this.onGroupChange(parseInt(groupId, 10))}\n        >\n          {sortBy(groups, group => group.name.toLowerCase()).map(\n            ({ id, name }) => (\n              <option key={id} value={id}>\n                {name}\n              </option>\n            ),\n          )}\n        </Select>\n      </div>\n    );\n  }\n\n  render() {\n    const { isLoadingGroups, visible, onClose } = this.props;\n    const { optimiseForTV: optimiseForTVChecked } = this.state;\n    return (\n      <Modal visible={visible} onClose={onClose}>\n        <ModalSection>\n          <form\n            onSubmit={e => {\n              e.preventDefault();\n\n              if (!isLoadingGroups) {\n                this.onSubmit();\n              }\n            }}\n          >\n            <div className={style.addDashboardModal}>\n              <ModalHeading>\n                <FormattedMessage id=\"addDashboardModal.heading\" />\n              </ModalHeading>\n              <Layout marginBottom={2} marginTop={2.5}>\n                <div className={style.toggleSection}>\n                  <Image\n                    className={style.illustration}\n                    src={`${\n                      config.get().StaticAssetBaseURL\n                    }/images/wonderwallboards-Illustration.svg`}\n                    width=\"400\"\n                    height=\"186\"\n                  />\n                  <div className={style.toggle}>\n                    <ToggleInput\n                      onToggle={() =>\n                        this.setState(({ optimiseForTV }) => ({\n                          optimiseForTV: !optimiseForTV,\n                        }))\n                      }\n                      name=\"optimiseForTVToggle\"\n                      checked={optimiseForTVChecked}\n                      title={\n                        <Label htmlFor=\"optimiseForTVToggle\">\n                          <FormattedMessage id=\"addDashboardModal.gridToggleLabelText\" />\n                          <Layout marginLeft={0.5} tag=\"span\">\n                            <InfoBubble zIndex={10003}>\n                              <FormattedHTMLMessage id=\"addDashboardModal.tooltip\" />\n                            </InfoBubble>\n                          </Layout>\n                        </Label>\n                      }\n                    />\n                  </div>\n                </div>\n              </Layout>\n            </div>\n            <div>{this.renderGroupsOption()}</div>\n            <Row justify=\"flex-end\">\n              <Layout marginRight={1}>\n                <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n                  <FormattedMessage id=\"addDashboardModal.cancelButtonText\" />\n                </Button>\n              </Layout>\n              <Button\n                disabled={isLoadingGroups}\n                loading={this.state.submitting}\n                type={Button.TYPES.SUBMIT}\n                onClick={() => this.onSubmit()}\n              >\n                <FormattedMessage id=\"addDashboardModal.submitButtonText\" />\n              </Button>\n            </Row>\n          </form>\n        </ModalSection>\n      </Modal>\n    );\n  }\n}\n\nAddDashboardModal.propTypes = {\n  groups: PropTypes.array,\n  isLoadingGroups: PropTypes.bool,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onSubmit: PropTypes.func,\n};\n\nexport default AddDashboardModal;\n","import InAppHelp from './in-app-help-component';\nexport default InAppHelp;\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentQuery\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"instrument\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"InstrumentFragment\"},\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":131}};\n    doc.loc.source = {\"body\":\"#import './instrument-fragment.graphql'\\n\\nquery InstrumentQuery($id: ID!) {\\n  instrument(id: $id) {\\n    ...InstrumentFragment\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require('./instrument-fragment.graphql').definitions));\n\n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"InstrumentQuery\"] = oneQuery(doc, \"InstrumentQuery\");\n        \n","import { connect } from 'react-redux';\nimport QueryEditorModal from './query-editor-modal-component';\nimport * as widgetMenuActions from '../../../widget-menu/actions/widget-menu-actions';\nimport * as editWidgetActions from '../../../widget/edit-widget/actions/edit-widget-actions';\nimport { TEMPLATES } from '../../../universal/serializers/services';\n\nconst getNumberFormat = (config, vizType) => {\n  // Keep number formatting if we aren't changing visualisation\n  if (vizType === config.type) {\n    return config.numberFormat;\n  }\n\n  // If we're switching to or from a table wipe numper formatting\n  if (vizType === 'table' || config.type === 'table') {\n    return undefined;\n  }\n\n  // If it's any other visualisation change keep number formatting\n  return config.numberFormat;\n};\n\nconst mapStateToProps = state => ({\n  databaseId: state.editWidget.config.databaseId,\n  initialValue: state.editWidget.config.query,\n  config: state.editWidget.config,\n});\n\nconst mapDispatchToProps = dispatch => {\n  const createOnConfirm = config => (query, vizType, data) => {\n    const newConfig = {\n      ...config,\n      query,\n      type: vizType,\n      template: TEMPLATES[vizType],\n      numberFormat: getNumberFormat(config, vizType),\n    };\n\n    dispatch(editWidgetActions.setConfigAndData({ data, config: newConfig }));\n    dispatch(widgetMenuActions.toggleQueryEditor(false));\n  };\n\n  return {\n    createOnConfirm,\n    onClose: () => dispatch(widgetMenuActions.toggleQueryEditor(false)),\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { config, ...remainingStateProps } = stateProps;\n  const { createOnConfirm, ...remainingDispatchProps } = dispatchProps;\n\n  return {\n    ...remainingStateProps,\n    ...remainingDispatchProps,\n    ...ownProps,\n    onConfirm: createOnConfirm(config),\n  };\n};\n\nconst EditWidgetQueryEditorModal = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(QueryEditorModal);\n\nexport default EditWidgetQueryEditorModal;\n","import config from '../universal/config';\nimport { trackEvent } from '@Tracking';\nimport {\n  externalConnectionCreated,\n  externalConnectionFailed,\n} from '@Tracking/events';\n\nlet handleEvent;\n\nexport const cleanupListeners = () =>\n  window.removeEventListener('message', handleEvent);\n\nconst receiveMessage = (event, popup, refetchConnections, setError) => {\n  const {\n    data: { success, error },\n  } = event;\n\n  if (success) {\n    refetchConnections();\n    popup.close();\n    cleanupListeners();\n    trackEvent(externalConnectionCreated());\n  }\n\n  if (error) {\n    setError(true);\n    popup.close();\n    cleanupListeners();\n    trackEvent(externalConnectionFailed());\n  }\n};\n\nconst slackOAuth = (popup, refetchConnections, setError) => {\n  const { BulletinBaseURL } = config.get();\n\n  popup.location = `${BulletinBaseURL}/slack/oauth/start`;\n\n  handleEvent = event =>\n    receiveMessage(event, popup, refetchConnections, setError);\n  window.addEventListener('message', handleEvent);\n};\n\nexport default slackOAuth;\n","const TIMES_IN_HOURS = [\n  { display: '00:00 AM', value: 0 },\n  { display: '01:00 AM', value: 1 },\n  { display: '02:00 AM', value: 2 },\n  { display: '03:00 AM', value: 3 },\n  { display: '04:00 AM', value: 4 },\n  { display: '05:00 AM', value: 5 },\n  { display: '06:00 AM', value: 6 },\n  { display: '07:00 AM', value: 7 },\n  { display: '08:00 AM', value: 8 },\n  { display: '09:00 AM', value: 9 },\n  { display: '10:00 AM', value: 10 },\n  { display: '11:00 AM', value: 11 },\n  { display: '12:00 PM', value: 12 },\n  { display: '1:00 PM', value: 13 },\n  { display: '2:00 PM', value: 14 },\n  { display: '3:00 PM', value: 15 },\n  { display: '4:00 PM', value: 16 },\n  { display: '5:00 PM', value: 17 },\n  { display: '6:00 PM', value: 18 },\n  { display: '7:00 PM', value: 19 },\n  { display: '8:00 PM', value: 20 },\n  { display: '9:00 PM', value: 21 },\n  { display: '10:00 PM', value: 22 },\n  { display: '11:00 PM', value: 23 },\n];\n\nexport { TIMES_IN_HOURS };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery } from 'react-apollo';\nimport { DashboardTimezone } from '../../../../services/concierge-service/graphql/dashboard-query.graphql';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nconst ScheduledPostsTimezoneQuery = Component => ({ dashboardId }) => {\n  const { loading, error, data } = useQuery(DashboardTimezone, {\n    variables: { id: dashboardId },\n  });\n\n  if (loading) {\n    return (\n      <LoadingSpinner\n        size={LoadingSpinner.SIZES.MEDIUM}\n        theme={LoadingSpinner.THEMES.DARK}\n      />\n    );\n  }\n\n  if (error || !data) return null;\n\n  const timezone = data.dashboard.timezone.name;\n\n  return <Component dashboardId={dashboardId} timezone={timezone} />;\n};\n\nScheduledPostsTimezoneQuery.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n    .isRequired,\n};\n\nexport default ScheduledPostsTimezoneQuery;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { find } from 'lodash';\nimport Button from '@UI/button';\nimport FormattedMessage from '../../../../lib/i18n';\nimport { dispatchToGeckoJS } from '../../../../lib/gecko-view';\nimport { isGraphQLDashboard } from '../../../../services/concierge-service/graphql-helpers';\nimport {\n  countries,\n  countryCodeByTimezone,\n  timezones,\n} from '../../../../edit-container-dashboard-page/dashboard-settings-modal/timezone-settings/timezones';\n\nimport styles from './scheduled-posts-timezone-component-style.scss';\n\nconst ScheduledPostTimezoneComponent = ({ dashboardId, timezone, history }) => {\n  const countryCode = countryCodeByTimezone[timezone];\n  const city = find(timezones[countryCode], {\n    code: timezone,\n  }).name;\n  const country = find(countries, { code: countryCode }).name;\n\n  const handleClick = () => {\n    if (isGraphQLDashboard()) {\n      history.push(`/edit/dashboards/${dashboardId}/settings`);\n    } else {\n      dispatchToGeckoJS('dashboard:settings');\n    }\n  };\n\n  return (\n    <div className={styles.scheduledPostTimezone}>\n      {city} - {country}\n      <div className={styles.changeTimezoneButton}>\n        <Button\n          onClick={() => handleClick()}\n          intent={Button.INTENT.LINK}\n          size={Button.SIZES.SMALL}\n        >\n          <FormattedMessage id=\"share.slackTab.scheduledPost.timezone.button\" />\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nScheduledPostTimezoneComponent.propTypes = {\n  history: PropTypes.object.isRequired,\n  timezone: PropTypes.string.isRequired,\n  dashboardId: PropTypes.string,\n};\n\nexport default ScheduledPostTimezoneComponent;\n","import { withRouter } from 'react-router';\nimport withScheduledPostsTimezoneQuery from './scheduled-posts-timezone-query';\nimport ScheduledPostsTimezoneComponent from './scheduled-posts-timezone-component';\n\nexport default withScheduledPostsTimezoneQuery(\n  withRouter(ScheduledPostsTimezoneComponent),\n);\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { head, isEmpty } from 'lodash';\nimport Alert from '@UI/alert';\nimport Button from '@UI/button';\nimport Select from '../../../components/form/select';\nimport { TIMES_IN_HOURS } from './scheduled-posts-constants';\nimport FormattedMessage from '../../../lib/i18n';\nimport ScheduledPostsTimezoneComponent from './scheduled-posts-timezone';\n\nimport styles from './scheduled-posts-component-style.scss';\n\nconst ScheduledPostsComponent = ({\n  scheduledPosts,\n  slackChannels,\n  dashboardId,\n  error,\n  createScheduledPost,\n  updateScheduledPost,\n  removeScheduledPost,\n}) => {\n  // For the first iteration of our slack integration we are only supporting 1 scheduled post.\n  const scheduledPost = head(scheduledPosts) || {};\n  const hasExistingScheduledPost = !isEmpty(scheduledPost);\n\n  const firstSlackChannel = head(slackChannels).id;\n  const firstPostTime = head(TIMES_IN_HOURS).value;\n\n  const initialSlackChannel = !hasExistingScheduledPost\n    ? firstSlackChannel\n    : scheduledPost.slackChannelId;\n  const [slackChannel, setSlackChannel] = useState(initialSlackChannel);\n\n  const initialPostTime = !hasExistingScheduledPost\n    ? firstPostTime\n    : scheduledPost.timeHour;\n  const [postTime, setPostTime] = useState(initialPostTime);\n\n  const hasFormValuesChanged =\n    scheduledPost.slackChannelId !== slackChannel ||\n    scheduledPost.timeHour !== postTime;\n\n  const handleSubmit = e => {\n    e.preventDefault();\n\n    if (!hasExistingScheduledPost) {\n      createScheduledPost(slackChannel, postTime);\n    } else {\n      updateScheduledPost(scheduledPost.id, slackChannel, postTime);\n    }\n  };\n\n  const handleRemove = () => {\n    removeScheduledPost(scheduledPost.id);\n    setSlackChannel(firstSlackChannel);\n    setPostTime(firstPostTime);\n  };\n\n  const buttonTextId = !hasExistingScheduledPost\n    ? 'share.slackTab.scheduledPost.createButton'\n    : 'share.slackTab.scheduledPost.updateButton';\n\n  const renderSlackChannelOptions = slackChannels.map(({ id, name }) => (\n    <option key={id} value={id}>\n      {name}\n    </option>\n  ));\n\n  const renderPostTimeOptions = TIMES_IN_HOURS.map(({ value, display }) => (\n    <option key={value} value={value}>\n      {display}\n    </option>\n  ));\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <hr className={styles.separator} />\n      <div className={styles.inputTitle}>\n        <FormattedMessage id=\"share.slackTab.scheduledPost.select.slackChannel\" />\n      </div>\n      <div className={styles.dropdown}>\n        <Select\n          name=\"slackChannel\"\n          value={slackChannel}\n          onChange={(_, slackChannelValue) =>\n            setSlackChannel(slackChannelValue)\n          }\n        >\n          {renderSlackChannelOptions}\n        </Select>\n      </div>\n      <div className={styles.inputTitle}>Daily schedule time</div>\n      <div className={styles.postTimeSection}>\n        <div className={styles.postTimeDropdown}>\n          <Select\n            name=\"postTime\"\n            value={postTime}\n            onChange={(_, hourValue) => setPostTime(parseInt(hourValue, 10))}\n          >\n            {renderPostTimeOptions}\n          </Select>\n        </div>\n        <div className={styles.postTimeTimezone}>\n          <ScheduledPostsTimezoneComponent dashboardId={dashboardId} />\n        </div>\n      </div>\n      <div className={styles.buttons}>\n        <div className={styles.submitButton}>\n          <Button\n            onClick={e => handleSubmit(e)}\n            disabled={!hasFormValuesChanged}\n          >\n            <FormattedMessage id={buttonTextId} />\n          </Button>\n        </div>\n        {hasExistingScheduledPost && (\n          <div className={styles.removeButton}>\n            <Button\n              onClick={() => handleRemove()}\n              intent={Button.INTENT.LINK}\n              size={Button.SIZES.SMALL}\n              icon=\"trash\"\n            >\n              <FormattedMessage id=\"share.slackTab.scheduledPost.removeButton\" />\n            </Button>\n          </div>\n        )}\n      </div>\n      {error && (\n        <div className={styles.error}>\n          <Alert\n            type={Alert.TYPES.ERROR}\n            title={<FormattedMessage id=\"share.slackTab.error.title\" />}\n            message={<FormattedMessage id=\"share.slackTab.error.message\" />}\n          />\n        </div>\n      )}\n    </form>\n  );\n};\n\nScheduledPostsComponent.propTypes = {\n  slackChannels: PropTypes.array.isRequired,\n  createScheduledPost: PropTypes.func,\n  dashboardId: PropTypes.string,\n  error: PropTypes.object,\n  removeScheduledPost: PropTypes.func,\n  scheduledPosts: PropTypes.array,\n  updateScheduledPost: PropTypes.func,\n};\n\nexport default ScheduledPostsComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { find } from 'lodash';\nimport { useQuery, useMutation } from 'react-apollo';\nimport ScheduledPostsQuery from '../../../services/concierge-service/graphql/scheduled-posts-query.graphql';\nimport {\n  CreateScheduledPost,\n  UpdateScheduledPost,\n  RemoveScheduledPost,\n} from '../../../services/concierge-service/graphql/scheduled-posts-mutations.graphql';\nimport ScheduledPostsComponent from './scheduled-posts-component';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport { trackEvent } from '@Tracking';\nimport {\n  scheduledPostCreated,\n  scheduledPostUpdated,\n  scheduledPostDeleted,\n} from '@Tracking/events';\n\nconst createScheduledPostCacheUpdater = (\n  cache,\n  mutationResponse,\n  dashboardId,\n) => {\n  const {\n    data: {\n      createScheduledPost: { scheduledPost = {} },\n    },\n  } = mutationResponse;\n\n  const { scheduledPosts: cachedScheduledPosts } = cache.readQuery({\n    query: ScheduledPostsQuery,\n    variables: {\n      id: dashboardId,\n    },\n  });\n\n  const newScheduledPosts = [...cachedScheduledPosts, scheduledPost];\n\n  cache.writeQuery({\n    query: ScheduledPostsQuery,\n    variables: {\n      id: dashboardId,\n    },\n    data: {\n      scheduledPosts: newScheduledPosts,\n    },\n  });\n\n  trackEvent(\n    scheduledPostCreated({\n      'Scheduled post ID': scheduledPost.id,\n      'Scheduled post destination': scheduledPost.slackChannelId,\n    }),\n  );\n};\n\nconst removeScheduledPostCacheUpdater = (\n  cache,\n  mutationResponse,\n  dashboardId,\n  postId,\n) => {\n  const {\n    data: {\n      deleteScheduledPost: { success },\n    },\n  } = mutationResponse;\n\n  if (success) {\n    const { scheduledPosts: cachedScheduledPosts } = cache.readQuery({\n      query: ScheduledPostsQuery,\n      variables: {\n        id: dashboardId,\n      },\n    });\n\n    const newScheduledPosts = cachedScheduledPosts.filter(c => c.id !== postId);\n\n    cache.writeQuery({\n      query: ScheduledPostsQuery,\n      variables: {\n        id: dashboardId,\n      },\n      data: {\n        scheduledPosts: newScheduledPosts,\n      },\n    });\n  }\n};\n\nconst ScheduledPostsQueryComponent = ({\n  dashboardId,\n  slackConnectionId,\n  slackChannels,\n}) => {\n  const { loading, error, data } = useQuery(ScheduledPostsQuery, {\n    variables: { id: dashboardId },\n  });\n  const [createScheduledPost, { error: createError }] = useMutation(\n    CreateScheduledPost,\n  );\n  const [updateScheduledPost, { error: updateError }] = useMutation(\n    UpdateScheduledPost,\n  );\n  const [removeScheduledPost, { error: removeError }] = useMutation(\n    RemoveScheduledPost,\n  );\n\n  if (loading) {\n    return (\n      <LoadingSpinner\n        size={LoadingSpinner.SIZES.MEDIUM}\n        theme={LoadingSpinner.THEMES.DARK}\n      />\n    );\n  }\n\n  if (error || !data) return null;\n\n  const { scheduledPosts } = data;\n\n  return (\n    <ScheduledPostsComponent\n      dashboardId={dashboardId}\n      scheduledPosts={scheduledPosts}\n      slackChannels={slackChannels}\n      error={createError || updateError || removeError}\n      createScheduledPost={(slackChannelId, timeHour) => {\n        createScheduledPost({\n          variables: {\n            scheduledPostInput: {\n              dashboardId,\n              slackConnectionId,\n              slackChannelId,\n              timeHour,\n            },\n          },\n          update: (cache, mutationResponse) =>\n            createScheduledPostCacheUpdater(\n              cache,\n              mutationResponse,\n              dashboardId,\n            ),\n        });\n      }}\n      updateScheduledPost={(postId, slackChannelId, timeHour) => {\n        updateScheduledPost({\n          variables: {\n            postId,\n            slackChannelId,\n            timeHour,\n          },\n        });\n        trackEvent(\n          scheduledPostUpdated({\n            'Scheduled post ID': postId,\n            'Scheduled post destination': slackChannelId,\n          }),\n        );\n      }}\n      removeScheduledPost={postId => {\n        removeScheduledPost({\n          variables: {\n            postId,\n          },\n          update: (cache, mutationResponse) =>\n            removeScheduledPostCacheUpdater(\n              cache,\n              mutationResponse,\n              dashboardId,\n              postId,\n            ),\n        });\n        const scheduledPost = find(scheduledPosts, { id: postId });\n        trackEvent(\n          scheduledPostDeleted({\n            'Scheduled post ID': scheduledPost.id,\n            'Scheduled post destination': scheduledPost.slackChannelId,\n          }),\n        );\n      }}\n    />\n  );\n};\n\nScheduledPostsQueryComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n    .isRequired,\n  slackChannels: PropTypes.array.isRequired,\n  slackConnectionId: PropTypes.string.isRequired,\n};\n\nexport default ScheduledPostsQueryComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useQuery } from 'react-apollo';\nimport { DashboardIdByLegacyId } from '../../../services/concierge-service/graphql/dashboard-query.graphql';\nimport { isGraphQLDashboard } from '../../../services/concierge-service/graphql-helpers';\nimport ScheduledPostsQuery from './scheduled-posts-query';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nconst ScheduledPostsDashboardIdQuery = props => {\n  let dashboardId = props.dashboardId;\n\n  // Let's ensure we get and use the scrooge dashboard id for all dashboard types\n  if (!isGraphQLDashboard()) {\n    const { loading, error, data } = useQuery(DashboardIdByLegacyId, {\n      variables: { legacyId: dashboardId },\n    });\n\n    if (loading) {\n      return (\n        <LoadingSpinner\n          size={LoadingSpinner.SIZES.MEDIUM}\n          theme={LoadingSpinner.THEMES.DARK}\n        />\n      );\n    }\n\n    if (error || !data) return null;\n\n    dashboardId = data.dashboard.id;\n  }\n\n  return (\n    <ScheduledPostsQuery\n      dashboardId={dashboardId}\n      slackConnectionId={props.slackConnectionId}\n      slackChannels={props.slackChannels}\n    />\n  );\n};\n\nScheduledPostsDashboardIdQuery.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n    .isRequired,\n  slackChannels: PropTypes.array.isRequired,\n  slackConnectionId: PropTypes.string,\n};\n\nexport default ScheduledPostsDashboardIdQuery;\n","import ScheduledPostsQuery from './scheduled-posts-dashboard-id-query';\nexport default ScheduledPostsQuery;\n","import React, { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { head, isEmpty } from 'lodash';\nimport { open as openPopup } from '../../lib/popup-window';\nimport slackOAuth, { cleanupListeners } from '../../lib/slack-oauth';\nimport ScheduledPosts from './scheduled-posts';\nimport Icon from '@UI/icon';\nimport Button from '@UI/button';\nimport Blob from '@UI/playground/blob';\nimport Alert from '@UI/alert';\nimport Image from '@UI/image';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked, externalLinkClicked } from '@Tracking/events';\nimport config from '../../universal/config';\nimport FormattedMessage from '../../lib/i18n';\n\nimport styles from './slack-menu-component-style.scss';\n\nexport const HOW_TO_DISCONNECT_KB_LINK =\n  'https://support.geckoboard.com/hc/en-us/articles/360006878838#disconnecting_the_share_to_slack_app';\n\nconst SlackMenuComponent = ({\n  dashboardId,\n  slackConnections,\n  slackChannels,\n  isSharing,\n  onDisplaySharingLinkTab,\n  refetchConnections,\n}) => {\n  // Cleanup listeners on unmount\n  useEffect(() => () => cleanupListeners(), []);\n  const [error, setError] = useState(false);\n\n  const renderConnectButton = () => {\n    const handleConnect = () => {\n      const popup = openPopup();\n      slackOAuth(popup, refetchConnections, setError);\n      trackEvent(\n        buttonClicked({\n          'Button identifier': 'Share | Scheduled Posts | Connect to Slack',\n        }),\n      );\n    };\n\n    return (\n      <Button onClick={handleConnect}>\n        <FormattedMessage id=\"share.slackTab.connect\" />\n      </Button>\n    );\n  };\n\n  const renderSlackIntegrationInfo = () => {\n    return (\n      <div className={styles.connectInfo}>\n        <FormattedMessage id=\"share.slackTab.connect.info\" />\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/images/slack.png`}\n          width=\"40\"\n          height=\"40\"\n        />\n      </div>\n    );\n  };\n\n  const handleCreateShareLinkClick = () => {\n    onDisplaySharingLinkTab();\n    trackEvent(\n      buttonClicked({\n        'Button identifier': 'Share | Scheduled Posts | Create a Sharing Link',\n      }),\n    );\n  };\n\n  if (!isSharing) {\n    return (\n      <div className={styles.slackWrapper}>\n        {renderSlackIntegrationInfo()}\n        <hr className={styles.separator} />\n        <div className={styles.sharingInfo}>\n          <Blob size={40} version={Blob.VERSIONS.THIRD}>\n            <Icon name=\"info-circle\" fontWeight={Icon.FONT_WEIGHTS.FA_SOLID} />\n          </Blob>\n          <div className={styles.sharingInfoText}>\n            <FormattedMessage id=\"share.slackTab.sharing.info\" />\n          </div>\n        </div>\n        <div className={styles.sharingLink}>\n          <Button\n            onClick={() => handleCreateShareLinkClick()}\n            intent={Button.INTENT.LINK}\n          >\n            <FormattedMessage id=\"share.slackTab.sharing.link\" />\n          </Button>\n          <Icon name=\"arrow-right\" fontWeight={Icon.FONT_WEIGHTS.FA_SOLID} />\n        </div>\n      </div>\n    );\n  }\n\n  if (error) {\n    return (\n      <div className={styles.slackWrapper}>\n        <div className={styles.errorAlert}>\n          <Alert\n            type={Alert.TYPES.ERROR}\n            title={<FormattedMessage id=\"share.slackTab.error.title\" />}\n            message={<FormattedMessage id=\"share.slackTab.error.message\" />}\n          />\n        </div>\n        {renderConnectButton()}\n      </div>\n    );\n  }\n\n  const hasConnections = !isEmpty(slackConnections);\n  if (hasConnections) {\n    const slackConnection = head(slackConnections);\n    const { teamName } = slackConnection;\n\n    const handleDisconnect = () => {\n      window.open(HOW_TO_DISCONNECT_KB_LINK);\n      trackEvent(\n        externalLinkClicked({\n          'Link identifier': 'Share | Scheduled Posts | How to disconnect',\n        }),\n      );\n    };\n\n    return (\n      <div className={styles.slackWrapper}>\n        {renderSlackIntegrationInfo()}\n        <div className={styles.connectionDetails}>\n          <div className={styles.connectedIcon}>\n            <Icon name=\"plug\" />\n          </div>\n          <FormattedMessage\n            id=\"share.slackTab.connected.info\"\n            values={{ teamName }}\n          />\n          <div className={styles.disconnectLink}>\n            <Button\n              intent={Button.INTENT.LINK}\n              size={Button.SIZES.SMALL}\n              onClick={handleDisconnect}\n            >\n              <FormattedMessage id=\"share.slackTab.disconnect.info\" />\n            </Button>\n          </div>\n        </div>\n        <ScheduledPosts\n          dashboardId={dashboardId}\n          slackConnectionId={slackConnection.id}\n          slackChannels={slackChannels}\n        />\n      </div>\n    );\n  }\n\n  return (\n    <div className={styles.slackWrapper}>\n      {renderSlackIntegrationInfo()}\n      {renderConnectButton()}\n    </div>\n  );\n};\n\nSlackMenuComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  isSharing: PropTypes.bool,\n  refetchConnections: PropTypes.func,\n  slackChannels: PropTypes.array,\n  slackConnections: PropTypes.array,\n  onDisplaySharingLinkTab: PropTypes.func,\n};\n\nexport default SlackMenuComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { head } from 'lodash';\nimport { useQuery } from 'react-apollo';\nimport SlackMenuComponent from './slack-menu-component';\nimport SlackChannelsQuery from '../../services/concierge-service/graphql/slack-channels-query.graphql';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nconst SlackMenuChannelsQuery = ({\n  slackConnections,\n  dashboardId,\n  isSharing,\n  onDisplaySharingLinkTab,\n}) => {\n  // For the first iteration of our slack integration we are only supporting one slack connection\n  const { id } = head(slackConnections);\n  const { loading, error, data } = useQuery(SlackChannelsQuery, {\n    variables: { id },\n  });\n\n  if (loading) {\n    return (\n      <LoadingSpinner\n        size={LoadingSpinner.SIZES.MEDIUM}\n        theme={LoadingSpinner.THEMES.DARK}\n      />\n    );\n  }\n\n  if (error || !data) return null;\n\n  const { slackChannels } = data;\n\n  return (\n    <SlackMenuComponent\n      slackConnections={slackConnections}\n      slackChannels={slackChannels}\n      dashboardId={dashboardId}\n      isSharing={isSharing}\n      onDisplaySharingLinkTab={onDisplaySharingLinkTab}\n    />\n  );\n};\n\nSlackMenuChannelsQuery.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n    .isRequired,\n  isSharing: PropTypes.bool,\n  slackConnections: PropTypes.array,\n  onDisplaySharingLinkTab: PropTypes.func,\n};\n\nexport default SlackMenuChannelsQuery;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { isEmpty } from 'lodash';\nimport { useQuery } from 'react-apollo';\nimport SlackMenuComponent from './slack-menu-component';\nimport SlackMenuChannelsQuery from './slack-menu-channels-query';\nimport SlackConnectionsQuery from '../../services/concierge-service/graphql/slack-connections-query.graphql';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nconst SlackMenuConnectionsQuery = ({\n  dashboardId,\n  isSharing,\n  onDisplaySharingLinkTab,\n}) => {\n  const { loading, error, data, refetch } = useQuery(SlackConnectionsQuery);\n\n  if (loading) {\n    return (\n      <LoadingSpinner\n        size={LoadingSpinner.SIZES.MEDIUM}\n        theme={LoadingSpinner.THEMES.DARK}\n      />\n    );\n  }\n\n  if (error || !data) return null;\n\n  const { slackConnections } = data;\n\n  if (isEmpty(slackConnections)) {\n    return (\n      <SlackMenuComponent\n        refetchConnections={refetch}\n        isSharing={isSharing}\n        onDisplaySharingLinkTab={onDisplaySharingLinkTab}\n      />\n    );\n  }\n\n  return (\n    <SlackMenuChannelsQuery\n      slackConnections={slackConnections}\n      dashboardId={dashboardId}\n      isSharing={isSharing}\n      onDisplaySharingLinkTab={onDisplaySharingLinkTab}\n    />\n  );\n};\n\nSlackMenuConnectionsQuery.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  isSharing: PropTypes.bool,\n  onDisplaySharingLinkTab: PropTypes.func,\n};\n\nexport default SlackMenuConnectionsQuery;\n","import SlackMenuConnectionsQuery from './slack-menu-connections-query';\nexport default SlackMenuConnectionsQuery;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport VisualisedWidget from '../visualised-widget-connector';\nimport Confetti from '../../components/confetti';\nimport InstrumentQuery from '../../components/instrument/query';\nimport Instrument from '../../components/instrument/instrument-component';\nimport { getWindow } from '../../lib/global';\nimport { VIEWING_CONTEXT_TYPES } from '../../components/instrument/instrument-helpers';\n\nimport styles from './celebration-widget-styles.scss';\n\nconst getScaleRatio = widgetHeight => {\n  const { innerHeight } = getWindow();\n  const maxAllowedWidgetHeight = innerHeight / 2;\n  return Math.min(maxAllowedWidgetHeight / widgetHeight, 1);\n};\n\nconst scaleWidthLayout = layout => {\n  const { pixel_height: pixelHeight } = layout;\n  const ratio = getScaleRatio(pixelHeight);\n\n  return {\n    ...layout,\n    pixel_width: ratio * layout.pixel_width,\n    pixel_height: ratio * layout.pixel_height,\n  };\n};\n\nconst fitInstrumentInPage = size => {\n  const { width, height } = size;\n  const ratio = getScaleRatio(height);\n  return {\n    height: height * ratio,\n    width: width * ratio,\n  };\n};\n\nconst getTransformedInstrumentSize = (actualSize, scaleFactor) => {\n  const { width, height } = actualSize;\n  return {\n    width: width * scaleFactor,\n    height: height * scaleFactor,\n  };\n};\n\nconst CelebrationWidget = props => {\n  const { instrumentId, onFinish, scaleFactor } = props;\n\n  const renderInstrument = () => {\n    const { instrumentData, instrumentSize } = props;\n    const scaledSize = fitInstrumentInPage(instrumentSize);\n    const containerSize = getTransformedInstrumentSize(scaledSize, scaleFactor);\n\n    return (\n      <div\n        className={styles.widget}\n        style={{ ...containerSize, '--scale-factor': scaleFactor }}\n      >\n        <InstrumentQuery id={instrumentId}>\n          {instrumentConfig => {\n            return (\n              <Instrument\n                data={{\n                  payload: instrumentData,\n                }}\n                id={instrumentId}\n                gridSize={320} // hard coded because this is how widgets worked\n                size={scaledSize}\n                visualisationScale={scaleFactor}\n                viewingContext={VIEWING_CONTEXT_TYPES.SHARE}\n                {...instrumentConfig}\n              />\n            );\n          }}\n        </InstrumentQuery>\n      </div>\n    );\n  };\n\n  const renderWidget = () => {\n    const { widget } = props;\n    return (\n      <div className={styles.widget} style={{ '--scale-factor': scaleFactor }}>\n        <VisualisedWidget\n          widgetKey={widget.widgetKey}\n          canEdit={false}\n          visualisation={widget.visualisation}\n          configuration={widget.config}\n          layout={scaleWidthLayout(widget.layout)}\n          isPublic={false}\n          isResizable={false}\n          gridSize={320} // change me!\n        />\n      </div>\n    );\n  };\n\n  return (\n    <div onClick={onFinish} className={styles.celebrationWidgetWrapper}>\n      <div className={styles.confetti}>\n        <Confetti onFinish={onFinish} />\n      </div>\n      <div className={styles.contentWrapper}>\n        <div className={styles.frame}>\n          <div className={styles.swirl}>\n            <img src=\"https://s3.amazonaws.com/gecko.static/celebration-wheel.png\" />\n          </div>\n          {instrumentId ? renderInstrument() : renderWidget()}\n        </div>\n        <div className={styles.message}>You did it!</div>\n      </div>\n    </div>\n  );\n};\n\nCelebrationWidget.defaultProps = {\n  scaleFactor: 1,\n};\nCelebrationWidget.propTypes = {\n  instrumentData: PropTypes.object,\n  instrumentId: PropTypes.string,\n  instrumentSize: PropTypes.shape({\n    height: PropTypes.number,\n    width: PropTypes.number,\n  }),\n  scaleFactor: PropTypes.number,\n  widget: PropTypes.object,\n  onFinish: PropTypes.func,\n};\n\nexport default CelebrationWidget;\n","import CelebrationWidget from './celebration-widget-connector';\nexport default CelebrationWidget;\n","import { connect } from 'react-redux';\nimport { finishCelebration } from '../../widget/actions/widget-actions';\n\nimport CelebrationWidgetComponent from './celebration-widget-component';\nimport * as graphQLDashboardActions from '../../dashboard/graphql-actions/graphql-dashboard-actions';\n\nconst mapStateToProps = state => {\n  const {\n    dashboard: { scaleFactor } = {},\n    graphQLDashboard: { celebrationInstrument = {} } = {},\n  } = state;\n  const instrumentData = celebrationInstrument.data;\n  const instrumentSize = celebrationInstrument.size;\n\n  return { scaleFactor, instrumentData, instrumentSize };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { widget: { widgetKey } = {}, instrumentId } = props;\n  return {\n    onFinish: () => {\n      if (!!instrumentId) {\n        dispatch(\n          graphQLDashboardActions.finishInstrumentCelebration(instrumentId),\n        );\n        return;\n      }\n      dispatch(finishCelebration(widgetKey));\n    },\n  };\n};\n\nconst CelebrationWidgetConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(CelebrationWidgetComponent);\n\nexport default CelebrationWidgetConnector;\n","import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { getNodeEnv, getWindow } from '../../lib/global';\nimport { generateUniqueId } from '../../lib/tracker';\n\nconst BUMBLEBEE_URL = 'https://geckoboard-bumblebee.herokuapp.com';\nconst TRACKING_INTERVAL = 6e5; // 10 minutes\n\nclass SessionTelemetryComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.timer = null;\n    this.windowSession = generateUniqueId();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillMount() {\n    // The session id will change once the browser\n    // or the inner iframe has been reloaded.\n\n    this.timer = setInterval(() => {\n      this.track();\n    }, TRACKING_INTERVAL);\n  }\n\n  componentWillUnmount() {\n    clearInterval(this.timer);\n  }\n\n  getMemorySnapshot() {\n    try {\n      return getWindow().performance.memory.usedJSHeapSize;\n    } catch (e) {\n      // If the browser doesn't support performance.memory\n      // we can't track memory usage so return undefined.\n      return undefined;\n    }\n  }\n\n  getSessionLength() {\n    try {\n      return parseInt(getWindow().performance.now() / 1000, 10);\n    } catch (e) {\n      return undefined;\n    }\n  }\n\n  render() {\n    return null;\n  }\n\n  track() {\n    const payload = {\n      window_session: this.windowSession,\n      org_id: `${this.props.orgId}`,\n      window_session_duration_s: this.getSessionLength(),\n      memory_used: this.getMemorySnapshot(),\n    };\n\n    if (getNodeEnv() !== 'development') {\n      fetch(BUMBLEBEE_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Accept: 'text/html',\n        },\n        body: JSON.stringify(payload),\n      });\n    } else {\n      console.log( //eslint-disable-line\n        'Bumblebee tracking: ',\n        payload,\n      );\n    }\n  }\n}\n\nSessionTelemetryComponent.propTypes = {\n  orgId: PropTypes.number,\n};\n\nexport default SessionTelemetryComponent;\n","import SessionTelemetry from './session-telemetry-connector';\nexport default SessionTelemetry;\n","import { connect } from 'react-redux';\nimport SessionTelemetryComponent from './session-telemetry-component';\n\nconst mapStateToProps = ({ user: { organization: { id: orgId } = {} } }) => ({\n  orgId,\n});\n\nconst SessionTelemetryConnector = connect(mapStateToProps)(\n  SessionTelemetryComponent,\n);\n\nexport default SessionTelemetryConnector;\n","import { connect } from 'react-redux';\nimport { isEqual } from 'lodash';\nimport CustomizeComponent from './customize-component';\nimport {\n  mount,\n  save,\n  cancel,\n  setScaleToFit,\n  setTvMode,\n  setLargeTitles,\n  setShowGridPreview,\n  setColumns,\n} from '../../actions/customize-actions';\nimport filterByAllowances from '../../filter-by-allowances';\nimport { track } from '../../../lib/tracker';\nimport { dispatchToGeckoJS } from '../../../lib/gecko-view';\nimport { router } from '../../../router';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\n\nconst COLUMN_OPTIONS = [\n  { value: 3, label: '3 columns' },\n  { value: 4, label: '4 columns' },\n  { value: 5, label: '5 columns' },\n  { value: 6, label: '6 columns' },\n  { value: 7, label: '7 columns' },\n  { value: 8, label: '8 columns' },\n];\n\nconst defaultUser = {\n  trialist: false,\n};\n\nconst doesCustomizationMatchAllowances = (values, allowances) => {\n  if (!allowances) {\n    return true;\n  }\n  const filteredValues = filterByAllowances(values, allowances);\n  return isEqual(values, filteredValues);\n};\n\nconst mapStateToProps = ({ customize, user, dashboard }) => {\n  const { isLoading, values = {}, isSaving } = customize;\n  const { user: { trialist, allowances } = defaultUser } = user;\n  // dashboard might not be defined yet, so default it to empty object\n  // values should get populated later\n  const { dashboard: { toggles = [] } = {} } = dashboard;\n\n  const showUpgradePromo = !doesCustomizationMatchAllowances(\n    values,\n    allowances,\n  );\n\n  const {\n    themeWidgetStyle,\n    scaleToFit,\n    tvMode,\n    widgets: { largeTitles } = {},\n    columns,\n  } = values;\n\n  return {\n    themeWidgetStyle,\n    columns,\n    columnOptions: COLUMN_OPTIONS,\n    scaleToFit,\n    tvMode,\n    largeTitles,\n    isLoading,\n    isSaving,\n    showTrialPromo: trialist,\n    showUpgradePromo,\n    isBoxLayout: toggles.includes('grid'),\n\n    //\n    // Needed in mergeProps\n    //\n    values,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMount: () => dispatch(mount()),\n    onCancel: () =>\n      dispatch((_, getState) => {\n        const {\n          dashboard: { dashboard },\n          customize: { originalColumnsValue },\n        } = getState();\n\n        router.navigate(`/edit/dashboards/${dashboard.id}`);\n\n        dispatch(cancel());\n        dispatchToGeckoJS('set:dashboard:columns', originalColumnsValue);\n        track('Customize - Clicked Cancel');\n        trackEvent(\n          buttonClicked({ 'Button identifier': 'Customize - Cancel' }),\n        );\n      }),\n    onScaleToFitChange: value => dispatch(setScaleToFit(value)),\n    onTvModeChange: value => dispatch(setTvMode(value)),\n    onLargeTitlesChange: value => dispatch(setLargeTitles(value)),\n    onColumnsChange: value => {\n      const columns = parseInt(value, 10);\n      dispatch(setColumns(columns));\n      dispatchToGeckoJS('set:dashboard:columns', columns);\n    },\n    onPreviewGrid: value => dispatch(setShowGridPreview(value)),\n\n    //\n    // Needed in mergeProps\n    //\n    createOnSaveHandler: values => () => {\n      track('Customize - Clicked Save', {\n        properties: {\n          ...values,\n        },\n      });\n      trackEvent(buttonClicked({ 'Button identifier': 'Customize - Save' }));\n      dispatch(save());\n    },\n    createOnUpgradeClickHandler: values => () => {\n      track('Customize - Clicked Upgrade', {\n        properties: {\n          ...values,\n        },\n      });\n    },\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps) => {\n  const { values, ...remainingStateProps } = stateProps;\n  const {\n    createOnSaveHandler,\n    createOnUpgradeClickHandler,\n    ...remainingDispatchProps\n  } = dispatchProps;\n\n  return {\n    onSave: createOnSaveHandler(values),\n    onUpgradeClick: createOnUpgradeClickHandler(values),\n    ...remainingStateProps,\n    ...remainingDispatchProps,\n  };\n};\n\nconst CustomizeConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(CustomizeComponent);\n\nexport default CustomizeConnector;\n","import Customize from './customize-connector';\nexport default Customize;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { TransitionGroup, CSSTransition } from 'react-transition-group';\nimport Customize from '../customize';\n\nimport style from './customize-panel-style.scss';\n\nconst CustomizePanelComponent = ({ isVisible }) => {\n  return (\n    <TransitionGroup>\n      {isVisible && (\n        <CSSTransition classNames=\"panel\" timeout={200}>\n          <div className={style.customizePanel}>\n            <Customize />\n          </div>\n        </CSSTransition>\n      )}\n    </TransitionGroup>\n  );\n};\n\nCustomizePanelComponent.propTypes = {\n  isVisible: PropTypes.bool,\n};\n\nexport default CustomizePanelComponent;\n","import CustomizePanelComponent from './customize-panel-component';\nexport default CustomizePanelComponent;\n","import React, { PureComponent } from 'react';\nimport { ApolloProvider } from 'react-apollo';\nimport { Route } from 'react-router';\nimport { noop } from 'lodash';\nimport { useView } from '../../lib/gecko-view';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport CelebrationWidget from '../../widget/celebration-widget/';\nimport AsyncComponentLoader from '../../async-component-loader';\nimport MobileDetector from '../../hoc/mobile-detector';\nimport SessionTelemetry from '../session-telemetry';\nimport ImportsIndicator from '../../imports';\nimport EditWidgetQueryEditorModal from '../../database-config/components/query-editor-modal/edit-widget-query-editor-modal';\nimport apolloClient from '../../services/concierge-service/apollo-client';\nimport CustomizePanel from '../../customize/components/customize-panel';\n\nimport { LAYOUT_TYPES } from './constants';\n\nimport style from './dashboard-layout-style.scss';\n\nconst _importClassicLayoutComponent = () => import('../classic-layout');\nexport const AsyncClassicLayout = props => (\n  <AsyncComponentLoader\n    importComponent={_importClassicLayoutComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: ClassicLayout } = component;\n      return <ClassicLayout {...props} />;\n    }}\n  />\n);\n\nconst _importClassicLayoutGraphQLComponent = () =>\n  import('../classic-layout/classic-layout-graphql');\nexport const AsyncClassicLayoutGraphQL = props => (\n  <AsyncComponentLoader\n    importComponent={_importClassicLayoutGraphQLComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: ClassicLayout } = component;\n      return <ClassicLayout {...props} />;\n    }}\n  />\n);\n\nconst _importBoxLayoutComponent = () => import('../box-layout');\nexport const AsyncBoxLayout = props => (\n  <AsyncComponentLoader\n    importComponent={_importBoxLayoutComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: BoxLayout } = component;\n      return <BoxLayout {...props} />;\n    }}\n  />\n);\n\nconst _importBoxLayoutGraphQLComponent = () =>\n  import('../box-layout/box-layout-graphql');\nexport const AsyncBoxLayoutGraphQL = props => (\n  <AsyncComponentLoader\n    importComponent={_importBoxLayoutGraphQLComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: BoxLayout } = component;\n      return <BoxLayout {...props} />;\n    }}\n  />\n);\n\nconst _importMobileLayoutComponent = () => import('../mobile-layout');\nexport const AsyncMobileLayout = props => (\n  <AsyncComponentLoader\n    importComponent={_importMobileLayoutComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: MobileLayout } = component;\n      return <MobileLayout {...props} />;\n    }}\n  />\n);\n\nclass DashboardLayoutComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isPointerActive: false,\n    };\n    this.handleMouseMove = this.handleMouseMove.bind(this);\n  }\n\n  componentDidMount() {\n    const {\n      onFinishCelebration,\n      celebrationWidget,\n      onFinishInstrumentCelebration,\n      celebrationInstrumentId,\n      onMount,\n    } = this.props;\n\n    onMount();\n\n    if (celebrationWidget) {\n      this.celebrationTimer = setTimeout(() => {\n        onFinishCelebration(celebrationWidget.widgetKey);\n      }, 30000);\n    }\n\n    if (celebrationInstrumentId) {\n      this.celebrationTimer = setTimeout(() => {\n        onFinishInstrumentCelebration(celebrationInstrumentId);\n      }, 30000);\n    }\n  }\n\n  componentDidUpdate(prevProps) {\n    const {\n      onFinishCelebration,\n      celebrationWidget,\n      onFinishInstrumentCelebration,\n      celebrationInstrumentId,\n    } = this.props;\n\n    // If the celebrationWidget updates, set a new timeout for that widget\n    if (\n      (!prevProps.celebrationWidget && celebrationWidget) ||\n      (prevProps.celebrationWidget &&\n        celebrationWidget &&\n        prevProps.celebrationWidget.widgetKey !== celebrationWidget.widgetKey)\n    ) {\n      clearTimeout(this.celebrationTimer);\n      this.celebrationTimer = setTimeout(() => {\n        onFinishCelebration(celebrationWidget.widgetKey);\n      }, 30000);\n    }\n    if (\n      (!prevProps.celebrationInstrumentId && celebrationInstrumentId) ||\n      (prevProps.celebrationInstrumentId &&\n        celebrationInstrumentId &&\n        celebrationInstrumentId !== prevProps.celebrationInstrumentId)\n    ) {\n      clearTimeout(this.celebrationTimer);\n      this.celebrationTimer = setTimeout(() => {\n        onFinishInstrumentCelebration(celebrationInstrumentId);\n      }, 30000);\n    }\n  }\n\n  componentWillUnmount() {\n    clearTimeout(this.timer);\n  }\n\n  handleMouseMove() {\n    // TODO: when releasing graphql screens for classic layouts,\n    // remove this functionality from here and enable it in\n    // graphql-share-page for all layouts.\n\n    // Notify outer frame (fullscreen button) that mouse\n    // has been moved over the iframe\n    window.parent.postMessage({ type: 'handleMousemove' }, '*');\n\n    clearTimeout(this.timer);\n\n    this.setState({\n      isPointerActive: true,\n    });\n\n    this.timer = setTimeout(() => {\n      this.setState({\n        isPointerActive: false,\n      });\n    }, 2e3);\n  }\n\n  renderDesktopLayout() {\n    const {\n      layoutType,\n      canEdit,\n      isPreview,\n      isSharing,\n      isEditMode,\n      celebrationWidget,\n      children,\n      dashboardId,\n      isDashboardLoaded,\n      isEditingDatabaseWidget,\n      useGraphQLDashboard,\n      celebrationInstrumentId,\n    } = this.props;\n\n    if (!isDashboardLoaded) {\n      return null;\n    }\n\n    const className = classNames({\n      [style.sharing]: isSharing,\n      [style.pointerActive]: this.state.isPointerActive,\n    });\n\n    const previewClassName = classNames({\n      ['new-preview-wrapper']:\n        isPreview && layoutType === LAYOUT_TYPES.FixedLayout,\n    });\n\n    let onMouseMove;\n    if (isSharing) {\n      onMouseMove = this.handleMouseMove;\n    }\n\n    return (\n      <div>\n        <Route path=\"/edit/dashboards/:dashboardId/customize\">\n          {({ match }) => <CustomizePanel isVisible={!!match} />}\n        </Route>\n        {isEditingDatabaseWidget && (\n          <EditWidgetQueryEditorModal isOpen={isEditingDatabaseWidget} />\n        )}\n        {celebrationInstrumentId && (\n          <CelebrationWidget instrumentId={celebrationInstrumentId} />\n        )}\n        {celebrationWidget && <CelebrationWidget widget={celebrationWidget} />}\n        <div className={className} onMouseMove={onMouseMove}>\n          <div className={previewClassName}>\n            {useGraphQLDashboard && layoutType === LAYOUT_TYPES.FixedLayout && (\n              <AsyncBoxLayoutGraphQL dashboardId={dashboardId} />\n            )}\n            {useGraphQLDashboard &&\n              layoutType === LAYOUT_TYPES.ClassicLayout && (\n                <AsyncClassicLayoutGraphQL dashboardId={dashboardId} />\n              )}\n            {!useGraphQLDashboard &&\n              LAYOUT_TYPES.FixedLayout === layoutType && (\n                <AsyncBoxLayout\n                  canEdit={canEdit}\n                  isSharing={isSharing}\n                  isPreview={isPreview}\n                  isEditMode={isEditMode}\n                />\n              )}\n            {!useGraphQLDashboard &&\n              LAYOUT_TYPES.ClassicLayout === layoutType && (\n                <AsyncClassicLayout\n                  canEdit={canEdit}\n                  isSharing={isSharing}\n                  isPreview={isPreview}\n                  isEditMode={isEditMode}\n                />\n              )}\n          </div>\n        </div>\n        {children}\n      </div>\n    );\n  }\n\n  render() {\n    const { isSharing, useGraphQLDashboard } = this.props;\n\n    if (useGraphQLDashboard) {\n      // Return here because on a GraphQL dashboard we\n      // don't load gecko-js and so can't access `useView` below.\n      return (\n        <div>\n          {isSharing && <SessionTelemetry />}\n          {this.renderDesktopLayout()}\n        </div>\n      );\n    }\n\n    const dashboardLayout = (\n      <MobileDetector\n        render={(isMobile, clientWidth) => {\n          if (isMobile) {\n            return (\n              <AsyncMobileLayout\n                clientWidth={clientWidth}\n                isSharing={isSharing}\n              />\n            );\n          }\n\n          return this.renderDesktopLayout();\n        }}\n      />\n    );\n\n    const GeckoRouter = useView('gecko-router');\n\n    return (\n      <GeckoRouter {...this.props}>\n        <ApolloProvider client={apolloClient.create()}>\n          <div>\n            {!isSharing && <ImportsIndicator />}\n            {isSharing && <SessionTelemetry />}\n            {dashboardLayout}\n          </div>\n        </ApolloProvider>\n      </GeckoRouter>\n    );\n  }\n}\n\nDashboardLayoutComponent.defaultProps = {\n  onFinishCelebration: noop,\n  useGraphQLDashboard: false,\n  onMount: noop,\n};\n\nDashboardLayoutComponent.propTypes = {\n  layoutType: PropTypes.string.isRequired,\n  canEdit: PropTypes.bool,\n  celebrationInstrumentId: PropTypes.string,\n  celebrationWidget: PropTypes.object,\n  children: PropTypes.node,\n  dashboardId: PropTypes.string,\n  isDashboardLoaded: PropTypes.bool,\n  isEditMode: PropTypes.bool,\n  isEditingDatabaseWidget: PropTypes.bool,\n  isPreview: PropTypes.bool,\n  isSharing: PropTypes.bool,\n  useGraphQLDashboard: PropTypes.bool,\n  onFinishCelebration: PropTypes.func,\n  onFinishInstrumentCelebration: PropTypes.func,\n  onMount: PropTypes.func,\n};\n\nexport default DashboardLayoutComponent;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport Modal, { ModalHeading, ModalSection } from '../../components/modal';\nimport ServiceIcon from '../../components/service-icon';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport Button from '@UI/button';\nimport ProgressBar from '@UI/progress-bar';\n\nimport { withIntercomContext, intercomContextTypes } from '../../intercom';\nimport { noop, includes } from 'lodash';\n\nimport style from './importing-data-modal-style.scss';\n\nexport class ImportingDataModal extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.handleSupport = this.handleSupport.bind(this);\n    this.handleClose = this.handleClose.bind(this);\n  }\n\n  handleClose() {\n    const {\n      progressStatus,\n      importId,\n      onClose,\n      onAcknowledgeImport,\n    } = this.props;\n    if (progressStatus === ProgressBar.STATUSES.ERROR) {\n      onAcknowledgeImport(importId);\n    }\n\n    onClose();\n  }\n\n  handleSupport(e) {\n    const {\n      intercomContext: { intercom },\n    } = this.props;\n\n    try {\n      intercom('showNewMessage');\n      // if everythin goes right, won't follow link\n      e.preventDefault();\n    } catch (error) {\n      // empty catch\n    }\n  }\n\n  getTimespan(serviceName, importType) {\n    if (serviceName === 'zendesk2' && importType === 'INITIAL') {\n      return 'last 31 days';\n    }\n\n    if (serviceName === 'zendesk2' && importType === 'SUPPLEMENTAL') {\n      return 'last 120 days';\n    }\n\n    return 'last two weeks';\n  }\n\n  renderProgressBar() {\n    const { progress, progressStatus } = this.props;\n\n    return (\n      <div className={style.progress}>\n        {progress < 1 && <ProgressBar status={progressStatus} />}\n        {progress > 0 && (\n          <div>\n            <ProgressBar progress={progress} status={progressStatus} />\n            <p className={style.progressText}>\n              <FormattedMessage\n                id=\"dashboard.importingDataModal.progressText\"\n                values={{ progress }}\n              />\n            </p>\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  renderImportModalDescription(serviceName) {\n    const SERVICES_WITH_SPECIFIC_DESCRIPTIONS = ['intercom3'];\n\n    let descriptionMessageId = `dashboard.importingDataModal.description`;\n\n    if (includes(SERVICES_WITH_SPECIFIC_DESCRIPTIONS, serviceName)) {\n      descriptionMessageId += `.${serviceName}`;\n    }\n\n    return <FormattedMessage id={descriptionMessageId} />;\n  }\n\n  renderInProgress() {\n    const { serviceName, serviceTitle, hasFailed, importType } = this.props;\n    const timespan = this.getTimespan(serviceName, importType);\n\n    return (\n      <div className={style.modal}>\n        <div className={style.heading}>\n          <ModalHeading>\n            {serviceName && (\n              <div className={style.serviceIcon}>\n                <ServiceIcon serviceName={serviceName} size={48} rounded />\n              </div>\n            )}\n            {hasFailed ? (\n              <FormattedMessage id=\"dashboard.importingDataModal.heading.failed\" />\n            ) : (\n              <FormattedMessage\n                id=\"dashboard.importingDataModal.heading.progress\"\n                values={{ serviceTitle, timespan }}\n              />\n            )}\n          </ModalHeading>\n        </div>\n        {this.renderProgressBar()}\n        <ModalSection>\n          {this.renderImportModalDescription(serviceName)}\n        </ModalSection>\n      </div>\n    );\n  }\n\n  renderError() {\n    const { serviceName, serviceTitle } = this.props;\n\n    return (\n      <div className={style.modal}>\n        <div className={style.heading}>\n          <ModalHeading>\n            {serviceName && (\n              <div className={style.serviceIcon}>\n                <ServiceIcon serviceName={serviceName} size={48} rounded />\n              </div>\n            )}\n            <FormattedMessage\n              id=\"dashboard.importingDataModal.heading.error\"\n              values={{ serviceTitle }}\n            />\n          </ModalHeading>\n        </div>\n        {this.renderProgressBar()}\n        <ModalSection>\n          <div onClick={this.handleSupport} className={style.sectionError}>\n            <FormattedHTMLMessage id=\"dashboard.importingDataModal.errorDescription\" />\n          </div>\n        </ModalSection>\n      </div>\n    );\n  }\n\n  renderFinished() {\n    const SERVICES_WITH_DESCRIPTION = ['intercom3'];\n    const { serviceName, serviceTitle } = this.props;\n\n    const showDescription = includes(SERVICES_WITH_DESCRIPTION, serviceName);\n\n    return (\n      <div className={style.modal}>\n        <div className={style.heading}>\n          <ModalHeading>\n            {serviceName && (\n              <div className={style.serviceIcon}>\n                <ServiceIcon serviceName={serviceName} size={48} rounded />\n              </div>\n            )}\n            <FormattedMessage id=\"dashboard.importingDataModal.complete\" />\n          </ModalHeading>\n        </div>\n        {this.renderProgressBar()}\n        <ModalSection>\n          {showDescription && (\n            <div className={style.complete}>\n              <FormattedMessage\n                id=\"dashboard.importingDataModal.completeDescription\"\n                values={{ serviceTitle }}\n              />\n            </div>\n          )}\n          <div className={style.okButton}>\n            <Button onClick={this.handleClose} stretched>\n              OK\n            </Button>\n          </div>\n        </ModalSection>\n      </div>\n    );\n  }\n\n  render() {\n    const { progressStatus, isOpen } = this.props;\n\n    let content = null;\n\n    switch (progressStatus) {\n      case ProgressBar.STATUSES.SUCCESS:\n        content = this.renderFinished();\n        break;\n      case ProgressBar.STATUSES.ERROR:\n        content = this.renderError();\n        break;\n      default:\n        content = this.renderInProgress();\n    }\n\n    return (\n      <Modal hasCloseButton visible={isOpen} onClose={this.handleClose}>\n        {content}\n      </Modal>\n    );\n  }\n}\n\nImportingDataModal.propTypes = {\n  hasFailed: PropTypes.bool,\n  importId: PropTypes.string,\n  importType: PropTypes.string,\n  intercomContext: intercomContextTypes,\n  isImportFinished: PropTypes.bool,\n  isOpen: PropTypes.bool,\n  progress: PropTypes.number,\n  progressStatus: PropTypes.oneOf([\n    ProgressBar.STATUSES.ERROR,\n    ProgressBar.STATUSES.LOADING,\n    ProgressBar.STATUSES.SUCCESS,\n  ]),\n  serviceName: PropTypes.string,\n  serviceTitle: PropTypes.string,\n  onAcknowledgeImport: PropTypes.func,\n  onClose: PropTypes.func,\n};\n\nImportingDataModal.defaultProps = {\n  progress: 0,\n  intercomContext: { intercom: noop },\n  hasFailed: false,\n};\n\nexport default withIntercomContext(ImportingDataModal);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Mutation } from 'react-apollo';\nimport { AcknowledgeImport } from '../../services/concierge-service/graphql/acknowledge-import-mutation.graphql';\nimport ImportingDataModal from './importing-data-modal-component';\n\nconst acknowledgeImport = (importId, mutation) => {\n  mutation({\n    variables: { id: importId },\n  });\n};\n\nconst ImportingDataModalMutation = props => (\n  <Mutation mutation={AcknowledgeImport}>\n    {mutation => (\n      <ImportingDataModal\n        {...props}\n        onAcknowledgeImport={id => {\n          acknowledgeImport(id, mutation);\n          props.hideImport(id);\n        }}\n      />\n    )}\n  </Mutation>\n);\n\nImportingDataModalMutation.propTypes = {\n  hideImport: PropTypes.func,\n};\n\nexport default ImportingDataModalMutation;\n","import ImportingDataModal from './importing-data-modal-connector';\nexport default ImportingDataModal;\n","import { connect } from 'react-redux';\nimport ImportingDataModalMutation from './importing-data-modal-mutation';\nimport * as importsActions from '../actions/imports-actions';\n\nconst mapDispatchToProps = dispatch => ({\n  hideImport: importId => {\n    dispatch(importsActions.hideImport(importId));\n  },\n});\n\nexport default connect(null, mapDispatchToProps)(ImportingDataModalMutation);\n","import React, { Component } from 'react';\nimport { isEqual, noop, find, isEmpty } from 'lodash';\nimport PropTypes from 'prop-types';\nimport ImportingDataModal from '../importing-data-modal';\nimport Toast, { ToastRoot } from '../../toast/components/toast';\nimport FormattedMessage from '../../lib/i18n';\nimport ServiceIcon from '../../components/service-icon';\nimport ProgressBar from '@UI/progress-bar';\nimport { hasFailed, hasCompleted } from '../reducer/imports-reducer';\n\nimport style from '../imports-indicator-style.scss';\n\nconst TIME_TO_HIDE = 7000;\n\nconst getProgressPercentage = dataImport => {\n  // get progress from status and preset to 0 if it's interrupted\n  let {\n    status: { progress = 0 },\n  } = dataImport;\n\n  if (hasCompleted(dataImport)) {\n    progress = 1;\n  }\n  // progress from BE is 0.0-1.0 but we need 0-100\n  return Math.floor(progress * 100);\n};\n\nconst getProgressStatus = dataImport => {\n  // get remainingRetries in case of failed status, default to 5\n  const {\n    status: { remainingRetries = 5 },\n  } = dataImport;\n\n  const isImportCompleted = hasCompleted(dataImport);\n\n  let progressStatus = isImportCompleted\n    ? ProgressBar.STATUSES.SUCCESS\n    : ProgressBar.STATUSES.LOADING;\n\n  // don't want to be dramatic but there's failure and total failure\n  const hasUltimatelyFailed = hasFailed(dataImport) && remainingRetries === 0;\n\n  if (hasUltimatelyFailed) {\n    progressStatus = ProgressBar.STATUSES.ERROR;\n  }\n\n  return progressStatus;\n};\n\nconst ImportToast = ({\n  onClick,\n  progress,\n  serviceName,\n  serviceTitle,\n  status,\n}) => (\n  <div className={style.toastWrapper} onClick={onClick}>\n    <Toast autoWidth>\n      <div className={style.toastProgress}>\n        {progress > 0 && <ProgressBar status={status} progress={progress} />}\n        {progress < 1 && <ProgressBar status={status} />}\n      </div>\n      <div className={style.toastInner}>\n        <ServiceIcon serviceName={serviceName} size={32} rounded />\n        <span className={style.toastText}>\n          <span className={style.statusText}>\n            <FormattedMessage\n              id=\"dashboard.importingDataToast.heading\"\n              values={{ serviceTitle }}\n            />\n          </span>\n          {progress > 0 && (\n            <span className={style.progressText}>\n              <FormattedMessage\n                id=\"dashboard.importingDataModal.progressText\"\n                values={{ progress }}\n              />\n            </span>\n          )}\n          {status === ProgressBar.STATUSES.ERROR && (\n            <span className={style.progressText}>\n              <FormattedMessage id=\"dashboard.importingDataToast.failed\" />\n            </span>\n          )}\n        </span>\n      </div>\n    </Toast>\n  </div>\n);\n\nImportToast.propTypes = {\n  progress: PropTypes.number,\n  serviceName: PropTypes.string,\n  serviceTitle: PropTypes.string,\n  status: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nclass ImportToastLauncher extends Component {\n  constructor(props) {\n    super(props);\n\n    const completed = props.dataImport.filter(hasCompleted).map(i => i.id);\n\n    this.state = { completed };\n    this.timeouts = [];\n  }\n\n  componentDidUpdate(prevProps) {\n    if (isEqual(prevProps.dataImport, this.props.dataImport)) {\n      return;\n    }\n\n    this.getNewlyCompleted().forEach(i => this.scheduleHideToast(i.id));\n  }\n\n  componentWillUnmount() {\n    this.timeouts.forEach(clearTimeout);\n  }\n\n  getVisibleToasts() {\n    return this.props.dataImport.filter(\n      i => !this.state.completed.includes(i.id),\n    );\n  }\n\n  getNewlyCompleted() {\n    return this.props.dataImport.reduce(\n      (completed, i) =>\n        hasCompleted(i) && !this.state.completed.includes(i.id)\n          ? [...completed, i]\n          : completed,\n      [],\n    );\n  }\n\n  renderToasts(toasts) {\n    const { onOpenModal } = this.props;\n\n    return toasts\n      .filter(i => !!i.integration)\n      .map(i => (\n        <ImportToast\n          key={i.id}\n          status={getProgressStatus(i)}\n          progress={getProgressPercentage(i)}\n          serviceName={i.integration.slug}\n          serviceTitle={i.integration.name}\n          onClick={() => onOpenModal(i.integration.slug)}\n        />\n      ));\n  }\n\n  renderImportingDataModal() {\n    const {\n      dataImport,\n      isImportingModalOpen,\n      openModalService = this.props.dataImport[0].integration.slug,\n      onCloseModal,\n    } = this.props;\n\n    const openModalDataImport = find(\n      dataImport,\n      imp => imp.integration.slug === openModalService,\n    );\n\n    const {\n      slug: serviceName,\n      name: serviceTitle,\n    } = openModalDataImport.integration;\n    const { type } = openModalDataImport;\n\n    return (\n      <ImportingDataModal\n        isOpen={isImportingModalOpen}\n        progress={getProgressPercentage(openModalDataImport)}\n        progressStatus={getProgressStatus(openModalDataImport)}\n        hasFailed={hasFailed(openModalDataImport)}\n        importId={openModalDataImport.id}\n        serviceName={serviceName}\n        serviceTitle={serviceTitle}\n        onClose={onCloseModal}\n        importType={type}\n      />\n    );\n  }\n\n  render() {\n    const { dataImport, isImportingModalOpen } = this.props;\n    if (isEmpty(dataImport)) return null;\n\n    const visibleToasts = this.getVisibleToasts();\n\n    return (\n      <div>\n        {!isImportingModalOpen && visibleToasts.length && (\n          <ToastRoot position=\"right\">\n            {this.renderToasts(visibleToasts)}\n          </ToastRoot>\n        )}\n        {this.renderImportingDataModal()}\n      </div>\n    );\n  }\n\n  scheduleHideToast(i) {\n    const timeout = setTimeout(() => {\n      this.setState({ completed: this.state.completed.concat(i) });\n    }, TIME_TO_HIDE);\n\n    this.timeouts.push(timeout);\n  }\n}\n\nImportToastLauncher.defaultProps = {\n  dataImport: [],\n  isImportingModalOpen: false,\n  onOpenModal: noop,\n  onCloseModal: noop,\n};\n\nImportToastLauncher.propTypes = {\n  dataImport: PropTypes.array,\n  isImportingModalOpen: PropTypes.bool,\n  openModalService: PropTypes.string,\n  onCloseModal: PropTypes.func,\n  onOpenModal: PropTypes.func,\n};\n\nImportToastLauncher.TIME_TO_HIDE = TIME_TO_HIDE;\n\nexport default ImportToastLauncher;\nexport { ImportToast };\n","import ImportToastLauncher from './import-toast-connector';\n\nexport default ImportToastLauncher;\n","import { connect } from 'react-redux';\nimport ImportToastLauncher from './import-toast-component';\nimport * as dashboardActions from '../../dashboard/actions/dashboard-actions';\n\nconst mapStateToProps = ({ dashboard }) => {\n  const { isImportingModalOpen, openModalService } = dashboard;\n\n  return {\n    isImportingModalOpen,\n    openModalService,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onCloseModal: () =>\n    dispatch(dashboardActions.toggleImportingModal({ open: false })),\n  onOpenModal: service =>\n    dispatch(dashboardActions.toggleImportingModal({ open: true, service })),\n});\n\nconst ImportToastConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(ImportToastLauncher);\n\nexport default ImportToastConnector;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { get, noop, isEmpty } from 'lodash';\nimport ImportsQuery from '../services/concierge-service/graphql/imports-query.graphql';\nimport ImportToastLauncher from './import-toast';\nimport apolloClient from '../services/concierge-service/apollo-client';\n\nconst POLL_INTERVAL = 2000;\n\nconst getImportsFromResponse = response => {\n  return get(response, 'data.imports', []);\n};\n\nclass ImportsIndicator extends Component {\n  constructor(props) {\n    super(props);\n\n    this.client = apolloClient.create();\n    this.timer = null;\n  }\n\n  componentDidMount() {\n    this.startPolling();\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (!this.props.polling && nextProps.polling) {\n      this.startPolling();\n    }\n  }\n\n  componentWillUnmount() {\n    clearTimeout(this.timer);\n  }\n\n  render() {\n    return !isEmpty(this.props.imports) ? (\n      <ImportToastLauncher dataImport={this.props.imports} />\n    ) : null;\n  }\n\n  async startPolling() {\n    const imports = await this.query();\n    this.props.onUpdate(imports);\n    this.schedule();\n  }\n\n  schedule() {\n    this.timer = setTimeout(async () => {\n      if (this.props.polling) {\n        const imports = await this.query();\n        this.props.onUpdate(imports);\n        this.schedule();\n      }\n    }, POLL_INTERVAL);\n  }\n\n  query() {\n    return this.client\n      .query({\n        query: ImportsQuery,\n        fetchPolicy: 'network-only',\n      })\n      .then(getImportsFromResponse);\n  }\n}\n\nImportsIndicator.pollInterval = POLL_INTERVAL;\n\nImportsIndicator.defaultProps = {\n  imports: [],\n  onUpdate: noop,\n  polling: false,\n};\n\nImportsIndicator.propTypes = {\n  imports: PropTypes.array,\n  polling: PropTypes.bool,\n  onUpdate: PropTypes.func,\n};\n\nexport default ImportsIndicator;\n","import { connect } from 'react-redux';\nimport ImportsIndicator from './imports-indicator-component';\nimport * as importsActions from './actions/imports-actions';\n\nconst mapStateToProps = state => ({\n  polling: state.imports.polling,\n  imports: state.imports.activeImports,\n});\n\nconst mapDispatchToProps = dispatch => ({\n  onUpdate: imports => dispatch(importsActions.importsReceived(imports)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ImportsIndicator);\n","import ImportsIndicator from './imports-indicator-connector';\n\nexport default ImportsIndicator;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Modal, { ModalSection, ModalHeading } from '../components/modal';\nimport ExternalLink from '../components/external-link';\nimport moment from 'moment';\nimport DropItem from '../components/menu/drop-item';\nimport Layout from '../components/layout';\nimport FormatMessage from '../lib/i18n';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport Alert from '@UI/alert';\n\nimport style from './whats-new-style.scss';\n\nconst WHATS_NEW_URL = 'https://www.geckoboard.com/whats-new/';\n\nconst renderItem = ({ link, pubDate, title, description }) => {\n  const html = { __html: description };\n\n  return (\n    <article key={link} className={style.article}>\n      <ModalHeading>{title}</ModalHeading>\n      <p>\n        <time className={style.pubDate}>\n          {moment(new Date(pubDate)).format('MMMM D, YYYY')}\n        </time>\n      </p>\n      <div className={style.formatting} dangerouslySetInnerHTML={html} />\n    </article>\n  );\n};\nrenderItem.propTypes = {\n  description: PropTypes.string,\n  link: PropTypes.string,\n  pubDate: PropTypes.string,\n  title: PropTypes.string,\n};\n\nconst renderItems = ({ error, items }) => {\n  if (error) {\n    return <Alert message={error} type={Alert.TYPES.ERROR} />;\n  }\n\n  if (!items) {\n    return null;\n  }\n\n  return (\n    <div className={style.items}>\n      <p>\n        <ExternalLink href={WHATS_NEW_URL}>\n          <FormatMessage id=\"whatsnew.openInTab\" />\n        </ExternalLink>\n      </p>\n      {items.map(renderItem)}\n      <p>\n        <ExternalLink href={WHATS_NEW_URL}>\n          <FormatMessage id=\"whatsnew.viewMore\" />\n        </ExternalLink>\n      </p>\n    </div>\n  );\n};\nrenderItems.propTypes = {\n  error: PropTypes.string,\n  items: PropTypes.array,\n};\n\nconst renderContent = ({ loading, ...props }) => {\n  if (loading) {\n    return (\n      <Layout flex margin={4}>\n        <LoadingSpinner\n          size={LoadingSpinner.SIZES.MEDIUM}\n          theme={LoadingSpinner.THEMES.DARK}\n        />\n      </Layout>\n    );\n  }\n\n  return (\n    <ModalSection>\n      <ModalHeading level={2}>\n        <FormatMessage id=\"whatsnew.heading\" />\n      </ModalHeading>\n      {renderItems(props)}\n    </ModalSection>\n  );\n};\nrenderContent.propTypes = {\n  error: PropTypes.string,\n  items: PropTypes.array,\n  loading: PropTypes.bool,\n};\n\nconst WhatsNewComponent = ({\n  visible,\n  onOpen,\n  onClose,\n  showNotification,\n  ...props\n}) => {\n  return (\n    <>\n      <DropItem onClick={onOpen} isSmall>\n        <Layout paddingY={0.5}>\n          {showNotification && <span className={style.notificationPill} />}\n          <FormatMessage id=\"whatsnew.toggle\" />\n        </Layout>\n      </DropItem>\n      <Modal visible={visible} hasCloseButton onClose={onClose}>\n        {renderContent(props)}\n      </Modal>\n    </>\n  );\n};\nWhatsNewComponent.propTypes = {\n  visible: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  onOpen: PropTypes.func.isRequired,\n  showNotification: PropTypes.bool,\n};\n\nexport default WhatsNewComponent;\n","import React, { Component } from 'react';\n\n/**\n * A HOC that will trigger a callback whenever the given prop changes\n */\nconst propWatcher = (propName, DecoratedComponent, callback) => {\n  class PropWatcher extends Component {\n    // eslint-disable-next-line camelcase\n    UNSAFE_componentWillMount() {\n      if (this.props.hasOwnProperty(propName)) {\n        callback(this.props[propName], this.props);\n      }\n    }\n\n    // eslint-disable-next-line camelcase\n    UNSAFE_componentWillReceiveProps(nextProps) {\n      if (nextProps[propName] !== this.props[propName]) {\n        callback(nextProps[propName], nextProps);\n      }\n    }\n\n    render() {\n      return <DecoratedComponent {...this.props} />;\n    }\n  }\n\n  return PropWatcher;\n};\n\nexport default propWatcher;\n","import WhatsNewComponent from './whats-new-component';\nimport propWatcher from '../hoc/prop-watcher';\n\nconst WhatsNewWatcher = propWatcher(\n  'userEtag',\n  WhatsNewComponent,\n  (userEtag, { checkForNewUpdate }) => {\n    checkForNewUpdate(userEtag);\n  },\n);\n\nexport default WhatsNewWatcher;\n","import { connect } from 'react-redux';\nimport {\n  toggleModal,\n  checkForNewUpdate,\n} from './whats-new-actions/whats-new-actions';\nimport WhatsNewWatcher from './whats-new-watcher';\n\nconst WhatsNewConnector = connect(\n  ({ whatsNew }, ownProps) => {\n    const { items: allItems, ...props } = whatsNew;\n    const { etag: userEtag } = ownProps;\n\n    let items = null;\n    if (allItems) {\n      items = allItems.slice(0, 5);\n    }\n\n    return { ...props, items, userEtag };\n  },\n  dispatch => ({\n    checkForNewUpdate: userEtag => dispatch(checkForNewUpdate(userEtag)),\n    onOpen: () => dispatch(toggleModal(true)),\n    onClose: () => dispatch(toggleModal(false)),\n  }),\n)(WhatsNewWatcher);\n\nexport default WhatsNewConnector;\n","import WhatsNewConnector from './whats-new-connector';\nexport default WhatsNewConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Button from '@UI/button';\nimport { Row, Column } from '../../components/layout';\nimport Input from '../../components/form/input';\nimport { ModalSection, ModalHeading, ModalText } from '../../components/modal';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport config from '../../universal/config';\nimport { redirect } from '../../lib/global';\nimport { injectIntl } from 'react-intl';\nimport { bindAll } from 'lodash';\nimport PricingGate from '../../components/pricing-gate';\nimport Image from '@UI/image';\n\nimport style from './add-screen-view-style.scss';\n\nconst MAX_INPUT_LENGTH = 6;\n\nclass AddScreenViewComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(\n      this,\n      'handleConnect',\n      'handleChange',\n      'renderError',\n      'renderAddScreenModal',\n    );\n\n    this.state = {\n      code: undefined,\n      errorText: props.error,\n    };\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps({ error }) {\n    if (error) {\n      this.setState({ errorText: error });\n    }\n  }\n\n  handleConnect(e) {\n    e.preventDefault();\n    const { code } = this.state;\n    this.props.onConnect(code);\n  }\n\n  handleChange({ value }) {\n    this.setState({ code: value, errorText: undefined });\n  }\n\n  renderError() {\n    const { errorText } = this.state;\n    if (!errorText) {\n      return null;\n    }\n    return <div className={style.errorText}>{errorText}</div>;\n  }\n\n  renderManageScreensButton() {\n    const { devices, onShowManageView } = this.props;\n\n    if (devices.length === 0) {\n      return null;\n    }\n\n    return (\n      <Button\n        size={Button.SIZES.SMALL}\n        intent={Button.INTENT.LINK}\n        icon=\"cog\"\n        onClick={onShowManageView}\n      >\n        <FormattedMessage id=\"masthead.addScreen.manageScreensButton\" />\n      </Button>\n    );\n  }\n\n  renderAddScreenModal() {\n    const { intl, isConnecting, onClose } = this.props;\n    const { code, errorText } = this.state;\n    const isDisabled = code && code.length >= MAX_INPUT_LENGTH ? false : true;\n    return (\n      <div className={style.modal}>\n        <ModalSection>\n          <div className={style.header}>\n            <ModalHeading>\n              <FormattedMessage id=\"masthead.addScreen.heading\" />\n            </ModalHeading>\n            <ModalText>\n              <FormattedMessage id=\"masthead.addScreen.text\" />{' '}\n              <a\n                href=\"https://support.geckoboard.com/hc/en-us/articles/206834867\"\n                target=\"_blank\"\n              >\n                <FormattedMessage id=\"masthead.addScreen.helpLinkText\" />\n              </a>\n            </ModalText>\n          </div>\n        </ModalSection>\n        <div className={style.instructions}>\n          <ModalSection>\n            <form onSubmit={this.handleConnect}>\n              <ModalHeading>\n                <strong>\n                  <FormattedMessage id=\"masthead.addScreen.instructions.heading\" />\n                </strong>\n              </ModalHeading>\n              <h6>Step 1</h6>\n              <p>\n                <FormattedMessage id=\"masthead.addScreen.instructions.step1\" />\n              </p>\n              <h6>Step 2</h6>\n              <p>\n                <FormattedHTMLMessage id=\"masthead.addScreen.instructions.step2\" />\n              </p>\n              <h6>Step 3</h6>\n              <Row align=\"center\">\n                <Column flexNone>\n                  <FormattedMessage id=\"masthead.addScreen.instructions.step3\" />{' '}\n                </Column>\n                <Column flexFill paddingLeft={1}>\n                  <Input\n                    name=\"codeInput\"\n                    value={code}\n                    maxLength={MAX_INPUT_LENGTH}\n                    placeholder={intl.formatMessage({\n                      id: 'masthead.addScreen.codePlaceholder',\n                    })}\n                    hasError={!!errorText}\n                    onChange={this.handleChange}\n                    isUppercase\n                    autoFocus\n                  />\n                </Column>\n              </Row>\n              {this.renderError()}\n\n              <Row marginTop={2.5} justify=\"flex-end\">\n                <Column flexAuto align=\"flex-start\" justify=\"center\" gutter={2}>\n                  {this.renderManageScreensButton()}\n                </Column>\n                <Column>\n                  <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n                    <FormattedMessage id=\"masthead.addScreen.cancelButton\" />\n                  </Button>\n                </Column>\n                <Column marginLeft={1}>\n                  <Button\n                    type={Button.TYPES.SUBMIT}\n                    disabled={isDisabled}\n                    loading={isConnecting}\n                  >\n                    <FormattedMessage id=\"masthead.addScreen.connectButton\" />\n                  </Button>\n                </Column>\n              </Row>\n            </form>\n          </ModalSection>\n        </div>\n      </div>\n    );\n  }\n\n  renderFeatureGate() {\n    return (\n      <div className={style.featureGate}>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/images/multi-screen-ill.svg`}\n          width=\"300\"\n          height=\"140\"\n        />\n        <strong className={style.featureGateTitle}>\n          <FormattedMessage id=\"featureGate.screens.heading\" />\n        </strong>\n        <p className={style.featureGateContent}>\n          <FormattedMessage id=\"featureGate.screens.text\" />\n        </p>\n        <div className={style.featureGateAction}>\n          <Button stretched onClick={() => redirect('/account/plans')}>\n            <FormattedMessage id=\"featureGate.screens.button\" />\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    return (\n      <PricingGate name=\"screens\" allowance=\"max_screens\" usage=\"screens\">\n        {({ allowed }) =>\n          allowed ? this.renderAddScreenModal() : this.renderFeatureGate()\n        }\n      </PricingGate>\n    );\n  }\n}\n\nAddScreenViewComponent.defaultProps = {\n  devices: [],\n};\n\nAddScreenViewComponent.propTypes = {\n  devices: PropTypes.array,\n  error: PropTypes.string,\n  intl: PropTypes.object,\n  isConnecting: PropTypes.bool,\n  showFeatureGate: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConnect: PropTypes.func,\n  onShowManageView: PropTypes.func,\n};\n\nexport default injectIntl(AddScreenViewComponent);\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './wistia-embed-style.scss';\n\nconst WistiaEmbed = ({ video }) => (\n  <div className={style.placeholder}>\n    <div className={style.container}>\n      <iframe\n        src={`//fast.wistia.net/embed/iframe/${video}?seo=false&videoFoam=true`}\n        allowTransparency=\"true\"\n        frameBorder=\"0\"\n        scrolling=\"no\"\n        className=\"wistia_embed\"\n        name=\"wistia_embed\"\n        allowFullScreen\n        MozAllowFullScreen\n        WebkitAllowFullScreen\n        OAllowFullScreen\n        msAllowFullScreen\n        width=\"100%\"\n        height=\"100%\"\n      />\n    </div>\n  </div>\n);\n\nWistiaEmbed.propTypes = {\n  video: PropTypes.string.isRequired,\n};\n\nexport default WistiaEmbed;\n","import WistiaEmbed from './wistia-embed-component';\n\nexport default WistiaEmbed;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport Button from '@UI/button';\nimport Link from '../../components/link';\nimport { ModalSection, ModalHeading, ModalText } from '../../components/modal';\nimport Layout, { Row, Column } from '../../components/layout';\nimport WistiaEmbed from '../../components/wistia-embed';\n\nimport style from './upgrade-view-style.scss';\n\nconst UpgradeView = ({ onClose, onUpgradeLinkClick }) => (\n  <ModalSection>\n    <ModalHeading>\n      <FormattedMessage id=\"masthead.upgradeScreens.heading\" />\n    </ModalHeading>\n    <ModalText>\n      <FormattedHTMLMessage id=\"masthead.upgradeScreens.text\" />{' '}\n      <Link\n        href=\"https://www.geckoboard.com/blog/new-displaying-your-dashboards-on-a-tv-just-got-a-whole-lot-easier/\"\n        target=\"_blank\"\n      >\n        <FormattedMessage id=\"masthead.learnMoreLink\" />\n      </Link>\n    </ModalText>\n    <Layout marginBottom={1}>\n      <WistiaEmbed video=\"ab42nzynqw\" />\n    </Layout>\n    <div className={style.instructionContainer}>\n      <FormattedHTMLMessage id=\"masthead.upgradeScreens.instructions\" />\n    </div>\n    <Row marginTop={1} justify=\"flex-end\">\n      <Column>\n        <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n          <FormattedMessage id=\"button.cancel\" />\n        </Button>\n      </Column>\n      <Column marginLeft={1}>\n        <Button onClick={onUpgradeLinkClick}>\n          <FormattedMessage id=\"button.upgrade\" />\n        </Button>\n      </Column>\n    </Row>\n  </ModalSection>\n);\n\nUpgradeView.propTypes = {\n  onClose: PropTypes.func,\n  onUpgradeLinkClick: PropTypes.func,\n};\n\nexport default UpgradeView;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Modal from '../../components/modal';\nimport AddScreenView from './add-screen-view-component';\nimport UpgradeView from './upgrade-view-component';\nimport ManageScreensView from './manage-screens-view-component';\nimport LoadingSpinner from '@UI/loading-spinner';\n\nimport style from './manage-screens-style.scss';\n\nconst ManageScreensComponent = ({\n  isModalOpen,\n  currentView,\n  isConnecting,\n  devices,\n  error,\n  onClose,\n  onConnect,\n  onShowAddView,\n  onShowManageView,\n  onUpgradeLinkClick,\n\n  dashboards,\n  sharingLoops,\n  isFetchingDevices,\n  onDeleteDevice,\n  onRefreshDevice,\n  onSetDeviceName,\n  onSetDeviceConnection,\n  onCreateLoop,\n  onToggleLite,\n  isLiteEnabled,\n  groupId,\n}) => {\n  const isVisible = !!(isModalOpen && currentView);\n\n  if (isFetchingDevices) {\n    return (\n      <Modal visible={isVisible} onClose={onClose}>\n        <div className={style.loader}>\n          <LoadingSpinner\n            size={LoadingSpinner.SIZES.MEDIUM}\n            theme={LoadingSpinner.THEMES.DARK}\n          />\n        </div>\n      </Modal>\n    );\n  }\n\n  switch (currentView) {\n    case 'add':\n      return (\n        <Modal hasCloseButton visible={isVisible} onClose={onClose}>\n          <AddScreenView\n            onClose={onClose}\n            onConnect={onConnect}\n            isConnecting={isConnecting}\n            onShowManageView={onShowManageView}\n            devices={devices}\n            error={error}\n          />\n        </Modal>\n      );\n\n    case 'upgrade':\n      return (\n        <Modal hasCloseButton visible={isVisible} onClose={onClose}>\n          <UpgradeView\n            onClose={onClose}\n            onUpgradeLinkClick={onUpgradeLinkClick}\n          />\n        </Modal>\n      );\n\n    default:\n      return (\n        <Modal hasCloseButton visible={isVisible} onClose={onClose}>\n          <ManageScreensView\n            onShowAddView={onShowAddView}\n            devices={devices}\n            dashboards={dashboards}\n            sharingLoops={sharingLoops}\n            error={error}\n            onClose={onClose}\n            onDeleteDevice={onDeleteDevice}\n            onRefreshDevice={onRefreshDevice}\n            onSetDeviceName={onSetDeviceName}\n            onSetDeviceConnection={onSetDeviceConnection}\n            onCreateLoop={() => onCreateLoop(groupId)}\n            isLiteEnabled={isLiteEnabled}\n            onToggleLite={onToggleLite}\n          />\n        </Modal>\n      );\n  }\n};\n\nManageScreensComponent.propTypes = {\n  onDeleteDevice: PropTypes.func.isRequired,\n  onRefreshDevice: PropTypes.func.isRequired,\n  onSetDeviceConnection: PropTypes.func.isRequired,\n  onSetDeviceName: PropTypes.func.isRequired,\n  currentView: PropTypes.oneOf(['add', 'manage', 'upgrade']),\n  dashboards: PropTypes.array,\n  devices: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n      name: PropTypes.string,\n    }),\n  ),\n  error: PropTypes.string,\n  groupId: PropTypes.number,\n  isConnecting: PropTypes.bool,\n  isFetchingDevices: PropTypes.bool,\n  isLiteEnabled: PropTypes.bool,\n  isModalOpen: PropTypes.bool,\n  sharingLoops: PropTypes.array,\n  onClose: PropTypes.func,\n  onConnect: PropTypes.func,\n  onCreateLoop: PropTypes.func,\n  onShowAddView: PropTypes.func,\n  onShowManageView: PropTypes.func,\n  onToggleLite: PropTypes.func,\n  onUpgradeLinkClick: PropTypes.func,\n};\n\nexport default ManageScreensComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Toast, { ToastIcon, ToastRoot } from '../../components/toast';\nimport Border from '@UI/playground/border';\nimport Button from '@UI/button';\nimport Icon from '@UI/icon';\nimport { redirect } from '../../../lib/global';\nimport { track } from '../../../lib/tracker';\nimport * as toastConstants from '../../toast-constants';\nimport { FormattedHTMLMessage, formatMessage } from '../../../lib/i18n';\nimport { trackEvent } from '@Tracking';\nimport { dashboardLoopCopiedSharingLink } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\n\nimport style from './toast-launcher.scss';\n\nexport const ToastPropTypes = PropTypes.shape({\n  dashboardPath: PropTypes.string,\n  dashboardTitle: PropTypes.string,\n  link: PropTypes.string,\n  message: PropTypes.string,\n  service_id: PropTypes.string,\n  service_name: PropTypes.string,\n  type: PropTypes.oneOf(Object.values(toastConstants)),\n  userId: PropTypes.number,\n  widgetKey: PropTypes.string,\n  widgetTitle: PropTypes.string,\n});\n\nconst successMessage = (text, onClose) => (\n  <Toast messageType=\"success\" onClose={onClose}>\n    <p>{text}</p>\n  </Toast>\n);\n\nconst successMessageWithButton = (\n  text,\n  buttonText,\n  action,\n  delayed,\n  onClose,\n  autoHide,\n) => (\n  <Toast\n    messageType=\"success\"\n    delayed={delayed}\n    onClose={onClose}\n    autoHide={autoHide}\n  >\n    <p>{text}</p>\n    <Border rounded>\n      <Button onClick={action} intent={Button.INTENT.SECONDARY}>\n        {buttonText}\n      </Button>\n    </Border>\n  </Toast>\n);\n\nconst successMessageWithButtonAndIcon = (\n  text,\n  buttonText,\n  action,\n  delayed,\n  icon,\n  onClose,\n  autoHide,\n) => (\n  <Toast\n    messageType=\"success\"\n    delayed={delayed}\n    onClose={onClose}\n    autoHide={autoHide}\n  >\n    {icon}\n    <p>{text}</p>\n    <Button onClick={action} intent={Button.INTENT.SECONDARY}>\n      {buttonText}\n    </Button>\n  </Toast>\n);\n\nconst successMessageWithIcon = (text, icon, onClose) => (\n  <Toast messageType=\"success\" onClose={onClose}>\n    {icon}\n    <p>{text}</p>\n  </Toast>\n);\n\nconst errorMessage = (text, onClose) => (\n  <Toast messageType=\"error\" onClose={onClose}>\n    <p>{text}</p>\n  </Toast>\n);\n\nconst ToastLauncherComponent = props => {\n  const {\n    toast = {},\n    dashboardId,\n    canUseSharingUrls,\n    onClose,\n    onManageScreens,\n    onManageDashboardAccess,\n    onCopySharingLink,\n  } = props;\n\n  const { link, loopId } = toast;\n\n  let ToastNode = null;\n  switch (toast.type) {\n    case toastConstants.SUCCESS:\n      ToastNode = successMessage(toast.message, onClose);\n      break;\n    case toastConstants.ERROR:\n      ToastNode = errorMessage(toast.message, onClose);\n      break;\n    case toastConstants.ADDED_SCREEN:\n      ToastNode = successMessageWithButton(\n        'Screen added',\n        'Manage screens',\n        onManageScreens,\n        true,\n        onClose,\n      );\n      break;\n    case toastConstants.DEMOTED_TO_DASHBOARD_VIEW_ONLY:\n      const { userId } = toast;\n      ToastNode = successMessageWithButton(\n        formatMessage('people.demoteToDashboardViewOnly.success'),\n        formatMessage('people.manageDashboardAccess'),\n        () => onManageDashboardAccess(userId),\n        false,\n        onClose,\n      );\n      break;\n    case toastConstants.ADD_A_GOAL:\n      ToastNode = successMessageWithButtonAndIcon(\n        <FormattedHTMLMessage id=\"universal.zendesk.onboarding.toast.text\" />,\n        formatMessage('universal.zendesk.onboarding.toast.button'),\n        () => {\n          track('Onboarding - Click CTA in toast', {\n            properties: {\n              service_name: 'zendesk2',\n            },\n          });\n          redirect(\n            `/v4/dashboards/${dashboardId}/widgets/${toast.widgetKey}/universal`,\n            300,\n          );\n        },\n        false,\n        <ToastIcon large>\n          <Icon name=\"trophy\" />\n        </ToastIcon>,\n        () => {},\n        true,\n      );\n      break;\n    case toastConstants.FOOTER_SWITCHED_ON:\n      ToastNode = successMessageWithIcon(\n        formatMessage('customize.footerSwitchedOn'),\n        <ToastIcon>👍</ToastIcon>,\n        onClose,\n      );\n      break;\n    case toastConstants.SHARING_LINK_COPIED:\n      ToastNode = successMessageWithIcon(\n        formatMessage('share.linkCopied'),\n        <span className={style.iconContainer}>\n          <Icon name=\"link\" />\n        </span>,\n        onClose,\n      );\n      break;\n    case toastConstants.REGENERATED_SHARING_LINK:\n      ToastNode = successMessageWithButtonAndIcon(\n        formatMessage('dashboards.regenerateSharingLinkSuccess'),\n        formatMessage('dashboards.copySharingLink'),\n        () => {\n          onCopySharingLink(link);\n          track('Dashboards - Toast - Copy URL');\n        },\n        false,\n        <span className={style.iconContainer}>\n          <Icon name=\"link\" />\n        </span>,\n        onClose,\n      );\n      break;\n    case toastConstants.REGENERATED_LOOP_SHARING_LINK:\n      ToastNode = successMessageWithButtonAndIcon(\n        formatMessage('dashboards.regenerateSharingLinkSuccess'),\n        formatMessage('dashboards.copySharingLink'),\n        () => {\n          onCopySharingLink(link);\n          track('Loops - Toast - Copy URL');\n          trackEvent(\n            dashboardLoopCopiedSharingLink({\n              'Dashboard loop ID': `${loopId}`,\n              Location: LOCATIONS.Toast,\n            }),\n          );\n        },\n        false,\n        <span className={style.iconContainer}>\n          <Icon name=\"link\" />\n        </span>,\n        onClose,\n      );\n      break;\n    case toastConstants.CREATED_LOOP:\n      if (canUseSharingUrls) {\n        ToastNode = successMessageWithButtonAndIcon(\n          formatMessage('loops.creationSuccessful'),\n          formatMessage('loops.copySharingLink'),\n          () => {\n            onCopySharingLink(link);\n            track('Loops - Toast - Copy URL');\n            trackEvent(\n              dashboardLoopCopiedSharingLink({\n                'Dashboard loop ID': `${loopId}`,\n                Location: LOCATIONS.Toast,\n              }),\n            );\n          },\n          false,\n          <span className={style.iconContainer}>\n            <Icon name=\"link\" />\n          </span>,\n          onClose,\n        );\n      } else {\n        ToastNode = successMessageWithIcon(\n          formatMessage('loops.creationSuccessful'),\n          <span className={style.iconContainer}>\n            <Icon name=\"link\" />\n          </span>,\n          onClose,\n        );\n      }\n\n      break;\n    case toastConstants.DASHBOARD_TEMPLATE_CREATE_ERROR:\n      ToastNode = errorMessage(\n        formatMessage('universal.zendesk.onboarding.failed'),\n      );\n      break;\n    case toastConstants.WIDGET_COPIED:\n      const { widgetTitle, dashboardTitle, dashboardPath } = toast;\n      const text = formatMessage(\n        'widget.copy.successToast.differentDashboard',\n        {\n          widgetTitle,\n          dashboardTitle,\n        },\n      );\n\n      if (dashboardPath) {\n        ToastNode = successMessageWithButton(\n          text,\n          formatMessage('widget.copy.successToast.viewDashboardLink'),\n          () => {\n            redirect(dashboardPath);\n          },\n          false,\n          onClose,\n        );\n      } else {\n        ToastNode = successMessage(text, onClose);\n      }\n\n      break;\n\n    default:\n      ToastNode = null;\n  }\n\n  return <ToastRoot>{ToastNode}</ToastRoot>;\n};\n\nToastLauncherComponent.propTypes = {\n  canUseSharingUrls: PropTypes.bool,\n  dashboardId: PropTypes.number,\n  toast: ToastPropTypes,\n  onClose: PropTypes.func,\n  onCopySharingLink: PropTypes.func,\n  onFollowLink: PropTypes.func,\n  onInviteMore: PropTypes.func,\n  onManageDashboardAccess: PropTypes.func,\n  onManageScreens: PropTypes.func,\n};\n\nexport default ToastLauncherComponent;\n","import ToastLauncherComponent from './toast-launcher-component';\nimport { connect } from 'react-redux';\nimport { track } from '../../../lib/tracker';\nimport { router } from '../../../router';\nimport { redirect } from '../../../lib/global';\nimport * as toastActions from '../../actions';\nimport * as toastConstants from '../../toast-constants';\nimport * as manageScreensActions from '../../../manage-screens/actions/manage-screens-actions';\nimport copy from '../../../lib/copy-to-clipboard';\n\nconst mapStateToProps = state => {\n  const {\n    toastLauncher,\n    user: { user = {}, organization: { allowances = {} } = {} },\n    dashboard: { dashboard: { id: dashboardId } = {} },\n  } = state;\n  const canUseSharingUrls = allowances.sharing_urls;\n\n  return { ...toastLauncher, user, dashboardId, canUseSharingUrls };\n};\n\nconst mapDispatchToProps = (dispatch, { onManageScreens }) => {\n  return {\n    onManageScreens: () => {\n      if (onManageScreens) onManageScreens();\n      else dispatch(manageScreensActions.openModalAndFetchDevices());\n    },\n    onFollowLink: (servicePath, serviceName) => {\n      track('Add another button - Click', {\n        properties: { service_name: serviceName },\n      });\n      redirect(servicePath, 300);\n    },\n    onManageDashboardAccess: userId => {\n      const manageDashboardAccessPath = `/admin/people/dashboard-permissions/${userId}`;\n      router.navigate(manageDashboardAccessPath);\n    },\n    onCopySharingLink: sharingLink => {\n      copy(sharingLink);\n      dispatch(\n        toastActions.showToast({ type: toastConstants.SHARING_LINK_COPIED }),\n      );\n    },\n    onClose: () => {\n      dispatch(toastActions.hideToast());\n    },\n  };\n};\n\nconst ToastLauncherConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(ToastLauncherComponent);\n\nexport default ToastLauncherConnector;\n","import ToastLauncher from './toast-launcher-connector';\nexport default ToastLauncher;\n","import PropTypes from 'prop-types';\nimport { snakeCase } from 'lodash';\nimport React, { Component } from 'react';\nimport Modal from '../components/modal';\nimport Button from '@UI/button';\nimport Image from '@UI/image';\nimport config from '../universal/config';\nimport FormattedMessage from '../lib/i18n';\nimport InputDropdownGroup from '../compact-config/components/input-dropdown-group';\n\nimport styles from './first-run-style.scss';\n\nconst formatOptions = options =>\n  options.map(item => ({\n    ...item,\n    value: snakeCase(item.label),\n    key: item.label,\n  }));\n\nexport const roleOptions = formatOptions([\n  {\n    label: 'Founder / CEO',\n  },\n  { label: 'Sales' },\n  { label: 'Marketing' },\n  { label: 'Finance' },\n  { label: 'Operations' },\n  { label: 'Customer Support' },\n  { label: 'IT Support' },\n  { label: 'Software Engineering' },\n  { label: 'Product Management' },\n  { label: 'Human Resources' },\n  { label: 'Data Analytics / BI' },\n  { label: 'Other' },\n]);\n\nexport const jtbdOptions = formatOptions([\n  { label: 'I’m just exploring' },\n  { label: 'I want to make key metrics more visible in my company' },\n  { label: 'I want to improve a team’s performance' },\n  { label: 'I want to save time creating reports' },\n  { label: 'I’ve been asked to build a dashboard by someone else' },\n  { label: 'Other' },\n]);\n\nconst EMPTY_VALUE = { label: '', value: '' };\n\nclass FirstRunComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      inputs: {\n        role: {\n          label: <FormattedMessage id=\"firstRun.modal.labelRole\" />,\n          options: roleOptions,\n        },\n        jtbd: {\n          label: <FormattedMessage id=\"firstRun.modal.labelJtbd\" />,\n          options: jtbdOptions,\n        },\n      },\n    };\n\n    this.handleChange = this.handleChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n  }\n\n  handleChange(name, value) {\n    this.setState(state => {\n      const inputs = { ...state.inputs };\n\n      inputs[name] = {\n        ...inputs[name],\n        value,\n      };\n\n      return { inputs };\n    });\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n    const { inputs } = this.state;\n    const values = Object.keys(inputs).reduce(\n      (acc, name) => ({\n        ...acc,\n        [name]: inputs[name].value || EMPTY_VALUE,\n      }),\n      {},\n    );\n\n    this.props.onSubmit(values);\n  }\n\n  render() {\n    const { visible } = this.props;\n    const { inputs } = this.state;\n\n    return (\n      <Modal visible={visible} onClose={this.props.onClose} scrollable>\n        <form onSubmit={this.handleSubmit}>\n          <div className={styles.container}>\n            <h2 className={styles.title}>\n              <FormattedMessage id=\"firstRun.modal.welcome\" />\n            </h2>\n            <div className={styles.banner}>\n              <Image\n                src={`${\n                  config.get().StaticAssetBaseURL\n                }/images/welcome-to-geckoboard.svg`}\n                width=\"304\"\n                height=\"257\"\n              />\n            </div>\n            <div className={styles.content}>\n              {Object.keys(inputs).map(name => (\n                <div className={styles.row} key={name}>\n                  <InputDropdownGroup\n                    mainKey=\"label\"\n                    canSearch={false}\n                    onChange={value => this.handleChange(name, value)}\n                    options={[inputs[name].options]}\n                    value={inputs[name].value || EMPTY_VALUE}\n                    label={inputs[name].label}\n                  />\n                </div>\n              ))}\n              <div className={styles.getStartedButton}>\n                <Button type={Button.TYPES.SUBMIT}>\n                  <FormattedMessage id=\"templateGallery.modal.getStartedButton\" />\n                </Button>\n              </div>\n            </div>\n          </div>\n        </form>\n      </Modal>\n    );\n  }\n}\n\nFirstRunComponent.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  visible: PropTypes.bool,\n  onSubmit: PropTypes.func,\n};\n\nexport default FirstRunComponent;\n","import { connect } from 'react-redux';\nimport FirstRunComponent from './first-run-component';\nimport { hasCheckpoint } from '../lib/user';\nimport * as userActions from '../user/actions/user-actions';\nimport conditionalRender from '../hoc/conditional-render';\nimport { saveSegmentationAnswers } from '../services/management-service';\nimport { trackEvent } from '@Tracking';\nimport {\n  welcomeSurveyDismissed,\n  welcomeSurveySubmitted,\n} from '@Tracking/events';\n\nconst CHECKPOINT = 'welcome_modal';\n\nconst formatFormValues = ({ role, jtbd }) =>\n  [\n    {\n      segmentation_question: 'job_role',\n      segmentation_answer: role.value,\n    },\n    {\n      segmentation_question: 'jtbd',\n      segmentation_answer: jtbd.value,\n    },\n  ].filter(value => !!value.segmentation_answer);\n\nconst ConditionalFirstRun = conditionalRender(({ user }) =>\n  hasCheckpoint(user, 'new_signup'),\n)(FirstRunComponent);\n\nconst FirstRunConnector = connect(\n  state => {\n    const {\n      user: { user = {}, organization = {} },\n    } = state;\n\n    const visible = !hasCheckpoint(user, CHECKPOINT);\n\n    return { user, orgId: organization.id, visible };\n  },\n  dispatch => ({\n    createHandlers: stateProps => ({\n      onClose: () => {\n        trackEvent(welcomeSurveyDismissed());\n        dispatch(userActions.updateCheckpoint(CHECKPOINT));\n      },\n      onSubmit: values => {\n        const answers = formatFormValues(values);\n\n        trackEvent(\n          welcomeSurveySubmitted({\n            'Job role': values.role.value || undefined,\n          }),\n        );\n\n        if (answers.length > 0) {\n          saveSegmentationAnswers(stateProps.orgId, { answers });\n        }\n\n        dispatch(userActions.updateCheckpoint(CHECKPOINT));\n      },\n    }),\n  }),\n  (stateProps, dispatchProps, ownProps) => ({\n    ...stateProps,\n    ...dispatchProps.createHandlers(stateProps),\n    ...ownProps,\n  }),\n)(ConditionalFirstRun);\n\nexport default FirstRunConnector;\nexport { ConditionalFirstRun };\n","import FirstRunConnector from './first-run-connector';\nexport default FirstRunConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classNames from 'classnames';\nimport config from '../../universal/config';\nimport Image from '@UI/image';\n\nimport style from './nav-logo-button-style.scss';\n\nconst NavLogoButtonComponent = props => {\n  const { href, showBackButton } = props;\n  const logoSrc = `${config.get().AssetBaseURL}/geckoboard-dashboard-logo.svg`;\n  if (showBackButton) {\n    const classes = classNames(style.logo, style.link);\n\n    return (\n      <a href={href} className={classes}>\n        <Image width={32} height={32} src={logoSrc} alt=\"Geckoboard\" />\n      </a>\n    );\n  }\n\n  return (\n    <span className={style.logo}>\n      <Image width={32} height={32} src={logoSrc} alt=\"Geckoboard\" />\n    </span>\n  );\n};\n\nNavLogoButtonComponent.propTypes = {\n  href: PropTypes.string,\n  showBackButton: PropTypes.bool,\n};\n\nNavLogoButtonComponent.defaultProps = {\n  showBackButton: false,\n};\n\nexport default NavLogoButtonComponent;\n","import NavLogoButtonComponent from './nav-logo-button-component';\nexport default NavLogoButtonComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useHistory, useRouteMatch } from 'react-router-dom';\nimport { redirect } from '../../lib/global';\nimport FormattedMessage from '../../lib/i18n';\nimport ConfirmModal from '../confirm-modal';\n\nconst DashboardLimitModalComponent = () => {\n  const match = useRouteMatch({\n    path: '/edit/dashboards/:dashboardId/limit',\n    exact: true,\n  });\n  const history = useHistory();\n\n  const handleCloseModal = () => {\n    history.push(`/edit/dashboards/${match.params.dashboardId}`);\n  };\n\n  return (\n    <ConfirmModal\n      visible={!!match}\n      onClose={handleCloseModal}\n      confirmButtonLabel={\n        <FormattedMessage id=\"dashboardLimitModal.submitButton\" />\n      }\n      onConfirm={() => redirect('/account/plans')}\n      heading={<FormattedMessage id=\"dashboardLimitModal.heading\" />}\n    >\n      <FormattedMessage id=\"dashboardLimitModal.body\" />\n    </ConfirmModal>\n  );\n};\n\nDashboardLimitModalComponent.propTypes = {\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nexport default DashboardLimitModalComponent;\n","import DashboardLimitModal from './dashboard-limit-modal-component';\nexport default DashboardLimitModal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\nimport FormattedMessage from '../../lib/i18n';\n\nimport styles from './masthead-upgrade-link-component-style.scss';\n\nconst MastheadUpgradeLink = ({\n  trialDaysRemaining,\n  showUpgradeLink,\n  onUpgradeLinkClick,\n  isFreePlanUser,\n}) => {\n  const renderTrialDaysRemainingText = () => {\n    let trialDaysCountdown = 0;\n\n    if (trialDaysRemaining > 0) {\n      trialDaysCountdown = trialDaysRemaining;\n    }\n\n    const dayText = trialDaysCountdown === 1 ? 'day' : 'days';\n\n    return `${trialDaysCountdown} ${dayText}`;\n  };\n\n  if (showUpgradeLink) {\n    return (\n      <a\n        className={styles.mastheadButton}\n        onClick={() => {\n          trackEvent(\n            buttonClicked({\n              'Button identifier': 'Header - Upgrade',\n            }),\n          );\n          onUpgradeLinkClick();\n        }}\n      >\n        {isFreePlanUser ? (\n          <FormattedMessage id=\"masthead.upgradeButton.free.upgrade\" />\n        ) : (\n          <FormattedMessage\n            id=\"masthead.upgradeButton.trial.upgrade\"\n            values={{ trialDaysRemainingText: renderTrialDaysRemainingText() }}\n          />\n        )}\n      </a>\n    );\n  }\n\n  const planText = isFreePlanUser ? (\n    <FormattedMessage id=\"masthead.upgradeButton.free\" />\n  ) : (\n    <FormattedMessage\n      id=\"masthead.upgradeButton.trial\"\n      values={{ trialDaysRemainingText: renderTrialDaysRemainingText() }}\n    />\n  );\n\n  return <span className={styles.mastheadUpgradeText}>{planText}</span>;\n};\n\nMastheadUpgradeLink.propTypes = {\n  isFreePlanUser: PropTypes.bool,\n  showUpgradeLink: PropTypes.bool,\n  trialDaysRemaining: PropTypes.number,\n  onUpgradeLinkClick: PropTypes.func,\n};\n\nexport default MastheadUpgradeLink;\n","import MastheadUpgradeLink from './masthead-upgrade-link-component';\nexport default MastheadUpgradeLink;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"item\":\"item---91IMR\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"lFetchingInitialList\":\"lFetchingInitialList---16JmK\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"externalLink\":\"externalLink---1o2sr\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modalContent\":\"modalContent---1F66G\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"integrationRequest\":\"integrationRequest---2DWBJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"dropItem\":\"dropItem---2gKQp\"};","\"use strict\";\n\nvar deselectCurrent = require(\"toggle-selection\");\n\nvar defaultMessage = \"Copy to clipboard: #{key}, Enter\";\n\nfunction format(message) {\n  var copyKey = (/mac os x/i.test(navigator.userAgent) ? \"⌘\" : \"Ctrl\") + \"+C\";\n  return message.replace(/#{\\s*key\\s*}/g, copyKey);\n}\n\nfunction copy(text, options) {\n  var debug,\n    message,\n    reselectPrevious,\n    range,\n    selection,\n    mark,\n    success = false;\n  if (!options) {\n    options = {};\n  }\n  debug = options.debug || false;\n  try {\n    reselectPrevious = deselectCurrent();\n\n    range = document.createRange();\n    selection = document.getSelection();\n\n    mark = document.createElement(\"span\");\n    mark.textContent = text;\n    // reset user styles for span element\n    mark.style.all = \"unset\";\n    // prevents scrolling to the end of the page\n    mark.style.position = \"fixed\";\n    mark.style.top = 0;\n    mark.style.clip = \"rect(0, 0, 0, 0)\";\n    // used to preserve spaces and line breaks\n    mark.style.whiteSpace = \"pre\";\n    // do not inherit user-select (it may be `none`)\n    mark.style.webkitUserSelect = \"text\";\n    mark.style.MozUserSelect = \"text\";\n    mark.style.msUserSelect = \"text\";\n    mark.style.userSelect = \"text\";\n    mark.addEventListener(\"copy\", function(e) {\n      e.stopPropagation();\n      if (options.format) {\n        e.preventDefault();\n        e.clipboardData.clearData();\n        e.clipboardData.setData(options.format, text);\n      }\n    });\n\n    document.body.appendChild(mark);\n\n    range.selectNodeContents(mark);\n    selection.addRange(range);\n\n    var successful = document.execCommand(\"copy\");\n    if (!successful) {\n      throw new Error(\"copy command was unsuccessful\");\n    }\n    success = true;\n  } catch (err) {\n    debug && console.error(\"unable to copy using execCommand: \", err);\n    debug && console.warn(\"trying IE specific stuff\");\n    try {\n      window.clipboardData.setData(options.format || \"text\", text);\n      success = true;\n    } catch (err) {\n      debug && console.error(\"unable to copy using clipboardData: \", err);\n      debug && console.error(\"falling back to prompt\");\n      message = format(\"message\" in options ? options.message : defaultMessage);\n      window.prompt(message, text);\n    }\n  } finally {\n    if (selection) {\n      if (typeof selection.removeRange == \"function\") {\n        selection.removeRange(range);\n      } else {\n        selection.removeAllRanges();\n      }\n    }\n\n    if (mark) {\n      document.body.removeChild(mark);\n    }\n    reselectPrevious();\n  }\n\n  return success;\n}\n\nmodule.exports = copy;\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"image\":\"image---TmTHU\",\"instructionContainer\":\"instructionContainer---2DWSS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loader\":\"loader---1sWj7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"warningPill\":\"warningPill---1VKs-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"settingsCog\":\"settingsCog---1w3A3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"Blob\":\"Blob---1SFNV\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SlackChannels\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slackChannels\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"slackConnectionId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":95}};\n    doc.loc.source = {\"body\":\"query SlackChannels($id: ID!) {\\n  slackChannels(slackConnectionId: $id) {\\n    id\\n    name\\n  }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"SlackChannels\"] = oneQuery(doc, \"SlackChannels\");\n        \n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"SlackConnections\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slackConnections\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"teamName\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":72}};\n    doc.loc.source = {\"body\":\"query SlackConnections {\\n  slackConnections {\\n    id\\n    teamName\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"SlackConnections\"] = oneQuery(doc, \"SlackConnections\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"input\":\"input---rkol7\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"breadcrumbNav\":\"breadcrumbNav---32LR-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"breadcrumbLink\":\"breadcrumbLink---1Ike9\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"disabled\":\"disabled---3WBAB\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"search\":\"search---hoClF\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"header---eWucp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"subheader\":\"subheader---2OtMh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"widgetImporting\":\"widgetImporting---1Qs0F\"};","(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.bugsnag__react = f()}})(function(){var define,module,exports;\nvar _$src_1 = {};\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n_$src_1 = {\n  name: 'react',\n  init: function (client, React) {\n    if (React === void 0) {\n      React = window.React;\n    }\n\n    if (!React) throw new Error('cannot find React');\n\n    var ErrorBoundary =\n    /*#__PURE__*/\n    function (_React$Component) {\n      _inheritsLoose(ErrorBoundary, _React$Component);\n\n      function ErrorBoundary(props) {\n        var _this;\n\n        _this = _React$Component.call(this, props) || this;\n        _this.state = {\n          error: null,\n          info: null\n        };\n        return _this;\n      }\n\n      var _proto = ErrorBoundary.prototype;\n\n      _proto.componentDidCatch = function componentDidCatch(error, info) {\n        var beforeSend = this.props.beforeSend;\n        var BugsnagReport = client.BugsnagReport;\n        var handledState = {\n          severity: 'error',\n          unhandled: true,\n          severityReason: {\n            type: 'unhandledException'\n          }\n        };\n        var report = new BugsnagReport(error.name, error.message, BugsnagReport.getStacktrace(error), handledState, error);\n        if (info && info.componentStack) info.componentStack = formatComponentStack(info.componentStack);\n        report.updateMetaData('react', info);\n        client.notify(report, {\n          beforeSend: beforeSend\n        });\n        this.setState({\n          error: error,\n          info: info\n        });\n      };\n\n      _proto.render = function render() {\n        var error = this.state.error;\n\n        if (error) {\n          var FallbackComponent = this.props.FallbackComponent;\n          if (FallbackComponent) return React.createElement(FallbackComponent, this.state);\n          return null;\n        }\n\n        return this.props.children;\n      };\n\n      return ErrorBoundary;\n    }(React.Component);\n\n    return ErrorBoundary;\n  }\n};\n\nvar formatComponentStack = function (str) {\n  var lines = str.split(/\\s*\\n\\s*/g);\n  var ret = '';\n\n  for (var line = 0, len = lines.length; line < len; line++) {\n    if (lines[line].length) ret += \"\" + (ret.length ? '\\n' : '') + lines[line];\n  }\n\n  return ret;\n};\n\n_$src_1.formatComponentStack = formatComponentStack;\n_$src_1['default'] = _$src_1;\n\nreturn _$src_1;\n\n});\n//# sourceMappingURL=bugsnag-react.js.map\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---MU7ih\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"container---1qoGS\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"link\":\"link---2qqeN\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"label\":\"label---158jN\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"image\":\"image---48X8B\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"loopsExplanation\":\"loopsExplanation---2eAJI\",\"buttonIconProvider\":\"buttonIconProvider---1Qcd_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"list\":\"list---3_SAO\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"offlineBanner\":\"offlineBanner---3dzt3\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spinnerWrapper\":\"spinnerWrapper---26rqz\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"isPreview\":\"isPreview---3VvhJ\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"instrumentError\":\"instrumentError---27Gad\"};","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"ImportsQuery\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"imports\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"ImportFragment\"},\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":98}};\n    doc.loc.source = {\"body\":\"#import './import-fragment.graphql'\\n\\nquery ImportsQuery {\\n  imports {\\n    ...ImportFragment\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  doc.definitions = doc.definitions.concat(unique(require('./import-fragment.graphql').definitions));\n\n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"ImportsQuery\"] = oneQuery(doc, \"ImportsQuery\");\n        \n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"AcknowledgeImport\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"acknowledgeImport\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"success\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"error\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":98}};\n    doc.loc.source = {\"body\":\"mutation AcknowledgeImport($id: ID!) {\\n  acknowledgeImport(id: $id) {\\n    success\\n    error\\n  }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n    // Collect any fragment/type references from a node, adding them to the refs Set\n    function collectFragmentReferences(node, refs) {\n      if (node.kind === \"FragmentSpread\") {\n        refs.add(node.name.value);\n      } else if (node.kind === \"VariableDefinition\") {\n        var type = node.type;\n        if (type.kind === \"NamedType\") {\n          refs.add(type.name.value);\n        }\n      }\n\n      if (node.selectionSet) {\n        node.selectionSet.selections.forEach(function(selection) {\n          collectFragmentReferences(selection, refs);\n        });\n      }\n\n      if (node.variableDefinitions) {\n        node.variableDefinitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n\n      if (node.definitions) {\n        node.definitions.forEach(function(def) {\n          collectFragmentReferences(def, refs);\n        });\n      }\n    }\n\n    var definitionRefs = {};\n    (function extractReferences() {\n      doc.definitions.forEach(function(def) {\n        if (def.name) {\n          var refs = new Set();\n          collectFragmentReferences(def, refs);\n          definitionRefs[def.name.value] = refs;\n        }\n      });\n    })();\n\n    function findOperation(doc, name) {\n      for (var i = 0; i < doc.definitions.length; i++) {\n        var element = doc.definitions[i];\n        if (element.name && element.name.value == name) {\n          return element;\n        }\n      }\n    }\n\n    function oneQuery(doc, operationName) {\n      // Copy the DocumentNode, but clear out the definitions\n      var newDoc = {\n        kind: doc.kind,\n        definitions: [findOperation(doc, operationName)]\n      };\n      if (doc.hasOwnProperty(\"loc\")) {\n        newDoc.loc = doc.loc;\n      }\n\n      // Now, for the operation we're running, find any fragments referenced by\n      // it or the fragments it references\n      var opRefs = definitionRefs[operationName] || new Set();\n      var allRefs = new Set();\n      var newRefs = new Set();\n\n      // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n      opRefs.forEach(function(refName) {\n        newRefs.add(refName);\n      });\n\n      while (newRefs.size > 0) {\n        var prevRefs = newRefs;\n        newRefs = new Set();\n\n        prevRefs.forEach(function(refName) {\n          if (!allRefs.has(refName)) {\n            allRefs.add(refName);\n            var childRefs = definitionRefs[refName] || new Set();\n            childRefs.forEach(function(childRef) {\n              newRefs.add(childRef);\n            });\n          }\n        });\n      }\n\n      allRefs.forEach(function(refName) {\n        var op = findOperation(doc, refName);\n        if (op) {\n          newDoc.definitions.push(op);\n        }\n      });\n\n      return newDoc;\n    }\n\n    module.exports = doc;\n    \n        module.exports[\"AcknowledgeImport\"] = oneQuery(doc, \"AcknowledgeImport\");\n        \n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"customizePanel\":\"customizePanel---3zLIj\"};","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { isUndefined, some } from 'lodash';\n\nimport style from './mobile-widget-styles.scss';\n\nconst MAX_ROWS_SMALL_HEIGHT = 3;\n\nconst smallHeightRowWidget = (type, data) => {\n  if (!data) {\n    return false;\n  }\n  let rowCount = 0;\n  switch (type) {\n    case 'table':\n      rowCount = data.data.length;\n      const hasHeader = some(data.columns, column => !!column.heading);\n      if (hasHeader) {\n        rowCount += 1;\n      }\n      break;\n    case 'bar':\n      if (!data.x_axis.labels) {\n        return false;\n      }\n      rowCount = data.x_axis.labels.length;\n      break;\n    default:\n      rowCount = data.items.length;\n      break;\n  }\n\n  return !rowCount || rowCount <= MAX_ROWS_SMALL_HEIGHT;\n};\n\nconst smallWidthNumberWidget = data => {\n  if (!data) {\n    return true;\n  }\n\n  if (\n    data.label &&\n    !isUndefined(data.comparison) &&\n    data.comparison.type !== 'goal'\n  ) {\n    return false;\n  }\n\n  return true;\n};\n\nclass MobileWidget extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      smallHeight: this.useSmallHeight(props),\n    };\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (nextProps.widgetData !== this.props.widgetData) {\n      this.setState({\n        smallHeight: this.useSmallHeight(nextProps),\n      });\n    }\n  }\n\n  getWidgetType(props) {\n    const {\n      widget: { visualisation, config },\n    } = props || this.props;\n    const { type: widgetType } = visualisation;\n    const { template: { type: visualisationType } = {} } = config;\n\n    return widgetType === 'polymorphic' ? visualisationType : widgetType;\n  }\n\n  render() {\n    const { children } = this.props;\n\n    const type = this.getWidgetType();\n    const smallWidth = this.useSmallWidth(type);\n    const largeHeight = type === 'feed';\n\n    const classes = classNames(style.wrapper, {\n      [style.smallWidth]: smallWidth,\n      [style.smallHeight]: this.state.smallHeight,\n      [style.largeHeight]: largeHeight,\n    });\n\n    return (\n      <div className={classes} ref={e => (this.el = e)}>\n        {children}\n      </div>\n    );\n  }\n\n  useSmallWidth(widgetType) {\n    switch (widgetType) {\n      case 'number':\n        return smallWidthNumberWidget(this.props.widgetData.data);\n      case 'geckometer':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  useSmallHeight(props) {\n    const widgetType = this.getWidgetType(props || this.props);\n    const {\n      widget: {\n        visualisation: { type },\n      },\n      widgetData,\n    } = props || this.props;\n    const isPolymorphic = type === 'polymorphic';\n    const hasError = !isUndefined(widgetData.error);\n    if (hasError) {\n      return true;\n    }\n\n    switch (widgetType) {\n      case 'text':\n        // Before adding truncation to text widgets, we made all\n        // polymorphic widgets default height (no matter the actual\n        // height of their text). We have to keep this rule now or\n        // we risk \"breaking\" widgets for customers that could see\n        // all the text on the default height.\n        return !isPolymorphic;\n      case 'number':\n        return true;\n      case 'table':\n      case 'bar':\n      case 'leaderboard':\n        return smallHeightRowWidget(widgetType, widgetData.data);\n      default:\n        return false;\n    }\n  }\n}\n\nMobileWidget.defaultProps = {\n  widgetData: {},\n};\n\nMobileWidget.propTypes = {\n  widget: PropTypes.object.isRequired,\n  children: PropTypes.node,\n  widgetData: PropTypes.object,\n};\n\nexport default MobileWidget;\n","import MobileWidget from './mobile-widget-connector';\n\nexport default MobileWidget;\n","import { connect } from 'react-redux';\nimport MobileWidget from './mobile-widget-component';\n\nconst mapStateToProps = (state, ownProps) => {\n  const { widgetData = {} } = state;\n  const { widget: { widgetKey } = {} } = ownProps;\n\n  return {\n    widgetData: widgetData[widgetKey],\n  };\n};\n\nconst MobileWidgetConnector = connect(mapStateToProps, undefined)(MobileWidget);\n\nexport default MobileWidgetConnector;\n","import React from 'react';\nimport { FormattedHTMLMessage } from '../../lib/i18n';\n\nimport style from './mobile-layout-style.scss';\n\nconst EmptyDashboard = () => {\n  return (\n    <div className={style.emptyDashboard}>\n      <div className={style.emptyContent}>\n        <svg width=\"110\" height=\"111\" viewBox=\"0 0 110 111\">\n          <g fill=\"none\" fillRule=\"evenodd\" transform=\"translate(0 2)\">\n            <rect\n              width=\"91.607\"\n              height=\"90.833\"\n              y=\"18.167\"\n              fill=\"#3E4553\"\n              fillRule=\"nonzero\"\n              opacity=\".3\"\n              rx=\"6.48\"\n            />\n            <path fill=\"#4F5765\" d=\"M13.741 2.98h91.607v89.414H13.741z\" />\n            <rect\n              width=\"96.188\"\n              height=\"93.885\"\n              x=\"11.451\"\n              y=\".745\"\n              stroke=\"#3E4553\"\n              strokeWidth=\"4.32\"\n              rx=\"3.456\"\n            />\n            <path\n              fill=\"#FFF\"\n              fillRule=\"nonzero\"\n              d=\"M18.321 37.83l17.104-23.233h4.419v22.926h4.939l-.624 3.633h-4.315v8.802h-4.367v-8.802H18.321V37.83zm17.156-.307v-17.04l-12.425 17.04h12.425zm13.79 8.75a322.932 322.932 0 0 1 4.264-3.684 428.81 428.81 0 0 0 4.627-3.991 131.159 131.159 0 0 0 4.366-3.915c1.248-1.177 2.288-2.311 3.12-3.403.831-1.092 1.455-2.2 1.871-3.326.416-1.126.624-2.337.624-3.634 0-2.149-.59-3.795-1.768-4.938-1.178-1.143-2.824-1.714-4.938-1.714-1.283 0-2.374.136-3.275.41-.902.272-1.664.673-2.288 1.202a6.264 6.264 0 0 0-1.533 1.97c-.4.785-.754 1.706-1.066 2.763l-4.315-.665a19.306 19.306 0 0 1 1.3-3.582 10.242 10.242 0 0 1 2.287-3.096c.97-.904 2.183-1.638 3.639-2.2 1.456-.564 3.24-.845 5.355-.845 1.837 0 3.465.256 4.886.768 1.421.511 2.608 1.22 3.562 2.123a9.011 9.011 0 0 1 2.183 3.25c.503 1.262.754 2.66.754 4.196 0 1.535-.217 2.968-.65 4.299-.433 1.33-1.1 2.644-2.002 3.94-.9 1.296-2.044 2.627-3.43 3.992-1.387 1.364-3.033 2.848-4.94 4.452a267.53 267.53 0 0 1-3.093 2.584c-1.057.87-2.088 1.748-3.093 2.635h17.572l-.676 4.094H49.268v-3.684z\"\n            />\n            <path\n              stroke=\"#41B6F9\"\n              strokeWidth=\"6.48\"\n              d=\"M22.902 86.292l17.282-16.968h36.962l19.041-19.366\"\n            />\n          </g>\n        </svg>\n        <FormattedHTMLMessage id=\"mobile.emptyDashboard\" />\n      </div>\n    </div>\n  );\n};\n\nexport default EmptyDashboard;\n","import React from 'react';\nimport { FormattedHTMLMessage } from '../../lib/i18n';\n\nimport style from './mobile-layout-style.scss';\n\nconst OfflineDashboard = () => {\n  return (\n    <div className={style.emptyDashboard}>\n      <div className={style.emptyContent}>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"152\"\n          height=\"107\"\n          viewBox=\"0 0 152 107\"\n        >\n          <g fill=\"none\" fillRule=\"evenodd\" opacity=\".3\">\n            <path\n              fill=\"#3E4552\"\n              d=\"M58.437 12.938c-5.013 0-9.632 1.217-13.857 3.652s-7.555 5.765-9.99 9.99c-2.435 4.225-3.653 8.845-3.653 13.858v.214c-5.872.86-10.778 3.545-14.716 8.057-3.94 4.512-5.909 9.775-5.909 15.791 0 4.297 1.075 8.307 3.223 12.031 2.149 3.724 5.085 6.66 8.809 8.809 3.724 2.148 7.734 3.223 12.03 3.223h72.188c5.73 0 10.6-2.006 14.61-6.016s6.015-8.88 6.015-14.61c0-5.729-2.005-10.598-6.015-14.609-4.01-4.01-8.88-6.015-14.61-6.015h-1.933c1.289-2.149 1.933-4.44 1.933-6.875 0-3.868-1.325-7.126-3.974-9.776-2.65-2.65-5.909-3.974-9.776-3.974-3.437 0-6.445 1.074-9.023 3.222-2.005-5.013-5.3-9.095-9.883-12.246-4.583-3.15-9.74-4.726-15.469-4.726zm0-10.313c5.873 0 11.387 1.29 16.543 3.867 5.157 2.579 9.525 6.016 13.106 10.313a26.372 26.372 0 0 1 4.726-.43c6.302 0 11.78 2.149 16.436 6.445 4.655 4.297 7.197 9.597 7.627 15.899 6.159 2.148 11.136 5.908 14.931 11.28 3.796 5.37 5.694 11.35 5.694 17.939 0 5.585-1.397 10.742-4.19 15.468-2.793 4.727-6.552 8.487-11.279 11.28-4.727 2.793-9.883 4.189-15.469 4.189H34.375c-6.159 0-11.888-1.54-17.188-4.62C11.888 91.177 7.7 86.988 4.62 81.689 1.54 76.388 0 70.658 0 64.5c0-7.018 1.97-13.428 5.908-19.228 3.939-5.801 9.131-9.99 15.576-12.569 1.72-8.737 6.052-15.934 12.998-21.591 6.947-5.658 14.932-8.487 23.955-8.487z\"\n            />\n            <path\n              stroke=\"#3E4552\"\n              strokeWidth=\"10\"\n              d=\"M10 12l130 90M10 12l130 90\"\n            />\n            <path\n              stroke=\"#F0F2F3\"\n              strokeLinecap=\"square\"\n              strokeWidth=\"10\"\n              d=\"M15 7l130 90\"\n            />\n          </g>\n        </svg>\n        <FormattedHTMLMessage id=\"mobile.offlineDashboard\" />\n      </div>\n    </div>\n  );\n};\n\nexport default OfflineDashboard;\n","import React from 'react';\nimport FormattedMessage, { formatMessage } from '../../lib/i18n';\nimport Button from '@UI/button';\nimport { getWindow } from '../../lib/global';\n\nimport style from './mobile-layout-style.scss';\n\nconst ReconnectDashboard = () => {\n  return (\n    <div className={style.emptyDashboard}>\n      <div className={`${style.emptyContent}`}>\n        <svg width=\"100\" height=\"97\" viewBox=\"0 0 100 97\">\n          <g fill=\"none\" fillRule=\"evenodd\">\n            <path fill=\"#F0F2F3\" d=\"M-138-154h375v671h-375z\" />\n            <path\n              fill=\"#BABDC2\"\n              d=\"M97.656 0a2.26 2.26 0 0 1 1.66.684 2.26 2.26 0 0 1 .684 1.66v37.5a2.26 2.26 0 0 1-.684 1.66 2.26 2.26 0 0 1-1.66.683h-37.5a2.26 2.26 0 0 1-1.66-.683 2.26 2.26 0 0 1-.684-1.66v-5.47c0-.65.228-1.204.684-1.66a2.26 2.26 0 0 1 1.66-.683l24.805.586c-3.125-6.77-7.813-12.207-14.063-16.308-6.25-4.102-13.216-6.153-20.898-6.153-5.99 0-11.621 1.302-16.895 3.906-5.273 2.605-9.7 6.218-13.28 10.84-3.582 4.623-6.023 9.733-7.325 15.332 0 .651-.228 1.14-.684 1.465a2.473 2.473 0 0 1-1.464.488H4.687c-.78 0-1.4-.293-1.855-.879-.456-.585-.618-1.204-.488-1.855 1.432-7.422 4.427-14.128 8.984-20.117 4.557-5.99 10.189-10.71 16.895-14.16C34.928 1.726 42.187 0 50 0c8.333 0 16.048 1.953 23.144 5.86 7.097 3.906 12.858 9.179 17.285 15.82l-.585-19.336c0-.651.227-1.205.683-1.66A2.26 2.26 0 0 1 92.187 0h5.469zm-2.344 54.687c.782 0 1.4.293 1.856.88.455.585.618 1.204.488 1.855-1.432 7.422-4.427 14.127-8.984 20.117-4.558 5.99-10.19 10.71-16.895 14.16-6.706 3.45-13.965 5.176-21.777 5.176-8.333 0-16.048-1.953-23.145-5.86-7.096-3.906-12.858-9.18-17.285-15.82l.586 19.336a2.26 2.26 0 0 1-.683 1.66 2.26 2.26 0 0 1-1.66.684h-5.47a2.26 2.26 0 0 1-1.66-.684A2.26 2.26 0 0 1 0 94.531v-37.5c0-.65.228-1.204.684-1.66a2.26 2.26 0 0 1 1.66-.684h37.5a2.26 2.26 0 0 1 1.66.684 2.26 2.26 0 0 1 .683 1.66V62.5a2.26 2.26 0 0 1-.683 1.66 2.26 2.26 0 0 1-1.66.684l-24.805-.586c3.125 6.77 7.813 12.207 14.062 16.308C35.351 84.668 42.318 86.72 50 86.72c5.99 0 11.62-1.303 16.894-3.907 5.274-2.604 9.7-6.217 13.282-10.84 3.58-4.622 6.022-9.733 7.324-15.332 0-.65.228-1.139.683-1.464a2.473 2.473 0 0 1 1.465-.489h5.664z\"\n            />\n          </g>\n        </svg>\n        <FormattedMessage id=\"mobile.reconnectDashboard\" />\n        <div className={style.reconnectButton}>\n          <Button\n            size={Button.SIZES.LARGE}\n            onClick={() => {\n              getWindow().location.reload();\n            }}\n          >\n            {formatMessage('mobile.reconnectButton')}\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default ReconnectDashboard;\n","import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { isUndefined, noop } from 'lodash';\nimport MobileWidget from '../../widget/mobile-widget';\nimport VisualisedWidget from '../../widget/visualised-widget-connector';\nimport OfflineBanner from '../../components/offline-banner';\nimport EmptyDashboard from './empty-dashboard-component';\nimport OfflineDashboard from './offline-dashboard-component';\nimport ReconnectDashboard from './reconnect-dashboard-component';\nimport FormattedMessage from '../../lib/i18n';\nimport { track } from '../../lib/tracker';\nimport { globalClearTimeout } from '../../lib/global';\n\nimport style from './mobile-layout-style.scss';\n\nclass MobileLayout extends PureComponent {\n  constructor() {\n    super();\n\n    this.state = {\n      returnedOnline: false,\n    };\n  }\n\n  componentDidMount() {\n    window.addEventListener('appinstalled', this.props.onAppInstalled);\n\n    this.props.onSetIsMobile(true);\n\n    this.trackResponsiveSession(this.props.orgId);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (this.props.isOffline && !nextProps.isOffline) {\n      this.setState({ returnedOnline: true });\n    }\n\n    if (nextProps.orgId !== this.props.orgId) {\n      this.trackResponsiveSession(nextProps.orgId);\n    }\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('appinstalled', this.props.onAppInstalled);\n\n    this.props.onSetIsMobile(false);\n    globalClearTimeout(this.timeout);\n    this.timeout = null;\n  }\n\n  renderContent() {\n    const { widgets, areWidgetsLoaded, isOffline } = this.props;\n    const { returnedOnline } = this.state;\n\n    if (!widgets.length) {\n      if (isOffline) {\n        return <OfflineDashboard />;\n      }\n\n      if (returnedOnline) {\n        return <ReconnectDashboard />;\n      }\n\n      if (areWidgetsLoaded) {\n        return <EmptyDashboard />;\n      }\n    }\n\n    return widgets.map(widget => {\n      const { widgetKey, visualisation, config } = widget;\n      if (!widgetKey) return null;\n      return (\n        <MobileWidget key={widgetKey} widget={widget}>\n          <VisualisedWidget\n            widgetKey={widgetKey}\n            visualisation={visualisation}\n            configuration={config || {}}\n            canEdit={false}\n            isPublic={false}\n            isMobile\n          />\n        </MobileWidget>\n      );\n    });\n  }\n\n  render() {\n    const {\n      title,\n      onOpenMenu,\n      isOffline,\n      isSharing,\n      areWidgetsLoaded,\n      onSwitchToDesktopView,\n    } = this.props;\n    const contentClasses = classNames(style.content, {\n      [style.isOffline]: isOffline,\n    });\n\n    return (\n      <div className={style.layout}>\n        <svg width=\"0\" height=\"0\">\n          <defs>\n            <clipPath id=\"footerCurve\" clipPathUnits=\"objectBoundingBox\">\n              <path d=\"M0 0 L0 1 L1 1 L1 0 C0.75 0.5, 0.25 0.5, 0 0 Z\" />\n            </clipPath>\n          </defs>\n        </svg>\n\n        {isOffline && <OfflineBanner bannerClass={style.offlineBanner} />}\n        <div className={style.contentWrapper}>\n          <div className={contentClasses}>{this.renderContent()}</div>\n          <br />\n          {areWidgetsLoaded && (\n            <div className={style.switchToDesktop}>\n              <button\n                className={style.switchToDesktopButton}\n                onClick={onSwitchToDesktopView}\n              >\n                <FormattedMessage id=\"mobile.switchToDesktopView\" />\n              </button>\n            </div>\n          )}\n          <br />\n        </div>\n\n        <div className={style.footerWrapper}>\n          <footer className={style.footer}>\n            <div className={style.footerInner}>\n              <span className={style.dashboardTitle}>{title}</span>\n              {!isSharing && (\n                <button\n                  type=\"button\"\n                  className={`${style.menu} fa fa-bars`}\n                  onClick={onOpenMenu}\n                />\n              )}\n            </div>\n          </footer>\n        </div>\n      </div>\n    );\n  }\n\n  trackResponsiveSession(orgId) {\n    if (!isUndefined(orgId)) {\n      // We need to wait until the orgId has been set\n      // and tracker has been initialised in gecko-js\n      this.timer = setTimeout(() => {\n        track('Responsive view session');\n      }, 100);\n    }\n  }\n}\n\nMobileLayout.defaultProps = {\n  onAppInstalled: noop,\n  onOpenMenu: noop,\n  onSetIsMobile: noop,\n  onSwitchToDesktopView: noop,\n};\n\nMobileLayout.propTypes = {\n  areWidgetsLoaded: PropTypes.bool,\n  isOffline: PropTypes.bool,\n  isSharing: PropTypes.bool,\n  orgId: PropTypes.number,\n  title: PropTypes.string,\n  widgets: PropTypes.array,\n  onAppInstalled: PropTypes.func,\n  onOpenMenu: PropTypes.func,\n  onSetIsMobile: PropTypes.func,\n  onSwitchToDesktopView: PropTypes.func,\n};\n\nexport default MobileLayout;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { values, omit } from 'lodash';\nimport MobileLayout from './mobile-layout-component';\nimport OfflineDetector from '../../hoc/offline-detector';\nimport { OFF_CANVAS_WIDGET_LOCATION } from '../../widget/constants/widget-location-constants';\nimport * as dashboardActions from '../actions/dashboard-actions';\nimport { router } from '../../router';\nimport { track } from '../../lib/tracker';\nimport { switchToDesktopView } from '../../lib/mobile';\n\nconst sortByPosition = (widgetA, widgetB) => {\n  const { layout: a = {} } = widgetA;\n  const { layout: b = {} } = widgetB;\n\n  // Widgets are ordered by their top/left coordinates\n  // on the desktop layout, and the top takes precedence.\n  if (a.top === b.top) {\n    return a.left - b.left;\n  }\n  return a.top - b.top;\n};\n\nconst WrappedLayout = props => (\n  <OfflineDetector\n    render={isOffline => <MobileLayout isOffline={isOffline} {...props} />}\n  />\n);\n\nconst mapStateToProps = state => {\n  const {\n    dashboard: { dashboard = {}, areWidgetsLoaded },\n    user: { user: { organization_id: orgId } = {} },\n    widgets,\n  } = state;\n  const { id: legacyDashboardId } = dashboard;\n\n  const onCanvasWidgets = values(widgets)\n    .filter(widget => widget.location !== OFF_CANVAS_WIDGET_LOCATION)\n    .sort(sortByPosition);\n\n  return {\n    title: dashboard.title,\n    widgets: onCanvasWidgets,\n    areWidgetsLoaded,\n    orgId,\n    legacyDashboardId,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onSetIsMobile: isMobile => dispatch(dashboardActions.setIsMobile(isMobile)),\n    createOnOpenMenuHandler: legacyDashboardId => () => {\n      router.navigate(`/dashboards/${legacyDashboardId}/mobile-menu`);\n    },\n    onSwitchToDesktopView: () => {\n      track('Switched to desktop view');\n      switchToDesktopView();\n    },\n    onAppInstalled: () => {\n      track('PWA installed');\n    },\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { legacyDashboardId } = stateProps;\n  const { createOnOpenMenuHandler } = dispatchProps;\n\n  return {\n    ...ownProps,\n    ...omit(stateProps, ['dashboardId']),\n    ...omit(dispatchProps, ['createOnOpenMenuHandler']),\n    onOpenMenu: createOnOpenMenuHandler(legacyDashboardId),\n  };\n};\n\nconst MobileLayoutConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(WrappedLayout);\n\nexport default MobileLayoutConnector;\n","import MobileLayout from './mobile-layout-connector';\n\nexport default MobileLayout;\n","\n    var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"ImportFragment\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Import\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"serviceAccountId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"integration\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"slug\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"status\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"__typename\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ImportStatusFailed\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"error\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"remainingRetries\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ImportStatusPending\"}},\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"progress\"},\"arguments\":[],\"directives\":[]}]}}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"},\"arguments\":[],\"directives\":[]}]}}],\"loc\":{\"start\":0,\"end\":263}};\n    doc.loc.source = {\"body\":\"fragment ImportFragment on Import {\\n  id\\n  serviceAccountId\\n  integration {\\n    slug\\n    name\\n  }\\n  status {\\n    __typename\\n    ...on ImportStatusFailed {\\n      error\\n      remainingRetries\\n    }\\n    ...on ImportStatusPending {\\n      progress\\n    }\\n  }\\n  type\\n}\\n\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n  \n\n    var names = {};\n    function unique(defs) {\n      return defs.filter(\n        function(def) {\n          if (def.kind !== 'FragmentDefinition') return true;\n          var name = def.name.value\n          if (names[name]) {\n            return false;\n          } else {\n            names[name] = true;\n            return true;\n          }\n        }\n      )\n    }\n  \n\n      module.exports = doc;\n    \n","\nmodule.exports = function () {\n  var selection = document.getSelection();\n  if (!selection.rangeCount) {\n    return function () {};\n  }\n  var active = document.activeElement;\n\n  var ranges = [];\n  for (var i = 0; i < selection.rangeCount; i++) {\n    ranges.push(selection.getRangeAt(i));\n  }\n\n  switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML\n    case 'INPUT':\n    case 'TEXTAREA':\n      active.blur();\n      break;\n\n    default:\n      active = null;\n      break;\n  }\n\n  selection.removeAllRanges();\n  return function () {\n    selection.type === 'Caret' &&\n    selection.removeAllRanges();\n\n    if (!selection.rangeCount) {\n      ranges.forEach(function(range) {\n        selection.addRange(range);\n      });\n    }\n\n    active &&\n    active.focus();\n  };\n};\n","IntlPolyfill.__addLocaleData({locale:\"en\",date:{ca:[\"gregory\",\"buddhist\",\"chinese\",\"coptic\",\"dangi\",\"ethioaa\",\"ethiopic\",\"generic\",\"hebrew\",\"indian\",\"islamic\",\"islamicc\",\"japanese\",\"persian\",\"roc\"],hourNo0:true,hour12:true,formats:{short:\"{1}, {0}\",medium:\"{1}, {0}\",full:\"{1} 'at' {0}\",long:\"{1} 'at' {0}\",availableFormats:{\"d\":\"d\",\"E\":\"ccc\",Ed:\"d E\",Ehm:\"E h:mm a\",EHm:\"E HH:mm\",Ehms:\"E h:mm:ss a\",EHms:\"E HH:mm:ss\",Gy:\"y G\",GyMMM:\"MMM y G\",GyMMMd:\"MMM d, y G\",GyMMMEd:\"E, MMM d, y G\",\"h\":\"h a\",\"H\":\"HH\",hm:\"h:mm a\",Hm:\"HH:mm\",hms:\"h:mm:ss a\",Hms:\"HH:mm:ss\",hmsv:\"h:mm:ss a v\",Hmsv:\"HH:mm:ss v\",hmv:\"h:mm a v\",Hmv:\"HH:mm v\",\"M\":\"L\",Md:\"M/d\",MEd:\"E, M/d\",MMM:\"LLL\",MMMd:\"MMM d\",MMMEd:\"E, MMM d\",MMMMd:\"MMMM d\",ms:\"mm:ss\",\"y\":\"y\",yM:\"M/y\",yMd:\"M/d/y\",yMEd:\"E, M/d/y\",yMMM:\"MMM y\",yMMMd:\"MMM d, y\",yMMMEd:\"E, MMM d, y\",yMMMM:\"MMMM y\",yQQQ:\"QQQ y\",yQQQQ:\"QQQQ y\"},dateFormats:{yMMMMEEEEd:\"EEEE, MMMM d, y\",yMMMMd:\"MMMM d, y\",yMMMd:\"MMM d, y\",yMd:\"M/d/yy\"},timeFormats:{hmmsszzzz:\"h:mm:ss a zzzz\",hmsz:\"h:mm:ss a z\",hms:\"h:mm:ss a\",hm:\"h:mm a\"}},calendars:{buddhist:{months:{narrow:[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],short:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],long:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"BE\"],short:[\"BE\"],long:[\"BE\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},chinese:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Mo1\",\"Mo2\",\"Mo3\",\"Mo4\",\"Mo5\",\"Mo6\",\"Mo7\",\"Mo8\",\"Mo9\",\"Mo10\",\"Mo11\",\"Mo12\"],long:[\"Month1\",\"Month2\",\"Month3\",\"Month4\",\"Month5\",\"Month6\",\"Month7\",\"Month8\",\"Month9\",\"Month10\",\"Month11\",\"Month12\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},coptic:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\"],short:[\"Tout\",\"Baba\",\"Hator\",\"Kiahk\",\"Toba\",\"Amshir\",\"Baramhat\",\"Baramouda\",\"Bashans\",\"Paona\",\"Epep\",\"Mesra\",\"Nasie\"],long:[\"Tout\",\"Baba\",\"Hator\",\"Kiahk\",\"Toba\",\"Amshir\",\"Baramhat\",\"Baramouda\",\"Bashans\",\"Paona\",\"Epep\",\"Mesra\",\"Nasie\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"ERA0\",\"ERA1\"],short:[\"ERA0\",\"ERA1\"],long:[\"ERA0\",\"ERA1\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},dangi:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Mo1\",\"Mo2\",\"Mo3\",\"Mo4\",\"Mo5\",\"Mo6\",\"Mo7\",\"Mo8\",\"Mo9\",\"Mo10\",\"Mo11\",\"Mo12\"],long:[\"Month1\",\"Month2\",\"Month3\",\"Month4\",\"Month5\",\"Month6\",\"Month7\",\"Month8\",\"Month9\",\"Month10\",\"Month11\",\"Month12\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},ethiopic:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\"],short:[\"Meskerem\",\"Tekemt\",\"Hedar\",\"Tahsas\",\"Ter\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehasse\",\"Pagumen\"],long:[\"Meskerem\",\"Tekemt\",\"Hedar\",\"Tahsas\",\"Ter\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehasse\",\"Pagumen\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"ERA0\",\"ERA1\"],short:[\"ERA0\",\"ERA1\"],long:[\"ERA0\",\"ERA1\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},ethioaa:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\"],short:[\"Meskerem\",\"Tekemt\",\"Hedar\",\"Tahsas\",\"Ter\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehasse\",\"Pagumen\"],long:[\"Meskerem\",\"Tekemt\",\"Hedar\",\"Tahsas\",\"Ter\",\"Yekatit\",\"Megabit\",\"Miazia\",\"Genbot\",\"Sene\",\"Hamle\",\"Nehasse\",\"Pagumen\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"ERA0\"],short:[\"ERA0\"],long:[\"ERA0\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},generic:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"M01\",\"M02\",\"M03\",\"M04\",\"M05\",\"M06\",\"M07\",\"M08\",\"M09\",\"M10\",\"M11\",\"M12\"],long:[\"M01\",\"M02\",\"M03\",\"M04\",\"M05\",\"M06\",\"M07\",\"M08\",\"M09\",\"M10\",\"M11\",\"M12\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"ERA0\",\"ERA1\"],short:[\"ERA0\",\"ERA1\"],long:[\"ERA0\",\"ERA1\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},gregory:{months:{narrow:[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],short:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],long:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"B\",\"A\",\"BCE\",\"CE\"],short:[\"BC\",\"AD\",\"BCE\",\"CE\"],long:[\"Before Christ\",\"Anno Domini\",\"Before Common Era\",\"Common Era\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},hebrew:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\",\"13\",\"7\"],short:[\"Tishri\",\"Heshvan\",\"Kislev\",\"Tevet\",\"Shevat\",\"Adar I\",\"Adar\",\"Nisan\",\"Iyar\",\"Sivan\",\"Tamuz\",\"Av\",\"Elul\",\"Adar II\"],long:[\"Tishri\",\"Heshvan\",\"Kislev\",\"Tevet\",\"Shevat\",\"Adar I\",\"Adar\",\"Nisan\",\"Iyar\",\"Sivan\",\"Tamuz\",\"Av\",\"Elul\",\"Adar II\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"AM\"],short:[\"AM\"],long:[\"AM\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},indian:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Chaitra\",\"Vaisakha\",\"Jyaistha\",\"Asadha\",\"Sravana\",\"Bhadra\",\"Asvina\",\"Kartika\",\"Agrahayana\",\"Pausa\",\"Magha\",\"Phalguna\"],long:[\"Chaitra\",\"Vaisakha\",\"Jyaistha\",\"Asadha\",\"Sravana\",\"Bhadra\",\"Asvina\",\"Kartika\",\"Agrahayana\",\"Pausa\",\"Magha\",\"Phalguna\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"Saka\"],short:[\"Saka\"],long:[\"Saka\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},islamic:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Muh.\",\"Saf.\",\"Rab. I\",\"Rab. II\",\"Jum. I\",\"Jum. II\",\"Raj.\",\"Sha.\",\"Ram.\",\"Shaw.\",\"Dhuʻl-Q.\",\"Dhuʻl-H.\"],long:[\"Muharram\",\"Safar\",\"Rabiʻ I\",\"Rabiʻ II\",\"Jumada I\",\"Jumada II\",\"Rajab\",\"Shaʻban\",\"Ramadan\",\"Shawwal\",\"Dhuʻl-Qiʻdah\",\"Dhuʻl-Hijjah\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"AH\"],short:[\"AH\"],long:[\"AH\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},islamicc:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Muh.\",\"Saf.\",\"Rab. I\",\"Rab. II\",\"Jum. I\",\"Jum. II\",\"Raj.\",\"Sha.\",\"Ram.\",\"Shaw.\",\"Dhuʻl-Q.\",\"Dhuʻl-H.\"],long:[\"Muharram\",\"Safar\",\"Rabiʻ I\",\"Rabiʻ II\",\"Jumada I\",\"Jumada II\",\"Rajab\",\"Shaʻban\",\"Ramadan\",\"Shawwal\",\"Dhuʻl-Qiʻdah\",\"Dhuʻl-Hijjah\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"AH\"],short:[\"AH\"],long:[\"AH\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},japanese:{months:{narrow:[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],short:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],long:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"Taika (645–650)\",\"Hakuchi (650–671)\",\"Hakuhō (672–686)\",\"Shuchō (686–701)\",\"Taihō (701–704)\",\"Keiun (704–708)\",\"Wadō (708–715)\",\"Reiki (715–717)\",\"Yōrō (717–724)\",\"Jinki (724–729)\",\"Tenpyō (729–749)\",\"Tenpyō-kampō (749-749)\",\"Tenpyō-shōhō (749-757)\",\"Tenpyō-hōji (757-765)\",\"Tenpyō-jingo (765-767)\",\"Jingo-keiun (767-770)\",\"Hōki (770–780)\",\"Ten-ō (781-782)\",\"Enryaku (782–806)\",\"Daidō (806–810)\",\"Kōnin (810–824)\",\"Tenchō (824–834)\",\"Jōwa (834–848)\",\"Kajō (848–851)\",\"Ninju (851–854)\",\"Saikō (854–857)\",\"Ten-an (857-859)\",\"Jōgan (859–877)\",\"Gangyō (877–885)\",\"Ninna (885–889)\",\"Kanpyō (889–898)\",\"Shōtai (898–901)\",\"Engi (901–923)\",\"Enchō (923–931)\",\"Jōhei (931–938)\",\"Tengyō (938–947)\",\"Tenryaku (947–957)\",\"Tentoku (957–961)\",\"Ōwa (961–964)\",\"Kōhō (964–968)\",\"Anna (968–970)\",\"Tenroku (970–973)\",\"Ten’en (973–976)\",\"Jōgen (976–978)\",\"Tengen (978–983)\",\"Eikan (983–985)\",\"Kanna (985–987)\",\"Eien (987–989)\",\"Eiso (989–990)\",\"Shōryaku (990–995)\",\"Chōtoku (995–999)\",\"Chōhō (999–1004)\",\"Kankō (1004–1012)\",\"Chōwa (1012–1017)\",\"Kannin (1017–1021)\",\"Jian (1021–1024)\",\"Manju (1024–1028)\",\"Chōgen (1028–1037)\",\"Chōryaku (1037–1040)\",\"Chōkyū (1040–1044)\",\"Kantoku (1044–1046)\",\"Eishō (1046–1053)\",\"Tengi (1053–1058)\",\"Kōhei (1058–1065)\",\"Jiryaku (1065–1069)\",\"Enkyū (1069–1074)\",\"Shōho (1074–1077)\",\"Shōryaku (1077–1081)\",\"Eihō (1081–1084)\",\"Ōtoku (1084–1087)\",\"Kanji (1087–1094)\",\"Kahō (1094–1096)\",\"Eichō (1096–1097)\",\"Jōtoku (1097–1099)\",\"Kōwa (1099–1104)\",\"Chōji (1104–1106)\",\"Kashō (1106–1108)\",\"Tennin (1108–1110)\",\"Ten-ei (1110-1113)\",\"Eikyū (1113–1118)\",\"Gen’ei (1118–1120)\",\"Hōan (1120–1124)\",\"Tenji (1124–1126)\",\"Daiji (1126–1131)\",\"Tenshō (1131–1132)\",\"Chōshō (1132–1135)\",\"Hōen (1135–1141)\",\"Eiji (1141–1142)\",\"Kōji (1142–1144)\",\"Ten’yō (1144–1145)\",\"Kyūan (1145–1151)\",\"Ninpei (1151–1154)\",\"Kyūju (1154–1156)\",\"Hōgen (1156–1159)\",\"Heiji (1159–1160)\",\"Eiryaku (1160–1161)\",\"Ōho (1161–1163)\",\"Chōkan (1163–1165)\",\"Eiman (1165–1166)\",\"Nin’an (1166–1169)\",\"Kaō (1169–1171)\",\"Shōan (1171–1175)\",\"Angen (1175–1177)\",\"Jishō (1177–1181)\",\"Yōwa (1181–1182)\",\"Juei (1182–1184)\",\"Genryaku (1184–1185)\",\"Bunji (1185–1190)\",\"Kenkyū (1190–1199)\",\"Shōji (1199–1201)\",\"Kennin (1201–1204)\",\"Genkyū (1204–1206)\",\"Ken’ei (1206–1207)\",\"Jōgen (1207–1211)\",\"Kenryaku (1211–1213)\",\"Kenpō (1213–1219)\",\"Jōkyū (1219–1222)\",\"Jōō (1222–1224)\",\"Gennin (1224–1225)\",\"Karoku (1225–1227)\",\"Antei (1227–1229)\",\"Kanki (1229–1232)\",\"Jōei (1232–1233)\",\"Tenpuku (1233–1234)\",\"Bunryaku (1234–1235)\",\"Katei (1235–1238)\",\"Ryakunin (1238–1239)\",\"En’ō (1239–1240)\",\"Ninji (1240–1243)\",\"Kangen (1243–1247)\",\"Hōji (1247–1249)\",\"Kenchō (1249–1256)\",\"Kōgen (1256–1257)\",\"Shōka (1257–1259)\",\"Shōgen (1259–1260)\",\"Bun’ō (1260–1261)\",\"Kōchō (1261–1264)\",\"Bun’ei (1264–1275)\",\"Kenji (1275–1278)\",\"Kōan (1278–1288)\",\"Shōō (1288–1293)\",\"Einin (1293–1299)\",\"Shōan (1299–1302)\",\"Kengen (1302–1303)\",\"Kagen (1303–1306)\",\"Tokuji (1306–1308)\",\"Enkyō (1308–1311)\",\"Ōchō (1311–1312)\",\"Shōwa (1312–1317)\",\"Bunpō (1317–1319)\",\"Genō (1319–1321)\",\"Genkō (1321–1324)\",\"Shōchū (1324–1326)\",\"Karyaku (1326–1329)\",\"Gentoku (1329–1331)\",\"Genkō (1331–1334)\",\"Kenmu (1334–1336)\",\"Engen (1336–1340)\",\"Kōkoku (1340–1346)\",\"Shōhei (1346–1370)\",\"Kentoku (1370–1372)\",\"Bunchū (1372–1375)\",\"Tenju (1375–1379)\",\"Kōryaku (1379–1381)\",\"Kōwa (1381–1384)\",\"Genchū (1384–1392)\",\"Meitoku (1384–1387)\",\"Kakei (1387–1389)\",\"Kōō (1389–1390)\",\"Meitoku (1390–1394)\",\"Ōei (1394–1428)\",\"Shōchō (1428–1429)\",\"Eikyō (1429–1441)\",\"Kakitsu (1441–1444)\",\"Bun’an (1444–1449)\",\"Hōtoku (1449–1452)\",\"Kyōtoku (1452–1455)\",\"Kōshō (1455–1457)\",\"Chōroku (1457–1460)\",\"Kanshō (1460–1466)\",\"Bunshō (1466–1467)\",\"Ōnin (1467–1469)\",\"Bunmei (1469–1487)\",\"Chōkyō (1487–1489)\",\"Entoku (1489–1492)\",\"Meiō (1492–1501)\",\"Bunki (1501–1504)\",\"Eishō (1504–1521)\",\"Taiei (1521–1528)\",\"Kyōroku (1528–1532)\",\"Tenbun (1532–1555)\",\"Kōji (1555–1558)\",\"Eiroku (1558–1570)\",\"Genki (1570–1573)\",\"Tenshō (1573–1592)\",\"Bunroku (1592–1596)\",\"Keichō (1596–1615)\",\"Genna (1615–1624)\",\"Kan’ei (1624–1644)\",\"Shōho (1644–1648)\",\"Keian (1648–1652)\",\"Jōō (1652–1655)\",\"Meireki (1655–1658)\",\"Manji (1658–1661)\",\"Kanbun (1661–1673)\",\"Enpō (1673–1681)\",\"Tenna (1681–1684)\",\"Jōkyō (1684–1688)\",\"Genroku (1688–1704)\",\"Hōei (1704–1711)\",\"Shōtoku (1711–1716)\",\"Kyōhō (1716–1736)\",\"Genbun (1736–1741)\",\"Kanpō (1741–1744)\",\"Enkyō (1744–1748)\",\"Kan’en (1748–1751)\",\"Hōreki (1751–1764)\",\"Meiwa (1764–1772)\",\"An’ei (1772–1781)\",\"Tenmei (1781–1789)\",\"Kansei (1789–1801)\",\"Kyōwa (1801–1804)\",\"Bunka (1804–1818)\",\"Bunsei (1818–1830)\",\"Tenpō (1830–1844)\",\"Kōka (1844–1848)\",\"Kaei (1848–1854)\",\"Ansei (1854–1860)\",\"Man’en (1860–1861)\",\"Bunkyū (1861–1864)\",\"Genji (1864–1865)\",\"Keiō (1865–1868)\",\"M\",\"T\",\"S\",\"H\"],short:[\"Taika (645–650)\",\"Hakuchi (650–671)\",\"Hakuhō (672–686)\",\"Shuchō (686–701)\",\"Taihō (701–704)\",\"Keiun (704–708)\",\"Wadō (708–715)\",\"Reiki (715–717)\",\"Yōrō (717–724)\",\"Jinki (724–729)\",\"Tenpyō (729–749)\",\"Tenpyō-kampō (749-749)\",\"Tenpyō-shōhō (749-757)\",\"Tenpyō-hōji (757-765)\",\"Tenpyō-jingo (765-767)\",\"Jingo-keiun (767-770)\",\"Hōki (770–780)\",\"Ten-ō (781-782)\",\"Enryaku (782–806)\",\"Daidō (806–810)\",\"Kōnin (810–824)\",\"Tenchō (824–834)\",\"Jōwa (834–848)\",\"Kajō (848–851)\",\"Ninju (851–854)\",\"Saikō (854–857)\",\"Ten-an (857-859)\",\"Jōgan (859–877)\",\"Gangyō (877–885)\",\"Ninna (885–889)\",\"Kanpyō (889–898)\",\"Shōtai (898–901)\",\"Engi (901–923)\",\"Enchō (923–931)\",\"Jōhei (931–938)\",\"Tengyō (938–947)\",\"Tenryaku (947–957)\",\"Tentoku (957–961)\",\"Ōwa (961–964)\",\"Kōhō (964–968)\",\"Anna (968–970)\",\"Tenroku (970–973)\",\"Ten’en (973–976)\",\"Jōgen (976–978)\",\"Tengen (978–983)\",\"Eikan (983–985)\",\"Kanna (985–987)\",\"Eien (987–989)\",\"Eiso (989–990)\",\"Shōryaku (990–995)\",\"Chōtoku (995–999)\",\"Chōhō (999–1004)\",\"Kankō (1004–1012)\",\"Chōwa (1012–1017)\",\"Kannin (1017–1021)\",\"Jian (1021–1024)\",\"Manju (1024–1028)\",\"Chōgen (1028–1037)\",\"Chōryaku (1037–1040)\",\"Chōkyū (1040–1044)\",\"Kantoku (1044–1046)\",\"Eishō (1046–1053)\",\"Tengi (1053–1058)\",\"Kōhei (1058–1065)\",\"Jiryaku (1065–1069)\",\"Enkyū (1069–1074)\",\"Shōho (1074–1077)\",\"Shōryaku (1077–1081)\",\"Eihō (1081–1084)\",\"Ōtoku (1084–1087)\",\"Kanji (1087–1094)\",\"Kahō (1094–1096)\",\"Eichō (1096–1097)\",\"Jōtoku (1097–1099)\",\"Kōwa (1099–1104)\",\"Chōji (1104–1106)\",\"Kashō (1106–1108)\",\"Tennin (1108–1110)\",\"Ten-ei (1110-1113)\",\"Eikyū (1113–1118)\",\"Gen’ei (1118–1120)\",\"Hōan (1120–1124)\",\"Tenji (1124–1126)\",\"Daiji (1126–1131)\",\"Tenshō (1131–1132)\",\"Chōshō (1132–1135)\",\"Hōen (1135–1141)\",\"Eiji (1141–1142)\",\"Kōji (1142–1144)\",\"Ten’yō (1144–1145)\",\"Kyūan (1145–1151)\",\"Ninpei (1151–1154)\",\"Kyūju (1154–1156)\",\"Hōgen (1156–1159)\",\"Heiji (1159–1160)\",\"Eiryaku (1160–1161)\",\"Ōho (1161–1163)\",\"Chōkan (1163–1165)\",\"Eiman (1165–1166)\",\"Nin’an (1166–1169)\",\"Kaō (1169–1171)\",\"Shōan (1171–1175)\",\"Angen (1175–1177)\",\"Jishō (1177–1181)\",\"Yōwa (1181–1182)\",\"Juei (1182–1184)\",\"Genryaku (1184–1185)\",\"Bunji (1185–1190)\",\"Kenkyū (1190–1199)\",\"Shōji (1199–1201)\",\"Kennin (1201–1204)\",\"Genkyū (1204–1206)\",\"Ken’ei (1206–1207)\",\"Jōgen (1207–1211)\",\"Kenryaku (1211–1213)\",\"Kenpō (1213–1219)\",\"Jōkyū (1219–1222)\",\"Jōō (1222–1224)\",\"Gennin (1224–1225)\",\"Karoku (1225–1227)\",\"Antei (1227–1229)\",\"Kanki (1229–1232)\",\"Jōei (1232–1233)\",\"Tenpuku (1233–1234)\",\"Bunryaku (1234–1235)\",\"Katei (1235–1238)\",\"Ryakunin (1238–1239)\",\"En’ō (1239–1240)\",\"Ninji (1240–1243)\",\"Kangen (1243–1247)\",\"Hōji (1247–1249)\",\"Kenchō (1249–1256)\",\"Kōgen (1256–1257)\",\"Shōka (1257–1259)\",\"Shōgen (1259–1260)\",\"Bun’ō (1260–1261)\",\"Kōchō (1261–1264)\",\"Bun’ei (1264–1275)\",\"Kenji (1275–1278)\",\"Kōan (1278–1288)\",\"Shōō (1288–1293)\",\"Einin (1293–1299)\",\"Shōan (1299–1302)\",\"Kengen (1302–1303)\",\"Kagen (1303–1306)\",\"Tokuji (1306–1308)\",\"Enkyō (1308–1311)\",\"Ōchō (1311–1312)\",\"Shōwa (1312–1317)\",\"Bunpō (1317–1319)\",\"Genō (1319–1321)\",\"Genkō (1321–1324)\",\"Shōchū (1324–1326)\",\"Karyaku (1326–1329)\",\"Gentoku (1329–1331)\",\"Genkō (1331–1334)\",\"Kenmu (1334–1336)\",\"Engen (1336–1340)\",\"Kōkoku (1340–1346)\",\"Shōhei (1346–1370)\",\"Kentoku (1370–1372)\",\"Bunchū (1372–1375)\",\"Tenju (1375–1379)\",\"Kōryaku (1379–1381)\",\"Kōwa (1381–1384)\",\"Genchū (1384–1392)\",\"Meitoku (1384–1387)\",\"Kakei (1387–1389)\",\"Kōō (1389–1390)\",\"Meitoku (1390–1394)\",\"Ōei (1394–1428)\",\"Shōchō (1428–1429)\",\"Eikyō (1429–1441)\",\"Kakitsu (1441–1444)\",\"Bun’an (1444–1449)\",\"Hōtoku (1449–1452)\",\"Kyōtoku (1452–1455)\",\"Kōshō (1455–1457)\",\"Chōroku (1457–1460)\",\"Kanshō (1460–1466)\",\"Bunshō (1466–1467)\",\"Ōnin (1467–1469)\",\"Bunmei (1469–1487)\",\"Chōkyō (1487–1489)\",\"Entoku (1489–1492)\",\"Meiō (1492–1501)\",\"Bunki (1501–1504)\",\"Eishō (1504–1521)\",\"Taiei (1521–1528)\",\"Kyōroku (1528–1532)\",\"Tenbun (1532–1555)\",\"Kōji (1555–1558)\",\"Eiroku (1558–1570)\",\"Genki (1570–1573)\",\"Tenshō (1573–1592)\",\"Bunroku (1592–1596)\",\"Keichō (1596–1615)\",\"Genna (1615–1624)\",\"Kan’ei (1624–1644)\",\"Shōho (1644–1648)\",\"Keian (1648–1652)\",\"Jōō (1652–1655)\",\"Meireki (1655–1658)\",\"Manji (1658–1661)\",\"Kanbun (1661–1673)\",\"Enpō (1673–1681)\",\"Tenna (1681–1684)\",\"Jōkyō (1684–1688)\",\"Genroku (1688–1704)\",\"Hōei (1704–1711)\",\"Shōtoku (1711–1716)\",\"Kyōhō (1716–1736)\",\"Genbun (1736–1741)\",\"Kanpō (1741–1744)\",\"Enkyō (1744–1748)\",\"Kan’en (1748–1751)\",\"Hōreki (1751–1764)\",\"Meiwa (1764–1772)\",\"An’ei (1772–1781)\",\"Tenmei (1781–1789)\",\"Kansei (1789–1801)\",\"Kyōwa (1801–1804)\",\"Bunka (1804–1818)\",\"Bunsei (1818–1830)\",\"Tenpō (1830–1844)\",\"Kōka (1844–1848)\",\"Kaei (1848–1854)\",\"Ansei (1854–1860)\",\"Man’en (1860–1861)\",\"Bunkyū (1861–1864)\",\"Genji (1864–1865)\",\"Keiō (1865–1868)\",\"Meiji\",\"Taishō\",\"Shōwa\",\"Heisei\"],long:[\"Taika (645–650)\",\"Hakuchi (650–671)\",\"Hakuhō (672–686)\",\"Shuchō (686–701)\",\"Taihō (701–704)\",\"Keiun (704–708)\",\"Wadō (708–715)\",\"Reiki (715–717)\",\"Yōrō (717–724)\",\"Jinki (724–729)\",\"Tenpyō (729–749)\",\"Tenpyō-kampō (749-749)\",\"Tenpyō-shōhō (749-757)\",\"Tenpyō-hōji (757-765)\",\"Tenpyō-jingo (765-767)\",\"Jingo-keiun (767-770)\",\"Hōki (770–780)\",\"Ten-ō (781-782)\",\"Enryaku (782–806)\",\"Daidō (806–810)\",\"Kōnin (810–824)\",\"Tenchō (824–834)\",\"Jōwa (834–848)\",\"Kajō (848–851)\",\"Ninju (851–854)\",\"Saikō (854–857)\",\"Ten-an (857-859)\",\"Jōgan (859–877)\",\"Gangyō (877–885)\",\"Ninna (885–889)\",\"Kanpyō (889–898)\",\"Shōtai (898–901)\",\"Engi (901–923)\",\"Enchō (923–931)\",\"Jōhei (931–938)\",\"Tengyō (938–947)\",\"Tenryaku (947–957)\",\"Tentoku (957–961)\",\"Ōwa (961–964)\",\"Kōhō (964–968)\",\"Anna (968–970)\",\"Tenroku (970–973)\",\"Ten’en (973–976)\",\"Jōgen (976–978)\",\"Tengen (978–983)\",\"Eikan (983–985)\",\"Kanna (985–987)\",\"Eien (987–989)\",\"Eiso (989–990)\",\"Shōryaku (990–995)\",\"Chōtoku (995–999)\",\"Chōhō (999–1004)\",\"Kankō (1004–1012)\",\"Chōwa (1012–1017)\",\"Kannin (1017–1021)\",\"Jian (1021–1024)\",\"Manju (1024–1028)\",\"Chōgen (1028–1037)\",\"Chōryaku (1037–1040)\",\"Chōkyū (1040–1044)\",\"Kantoku (1044–1046)\",\"Eishō (1046–1053)\",\"Tengi (1053–1058)\",\"Kōhei (1058–1065)\",\"Jiryaku (1065–1069)\",\"Enkyū (1069–1074)\",\"Shōho (1074–1077)\",\"Shōryaku (1077–1081)\",\"Eihō (1081–1084)\",\"Ōtoku (1084–1087)\",\"Kanji (1087–1094)\",\"Kahō (1094–1096)\",\"Eichō (1096–1097)\",\"Jōtoku (1097–1099)\",\"Kōwa (1099–1104)\",\"Chōji (1104–1106)\",\"Kashō (1106–1108)\",\"Tennin (1108–1110)\",\"Ten-ei (1110-1113)\",\"Eikyū (1113–1118)\",\"Gen’ei (1118–1120)\",\"Hōan (1120–1124)\",\"Tenji (1124–1126)\",\"Daiji (1126–1131)\",\"Tenshō (1131–1132)\",\"Chōshō (1132–1135)\",\"Hōen (1135–1141)\",\"Eiji (1141–1142)\",\"Kōji (1142–1144)\",\"Ten’yō (1144–1145)\",\"Kyūan (1145–1151)\",\"Ninpei (1151–1154)\",\"Kyūju (1154–1156)\",\"Hōgen (1156–1159)\",\"Heiji (1159–1160)\",\"Eiryaku (1160–1161)\",\"Ōho (1161–1163)\",\"Chōkan (1163–1165)\",\"Eiman (1165–1166)\",\"Nin’an (1166–1169)\",\"Kaō (1169–1171)\",\"Shōan (1171–1175)\",\"Angen (1175–1177)\",\"Jishō (1177–1181)\",\"Yōwa (1181–1182)\",\"Juei (1182–1184)\",\"Genryaku (1184–1185)\",\"Bunji (1185–1190)\",\"Kenkyū (1190–1199)\",\"Shōji (1199–1201)\",\"Kennin (1201–1204)\",\"Genkyū (1204–1206)\",\"Ken’ei (1206–1207)\",\"Jōgen (1207–1211)\",\"Kenryaku (1211–1213)\",\"Kenpō (1213–1219)\",\"Jōkyū (1219–1222)\",\"Jōō (1222–1224)\",\"Gennin (1224–1225)\",\"Karoku (1225–1227)\",\"Antei (1227–1229)\",\"Kanki (1229–1232)\",\"Jōei (1232–1233)\",\"Tenpuku (1233–1234)\",\"Bunryaku (1234–1235)\",\"Katei (1235–1238)\",\"Ryakunin (1238–1239)\",\"En’ō (1239–1240)\",\"Ninji (1240–1243)\",\"Kangen (1243–1247)\",\"Hōji (1247–1249)\",\"Kenchō (1249–1256)\",\"Kōgen (1256–1257)\",\"Shōka (1257–1259)\",\"Shōgen (1259–1260)\",\"Bun’ō (1260–1261)\",\"Kōchō (1261–1264)\",\"Bun’ei (1264–1275)\",\"Kenji (1275–1278)\",\"Kōan (1278–1288)\",\"Shōō (1288–1293)\",\"Einin (1293–1299)\",\"Shōan (1299–1302)\",\"Kengen (1302–1303)\",\"Kagen (1303–1306)\",\"Tokuji (1306–1308)\",\"Enkyō (1308–1311)\",\"Ōchō (1311–1312)\",\"Shōwa (1312–1317)\",\"Bunpō (1317–1319)\",\"Genō (1319–1321)\",\"Genkō (1321–1324)\",\"Shōchū (1324–1326)\",\"Karyaku (1326–1329)\",\"Gentoku (1329–1331)\",\"Genkō (1331–1334)\",\"Kenmu (1334–1336)\",\"Engen (1336–1340)\",\"Kōkoku (1340–1346)\",\"Shōhei (1346–1370)\",\"Kentoku (1370–1372)\",\"Bunchū (1372–1375)\",\"Tenju (1375–1379)\",\"Kōryaku (1379–1381)\",\"Kōwa (1381–1384)\",\"Genchū (1384–1392)\",\"Meitoku (1384–1387)\",\"Kakei (1387–1389)\",\"Kōō (1389–1390)\",\"Meitoku (1390–1394)\",\"Ōei (1394–1428)\",\"Shōchō (1428–1429)\",\"Eikyō (1429–1441)\",\"Kakitsu (1441–1444)\",\"Bun’an (1444–1449)\",\"Hōtoku (1449–1452)\",\"Kyōtoku (1452–1455)\",\"Kōshō (1455–1457)\",\"Chōroku (1457–1460)\",\"Kanshō (1460–1466)\",\"Bunshō (1466–1467)\",\"Ōnin (1467–1469)\",\"Bunmei (1469–1487)\",\"Chōkyō (1487–1489)\",\"Entoku (1489–1492)\",\"Meiō (1492–1501)\",\"Bunki (1501–1504)\",\"Eishō (1504–1521)\",\"Taiei (1521–1528)\",\"Kyōroku (1528–1532)\",\"Tenbun (1532–1555)\",\"Kōji (1555–1558)\",\"Eiroku (1558–1570)\",\"Genki (1570–1573)\",\"Tenshō (1573–1592)\",\"Bunroku (1592–1596)\",\"Keichō (1596–1615)\",\"Genna (1615–1624)\",\"Kan’ei (1624–1644)\",\"Shōho (1644–1648)\",\"Keian (1648–1652)\",\"Jōō (1652–1655)\",\"Meireki (1655–1658)\",\"Manji (1658–1661)\",\"Kanbun (1661–1673)\",\"Enpō (1673–1681)\",\"Tenna (1681–1684)\",\"Jōkyō (1684–1688)\",\"Genroku (1688–1704)\",\"Hōei (1704–1711)\",\"Shōtoku (1711–1716)\",\"Kyōhō (1716–1736)\",\"Genbun (1736–1741)\",\"Kanpō (1741–1744)\",\"Enkyō (1744–1748)\",\"Kan’en (1748–1751)\",\"Hōreki (1751–1764)\",\"Meiwa (1764–1772)\",\"An’ei (1772–1781)\",\"Tenmei (1781–1789)\",\"Kansei (1789–1801)\",\"Kyōwa (1801–1804)\",\"Bunka (1804–1818)\",\"Bunsei (1818–1830)\",\"Tenpō (1830–1844)\",\"Kōka (1844–1848)\",\"Kaei (1848–1854)\",\"Ansei (1854–1860)\",\"Man’en (1860–1861)\",\"Bunkyū (1861–1864)\",\"Genji (1864–1865)\",\"Keiō (1865–1868)\",\"Meiji\",\"Taishō\",\"Shōwa\",\"Heisei\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},persian:{months:{narrow:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],short:[\"Farvardin\",\"Ordibehesht\",\"Khordad\",\"Tir\",\"Mordad\",\"Shahrivar\",\"Mehr\",\"Aban\",\"Azar\",\"Dey\",\"Bahman\",\"Esfand\"],long:[\"Farvardin\",\"Ordibehesht\",\"Khordad\",\"Tir\",\"Mordad\",\"Shahrivar\",\"Mehr\",\"Aban\",\"Azar\",\"Dey\",\"Bahman\",\"Esfand\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"AP\"],short:[\"AP\"],long:[\"AP\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}},roc:{months:{narrow:[\"J\",\"F\",\"M\",\"A\",\"M\",\"J\",\"J\",\"A\",\"S\",\"O\",\"N\",\"D\"],short:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],long:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},days:{narrow:[\"S\",\"M\",\"T\",\"W\",\"T\",\"F\",\"S\"],short:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],long:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},eras:{narrow:[\"Before R.O.C.\",\"Minguo\"],short:[\"Before R.O.C.\",\"Minguo\"],long:[\"Before R.O.C.\",\"Minguo\"]},dayPeriods:{am:\"AM\",pm:\"PM\"}}}},number:{nu:[\"latn\"],patterns:{decimal:{positivePattern:\"{number}\",negativePattern:\"{minusSign}{number}\"},currency:{positivePattern:\"{currency}{number}\",negativePattern:\"{minusSign}{currency}{number}\"},percent:{positivePattern:\"{number}{percentSign}\",negativePattern:\"{minusSign}{number}{percentSign}\"}},symbols:{latn:{decimal:\".\",group:\",\",nan:\"NaN\",plusSign:\"+\",minusSign:\"-\",percentSign:\"%\",infinity:\"∞\"}},currencies:{AUD:\"A$\",BRL:\"R$\",CAD:\"CA$\",CNY:\"CN¥\",EUR:\"€\",GBP:\"£\",HKD:\"HK$\",ILS:\"₪\",INR:\"₹\",JPY:\"¥\",KRW:\"₩\",MXN:\"MX$\",NZD:\"NZ$\",TWD:\"NT$\",USD:\"$\",VND:\"₫\",XAF:\"FCFA\",XCD:\"EC$\",XOF:\"CFA\",XPF:\"CFPF\"}}});","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\nimport FormattedMessage from '../../../../lib/i18n';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport Icon from '@UI/icon';\nimport style from './basic-plan-confirm-modal-style.scss';\n\nconst BasicPlanConfirmModalComponent = props => (\n  <ConfirmModal\n    visible={props.visible}\n    confirmButtonLabel={\n      <FormattedMessage id=\"account.plans.basicPlan.modal.button\" />\n    }\n    heading={<FormattedMessage id=\"account.plans.basicPlan.modal.title\" />}\n    onClose={props.onClose}\n    onConfirm={props.onConfirm}\n  >\n    <FormattedMessage id=\"account.plans.basicPlan.modal.intro\" />\n    <ul className={style.featureList}>\n      <li>\n        <span className={style.featureIcon}>\n          <Icon name=\"paint-brush\" />\n        </span>\n        <div className={style.featureContent}>\n          <strong className={style.featureTitle}>\n            <FormattedMessage id=\"account.plans.basicPlan.modal.featureOne.title\" />\n          </strong>\n          <FormattedMessage id=\"account.plans.basicPlan.modal.featureOne.text\" />\n        </div>\n      </li>\n      {/* \n        Due to COVID-19 we are temporarily allowing basic plan users access to sharing links and mobile access.\n        After 1st September 2020 we can uncomment the code below\n      */}\n      {/* <li> \n        <span className={style.featureIcon}>\n          <Icon name=\"link\" />\n        </span>\n        <div className={style.featureContent}>\n          <strong className={style.featureTitle}>\n            <FormattedMessage id=\"account.plans.basicPlan.modal.featureTwo.title\" />\n          </strong>\n          <FormattedMessage id=\"account.plans.basicPlan.modal.featureTwo.text\" />\n        </div>\n      </li>\n      <li>\n        <span className={style.featureIcon}>\n          <Icon name=\"mobile-alt\" />\n        </span>\n        <div className={style.featureContent}>\n          <strong className={style.featureTitle}>\n            <FormattedMessage id=\"account.plans.basicPlan.modal.featureThree.title\" />\n          </strong>\n          <FormattedMessage id=\"account.plans.basicPlan.modal.featureThree.text\" />\n        </div>\n      </li> */}\n    </ul>\n  </ConfirmModal>\n);\n\nBasicPlanConfirmModalComponent.defaultProps = {\n  onClose: noop,\n  onConfirm: noop,\n  visible: false,\n};\n\nBasicPlanConfirmModalComponent.propTypes = {\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default BasicPlanConfirmModalComponent;\n","import BasicPlanConfirmModal from './basic-plan-confirm-modal-component';\n\nexport default BasicPlanConfirmModal;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { lowerCase } from 'lodash';\nimport classnames from 'classnames';\nimport Button from '@UI/button';\nimport Link from '../../../components/link';\nimport BasicPlanConfirmModal from './basic-plan-confirm-modal';\nimport { FormattedHTMLMessage } from '../../../lib/i18n';\n\nimport style from './plan-style.scss';\n\nexport const PLANS_2019_DETAILS = {\n  basic0819: {\n    titleId: 'account.plans.pricing2019.basic0819.title',\n    allAllowancesId: 'account.plans.pricing2019.basic0819.allAllowances',\n  },\n  team0819: {\n    titleId: 'account.plans.pricing2019.team0819.title',\n    allAllowancesId: 'account.plans.pricing2019.team0819.allAllowances',\n  },\n  teamplus0819: {\n    titleId: 'account.plans.pricing2019.teamplus0819.title',\n    allAllowancesId: 'account.plans.pricing2019.teamplus0819.allAllowances',\n  },\n  company0819: {\n    titleId: 'account.plans.pricing2019.company0819.title',\n    allAllowancesId: 'account.plans.pricing2019.company0819.allAllowances',\n  },\n};\n\nexport const PLANS_2020_DETAILS = {\n  freemium0520: {\n    titleId: 'account.plans.pricing2020.freemium0520.title',\n    allAllowancesId: 'account.plans.pricing2020.freemium0520.allAllowances',\n  },\n};\n\nexport const ALL_PLAN_DETAILS = {\n  ...PLANS_2019_DETAILS,\n  ...PLANS_2020_DETAILS,\n};\n\nconst commaList = list =>\n  list.reduce((acc, item, index) => {\n    if (index === 0) {\n      return [item];\n    }\n\n    if (index === list.length - 1) {\n      return [...acc, ' and ', item];\n    }\n\n    return [...acc, ', ', item];\n  }, []);\n\nconst pluralize = (string, count) => (count === 1 ? string : `${string}s`);\n\nclass PlanComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      showWarning: false,\n    };\n\n    this.openWarningModal = this.openWarningModal.bind(this);\n    this.closeWarningModal = this.closeWarningModal.bind(this);\n  }\n\n  renderPrice() {\n    const { displayedPrice, isAnnual } = this.props;\n    const period = isAnnual ? 'year' : 'month';\n\n    return (\n      <span>\n        ${displayedPrice}{' '}\n        {displayedPrice !== 0 && (\n          <span className={style.subPrice}>USD per {period}</span>\n        )}\n      </span>\n    );\n  }\n\n  renderDashboardLimit() {\n    const { limits } = this.props;\n\n    if (limits.dashboards === 1) {\n      return <FormattedHTMLMessage id=\"account.plans.singleDashboardLimit\" />;\n    } else if (limits.dashboards) {\n      return (\n        <FormattedHTMLMessage\n          id=\"account.plans.dashboardLimit\"\n          values={{ limit: limits.dashboards }}\n        />\n      );\n    }\n\n    return <FormattedHTMLMessage id=\"account.plans.noDashboardLimit\" />;\n  }\n\n  renderDisabledMessage() {\n    if (!this.isDisabled()) return null;\n\n    const {\n      groupId: groupId,\n      devices = [],\n      features,\n      limits = {},\n      usage = {},\n      databaseConnectionCount,\n      onManageScreens,\n    } = this.props;\n\n    const messageParts = [];\n\n    if (limits.dashboards && usage.dashboards > limits.dashboards) {\n      messageParts.push(\n        <Link\n          href={`/admin/groups/${groupId}/dashboards`}\n          target=\"_blank\"\n          key=\"dashboards\"\n        >\n          {usage.dashboards} {pluralize('dashboard', usage.dashboards)}\n        </Link>,\n      );\n    }\n\n    if (limits.users && usage.users > limits.users) {\n      messageParts.push(\n        <Link href={`/admin/people`} target=\"_blank\" key=\"users\">\n          {usage.users} {pluralize('user', usage.users)}\n        </Link>,\n      );\n    }\n\n    if (features.max_screens && features.max_screens < devices.length) {\n      messageParts.push(\n        <Link onClick={onManageScreens} key=\"screens\">\n          {devices.length} {pluralize('screen', devices.length)}\n        </Link>,\n      );\n    }\n\n    if (this.isBasicPlan() && databaseConnectionCount > 0) {\n      messageParts.push(\n        <Link href={`/admin/groups/${groupId}/data-sources`} key=\"connections\">\n          {databaseConnectionCount}{' '}\n          {pluralize('database connection', databaseConnectionCount)}\n        </Link>,\n      );\n    }\n\n    return (\n      <div className={style.disabledMessage}>\n        You currently have {commaList(messageParts)}. To select this plan please\n        remove items by following the links.\n      </div>\n    );\n  }\n\n  renderSelectButton() {\n    const { id, isCurrent, handleSelection, title } = this.props;\n\n    if (this.isDisabled()) {\n      return null;\n    }\n\n    const onClick = this.isBasicPlan()\n      ? () => this.openWarningModal()\n      : () => handleSelection(id);\n    return (\n      <div className={style.selectButton}>\n        <Button\n          onClick={onClick}\n          disabled={!!isCurrent}\n          intent={isCurrent ? Button.INTENT.SECONDARY : Button.INTENT.PRIMARY}\n          size={Button.SIZES.EXTRA_SMALL}\n          stretched\n        >\n          {isCurrent ? 'Current plan' : `Select ${lowerCase(title)} plan`}\n        </Button>\n      </div>\n    );\n  }\n\n  render() {\n    const { id, code, handleSelection, title } = this.props;\n    const details = ALL_PLAN_DETAILS[code];\n    const isBasicPlan = this.isBasicPlan();\n    const isFreePlan = this.isFreePlan();\n\n    const containerClass = classnames(style.planWrapper, {\n      [style.disabled]: this.isDisabled(),\n      [style.basic]: isBasicPlan || isFreePlan,\n    });\n\n    return (\n      <div className={containerClass}>\n        <h3 className={style.title}>{title}</h3>\n        <div className={style.price}>{this.renderPrice()}</div>\n        {this.renderSelectButton()}\n        <div className={style.dashboardLimit}>\n          {this.renderDashboardLimit()}\n        </div>\n        <ol className={style.features}>\n          <FormattedHTMLMessage id={details.allAllowancesId} />\n          {(isBasicPlan || isFreePlan) && (\n            <>\n              <li className={style.basicPlanTick}>\n                Sharing links (until 1st September 2020 in response to COVID-19)\n              </li>\n              <li className={style.basicPlanTick}>\n                Mobile access (until 1st September 2020 in response to COVID-19)\n              </li>\n            </>\n          )}\n        </ol>\n\n        {this.renderDisabledMessage()}\n\n        {isBasicPlan && (\n          <BasicPlanConfirmModal\n            visible={this.state.showWarning}\n            onClose={this.closeWarningModal}\n            onConfirm={() => handleSelection(id)}\n          />\n        )}\n      </div>\n    );\n  }\n\n  openWarningModal() {\n    this.setState({ showWarning: true });\n  }\n\n  closeWarningModal() {\n    this.setState({ showWarning: false });\n  }\n\n  isBasicPlan() {\n    return ['basic0819'].includes(this.props.code);\n  }\n\n  isFreePlan() {\n    return ['freemium0520'].includes(this.props.code);\n  }\n\n  isDisabled() {\n    const {\n      devices = [],\n      features,\n      limits = {},\n      usage = {},\n      databaseConnectionCount,\n    } = this.props;\n\n    return (\n      (limits.dashboards && usage.dashboards > limits.dashboards) ||\n      (limits.users && usage.users > limits.users) ||\n      (features.max_screens && features.max_screens < devices.length) ||\n      (this.isBasicPlan() && databaseConnectionCount > 0)\n    );\n  }\n}\n\nPlanComponent.defaultProps = {\n  limits: {},\n  databaseConnectionCount: 0,\n};\n\nPlanComponent.propTypes = {\n  code: PropTypes.string,\n  databaseConnectionCount: PropTypes.number,\n  devices: PropTypes.array,\n  displayedPrice: PropTypes.number,\n  features: PropTypes.shape({\n    custom_css: PropTypes.bool,\n    max_screens: PropTypes.number,\n    support: PropTypes.string,\n  }),\n  groupId: PropTypes.number,\n  handleSelection: PropTypes.func,\n  id: PropTypes.number,\n  isAnnual: PropTypes.bool,\n  isCurrent: PropTypes.bool,\n  limits: PropTypes.shape({\n    dashboards: PropTypes.number,\n    users: PropTypes.number,\n  }),\n  title: PropTypes.string,\n  usage: PropTypes.shape({\n    dashboards: PropTypes.number,\n    users: PropTypes.number,\n  }),\n  onManageScreens: PropTypes.func,\n};\n\nexport default PlanComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { find } from 'lodash';\nimport { pluralize } from '../../../lib/toString';\nimport Link from '../../../components/link';\nimport Plan from './plan-component';\n\nimport style from './plans-modal-style.scss';\n\nconst HEADER =\n  \"Whatever your needs, we've got a plan for you. Geckoboard helps companies grow, and we've got plans that grow with you.\";\n\nconst DISCONTINUED_HEADER = (\n  <div>\n    Your plan has been discontinued. You can stay on this plan, or change to one\n    of our new great-value bundles.\n  </div>\n);\n\nconst READ_MORE_LINK = 'https://www.geckoboard.com/pricing';\nconst VAT_NOTICE = 'Prices do not include VAT';\nconst TITLE_TRIAL = 'Upgrade';\nconst TITLE = 'Change plan';\n\nconst ADDONS_TEXT = {\n  max_dashboard_user_bundle: qty =>\n    `${qty} ${pluralize(qty, 'add-on')} dashboards`,\n  max_dashboards: qty => `${qty} ${pluralize(qty, 'add-on')} dashboards`,\n};\n\nconst getAddonsDetails = plan => {\n  const { addons: { purchased = [], available } = {} } = plan;\n  if (!purchased.length) {\n    return '';\n  }\n  const details = purchased.map(({ addon_id: id, quantity }) => {\n    const { subject } = find(available, { id });\n    return ADDONS_TEXT[subject](quantity);\n  });\n\n  return ` with ${details.join(', ')}`;\n};\n\nclass PlansModalComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.renderPlans = this.renderPlans.bind(this);\n  }\n\n  componentDidMount() {\n    this.props.initialise();\n  }\n\n  renderHeader() {\n    const {\n      currentPlan = {},\n      currentIsAnnual,\n      currentPrice,\n      isTrial,\n    } = this.props;\n\n    const { title, obsolete } = currentPlan;\n    const showCurrentPlan = !isTrial && currentPrice;\n    const discontinuedMessage = obsolete ? DISCONTINUED_HEADER : null;\n\n    let header;\n    if (showCurrentPlan) {\n      const suffix = currentIsAnnual ? ' / year' : ' / month';\n      header = `You're currently subscribed to the ${title} plan${getAddonsDetails(\n        currentPlan,\n      )} paying $ ${currentPrice}${suffix}.`;\n    } else {\n      header = HEADER;\n    }\n\n    return (\n      <header className={style.header}>\n        {header} {discontinuedMessage}\n      </header>\n    );\n  }\n\n  renderSwitchPaymentInterval() {\n    const { isAnnual, handleSwitchPaymentInterval } = this.props;\n    return (\n      <div className={style.paymentInterval}>\n        <label htmlFor=\"monthly\" key=\"monthly-radio\">\n          <input\n            type=\"radio\"\n            name=\"monthly\"\n            id=\"monthly\"\n            key=\"monthly\"\n            value=\"monthly\"\n            onChange={() => handleSwitchPaymentInterval(false)}\n            checked={!isAnnual}\n          />\n          Pay monthly\n        </label>\n        <label htmlFor=\"annual\" key=\"annual-radio\">\n          <input\n            type=\"radio\"\n            name=\"annual\"\n            id=\"annual\"\n            key=\"yearly\"\n            value=\"yearly\"\n            onChange={() => handleSwitchPaymentInterval(true)}\n            checked={isAnnual}\n          />\n          Pay annually <span className={style.annualHint}>(Save 20%)</span>\n        </label>\n      </div>\n    );\n  }\n\n  renderPlans() {\n    const {\n      plans,\n      usage,\n      isAnnual,\n      handleSelectPlan,\n      handleSelectAddon,\n      defaultGroupId,\n      devices = [],\n      onManageScreens,\n      databaseConnectionCount,\n    } = this.props;\n\n    if (!plans) return null;\n\n    return plans.map(plan => {\n      const {\n        id,\n        code,\n        title,\n        features,\n        displayedPrice,\n        isCurrent,\n        limits,\n      } = plan;\n\n      return (\n        <Plan\n          key={code}\n          id={id}\n          code={code}\n          title={title}\n          isAnnual={isAnnual}\n          features={features}\n          displayedPrice={displayedPrice}\n          isCurrent={isCurrent}\n          limits={limits}\n          onManageScreens={onManageScreens}\n          usage={usage}\n          handleSelection={handleSelectPlan}\n          handleSelectAddon={handleSelectAddon}\n          groupId={defaultGroupId}\n          devices={devices}\n          databaseConnectionCount={databaseConnectionCount}\n        />\n      );\n    });\n  }\n\n  render() {\n    const { isTrial } = this.props;\n    const title = isTrial ? TITLE_TRIAL : TITLE;\n\n    return (\n      <div className={`${style.plansModal} inner`}>\n        <div className={`modal-display-area ${style.plansModalInner}`}>\n          <section>\n            <h2 className={style.title}>{title}</h2>\n            {this.renderHeader()}\n            <div className={style.intervalAndUsage}>\n              {this.renderSwitchPaymentInterval()}\n            </div>\n            <div className={style.plansWrapper}>{this.renderPlans()}</div>\n            <div className={style.footer}>\n              <p>{VAT_NOTICE}</p>\n              <p>\n                For more information about plans and pricing{' '}\n                <Link target=\"_blank\" href={READ_MORE_LINK}>\n                  visit our pricing page\n                </Link>{' '}\n                or{' '}\n                <Link href=\"mailto:support@geckoboard.com\">talk with us</Link>\n              </p>\n            </div>\n          </section>\n        </div>\n      </div>\n    );\n  }\n}\n\nPlansModalComponent.propTypes = {\n  currentIsAnnual: PropTypes.bool,\n  currentPlan: PropTypes.object,\n  currentPrice: PropTypes.number,\n  databaseConnectionCount: PropTypes.number,\n  defaultGroupId: PropTypes.number,\n  devices: PropTypes.array,\n  handleSelectAddon: PropTypes.func,\n  handleSelectPlan: PropTypes.func,\n  handleSwitchPaymentInterval: PropTypes.func,\n  initialise: PropTypes.func,\n  isAnnual: PropTypes.bool,\n  isTrial: PropTypes.bool,\n  plans: PropTypes.array,\n  usage: PropTypes.shape({\n    dashboards: PropTypes.number,\n    users: PropTypes.users,\n  }),\n  onManageScreens: PropTypes.func,\n};\n\nPlansModalComponent.defaultProps = {\n  isAnnual: false,\n};\n\nexport {\n  PlansModalComponent as default,\n  HEADER,\n  DISCONTINUED_HEADER,\n  READ_MORE_LINK,\n  TITLE,\n  TITLE_TRIAL,\n  VAT_NOTICE,\n};\n","import PlansModalComponent from './plans-modal-component';\nexport default PlansModalComponent;\n","import React from 'react';\nimport { Query, ApolloProvider } from 'react-apollo';\nimport apolloClient from '../services/concierge-service/apollo-client';\nimport { DatabaseConnections } from '../database-config/database-connections-query.graphql';\nimport { chain, find, omit } from 'lodash';\nimport { connect } from 'react-redux';\nimport PlansModal from './components/plans-modal';\nimport {\n  initialisePlans,\n  selectPlan,\n  setPaymentInterval,\n  selectAddon,\n  cancel,\n} from './actions/account-actions';\nimport { openModalAndFetchDevices } from '../manage-screens/actions/manage-screens-actions';\nimport {\n  extraDashboards,\n  applyLimits,\n  applyPricing,\n  applySelectedAddons,\n  flagIsCurrent,\n  getCurrentPrice,\n  removeEmptyAddons,\n} from './lib/plan-helpers';\nimport { track } from '../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\nimport { dispatchToGeckoJS } from '../lib/gecko-view';\n\nconst mapStateToProps = (state, props) => {\n  const { isAnnual: currentIsAnnual, currentPlan = {} } = props;\n  const {\n    plans = [],\n    error,\n    isAnnual = currentIsAnnual,\n    selectedAddons = {},\n  } = state.account;\n  const {\n    manageScreens: { devices = [] },\n    user: {\n      user: { default_group_id: defaultGroupId, features = [] } = {},\n    } = {},\n  } = state;\n\n  const completePlans = chain(plans)\n    .map(plan => applySelectedAddons(plan, selectedAddons))\n    .map(plan =>\n      flagIsCurrent({ isAnnual, currentIsAnnual }, currentPlan, plan),\n    )\n    .map(plan => applyPricing({ isAnnual }, plan))\n    .map(plan => applyLimits(plan))\n    .value();\n\n  let currentPrice;\n  if (currentPlan) {\n    currentPrice = getCurrentPrice(currentPlan, currentIsAnnual);\n  }\n\n  return {\n    features,\n    completePlans,\n    currentIsAnnual,\n    currentPrice,\n    defaultGroupId,\n    devices,\n    error,\n    isAnnual,\n    plans,\n    selectedAddons,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { orgId, currentPlan = {}, usage = {} } = props;\n  const onManageScreens = () => dispatch(openModalAndFetchDevices());\n  const initialise = () => {\n    dispatch(initialisePlans(orgId, usage, currentPlan, true));\n  };\n  const createSelectPlanHandler = (plans, selectedAddons, isAnnual) => id => {\n    const {\n      code,\n      addons: { available },\n      title,\n    } = find(plans, { id });\n    const numExtraDashboards = extraDashboards(selectedAddons[id], available);\n    const plan = removeEmptyAddons({\n      id,\n      isAnnual,\n      addons: selectedAddons[id],\n    });\n\n    track('Plans - Select plan - Click', {\n      properties: {\n        selected_plan: code,\n        extra_dashboards: numExtraDashboards,\n      },\n    });\n    trackEvent(\n      buttonClicked({ 'Button identifier': `Plans - Select ${title} plan` }),\n    );\n\n    dispatch(selectPlan(plan));\n    dispatchToGeckoJS('plan:selected', plan);\n  };\n  const handleSwitchPaymentInterval = isAnnual => {\n    dispatch(setPaymentInterval(isAnnual));\n  };\n  const handleSelectAddon = (planId, addonId, quantity) => {\n    dispatch(selectAddon({ planId, addonId, quantity }));\n  };\n  const handleCancel = () => {\n    track('Plans - Cancel - Click');\n    dispatch(cancel());\n    dispatchToGeckoJS('plan:cancel');\n  };\n\n  return {\n    initialise,\n    createSelectPlanHandler,\n    handleSwitchPaymentInterval,\n    handleSelectAddon,\n    handleCancel,\n    onManageScreens,\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { isAnnual, selectedAddons, plans, completePlans } = stateProps;\n  const { createSelectPlanHandler, initialise } = dispatchProps;\n\n  const newDispatchProps = omit(dispatchProps, 'createSelectPlanHandler');\n  const newStateProps = omit(stateProps, ['selectedAddons', 'completePlans']);\n\n  return {\n    ...ownProps,\n    ...newStateProps,\n    ...newDispatchProps,\n    plans: completePlans,\n    initialise: () => initialise(),\n    handleSelectPlan: createSelectPlanHandler(plans, selectedAddons, isAnnual),\n  };\n};\n\nexport const PlansModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(PlansModal);\n\nexport const PlansModalQueryConnector = props => (\n  <Query query={DatabaseConnections}>\n    {({ data }) => {\n      if (!data || !data.databaseConnections) {\n        return null;\n      }\n\n      return (\n        <PlansModalConnector\n          databaseConnectionCount={data.databaseConnections.length}\n          {...props}\n        />\n      );\n    }}\n  </Query>\n);\n\nexport default props => {\n  return (\n    <ApolloProvider client={apolloClient.create()}>\n      <PlansModalQueryConnector {...props} />\n    </ApolloProvider>\n  );\n};\n","import createReactRenderer from '../react-renderer';\nimport PlansModalConnector from './plans-modal-connector';\n\nconst PlansModal = createReactRenderer(PlansModalConnector);\n\nexport default { PlansModal };\n","import createReactRenderer from '../../../react-renderer';\nimport DashboardFooterConnector from './dashboard-footer-connector';\n\nconst DashboardFooter = createReactRenderer(DashboardFooterConnector);\n\nexport default DashboardFooter;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport AsyncComponentLoader from '../async-component-loader';\n\nconst _importComponent = () => import('./config-wrapper-picker');\nconst Loader = props => (\n  <AsyncComponentLoader\n    importComponent={_importComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: configWrapperPicker, COMPONENTS } = component;\n      const ConfigComponent = configWrapperPicker(\n        COMPONENTS,\n        props.polecatService,\n      );\n\n      return <ConfigComponent {...props} />;\n    }}\n  />\n);\nLoader.propTypes = {\n  polecatService: PropTypes.string,\n};\n\nconst ConfigWrapper = props => {\n  let renderProps;\n\n  if (props.features) {\n    // Only render with our props once we have access to our feature flags\n    renderProps = props;\n  }\n\n  return <Loader {...renderProps} />;\n};\nConfigWrapper.propTypes = {\n  features: PropTypes.object,\n};\n\nexport default ConfigWrapper;\n","import createReactRenderer from '../react-renderer';\nimport ConfigWrapperComponent from './config-wrapper';\n\nconst ConfigWrapper = createReactRenderer(ConfigWrapperComponent);\n\nexport default ConfigWrapper;\n","import createReactRenderer from '../react-renderer';\nimport DataSourceConnectorComponent from './data-source-connector-connector';\n\nconst DataSourceConnector = createReactRenderer(DataSourceConnectorComponent, {\n  propsTransform: ({ serviceId, dashboardId, serviceType }) => ({\n    serviceId,\n    dashboardId,\n    serviceType,\n  }),\n});\n\nexport { DataSourceConnectorComponent as Component };\nexport default DataSourceConnector;\n","import createReactRenderer from '../react-renderer';\nimport EmptyDashboardComponent from './empty-dashboard-component';\n\nconst EmptyDashboard = createReactRenderer(EmptyDashboardComponent);\n\nexport default EmptyDashboard;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Modal from '../../../components/modal';\nimport Input from '../../../components/form/input';\nimport TextArea from '../../../components/form/text-area';\nimport Label from '../../../components/form/label';\nimport Button from '@UI/button';\nimport Layout, { Row, Column } from '../../../components/layout';\nimport {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from '../../../components/modal';\n\nimport style from './integration-request-modal-style.scss';\n\nclass IntegrationRequestModalComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.handleClose = this.handleClose.bind(this);\n\n    this.state = {\n      name: undefined,\n      description: undefined,\n    };\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n    this.props.onSubmit(this.state);\n    this.clearState();\n  }\n\n  handleClose() {\n    this.props.onClose();\n    this.clearState();\n  }\n\n  render() {\n    return (\n      <Modal onClose={this.handleClose} visible={this.props.visible}>\n        <div className={style.modalContent}>\n          <ModalSection>\n            <ModalHeading>Integration request</ModalHeading>\n            <ModalText>\n              Can't see the integration you're looking for? Let us know. Your\n              input helps us decide what to build next.\n            </ModalText>\n            <form onSubmit={this.handleSubmit}>\n              <Layout marginTop={1}>\n                <Label htmlFor=\"integration-name\">Integration name</Label>\n                <Input\n                  onChange={({ value: name }) => {\n                    this.setState({ name });\n                  }}\n                  name=\"integration-name\"\n                  value={this.state.name}\n                />\n              </Layout>\n              <Layout marginTop={1}>\n                <Label htmlFor=\"integration-description\">\n                  What data would you like to display, and how?\n                </Label>\n                <TextArea\n                  onChange={({ value: description }) => {\n                    this.setState({ description });\n                  }}\n                  name=\"integration-description\"\n                  value={this.state.description}\n                />\n              </Layout>\n              <Row marginTop={2} justify=\"flex-end\">\n                <Column>\n                  <Button\n                    intent={Button.INTENT.SECONDARY}\n                    onClick={this.props.onClose}\n                  >\n                    Cancel\n                  </Button>\n                </Column>\n                <Column marginLeft={1}>\n                  <Button type={Button.TYPES.SUBMIT}>Submit</Button>\n                </Column>\n              </Row>\n            </form>\n          </ModalSection>\n        </div>\n      </Modal>\n    );\n  }\n\n  clearState() {\n    this.setState({\n      name: undefined,\n      description: undefined,\n    });\n  }\n}\n\nIntegrationRequestModalComponent.defaultProps = {\n  visible: false,\n};\n\nIntegrationRequestModalComponent.propTypes = {\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onSubmit: PropTypes.func,\n};\n\nexport default IntegrationRequestModalComponent;\n","import IntegrationRequestModalComponent from './integration-request-modal-component';\nexport default IntegrationRequestModalComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport IntegrationRequestModal from './components/integration-request-modal';\n\nclass IntegrationRequestComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.handleSubmitModal = this.handleSubmitModal.bind(this);\n    this.handleOpenModal = this.handleOpenModal.bind(this);\n    this.handleCloseModal = this.handleCloseModal.bind(this);\n\n    this.state = { showRequestModal: false };\n  }\n\n  handleSubmitModal(data) {\n    this.props.onSubmitIntegrationRequest(data);\n    this.setState({ showRequestModal: false });\n  }\n\n  handleOpenModal(e) {\n    e.preventDefault();\n    this.setState({ showRequestModal: true });\n  }\n\n  handleCloseModal() {\n    this.setState({ showRequestModal: false });\n  }\n\n  render() {\n    return (\n      <span>\n        <a href=\"#\" onClick={this.handleOpenModal}>\n          {this.props.label}\n        </a>\n        <IntegrationRequestModal\n          visible={this.state.showRequestModal}\n          onSubmit={this.handleSubmitModal}\n          onClose={this.handleCloseModal}\n        />\n      </span>\n    );\n  }\n}\n\nIntegrationRequestComponent.propTypes = {\n  label: PropTypes.string,\n  onSubmitIntegrationRequest: PropTypes.func,\n};\n\nexport default IntegrationRequestComponent;\n","import { connect } from 'react-redux';\nimport IntegrationRequestComponent from './integration-request-component';\nimport { submitIntegrationRequest } from '../services/management-service';\nimport * as toastActions from '../toast/actions';\n\nconst IntegrationRequestConnector = connect(undefined, dispatch => {\n  return {\n    onSubmitIntegrationRequest: data => {\n      const { name, description } = data;\n      const serviceRequest = {\n        service_name: name,\n        details: description,\n      };\n\n      submitIntegrationRequest(serviceRequest)\n        .then(() => {\n          dispatch(toastActions.showSuccessToast('Request sent. Thanks'));\n        })\n        .catch(() => {\n          dispatch(toastActions.showGenericErrorToast());\n        });\n    },\n  };\n})(IntegrationRequestComponent);\n\nexport default IntegrationRequestConnector;\n","import WidgetTypePageComponent from './widget-type-page-component';\nexport default WidgetTypePageComponent;\n","import React from 'react';\nimport IntegrationRequestConnector from '../../integration-request-connector';\n\nimport style from './widget-type-page-style.scss';\n\n// TODO Remove once WidgetType page is migrated to polecat\nconst WidgetTypePageComponent = () => {\n  return (\n    <p className={style.integrationRequest}>\n      Can't find the widget you're looking for?{' '}\n      <IntegrationRequestConnector label=\"Send a request\" />.\n    </p>\n  );\n};\n\nexport default WidgetTypePageComponent;\n","import createReactRenderer from '../react-renderer';\nimport IntegrationRequestConnector from './integration-request-connector';\nimport WidgetTypePageIntegrationRequest from './components/widget-type-page';\n\n// TODO Remove once WidgetType page is migrated to polecat\nconst IntegrationRequest = createReactRenderer(\n  WidgetTypePageIntegrationRequest,\n);\n\nexport { IntegrationRequestConnector as default, IntegrationRequest };\n","import PropTypes from 'prop-types';\nimport { Query } from 'react-apollo';\nimport React, { Component } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { bindAll } from 'lodash';\nimport DropMenu from '../../components/menu-legacy/drop-menu';\nimport DropLink from '../../components/menu-legacy/drop-link';\nimport DropItem from '../../components/menu-legacy/drop-item';\nimport Button from '@UI/button';\nimport Layout from '../../components/layout';\nimport ExternalLink from '../../components/external-link';\nimport FormattedMessage from '../../lib/i18n';\nimport { LAYOUT_TYPES } from '../../dashboard/dashboard-layout/constants';\nimport { Dashboards } from '../../services/concierge-service/graphql/dashboards-query.graphql';\n\nimport styles from './dashboard-picker-style.scss';\n\nconst MARKETING_EXAMPLES_LINK =\n  'https://www.geckoboard.com/learn/dashboard-examples';\n\nconst makeLegacyDashboard = item => {\n  const {\n    layoutType: { __typename: layoutType },\n    legacyId,\n    id: newId,\n    title: name,\n  } = item;\n\n  const id = layoutType === LAYOUT_TYPES.ContainerLayout ? newId : legacyId;\n  const shouldReload = layoutType === LAYOUT_TYPES.ContainerLayout;\n\n  return {\n    name,\n    id,\n    shouldReload,\n  };\n};\n\nclass DashboardPickerComponent extends Component {\n  constructor(props) {\n    super(props);\n    bindAll(this, 'renderDashboardItem', 'handleResize', 'renderGroupItem');\n  }\n\n  componentDidMount() {\n    // Handles the event in which this component is removed and added again (ie. opening Customize)\n    this.handleResize();\n\n    window.addEventListener('resize', this.handleResize);\n  }\n\n  componentDidUpdate() {\n    this.handleResize();\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.handleResize);\n  }\n\n  handleResize() {\n    // Resize the dashboard picker to fit the viewport when scrolling is required\n    if (this.refs.dashboardList && this.refs.dashboardListContainer) {\n      const domList = findDOMNode(this.refs.dashboardList);\n      const domContainer = findDOMNode(this.refs.dashboardListContainer);\n\n      domList.style.height = 'auto';\n\n      const height = domContainer.clientHeight;\n      // Menu height - Toggle height - Add dashboard button height\n      domList.style.height = `${height - 50 - 51}px`;\n    }\n  }\n\n  renderDashboardItem(dashboard) {\n    const { label, name, id, isActive, shouldReload } = dashboard;\n\n    if (label) {\n      return this.renderGroupItem(dashboard);\n    }\n\n    const className = isActive ? 'active' : '';\n\n    return (\n      <DropLink\n        className={className}\n        key={id}\n        data-action={shouldReload ? undefined : 'navigate'}\n        href={`/edit/dashboards/${id}`}\n      >\n        {name}\n      </DropLink>\n    );\n  }\n\n  renderExampleHint() {\n    if (!this.props.showTrialCountdown) {\n      return null;\n    }\n\n    return (\n      <Layout\n        tag=\"li\"\n        padding={1}\n        margin={0.5}\n        className={styles.dashboardLinkWrapper}\n      >\n        <ExternalLink\n          href={MARKETING_EXAMPLES_LINK}\n          eventName=\"Dashboard list - Clicked dashboard examples\"\n          className={styles.link}\n        >\n          <div className={styles.heading}>\n            <i className=\"fa fa-lightbulb\" />\n            <FormattedMessage id=\"masthead.dashboardPicker.exampleLinkHeading\" />\n          </div>\n          <p className={styles.body}>\n            <FormattedMessage id=\"masthead.dashboardPicker.exampleLinkBody\" />\n            <i className=\"fa fa-angle-right\" />\n          </p>\n        </ExternalLink>\n      </Layout>\n    );\n  }\n\n  renderGroupItem(group) {\n    const key = group.dashboards.map(d => d.id).join('-');\n    return (\n      <li key={key}>\n        <h3>{group.label}</h3>\n        <ul role=\"menu\">{group.dashboards.map(this.renderDashboardItem)}</ul>\n      </li>\n    );\n  }\n\n  render() {\n    const {\n      dashboardId: activeDashboardId,\n      onAddDashboard,\n      canEdit,\n    } = this.props;\n    let { dashboards } = this.props;\n    let addDashboardButton;\n\n    if (!dashboards) {\n      return null;\n    }\n\n    if (canEdit) {\n      addDashboardButton = (\n        <DropItem className=\"masthead-dashboard-add\">\n          <Button icon=\"plus\" size=\"small\" stretched onClick={onAddDashboard}>\n            <FormattedMessage id=\"masthead.dashboardPicker.addDashboard\" />\n          </Button>\n        </DropItem>\n      );\n    }\n\n    dashboards = dashboards // eslint-disable-line no-shadow\n      .map(function present(dashboard) {\n        const {\n          id,\n          name,\n          label,\n          dashboards, // eslint-disable-line no-shadow\n          shouldReload,\n          layoutType,\n        } = dashboard;\n        if (dashboards) {\n          return { label, dashboards: dashboards.map(present) };\n        }\n\n        return {\n          id,\n          layoutType,\n          name,\n          shouldReload,\n          isActive: id.toString() === activeDashboardId,\n        };\n      })\n      .map(this.renderDashboardItem);\n\n    return (\n      <DropMenu\n        label=\"Dashboards\"\n        className=\"drop-menu-picker masthead-dashboard-picker\"\n        toggleClassName=\"fa fa-bars\"\n      >\n        <li className=\"drop-menu-picker-list\" ref=\"dashboardListContainer\">\n          <ul ref=\"dashboardList\">\n            {dashboards}\n            {this.renderExampleHint()}\n          </ul>\n        </li>\n        {addDashboardButton}\n      </DropMenu>\n    );\n  }\n}\n\nDashboardPickerComponent.propTypes = {\n  canEdit: PropTypes.bool,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  dashboards: PropTypes.array,\n  showTrialCountdown: PropTypes.bool,\n  onAddDashboard: PropTypes.func,\n};\n\nconst DashboardPickerWithDashboardsQuery = ({ ...props }) => {\n  return (\n    <Query query={Dashboards}>\n      {({ data }) => {\n        if (!data || !data.dashboards) {\n          return null;\n        }\n\n        return (\n          <DashboardPickerComponent\n            {...props}\n            dashboards={data.dashboards.map(makeLegacyDashboard)}\n          />\n        );\n      }}\n    </Query>\n  );\n};\n\nexport { DashboardPickerComponent };\nexport default DashboardPickerWithDashboardsQuery;\n","import DashboardPicker from './dashboard-picker-component';\nexport default DashboardPicker;\n","import PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { isUndefined } from 'lodash';\nimport { isAccountOwner, isGroupAdmin } from '../lib/user-permissions';\n\nconst AccountOwnerOrGroupAdmin = ({ user, children, fallback }) => {\n  if (isUndefined(user)) {\n    return null;\n  }\n\n  const isAccountOwnerOrGroupAdmin = isAccountOwner(user) || isGroupAdmin(user);\n\n  if (!isAccountOwnerOrGroupAdmin) {\n    return fallback ? fallback() : null;\n  }\n\n  return children;\n};\n\nAccountOwnerOrGroupAdmin.propTypes = {\n  children: PropTypes.node,\n  fallback: PropTypes.func,\n  user: PropTypes.object,\n};\n\nconst AccountOwnerOrGroupAdminConnector = connect(state => {\n  const {\n    user: { user },\n  } = state;\n  return { user };\n})(AccountOwnerOrGroupAdmin);\n\nexport default AccountOwnerOrGroupAdminConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport classnames from 'classnames';\nimport DropMenu from '../../components/menu/drop-menu';\nimport DropItem from '../../components/menu/drop-item';\nimport DropItemWithDescription from '../../components/menu/drop-item-with-description';\nimport WhatsNew from '../../whats-new';\nimport AccountOwnerOrGroupAdmin from '../../hoc/account-owner-or-group-admin';\nimport { getInitials } from '../../lib/user';\nimport FormattedMessage from '../../lib/i18n';\nimport { includes } from 'lodash';\nimport { useFeatureFlags } from '@Hooks';\n\nimport styles from './account-menu-style.scss';\n\nconst AccountMenuComponent = props => {\n  const { flags } = useFeatureFlags();\n\n  const {\n    adminLink,\n    currentUserIsOwner,\n    firstName,\n    lastName,\n    canUpgrade,\n    showNotification,\n    etag,\n    onCloseMenu,\n  } = props;\n  const userInitials = getInitials(firstName, lastName);\n  const classes = classnames(styles.accountMenu, {\n    notification: showNotification,\n  });\n  const accountLinkDescriptionId = currentUserIsOwner\n    ? 'account.menu.accountDescription'\n    : 'account.menu.accountDescriptionShort';\n\n  return (\n    <DropMenu\n      label={\n        <div className={styles.userInitialsCircle}>\n          <span className={styles.userInitials}>{userInitials}</span>\n        </div>\n      }\n      layoutClassName={classes}\n      onClose={() => {\n        showNotification && onCloseMenu(etag);\n      }}\n    >\n      {!includes(flags, 'create_groups') && (\n        <AccountOwnerOrGroupAdmin>\n          <DropItemWithDescription\n            label={<FormattedMessage id=\"account.menu.adminLink\" />}\n            description={\n              <FormattedMessage id=\"account.menu.adminDescription\" />\n            }\n            isLink\n            linkClass={styles.link}\n            linkHref={adminLink}\n            hasBottomDivider\n          />\n        </AccountOwnerOrGroupAdmin>\n      )}\n\n      <DropItemWithDescription\n        label={<FormattedMessage id=\"account.menu.accountLink\" />}\n        description={<FormattedMessage id={accountLinkDescriptionId} />}\n        isLink\n        linkClass={styles.link}\n        linkHref={'/account'}\n        hasBottomDivider\n      />\n      {canUpgrade && (\n        <DropItem layoutClassName={styles.item} isSmall>\n          <a href={'/account/plans'} rel=\"nofollow\" className={styles.link}>\n            <FormattedMessage id=\"account.menu.upgradeLink\" />\n          </a>\n        </DropItem>\n      )}\n      <WhatsNew showNotification={showNotification} etag={etag} />\n      <DropItem layoutClassName={styles.item} isSmall>\n        <a href={'/logout'} rel=\"nofollow\" className={styles.link}>\n          <FormattedMessage id=\"account.menu.logoutLink\" />\n        </a>\n      </DropItem>\n    </DropMenu>\n  );\n};\n\nAccountMenuComponent.propTypes = {\n  adminLink: PropTypes.string,\n  canUpgrade: PropTypes.bool,\n  currentUserIsOwner: PropTypes.bool,\n  etag: PropTypes.string,\n  firstName: PropTypes.string,\n  lastName: PropTypes.string,\n  showAdmin: PropTypes.bool,\n  showNotification: PropTypes.bool,\n  onCloseMenu: PropTypes.func,\n};\n\nexport default AccountMenuComponent;\n","import AccountMenuConnector from './account-menu-connector';\nexport default AccountMenuConnector;\n","import { connect } from 'react-redux';\nimport AccountMenuComponent from './account-menu-component';\nimport { markAsRead } from '../../whats-new/whats-new-actions/whats-new-actions';\nimport { isAccountOwner } from '../../lib/user-permissions';\n\nconst mapStateToProps = state => {\n  const {\n    whatsNew: { showNotification },\n    user: { user = {} },\n  } = state;\n  const { whats_new_etag: etag, default_group_id: groupId } = user;\n  const adminLink = `/admin/groups/${groupId}`;\n  const currentUserIsOwner = isAccountOwner(user);\n\n  return {\n    showNotification,\n    etag,\n    adminLink,\n    currentUserIsOwner,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onCloseMenu: etag => dispatch(markAsRead(etag)),\n});\n\nconst AccountMenuConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(AccountMenuComponent);\n\nexport default AccountMenuConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../lib/i18n';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { get, includes } from 'lodash';\nimport { useIsFreePlan } from '@Hooks';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\nimport * as manageScreensActions from '../../manage-screens/actions/manage-screens-actions';\nimport { router } from '../../router';\nimport { TRIAL_MODAL_ROUTES } from '../../components/trial-modal';\nimport { useLocation } from 'react-router';\n\nimport style from '../base-masthead/base-masthead-style.scss';\n\nconst ScreensButton = () => {\n  const dispatch = useDispatch();\n  const user = useSelector(state => get(state, 'user.user')) || {};\n  const isFreePlan = useIsFreePlan();\n  const location = useLocation();\n\n  const handleOnClick = () => {\n    track('Header - Click Screens');\n    trackEvent(buttonClicked({ 'Button identifier': 'Header - Send to TV' }));\n\n    if (isFreePlan) {\n      router.navigate(`${location.pathname}/trial/${TRIAL_MODAL_ROUTES.TV}`);\n      return;\n    }\n\n    const { features = [], allowances = {} } = user;\n\n    if (\n      allowances.screens ||\n      includes(features, 'add_screens_to_legacy_plan')\n    ) {\n      dispatch(manageScreensActions.openModalAndFetchDevices());\n    } else {\n      dispatch(manageScreensActions.openUpgradeModal());\n    }\n  };\n\n  return (\n    <button className={`bttn ${style.mastheadButton}`} onClick={handleOnClick}>\n      <FormattedMessage id=\"masthead.addScreen.openModalButton\" />\n    </button>\n  );\n};\n\nScreensButton.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default ScreensButton;\n","import ScreensButtonConnector from './screens-button';\n\nexport default ScreensButtonConnector;\n","import { connect } from 'react-redux';\nimport ManageScreens from './manage-screens-component';\nimport * as actions from '../actions/manage-screens-actions';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  screenChangedContent,\n  screenDeleted,\n  screenRefreshed,\n  screenRenamed,\n  buttonClicked,\n} from '@Tracking/events';\nimport { redirect } from '../../lib/global';\nimport { router } from '../../router';\nimport { chain } from 'lodash';\n\nconst mapStateToProps = state => {\n  const {\n    manageScreens,\n    allDashboards,\n    allLoops,\n    user: { user: { default_group_id: groupId, toggles = [] } = {} },\n  } = state;\n\n  const isLiteEnabled = toggles.includes('lite');\n\n  return {\n    ...manageScreens,\n    dashboards: chain(allDashboards)\n      .values()\n      .sortBy('title')\n      .value(),\n    sharingLoops: chain(allLoops)\n      .values()\n      .sortBy('title')\n      .value(),\n    groupId,\n    isLiteEnabled,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  return {\n    onClose: () => {\n      dispatch(actions.closeModal());\n    },\n    onConnect: code => {\n      track('Screens - Setup - Click connect');\n      trackEvent(\n        buttonClicked({\n          'Button identifier': 'Screens - Setup - Connect',\n        }),\n      );\n      dispatch(actions.connectDevice(code, ownProps.dashboardId));\n    },\n    onShowAddView: () => {\n      track('Screens - Manage - Click Add Another');\n      trackEvent(\n        buttonClicked({\n          'Button identifier': 'Screens - Manage - Add another',\n        }),\n      );\n      dispatch(actions.setView('add'));\n    },\n    onShowManageView: () => {\n      track('Screens - Add - Click Manage Screens');\n      dispatch(actions.setView('manage'));\n    },\n    onUpgradeLinkClick: () => {\n      track('Screens - Upgrade modal - Clicked Upgrade');\n      redirect('/account/plans');\n    },\n    onDeleteDevice: id => {\n      track('Screens - Manage - Removed screen');\n      trackEvent(\n        screenDeleted({\n          'Screen ID': id,\n        }),\n      );\n      dispatch(actions.deleteDevice(id));\n    },\n    onRefreshDevice: id => {\n      track('Screens - Manage - Refresh screen');\n      trackEvent(\n        screenRefreshed({\n          'Screen ID': id,\n        }),\n      );\n      dispatch(actions.refreshDevice(id));\n    },\n    onSetDeviceName: (id, name) => {\n      track('Screens - Manage - Renamed screen');\n      trackEvent(\n        screenRenamed({\n          'Screen ID': id,\n        }),\n      );\n      dispatch(actions.setDeviceName(id, name));\n    },\n    onSetDeviceConnection: (id, dashboardId, type) => {\n      track('Screens - Manage - Change dashboard');\n      trackEvent(\n        screenChangedContent({\n          'Screen ID': id,\n          'Screen content type': type,\n        }),\n      );\n      dispatch(actions.setDeviceConnection(id, dashboardId, type));\n    },\n    onCreateLoop: groupId => {\n      dispatch(actions.closeModal());\n      router.setQueryParam('addLoop', groupId);\n    },\n    onToggleLite: enabled => {\n      dispatch(actions.toggleLite(enabled));\n    },\n  };\n};\n\nconst ManageScreensConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(ManageScreens);\n\nexport default ManageScreensConnector;\n","import ManageScreens from './manage-screens-connector';\nexport default ManageScreens;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ToastLauncher from '../toast/components/toast-launcher';\nimport AddScreenModal from '../manage-screens/components';\nimport TrialModal from '../components/trial-modal';\nimport FirstRun from '../first-run';\n\nconst App = ({ dashboardId, children }) => {\n  return (\n    <div>\n      {children}\n      <ToastLauncher dashboardId={dashboardId} />\n      <AddScreenModal dashboardId={dashboardId} />\n      <FirstRun />\n      <TrialModal />\n    </div>\n  );\n};\n\nApp.propTypes = {\n  children: PropTypes.node,\n  dashboardId: PropTypes.string,\n};\n\nexport default App;\n","import { getWindow } from '../global';\n\nconst unsupportedRegex = /; Trident\\/[0-9.]+/;\n\nconst isUnsupportedBrowserFromUserAgent = userAgent => {\n  return unsupportedRegex.test(userAgent);\n};\n\nconst isUnsupportedBrowser = isUnsupportedBrowserFromUserAgent(\n  getWindow().navigator.userAgent,\n);\n\nexport default isUnsupportedBrowser;\nexport { isUnsupportedBrowserFromUserAgent };\n","import App from './app-component';\nexport default App;\n","import isUnsupportedBrowser from './is-unsupported-browser';\nexport default isUnsupportedBrowser;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport style from './warning-pill-style.scss';\n\nconst WarningPill = ({ onClick, children }) => {\n  return (\n    <div className={style.warningPill} onClick={onClick}>\n      {children}\n    </div>\n  );\n};\n\nWarningPill.propTypes = {\n  onClick: PropTypes.func.isRequired,\n  children: PropTypes.node,\n};\n\nexport default WarningPill;\n","import WarningPill from './warning-pill-component.js';\nexport default WarningPill;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../lib/i18n';\nimport { Row, Column } from '../../components/layout';\nimport Button from '@UI/button';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from '../../components/modal';\n\nconst UnsupportedBrowserModal = ({ isVisible, onClose }) => {\n  return (\n    <Modal visible={isVisible} onClose={onClose}>\n      <ModalSection>\n        <ModalHeading>\n          <FormattedMessage id=\"unsupported.unsupportedBrowser\" />\n        </ModalHeading>\n        <ModalText>\n          <FormattedHTMLMessage id=\"unsupported.warningMessage\" />\n        </ModalText>\n        <Row marginTop={2} justify=\"flex-end\">\n          <Column>\n            <Button onClick={onClose} intent={Button.INTENT.SECONDARY}>\n              <FormattedMessage id=\"unsupported.done\" />\n            </Button>\n          </Column>\n        </Row>\n      </ModalSection>\n    </Modal>\n  );\n};\n\nUnsupportedBrowserModal.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  isVisible: PropTypes.bool,\n};\n\nexport default UnsupportedBrowserModal;\n","import UnsupportedBrowserModal from './unsupported-browser-modal-component';\nexport default UnsupportedBrowserModal;\n","import Unsupported from './unsupported-component';\nexport default Unsupported;\n","import React, { Component } from 'react';\nimport isUnsupportedBrowser from '../lib/is-unsupported-browser';\nimport FormattedMessage from '../lib/i18n';\nimport WarningPill from '../components/warning-pill';\nimport UnsupportedBrowserModal from './unsupported-browser-modal';\n\n// This currently uses local state to track the modal visibility.\n// We can move this into Redux if that would be useful.\nclass Unsupported extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isVisible: false,\n    };\n  }\n\n  handleOpen() {\n    this.setState({ isVisible: true });\n  }\n\n  handleClose() {\n    this.setState({ isVisible: false });\n  }\n\n  render() {\n    const { isVisible } = this.state;\n\n    if (!isUnsupportedBrowser) {\n      return null;\n    }\n\n    return (\n      <WarningPill onClick={() => this.handleOpen()}>\n        <FormattedMessage id=\"masthead.unsupportedBrowser\" />\n        <UnsupportedBrowserModal\n          isVisible={isVisible}\n          onClose={() => this.handleClose()}\n        />\n      </WarningPill>\n    );\n  }\n}\n\nexport default Unsupported;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { injectIntl } from 'react-intl';\nimport Layout, { Row, Column } from '../../../../components/layout';\nimport Input from '../../../../components/form/input';\nimport Button from '@UI/button';\nimport Icon from '@UI/icon';\nimport DropMenu from '../../../../components/menu/drop-menu';\nimport DropItemWithDescription from '../../../../components/menu/drop-item-with-description';\nimport DropMenuSelectLabel from '../../../../components/menu/drop-menu-select-label';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../../../lib/i18n';\n\nimport style from '../admin-modal.scss';\n\nconst renderError = error => {\n  if (!error) {\n    return null;\n  }\n\n  return (\n    <div className={style.error}>\n      <FormattedHTMLMessage id={error.id} values={error.values} />\n    </div>\n  );\n};\n\nclass InviteMembersFormComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.handleInputChange = this.handleInputChange.bind(this);\n    this.handlePermissionChange = this.handlePermissionChange.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n\n    this.state = {\n      addresses: '',\n      permission: 'read_only',\n    };\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n\n    const { addresses, permission } = this.state;\n\n    this.props.onInvite(addresses, permission);\n  }\n\n  handlePermissionChange(value) {\n    this.setState({ permission: value });\n  }\n\n  handleInputChange({ value }) {\n    this.setState({ addresses: value });\n  }\n\n  render() {\n    const { intl, loadingInvite, onClose, error } = this.props;\n    const { addresses, permission } = this.state;\n\n    const menuLabelId =\n      permission === 'read_only'\n        ? 'groups.people.permissions.readOnly'\n        : 'groups.people.permissions.admin';\n\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className={style.inputContainer}>\n          <Layout marginBottom={0.5}>\n            <Layout flex>\n              <Column flexAuto>\n                <Input\n                  placeholder={intl.formatMessage({\n                    id: 'groups.people.emailPlaceholder',\n                  })}\n                  name=\"addresses\"\n                  value={addresses}\n                  onChange={this.handleInputChange}\n                  hasError={!!error}\n                  autoFocus\n                />\n                {renderError(error)}\n              </Column>\n              <Column marginLeft={0.5}>\n                <DropMenu\n                  origin=\"bottom left\"\n                  label={\n                    <DropMenuSelectLabel>\n                      <FormattedMessage id={menuLabelId} />\n                    </DropMenuSelectLabel>\n                  }\n                  isAnchored={false}\n                >\n                  <DropItemWithDescription\n                    label={\n                      <FormattedMessage id=\"groups.people.permissions.admin\" />\n                    }\n                    description={\n                      <FormattedMessage id=\"groups.people.permissions.adminDescription\" />\n                    }\n                    value={'admin'}\n                    selected={permission === 'admin'}\n                    handleClick={this.handlePermissionChange}\n                  />\n                  <DropItemWithDescription\n                    label={\n                      <FormattedMessage id=\"groups.people.permissions.readOnly\" />\n                    }\n                    description={\n                      <FormattedMessage id=\"groups.people.permissions.readOnlyDescription\" />\n                    }\n                    value={'read_only'}\n                    selected={permission === 'read_only'}\n                    handleClick={this.handlePermissionChange}\n                  />\n                </DropMenu>\n              </Column>\n            </Layout>\n          </Layout>\n          <div className={style.muted}>\n            <FormattedMessage id=\"people.commaSeparate\" />\n          </div>\n        </div>\n        <Row marginTop={2} justify=\"flex-end\">\n          <Column flexAuto align=\"flex-start\" justify=\"center\">\n            <a href=\"/admin/people\" className={style.manageLink}>\n              <span className={style.manageLinkIcon}>\n                <Icon name=\"cog\" />\n              </span>\n              <FormattedMessage id=\"people.managePeople\" />\n            </a>\n          </Column>\n          <Column>\n            <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n              <FormattedMessage id=\"button.cancel\" />\n            </Button>\n          </Column>\n          <Column marginLeft={1}>\n            <Button type={Button.TYPES.SUBMIT} loading={loadingInvite}>\n              <FormattedMessage id=\"people.sendInvite\" />\n            </Button>\n          </Column>\n        </Row>\n      </form>\n    );\n  }\n}\n\nInviteMembersFormComponent.propTypes = {\n  onInvite: PropTypes.func.isRequired,\n  error: PropTypes.shape({\n    id: PropTypes.string.isRequired,\n    values: PropTypes.object,\n  }),\n  intl: PropTypes.object,\n  loadingInvite: PropTypes.bool,\n  onClose: PropTypes.func,\n};\n\nexport default injectIntl(InviteMembersFormComponent);\n","import PropTypes from 'prop-types';\nimport { noop } from 'lodash';\nimport React, { PureComponent } from 'react';\nimport Modal from '../../../../components/modal';\nimport {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from '../../../../components/modal';\nimport Button from '@UI/button';\nimport Image from '@UI/image';\nimport { trackEvent } from '@Tracking';\nimport { invitationSent } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\nimport FormattedMessage from '../../../../lib/i18n';\nimport { redirect } from '../../../../lib/global';\nimport config from '../../../../universal/config';\nimport InviteMembersFormComponent from './invite-members-form-component';\nimport PricingGate from '../../../../components/pricing-gate';\n\nimport style from '../admin-modal.scss';\n\nclass InviteMembersModalComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n    this.handleInvite = this.handleInvite.bind(this);\n  }\n\n  componentDidUpdate(prevProps) {\n    // If modal was hidden and becomes visible, we need to clear the error state\n    if (this.props.isVisible && !prevProps.isVisible) {\n      this.props.onShow();\n    }\n  }\n\n  handleInvite(addresses, permission) {\n    const { onInvite, isAdminPage } = this.props;\n\n    onInvite(addresses, permission);\n    trackEvent(\n      invitationSent({\n        Location: isAdminPage\n          ? LOCATIONS.AdminInviteModal\n          : LOCATIONS.HeaderPeopleModal,\n      }),\n    );\n  }\n\n  renderInviteModal() {\n    const {\n      groupName,\n      groupId,\n      isVisible,\n      error,\n      onClose,\n      loadingInvite,\n    } = this.props;\n\n    return (\n      <Modal visible={isVisible} onClose={onClose} hasCloseButton>\n        <ModalSection>\n          <div className={style.adminModal}>\n            <ModalHeading>{this.renderHeading(groupName)}</ModalHeading>\n            <div className={style.adminModalImage}>\n              <Image\n                src={`${\n                  config.get().StaticAssetBaseURL\n                }/images/gb-people-modal.svg`}\n                width={250}\n                height={250}\n              />\n            </div>\n            <ModalText>\n              <FormattedMessage id=\"groups.people.modalBody\" />\n            </ModalText>\n            <InviteMembersFormComponent\n              onClose={onClose}\n              error={error}\n              onInvite={this.handleInvite}\n              loadingInvite={loadingInvite}\n              groupId={groupId}\n            />\n          </div>\n        </ModalSection>\n      </Modal>\n    );\n  }\n\n  renderFeatureGate() {\n    const { isVisible, onClose } = this.props;\n\n    return (\n      <Modal visible={isVisible} onClose={onClose} hasCloseButton>\n        <div className={style.featureGateModal}>\n          <ModalHeading>\n            <strong>\n              <FormattedMessage id=\"featureGate.people.heading\" />\n            </strong>\n          </ModalHeading>\n          <p className={style.featureGateCopy}>\n            <FormattedMessage id=\"featureGate.people.text\" />\n          </p>\n          <div className={style.action}>\n            <Button stretched onClick={() => redirect('/account/plans')}>\n              <FormattedMessage id=\"featureGate.people.button\" />\n            </Button>\n          </div>\n        </div>\n      </Modal>\n    );\n  }\n\n  renderHeading(groupName) {\n    if (groupName) {\n      return (\n        <FormattedMessage\n          id=\"groups.people.modalHeading\"\n          values={{ groupName }}\n        />\n      );\n    }\n\n    return <FormattedMessage id=\"people.heading\" />;\n  }\n\n  render() {\n    return (\n      <PricingGate name=\"users\" allowance=\"max_users\" usage=\"users\">\n        {({ allowed }) =>\n          allowed ? this.renderInviteModal() : this.renderFeatureGate()\n        }\n      </PricingGate>\n    );\n  }\n}\n\nInviteMembersModalComponent.defaultProps = {\n  onInvite: noop,\n  isAdminPage: false,\n};\n\nInviteMembersModalComponent.propTypes = {\n  error: PropTypes.shape({\n    id: PropTypes.string.isRequired,\n    values: PropTypes.object,\n  }),\n  groupId: PropTypes.number,\n  groupName: PropTypes.string,\n  isAdminPage: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  loadingInvite: PropTypes.bool,\n  onClose: PropTypes.func,\n  onInvite: PropTypes.func,\n  onShow: PropTypes.func,\n};\n\nexport default InviteMembersModalComponent;\n","import { connect } from 'react-redux';\nimport { isUndefined } from 'lodash';\nimport connectToHistory from '../../../../hoc/connect-to-history';\nimport * as groupsActions from '../../../../groups/actions/groups-actions';\nimport { router } from '../../../../router';\nimport InviteMembersModal from './invite-members-modal-component';\n\nconst mapStateToProps = (state, props) => {\n  const { groupId } = props;\n\n  const { loadingInvite, inviteError } = state.admin;\n  const { user = {} } = state.user;\n\n  return {\n    loadingInvite,\n    error: inviteError,\n    groupName: user.company,\n    groupId,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { groupId } = props;\n\n  return {\n    onClose: () => {\n      router.removeQueryParam('invite');\n      router.removeQueryParam('invite-admin');\n    },\n    onInvite: (addresses, permission) => {\n      dispatch(groupsActions.inviteMembers(groupId, addresses, permission));\n    },\n    onShow: () => {\n      dispatch(groupsActions.inviteMembersClearError());\n    },\n  };\n};\n\nconst mapHistoryToProps = () => {\n  const invite = router.getQueryParam('invite');\n  const inviteAdmin = router.getQueryParam('invite-admin');\n\n  // eslint-disable-next-line\n  const groupId = !isUndefined(invite)\n    ? parseInt(invite, 10)\n    : !isUndefined(inviteAdmin)\n    ? parseInt(inviteAdmin, 10)\n    : undefined;\n\n  return {\n    isVisible: !isUndefined(invite) || !isUndefined(inviteAdmin),\n    isAdminPage: !isUndefined(inviteAdmin),\n    groupId,\n  };\n};\n\nconst InviteMembersModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(InviteMembersModal);\n\nconst InviteMembersModalHistoryConnector = connectToHistory(mapHistoryToProps)(\n  InviteMembersModalConnector,\n);\n\nexport default InviteMembersModalHistoryConnector;\nexport { InviteMembersModalConnector };\n","import InviteMembersModalConnector from './invite-members-modal-connector';\n\nexport default InviteMembersModalConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport FormattedMessage from '../../../../lib/i18n';\nimport { Column, Row } from '../../../../components/layout';\nimport MenuLabel from '../../../../components/menu/menu-label';\nimport DropMenu from '../../../../components/menu/drop-menu';\nimport DropItem from '../../../../components/menu/drop-item';\nimport SortableList from '../../../../components/sortable-list';\nimport SortableListItem from '../../../../components/sortable-list-item';\nimport { SortableHandle } from '../../../../components/sortable';\n\nconst LoopDashboardListComponent = ({ dashboards, onDelete, onMove }) => {\n  return (\n    <SortableList>\n      {dashboards.map((dashboard, index) => (\n        <SortableListItem\n          key={dashboard.id}\n          id={dashboard.id}\n          index={index}\n          onMove={onMove}\n        >\n          <Row flexFill align=\"center\">\n            <SortableHandle />\n            <Column\n              flexEqualWidth\n              justify=\"center\"\n              marginRight={1}\n              marginLeft={1}\n            >\n              {dashboard.title}\n            </Column>\n            <Row justify=\"flex-end\">\n              <Column flexNone justify=\"center\" align=\"flex-end\">\n                <DropMenu\n                  label={<MenuLabel />}\n                  origin=\"top left\"\n                  isAnchored={false}\n                >\n                  <DropItem onClick={() => onDelete(dashboard.id)} isSmall>\n                    <FormattedMessage id=\"loops.deleteDashboard\" />\n                  </DropItem>\n                </DropMenu>\n              </Column>\n            </Row>\n          </Row>\n        </SortableListItem>\n      ))}\n    </SortableList>\n  );\n};\n\nLoopDashboardListComponent.propTypes = {\n  onMove: PropTypes.func.isRequired,\n  dashboards: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.number,\n      title: PropTypes.string,\n    }),\n  ),\n  onDelete: PropTypes.func,\n};\n\nexport default LoopDashboardListComponent;\n","import LoopDashboardList from './loop-dashboard-list-component';\nexport default LoopDashboardList;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport update from 'immutability-helper';\nimport { chain, has, isUndefined, without, trim, first } from 'lodash';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n} from '../../../../components/modal';\nimport Layout, { Row, Column } from '../../../../components/layout';\nimport Button from '@UI/button';\nimport Label from '../../../../components/form/label';\nimport Input from '../../../../components/form/input';\nimport Select from '../../../../components/form/select';\nimport Icon from '@UI/icon';\nimport FormattedMessage from '../../../../lib/i18n';\nimport LoopDashboardList from '../loop-dashboard-list';\nimport Image from '@UI/image';\nimport config from '../../../../universal/config';\nimport { OnMount } from '../../../../hoc/on-mount';\nimport ConditionalLoadingIndicator from '../../../../components/conditional-loading-indicator/';\n\nimport style from './loop-modal-style.scss';\n\nconst MAX_LOOP_NAME_LENGTH = 50;\n\nconst LEGACY_INTERVAL_OPTIONS = {\n  10: { value: '10', text: '10 seconds' },\n  20: { value: '20', text: '20 seconds' },\n};\n\nclass LoopModalComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = this.applyDefaults(props.loop);\n\n    this.handleUpdate = this.handleUpdate.bind(this);\n    this.handleCreate = this.handleCreate.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.handleSelectDashboard = this.handleSelectDashboard.bind(this);\n    this.getAvailableDashboards = this.getAvailableDashboards.bind(this);\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.loop !== prevProps.loop) {\n      this.setState(this.applyDefaults(this.props.loop));\n    }\n  }\n\n  handleCreate() {\n    const { onCreate } = this.props;\n    const { loopName, interval, dashboardIds } = this.state;\n\n    onCreate({\n      title: loopName,\n      interval,\n      dashboard_ids: dashboardIds,\n    });\n  }\n\n  handleUpdate() {\n    const { onUpdate, loop } = this.props;\n    const { loopName, interval, dashboardIds } = this.state;\n\n    onUpdate({\n      title: loopName,\n      interval,\n      dashboard_ids: dashboardIds,\n      code: loop.code,\n    });\n  }\n\n  handleMove(dragIndex, hoverIndex) {\n    const { dashboardIds } = this.state;\n    const dashboardId = dashboardIds[dragIndex];\n\n    this.setState(\n      update(this.state, {\n        dashboardIds: {\n          $splice: [\n            [dragIndex, 1],\n            [hoverIndex, 0, dashboardId],\n          ],\n        },\n      }),\n    );\n  }\n\n  handleSubmit(e) {\n    e.preventDefault();\n\n    const dashboardIds = this.state.dashboardIds.concat(\n      this.state.selectedDashboardId,\n    );\n\n    const dashboards = this.getAvailableDashboards(dashboardIds);\n    const firstDashboard = first(dashboards) || {};\n\n    this.setState({\n      dashboardIds,\n      selectedDashboardId: firstDashboard.id,\n    });\n  }\n\n  handleSelectDashboard(_, id) {\n    this.setState({ selectedDashboardId: parseInt(id, 10) });\n  }\n\n  getAvailableDashboards(dashboardIds) {\n    const { allDashboards } = this.props;\n\n    return chain(allDashboards)\n      .omit(dashboardIds)\n      .values()\n      .sortBy(dashboard => dashboard.title.toLowerCase())\n      .value();\n  }\n\n  renderAddForm() {\n    const availableDashboardsList = this.getAvailableDashboards(\n      this.state.dashboardIds,\n    );\n\n    if (!availableDashboardsList.length) {\n      return (\n        <Layout marginTop={1} className={style.inputContainer}>\n          <FormattedMessage id=\"loops.noMoreDashboardsToAdd\" />\n        </Layout>\n      );\n    }\n\n    return (\n      <form name=\"addDashboard\" onSubmit={this.handleSubmit}>\n        <Row marginTop={1} className={style.inputContainer}>\n          <Column flexFill marginRight={0.5}>\n            <Select\n              name=\"addDashboardField\"\n              onChange={this.handleSelectDashboard}\n            >\n              {availableDashboardsList.map(({ id, title }) => (\n                <option key={id} value={id}>\n                  {title}\n                </option>\n              ))}\n            </Select>\n          </Column>\n          <Column>\n            <Button type={Button.TYPES.SUBMIT} intent={Button.INTENT.SECONDARY}>\n              <FormattedMessage id=\"button.add\" />\n            </Button>\n          </Column>\n        </Row>\n      </form>\n    );\n  }\n\n  renderLoopDashboardList() {\n    const { allDashboards } = this.props;\n    const { dashboardIds } = this.state;\n    const dashboards = dashboardIds.map(id => allDashboards[id] || { id });\n    if (dashboards.length === 0) {\n      const imageSrc = `${\n        config.get().StaticAssetBaseURL\n      }/images/empty-loop.png`;\n      return (\n        <div className={style.emptyLoops}>\n          <Image\n            className={style.emptyLoopsImage}\n            src={imageSrc}\n            width=\"360\"\n            height=\"132\"\n          />\n          <div>\n            <FormattedMessage id=\"loops.emptyLoop\" />\n          </div>\n        </div>\n      );\n    }\n    const onDelete = dashboardId => {\n      this.setState({\n        dashboardIds: without(this.state.dashboardIds, dashboardId),\n      });\n    };\n    return (\n      <LoopDashboardList\n        dashboards={dashboards}\n        onDelete={onDelete}\n        onMove={(dragIndex, hoverIndex) =>\n          this.handleMove(dragIndex, hoverIndex)\n        }\n      />\n    );\n  }\n\n  renderSubmitButton() {\n    if (!isUndefined(this.props.onUpdate)) {\n      return (\n        <Button onClick={this.handleUpdate} disabled={!this.canSave()}>\n          <FormattedMessage id=\"button.update\" />\n        </Button>\n      );\n    }\n    return (\n      <Button onClick={this.handleCreate} disabled={!this.canSave()}>\n        <FormattedMessage id=\"loops.createButton\" />\n      </Button>\n    );\n  }\n\n  renderIntervalSelect() {\n    const { interval } = this.state;\n\n    let intervalOptions = [\n      { value: '30', text: '30 seconds' },\n      { value: '60', text: '1 minute' },\n      { value: '120', text: '2 minutes' },\n      { value: '180', text: '3 minutes' },\n      { value: '300', text: '5 minutes' },\n    ];\n\n    if (has(LEGACY_INTERVAL_OPTIONS, interval)) {\n      // this currently works because the legacy options are all less than\n      // the current options. If that changes, we'll need some more\n      // elaborate logic\n      intervalOptions = [LEGACY_INTERVAL_OPTIONS[interval], ...intervalOptions];\n    }\n\n    const renderOptions = options => {\n      return options.map(op => (\n        <option key={op.value} value={op.value}>\n          {op.text}\n        </option>\n      ));\n    };\n    return (\n      <Layout marginLeft={0.5}>\n        <Label htmlFor=\"interval\">Interval</Label>\n        <Select\n          isFullWidth\n          name=\"interval\"\n          value={String(interval)}\n          onChange={(_, value) => {\n            this.setState({ interval: parseInt(value, 10) });\n          }}\n        >\n          {renderOptions(intervalOptions)}\n        </Select>\n      </Layout>\n    );\n  }\n\n  render() {\n    const {\n      isLoading,\n      visible,\n      showManageLink,\n      groupId,\n      onClose,\n      onMount,\n      modalHeading,\n    } = this.props;\n\n    return (\n      <Modal\n        hasCloseButton\n        visible={visible}\n        onClose={onClose}\n        isContentScrollable\n      >\n        <OnMount do={onMount} />\n        <ModalSection>\n          <div className={style.container}>\n            <ModalHeading>{modalHeading}</ModalHeading>\n            <ConditionalLoadingIndicator isLoading={isLoading} isDark>\n              <Row>\n                <Column col={8}>\n                  <Label htmlFor=\"loop-name\">\n                    <FormattedMessage id=\"loops.modal.loopName\" />\n                  </Label>\n                  <Input\n                    maxLength={MAX_LOOP_NAME_LENGTH}\n                    onChange={({ value: loopName }) => {\n                      this.setState({ loopName });\n                    }}\n                    name=\"loop-name\"\n                    value={this.state.loopName}\n                  />\n                </Column>\n                <Column col={4}>{this.renderIntervalSelect()}</Column>\n              </Row>\n              <Row marginTop={2}>{this.renderLoopDashboardList()}</Row>\n              {this.renderAddForm()}\n              <Row marginTop={2} justify=\"flex-end\">\n                {showManageLink && (\n                  <Column flexAuto align=\"flex-start\" justify=\"center\">\n                    <a\n                      href={`/admin/groups/${groupId}/loops`}\n                      className={style.manageLink}\n                    >\n                      <span className={style.manageLinkIcon}>\n                        <Icon name=\"cog\" />\n                      </span>\n                      <FormattedMessage id=\"loops.manageLoops\" />\n                    </a>\n                  </Column>\n                )}\n                <Column>\n                  <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n                    <FormattedMessage id=\"button.cancel\" />\n                  </Button>\n                </Column>\n                <Column marginLeft={1}>{this.renderSubmitButton()}</Column>\n              </Row>\n            </ConditionalLoadingIndicator>\n          </div>\n        </ModalSection>\n      </Modal>\n    );\n  }\n\n  applyDefaults(loop) {\n    const dashboards = this.getAvailableDashboards(loop.dashboard_ids);\n    const firstDashboard = first(dashboards) || {};\n\n    return {\n      selectedDashboardId: firstDashboard.id,\n      loopName: loop.title || '',\n      interval: loop.interval || 30,\n      dashboardIds: loop.dashboard_ids || [],\n    };\n  }\n\n  canSave() {\n    const { loopName, dashboardIds } = this.state;\n\n    return (\n      !isUndefined(loopName) && trim(loopName) !== '' && dashboardIds.length > 0\n    );\n  }\n}\n\nLoopModalComponent.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  onMount: PropTypes.func.isRequired,\n  allDashboards: PropTypes.object,\n  groupId: PropTypes.string,\n  isLoading: PropTypes.bool,\n  loop: PropTypes.object,\n  modalHeading: PropTypes.node,\n  showManageLink: PropTypes.bool,\n  visible: PropTypes.bool,\n  onCreate: PropTypes.func,\n  onUpdate: PropTypes.func,\n};\n\nLoopModalComponent.defaultProps = {\n  loop: {},\n  allDashboards: {},\n  showManageLink: true,\n};\n\nexport default LoopModalComponent;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { isUndefined, isEmpty } from 'lodash';\nimport LoopModal from '../loop-modal-component';\nimport connectToHistory from '../../../../../hoc/connect-to-history';\nimport FormattedMessage from '../../../../../lib/i18n';\nimport { router } from '../../../../../router';\nimport { createLoop } from '../../../../actions/loop-actions';\nimport { getDashboards } from '../../../../../groups/actions/groups-actions';\n\nconst mapStateToProps = state => {\n  const { allDashboards } = state;\n\n  const isLoading = isEmpty(allDashboards);\n\n  return {\n    modalHeading: <FormattedMessage id=\"loops.modal.addLoopHeading\" />,\n    isLoading,\n    allDashboards,\n    onClose: () => router.removeQueryParam('addLoop'),\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { groupId } = props;\n  return {\n    onMount: () => {\n      dispatch(getDashboards(groupId));\n    },\n    onCreate: loop => {\n      dispatch(createLoop({ ...loop, group_id: groupId }));\n    },\n  };\n};\n\nconst mapHistoryToProps = history => {\n  const { pathname } = history;\n  const groupId = router.getQueryParam('addLoop');\n\n  return {\n    groupId,\n    visible: !isUndefined(groupId),\n    showManageLink: pathname !== `/admin/groups/${groupId}/loops`,\n    loop: {}, // We reset the loop state whenever we navigate to clear the modal form state\n  };\n};\nconst AddLoopModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(LoopModal);\n\nconst AddLoopModalHistoryConnector = connectToHistory(mapHistoryToProps)(\n  AddLoopModalConnector,\n);\n\nexport default AddLoopModalHistoryConnector;\nexport { AddLoopModalConnector };\n","import AddLoopModalConnector from './add-loop-modal-connector';\nexport default AddLoopModalConnector;\n","import { connect } from 'react-redux';\nimport connectToHistory from '../../hoc/connect-to-history';\nimport { router } from '../../router';\nimport { redirect } from '../../lib/global';\nimport { isUndefined } from 'lodash';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport { createDashboard } from '../../dashboard/helpers/dashboard-helpers';\nimport AddDashboardModal from './add-dashboard-modal-component';\n\n// we're currently not able to test `connectToHistory` connectors :(\nconst mapHistoryToProps = () => ({\n  visible: !isUndefined(router.getQueryParam('addDashboard')),\n  onClose: () => router.removeQueryParam('addDashboard'),\n});\n\nconst mapStateToProps = state => {\n  const { user: { user = {}, organization = {} } = {} } = state;\n\n  return {\n    groupId: user.default_group_id,\n    orgId: organization.id,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => ({\n  createOnSubmitHandler: (defaultGroupId, orgId) => async ({\n    optimiseForTV = false,\n    groupId: selectedGroupId,\n  } = {}) => {\n    const groupId = selectedGroupId || defaultGroupId;\n\n    try {\n      const dashboard = await createDashboard(orgId, optimiseForTV, groupId);\n      redirect(`/edit/dashboards/${dashboard.id}`, 300);\n    } catch (e) {\n      props.onClose();\n      dispatch(toastActions.showGenericErrorToast());\n    }\n  },\n});\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { groupId, orgId, ...state } = stateProps;\n  const { createOnSubmitHandler, ...dispatch } = dispatchProps;\n\n  const onSubmit = createOnSubmitHandler(groupId, orgId);\n\n  return {\n    ...state,\n    ...dispatch,\n    onSubmit,\n    ...ownProps,\n  };\n};\n\nconst AddDashboardModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(AddDashboardModal);\n\nconst AddDashboardModalHistoryConnector = connectToHistory(mapHistoryToProps)(\n  AddDashboardModalConnector,\n);\n\nexport default AddDashboardModalHistoryConnector;\nexport { AddDashboardModalConnector };\n","import AddDashboardModal from './add-dashboard-modal-connector';\nexport default AddDashboardModal;\n","import React, { Component } from 'react';\nimport { bindAll, isUndefined } from 'lodash';\nimport { ApolloProvider } from 'react-apollo';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport apolloClient from '../../services/concierge-service/apollo-client';\nimport DashboardPicker from '../dashboard-picker';\nimport AccountMenu from '../account-menu';\nimport NavLogoButton from '../../components/nav-logo-button';\nimport ScreensButton from '../screens-button';\nimport { dispatchEvent } from '../../lib/dispatch-event';\nimport { getAttributeValue } from '../../lib/dom-helper';\nimport App from '../../app';\nimport FormattedMessage from '../../lib/i18n';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\nimport Unsupported from '../../unsupported';\nimport AccountOwnerOrGroupAdmin from '../../hoc/account-owner-or-group-admin';\nimport InviteMembersModal from '../../admin/components/modals/invite-members-modal';\nimport AddLoopModal from '../../admin/pages/loops-group-page/loop-modal/add-loop-modal';\nimport AddDashboardModal from '../../components/add-dashboard-modal';\nimport DashboardLimitModal from '../../components/dashboard-limit-modal';\nimport Popover from '../../components/popover';\nimport InAppHelp from '../../in-app-help';\nimport MastheadUpgradeLink from '../masthead-upgrade-link';\nimport { getDashboardPath } from '../../lib/path';\n\nimport style from './base-masthead-style.scss';\n\nfunction gatherEventProps(type, domSource) {\n  switch (type) {\n    case 'navigate':\n      return { type, href: domSource.getAttribute('href') };\n    default:\n      return { type };\n  }\n}\n\nclass BaseMastheadComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = { isHelpOpen: false };\n\n    bindAll(this, 'handleClick');\n  }\n\n  handleClick(e) {\n    const target = e.target;\n    const type = getAttributeValue(target, 'action');\n\n    if (type) {\n      e.preventDefault();\n      const detail = gatherEventProps(type, target);\n\n      dispatchEvent(this, 'action', detail);\n    }\n  }\n\n  renderPicker() {\n    const {\n      canEditOrganization,\n      dashboardId,\n      dashboards,\n      showTrialCountdown,\n      isViewingDashboard,\n      onAddDashboard,\n    } = this.props;\n\n    if (!isViewingDashboard) {\n      return null;\n    }\n\n    return (\n      <DashboardPicker\n        dashboardId={dashboardId}\n        dashboards={dashboards}\n        canEdit={canEditOrganization}\n        showTrialCountdown={showTrialCountdown}\n        onAddDashboard={onAddDashboard}\n      />\n    );\n  }\n\n  render() {\n    const classes = classNames('masthead', this.props.className);\n    const {\n      dashboardId,\n      firstName,\n      lastName,\n      canUpgrade,\n      children,\n      groupId,\n      isViewingDashboard,\n      showSwitchToMobile,\n      onSwitchToMobileView,\n      showTrialCountdown,\n      trialDaysRemaining,\n      showUpgradeLink,\n      onUpgradeLinkClick,\n      isFreePlanUser,\n    } = this.props;\n\n    const stringifiedDashboardId = isUndefined(dashboardId)\n      ? undefined\n      : `${dashboardId}`;\n    const backToDashboardPath = dashboardId\n      ? `${getDashboardPath(dashboardId)}`\n      : '/';\n    const helpButtonClasses = classNames(style.mastheadButton, style.help, {\n      [style.closeHelp]: this.state.isHelpOpen,\n    });\n\n    return (\n      <App dashboardId={stringifiedDashboardId}>\n        <div id=\"base-masthead\" className={classes} onClick={this.handleClick}>\n          <div className={style.mastheadTopWrapper}>\n            <NavLogoButton\n              href={backToDashboardPath}\n              showBackButton={!isViewingDashboard}\n            />\n            {this.renderPicker()}\n            <nav className=\"masthead-menu\">\n              {showSwitchToMobile && (\n                <span\n                  className={style.switchToMobileView}\n                  onClick={onSwitchToMobileView}\n                >\n                  <FormattedMessage id=\"masthead.switchToMobileView\" />\n                </span>\n              )}\n              <Unsupported />\n              {(showTrialCountdown || isFreePlanUser) && (\n                <MastheadUpgradeLink\n                  trialDaysRemaining={trialDaysRemaining}\n                  showUpgradeLink={showUpgradeLink}\n                  onUpgradeLinkClick={onUpgradeLinkClick}\n                  isFreePlanUser={isFreePlanUser}\n                />\n              )}\n              <AccountOwnerOrGroupAdmin>\n                <ScreensButton dashboardId={stringifiedDashboardId} />\n              </AccountOwnerOrGroupAdmin>\n              <AccountOwnerOrGroupAdmin>\n                <button\n                  className={`bttn ${style.mastheadButton}`}\n                  onClick={() => this.props.onLoopsClick(groupId)}\n                >\n                  <FormattedMessage id=\"masthead.loops\" />\n                </button>\n              </AccountOwnerOrGroupAdmin>\n              <AccountOwnerOrGroupAdmin>\n                <button\n                  className={`bttn ${style.mastheadButton}`}\n                  onClick={() => {\n                    trackEvent(\n                      buttonClicked({ 'Button identifier': 'Header - People' }),\n                    );\n                    this.props.onInviteClick(groupId);\n                  }}\n                >\n                  <FormattedMessage id=\"masthead.invite\" />\n                </button>\n              </AccountOwnerOrGroupAdmin>\n              <button\n                onClick={() => {\n                  track('In-app Help - Open');\n                  trackEvent(\n                    buttonClicked({ 'Button identifier': 'Header - Help' }),\n                  );\n                  this.setState({ isHelpOpen: true });\n                }}\n                className={helpButtonClasses}\n              >\n                <FormattedMessage id=\"masthead.help\" />\n              </button>\n              <Popover\n                target={this.helpPopoverRef}\n                isVisible={this.state.isHelpOpen}\n                isRightAligned\n                above={25}\n                onClose={() => this.setState({ isHelpOpen: false })}\n                render={() => (\n                  <InAppHelp\n                    onClose={() => this.setState({ isHelpOpen: false })}\n                  />\n                )}\n              />\n              <span ref={el => (this.helpPopoverRef = el)}>\n                <AccountMenu\n                  firstName={firstName}\n                  lastName={lastName}\n                  canUpgrade={canUpgrade}\n                />\n              </span>\n            </nav>\n          </div>\n          {children && <div className=\"masthead-navigation\">{children}</div>}\n        </div>\n        <AddDashboardModal />\n        <DashboardLimitModal />\n        <div>\n          <AddLoopModal />\n          <InviteMembersModal />\n        </div>\n      </App>\n    );\n  }\n}\n\nBaseMastheadComponent.propTypes = {\n  canEditOrganization: PropTypes.bool,\n  canUpgrade: PropTypes.bool,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  dashboards: PropTypes.array,\n  firstName: PropTypes.string,\n  groupId: PropTypes.number,\n  isFreePlanUser: PropTypes.bool,\n  isViewingDashboard: PropTypes.bool,\n  lastName: PropTypes.string,\n  showSwitchToMobile: PropTypes.bool,\n  showTrialCountdown: PropTypes.bool,\n  showUpgradeLink: PropTypes.bool,\n  supportUrl: PropTypes.string,\n  trialDaysRemaining: PropTypes.number,\n  onAddDashboard: PropTypes.func,\n  onInviteClick: PropTypes.func,\n  onLoopsClick: PropTypes.func,\n  onSwitchToMobileView: PropTypes.func,\n  onUpgradeLinkClick: PropTypes.func,\n};\n\nconst BaseMastheadComponentWithApolloProvider = props => (\n  <ApolloProvider client={apolloClient.create()}>\n    <BaseMastheadComponent {...props} />\n  </ApolloProvider>\n);\n\nexport default BaseMastheadComponentWithApolloProvider;\nexport { BaseMastheadComponent };\n","import { connect } from 'react-redux';\nimport { some, intersection, get, includes } from 'lodash';\nimport connectToHistory from '../../hoc/connect-to-history';\nimport { router } from '../../router';\nimport { redirect } from '../../lib/global';\nimport { track, trackSnowplow } from '../../lib/tracker';\nimport * as toastActions from '../../toast/actions/toast-actions';\nimport * as dashboardHelpers from '../../dashboard/helpers/dashboard-helpers';\nimport BaseMastheadComponent from './base-masthead-component';\nimport { switchToMobileView, getShowDesktopView } from '../../lib/mobile';\n\nconst mapStateToProps = state => {\n  const {\n    dashboard: { dashboard: { id: dashboardId } = {} },\n    user: {\n      user = {},\n      organization = {},\n      organization: { allowances = {} } = {},\n    },\n    allDashboards = [],\n  } = state;\n\n  const flags = get(user, 'features') || [];\n  const hasFreemiumFeatureFlag = includes(flags, 'ff:freemium');\n\n  // If a user has Classicboards already, we allow them to continue adding more via the\n  // Add Dashboard modal\n  const hasClassicboards = some(\n    allDashboards,\n    dashboard =>\n      intersection(dashboard.toggles, ['grid', 'container']).length === 0,\n  );\n\n  return {\n    groupId: user.default_group_id,\n    firstName: user.first_name,\n    lastName: user.last_name,\n    showUpgradeLink: user.is_admin,\n    showTrialCountdown: user.show_trial_countdown,\n    trialDaysRemaining: user.trialDaysRemaining,\n    userId: user.id,\n    orgId: user.organization_id,\n    showSwitchToMobile: !!getShowDesktopView(),\n    hasClassicboards,\n    isFreePlanUser: !!allowances.is_free || hasFreemiumFeatureFlag,\n    isDashboardLimitReached: dashboardHelpers.hasReachedDashboardLimit(\n      organization,\n    ),\n    dashboardId,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onInviteClick: groupId => router.setQueryParam('invite', groupId),\n    onLoopsClick: groupId => {\n      track('Header - Click loops');\n      router.setQueryParam('addLoop', groupId);\n    },\n    createOnAddDashboardHandler: (\n      hasClassicboards,\n      isDashboardLimitReached,\n      organizationId,\n      groupId,\n      dashboardId,\n    ) => async () => {\n      if (isDashboardLimitReached) {\n        router.navigate(`/edit/dashboards/${dashboardId}/limit`);\n        return;\n      }\n\n      if (hasClassicboards) {\n        router.setQueryParam('addDashboard', 1);\n      } else {\n        try {\n          const dashboard = await dashboardHelpers.createDashboard(\n            organizationId,\n            true,\n            groupId,\n          );\n          redirect(`/edit/dashboards/${dashboard.id}`, 300);\n        } catch (e) {\n          dispatch(toastActions.showGenericErrorToast());\n        }\n      }\n    },\n    onSwitchToMobileView: () => {\n      track('Switched to mobile view');\n      switchToMobileView();\n    },\n    createOnUpgradeLinkClick: (userId, orgId) => () => {\n      track('Clicked upgrade link');\n      trackSnowplow('trial-upgrade_click', '1-0-0', {\n        user_id: `${userId}`,\n        org_id: `${orgId}`,\n      });\n      redirect('/account/plans');\n    },\n  };\n};\n\n// This component does not have any action file but tracking require more\n// context\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const {\n    userId,\n    orgId,\n    groupId,\n    dashboardId,\n    hasClassicboards,\n    isDashboardLimitReached,\n    ...filteredStateProps\n  } = stateProps;\n  const {\n    createOnAddDashboardHandler,\n    createOnUpgradeLinkClick,\n    ...filteredDispatchProps\n  } = dispatchProps;\n\n  const onUpgradeLinkClick = createOnUpgradeLinkClick(userId, orgId);\n  const onAddDashboard = createOnAddDashboardHandler(\n    hasClassicboards,\n    isDashboardLimitReached,\n    orgId,\n    groupId,\n    dashboardId,\n  );\n\n  return {\n    ...ownProps,\n    ...{ ...filteredStateProps, groupId },\n    ...filteredDispatchProps,\n    onAddDashboard,\n    onUpgradeLinkClick,\n  };\n};\n\nconst BaseMastheadConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(BaseMastheadComponent);\n\nconst HistoryBaseMastheadConnector = connectToHistory(history => {\n  return {\n    isViewingDashboard: !!history.pathname.match(\n      /\\/edit\\/dashboards\\/([0-9]+)\\/?$/,\n    ),\n  };\n})(BaseMastheadConnector);\n\nexport default HistoryBaseMastheadConnector;\nexport { BaseMastheadConnector };\n","import BaseMasthead, { BaseMastheadConnector } from './base-masthead-connector';\n\nexport default BaseMasthead;\nexport { BaseMastheadConnector };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport DropItem from '../drop-item';\n\nclass DropButtonComponent extends Component {\n  render() {\n    const classes = classNames('drop-menu-control', this.props.className);\n    return (\n      <DropItem>\n        <button {...this.props} className={classes} />\n      </DropItem>\n    );\n  }\n}\n\nDropButtonComponent.propTypes = {\n  className: PropTypes.string,\n};\n\nexport default DropButtonComponent;\n","import DropButton from './drop-button-component';\nexport default DropButton;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport DropMenu from '../../components/menu-legacy/drop-menu';\nimport DropButton from '../../components/menu-legacy/drop-button';\nimport DropItem from '../../components/menu-legacy/drop-item';\nimport { Link } from 'react-router-dom';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\n\nimport styles from './dashboard-settings-menu-component-style.scss';\n\nconst CustomizeDropItem = ({ dashboardId }) => {\n  const onCustomizeClick = () => {\n    track('Header - Settings Menu - Clicked Customize Appearance');\n    trackEvent(\n      buttonClicked({\n        'Button identifier': 'Header - Settings - Customize appearance',\n      }),\n    );\n  };\n\n  return (\n    <DropItem>\n      <Link\n        className={'drop-menu-control'}\n        to={`/edit/dashboards/${dashboardId}/customize`}\n        onClick={onCustomizeClick}\n      >\n        Customize appearance\n      </Link>\n    </DropItem>\n  );\n};\n\nCustomizeDropItem.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nclass DashboardSettingsMenuComponent extends Component {\n  render() {\n    const { dashboardId } = this.props;\n\n    return (\n      <DropMenu\n        label=\"Settings\"\n        className=\"masthead-dashboard-settings\"\n        toggleClassName={styles.settingsCog}\n      >\n        <CustomizeDropItem dashboardId={dashboardId} />\n        <DropButton\n          data-action=\"dashboard:settings\"\n          onClick={() =>\n            trackEvent(\n              buttonClicked({\n                'Button identifier': 'Header - Settings - Dashboard settings',\n              }),\n            )\n          }\n        >\n          Dashboard settings\n        </DropButton>\n        <DropButton\n          data-action=\"dashboard:copy\"\n          onClick={() =>\n            trackEvent(\n              buttonClicked({\n                'Button identifier': 'Header - Settings - Copy dashboard',\n              }),\n            )\n          }\n        >\n          Copy dashboard\n        </DropButton>\n        <DropButton\n          data-action=\"dashboard:delete\"\n          onClick={() =>\n            trackEvent(\n              buttonClicked({\n                'Button identifier': 'Header - Settings - Delete dashboard',\n              }),\n            )\n          }\n        >\n          Delete dashboard\n        </DropButton>\n      </DropMenu>\n    );\n  }\n}\n\nDashboardSettingsMenuComponent.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default DashboardSettingsMenuComponent;\nexport { CustomizeDropItem };\n","import DashboardSettingsMenu from './dashboard-settings-menu-component';\nexport default DashboardSettingsMenu;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Button from '@UI/button';\nimport ButtonGroup from '@UI/button-group';\nimport DropMenu from '../../components/menu/drop-menu';\nimport DropItem from '../../components/menu/drop-item';\nimport StatusLabel from '../../components/status-label';\nimport ServiceIcon from '../../components/service-icon';\nimport { getServicePath, getWidgetTypePath } from '../../lib/path';\nimport { OnMount } from '../../hoc/on-mount';\nimport { noop } from 'lodash';\n\nimport styles from './add-widget-button-style.scss';\n\nclass AddWidgetButtonComponent extends Component {\n  handleMenuToggle() {\n    this.refs.menu.toggle();\n    this.props.onOpenMenu();\n  }\n\n  handleClickService(e, service) {\n    e.preventDefault();\n    this.props.onFollowLink(service, e.currentTarget.href);\n  }\n\n  getServiceLink({\n    name: serviceName,\n    id: serviceId,\n    widget_types: widgetTypes,\n    has_accounts: hasAccounts,\n    isUniversal,\n    polymorphic,\n    hasPresets,\n  }) {\n    const { dashboardId } = this.props;\n\n    // If there is only one widget type then we want to link directly to it\n    if (!isUniversal && widgetTypes && widgetTypes.length === 1) {\n      return getWidgetTypePath(serviceName, {\n        dashboardId,\n        serviceId,\n        widgetTypeId: widgetTypes[0],\n      });\n    }\n\n    const isLegacy = serviceName === 'salesforce' && !polymorphic;\n\n    return getServicePath(serviceName, {\n      dashboardId,\n      serviceId,\n      isUniversal,\n      hasAccounts,\n      isLegacy,\n      hasPresets,\n    });\n  }\n\n  renderMenuItem(service) {\n    const href = this.getServiceLink(service);\n    const onClick = e => this.handleClickService(e, service);\n\n    return (\n      // `onClick` is required to apply the \"pointer\" and rollover styles\n      <DropItem isSmall key={service.key || service.name} onClick={noop}>\n        <div className={styles.dropItem}>\n          <a\n            href={href}\n            onClick={onClick}\n            className={styles.link}\n            data-service={service.name}\n          >\n            <ServiceIcon\n              className={styles.logo}\n              serviceName={service.name}\n              size={32}\n              rounded\n            />\n            <span className={styles.title}>\n              {service.label && <StatusLabel type={service.label} />}\n              {service.title}\n            </span>\n          </a>\n        </div>\n      </DropItem>\n    );\n  }\n\n  renderMenu() {\n    const { connectedServices, utilityServices } = this.props;\n    const renderMenuItem = this.renderMenuItem.bind(this);\n\n    return (\n      <div className={styles.dropMenu}>\n        <DropMenu ref=\"menu\" name=\"add-widget\">\n          <li>\n            <h4 className={styles.dropMenuHeading}>Recent Connections</h4>\n          </li>\n          {connectedServices.map(renderMenuItem)}\n          <li className={styles.divider} />\n          {utilityServices.map(renderMenuItem)}\n        </DropMenu>\n      </div>\n    );\n  }\n\n  renderSplitButton() {\n    if (!this.props.connectedServices.length) {\n      return null;\n    }\n\n    return (\n      <Button\n        onClick={() => this.handleMenuToggle()}\n        icon=\"caret-down\"\n        size=\"small\"\n      />\n    );\n  }\n\n  render() {\n    return (\n      <div className={styles.wrapper}>\n        <OnMount do={this.props.onMount} />\n        <ButtonGroup>\n          <Button\n            onClick={this.props.onAddWidget}\n            icon=\"plus\"\n            size={Button.SIZES.SMALL}\n          >\n            Add widget\n          </Button>\n          {this.renderSplitButton()}\n        </ButtonGroup>\n        {this.renderMenu()}\n      </div>\n    );\n  }\n}\n\nAddWidgetButtonComponent.defaultProps = {\n  utilityServices: [],\n  connectedServices: [],\n};\n\nAddWidgetButtonComponent.propTypes = {\n  connectedServices: PropTypes.array,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  utilityServices: PropTypes.array,\n  onAddWidget: PropTypes.func,\n  onFollowLink: PropTypes.func,\n  onMount: PropTypes.func,\n  onOpenMenu: PropTypes.func,\n};\n\nexport default AddWidgetButtonComponent;\n","import { connect } from 'react-redux';\nimport { chain } from 'lodash';\nimport AddWidgetButtonComponent from './add-widget-button-component';\nimport { fetchRecentlyConnected } from '../../data-sources/actions/data-sources-actions';\nimport { transformServices } from '../../data-sources/data-sources-helpers';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { integrationSelected, buttonClicked } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\nimport { redirect } from '../../lib/global';\n\nconst isUtility = ({ name }) => ['text', 'image'].includes(name);\n\nconst mapStateToProps = (state, props) => {\n  const {\n    user: { user: { features = [] } = {} },\n    dataSources: { recentlyConnected } = {},\n  } = state;\n  const onOpenMenu = () => track('Add widget menu - Click');\n  const onFollowLink = ({ name, title, auth_type: authType }, servicePath) => {\n    redirect(servicePath, 300);\n    track('Add widget menu - Service - Click', {\n      properties: { service_name: name },\n    });\n    trackEvent(\n      integrationSelected({\n        'Auth type': authType,\n        'Integration name': title,\n        'Integration slug': name,\n        Location: LOCATIONS.DashboardAddWidgetDropdown,\n      }),\n    );\n  };\n  const onAddWidget = async () => {\n    track('Add widget button - Click', {\n      properties: { location: 'masthead button' },\n    });\n\n    await trackEvent(\n      buttonClicked({\n        'Button identifier': 'Header | Add widget',\n      }),\n    );\n\n    redirect(`/v4/dashboards/${props.dashboardId}`);\n  };\n\n  const [utilityServices, connectedServices] = chain(recentlyConnected)\n    .orderBy(item => Date.parse(item.updated_at), ['desc'])\n    .map(({ service, widget_types: widgetTypes }) => ({\n      ...service,\n      widget_types: widgetTypes,\n    }))\n    .partition(isUtility);\n\n  return {\n    connectedServices: transformServices(connectedServices, features),\n    utilityServices,\n    onOpenMenu,\n    onFollowLink,\n    onAddWidget,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMount: () => dispatch(fetchRecentlyConnected()),\n  };\n};\n\nconst AddWidgetButtonConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(AddWidgetButtonComponent);\n\nexport default AddWidgetButtonConnector;\n","import AddWidgetButtonConnector from './add-widget-button-connector';\nexport default AddWidgetButtonConnector;\n","import PropTypes from 'prop-types';\nimport React, { useState } from 'react';\nimport { TabList, Tab, Tabs, TabPanel } from '../components/tabs';\nimport DropMenu from '../components/menu/drop-menu';\nimport DropItem from '../components/menu/drop-item';\nimport Layout, { Column, Row } from '../components/layout';\nimport Button from '@UI/button';\nimport Input from '../components/form/input';\nimport { AutoInputTextCollection } from '../components/form/auto-input';\nimport Icon from '@UI/icon';\nimport MenuLabel from '../components/menu/menu-label';\nimport classNames from 'classnames';\nimport config from '../universal/config';\nimport { getSharingURL } from '../lib/sharing';\nimport { redirect } from '../lib/global';\nimport FormattedMessage, { FormattedHTMLMessage } from '../lib/i18n';\nimport PricingGate from '../components/pricing-gate';\nimport Image from '@UI/image';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\nimport SlackMenuComponent from './slack-menu';\n\nimport style from './sharing-menu-style.scss';\n\nconst renderShareFeatureGate = (trialist, onDismiss) => {\n  const contentId = 'featureGate.sharing.text';\n  const trialistContentId = 'featureGate.sharing.trialist.text';\n  const buttonId = 'featureGate.sharing.button';\n  const trialistButtonId = 'featureGate.sharing.trialist.button';\n\n  const onClick = trialist ? onDismiss : () => redirect('/account/plans');\n\n  return (\n    <div className={style.featureGate}>\n      <div className={style.shareIllustration}>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/images/gb-share.svg`}\n          width={220}\n          height={220}\n        />\n      </div>\n      <strong className={style.featureGateTitle}>\n        <FormattedMessage id=\"featureGate.sharing.heading\" />\n      </strong>\n      <p className={style.featureGateContent}>\n        <FormattedHTMLMessage id={trialist ? trialistContentId : contentId} />\n      </p>\n      <div className={style.featureGateAction}>\n        <Button stretched onClick={onClick}>\n          <FormattedMessage id={trialist ? trialistButtonId : buttonId} />\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nconst renderInviteFeatureGate = () => {\n  return (\n    <div className={style.featureGate}>\n      <Image\n        src={`${config.get().StaticAssetBaseURL}/images/welcome-team-ill-2.svg`}\n        width=\"150\"\n        height=\"150\"\n      />\n      <strong className={style.featureGateTitle}>\n        <FormattedMessage id=\"featureGate.sharePeople.heading\" />\n      </strong>\n      <p className={style.featureGateContent}>\n        <FormattedMessage id=\"featureGate.sharePeople.text\" />\n      </p>\n      <div className={style.featureGateAction}>\n        <Button stretched onClick={() => redirect('/account/plans')}>\n          <FormattedMessage id=\"featureGate.sharePeople.button\" />\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nconst renderError = errorMessage => {\n  return (\n    <p className={style.error}>\n      <FormattedMessage id={errorMessage} />\n    </p>\n  );\n};\n\nconst renderPublicContent = props => {\n  const sharingURL = getSharingURL(props.dashboard.sharing_hash);\n\n  return (\n    <Layout paddingX={1} paddingBottom={1} className={style.tabPanel}>\n      <div className={style.toggle}>\n        <p className={style.shareLinkText}>\n          <span className={style.iconContainerLink}>\n            <Icon name=\"link\" />\n          </span>\n          <FormattedHTMLMessage id=\"share.publicInfoHtml\" />\n        </p>\n        <Row align=\"center\">\n          <Column flexAuto>\n            <Input name=\"sharingURL\" value={sharingURL} />\n          </Column>\n          <Column flexNone marginLeft={0.5}>\n            <DropMenu\n              label={<MenuLabel />}\n              origin=\"bottom left\"\n              isAnchored={false}\n            >\n              <DropItem isSmall onClick={() => props.onCopyLink(sharingURL)}>\n                <FormattedMessage id=\"share.copy\" />\n              </DropItem>\n              <DropItem isSmall onClick={props.onRegenerateLink}>\n                <FormattedMessage id=\"share.regenerate\" />\n              </DropItem>\n              <DropItem isSmall dividerTop onClick={props.onDeleteLink}>\n                <FormattedMessage id=\"share.delete\" />\n              </DropItem>\n            </DropMenu>\n          </Column>\n        </Row>\n        {props.regenerateLinkError && renderError(props.regenerateLinkError)}\n        {props.sharingError && renderError(props.sharingError)}\n      </div>\n    </Layout>\n  );\n};\nrenderPublicContent.propTypes = {\n  dashboard: PropTypes.object,\n  regenerateLinkError: PropTypes.string,\n  sharingError: PropTypes.string,\n  onCopyLink: PropTypes.func,\n  onDeleteLink: PropTypes.func,\n  onRegenerateLink: PropTypes.func,\n};\n\nconst renderPrivateContent = props => {\n  return (\n    <Layout paddingX={1} paddingBottom={1}>\n      <Column>\n        <div className={style.shareIllustration}>\n          <Image\n            src={`${config.get().StaticAssetBaseURL}/images/gb-share.svg`}\n            width={220}\n            height={220}\n          />\n        </div>\n        <p className={style.info}>\n          <FormattedMessage id=\"share.privateInfo\" />\n        </p>\n        <div className={style.button}>\n          <Button onClick={props.onEnableSharing}>\n            <FormattedMessage id=\"share.createLink\" />\n          </Button>\n        </div>\n        {props.sharingError && renderError(props.sharingError)}\n      </Column>\n    </Layout>\n  );\n};\nrenderPrivateContent.propTypes = {\n  sharingError: PropTypes.string,\n  onEnableSharing: PropTypes.func,\n};\n\nconst renderInviteContent = props => {\n  const {\n    userSuggestions,\n    inviteError,\n    addressInput = {},\n    working,\n    onChangeAddress,\n    onSubmitInvite,\n  } = props;\n  const onSubmit = evt => {\n    evt.preventDefault();\n    onSubmitInvite();\n  };\n\n  return (\n    <Layout paddingX={1} paddingBottom={1} className={style.tabPanel}>\n      <form onSubmit={onSubmit}>\n        <Row paddingTop={1}>\n          <FormattedHTMLMessage id=\"share.invite.giveViewOnly\" />\n        </Row>\n        <Row className={style.muted} marginTop={0.2}>\n          <FormattedMessage id=\"share.invite.newUserInvite\" />\n        </Row>\n        <Row align=\"center\" marginTop={0.5}>\n          <Column flexAuto>\n            <AutoInputTextCollection\n              placeholder=\"vanessa@example.com\"\n              formState={addressInput}\n              onChange={onChangeAddress}\n              onApply={onSubmitInvite}\n              availableSuggestions={userSuggestions}\n              hasError={!!inviteError}\n            />\n            {inviteError && renderError(inviteError)}\n          </Column>\n        </Row>\n        <Row marginTop={0.75} justify=\"flex-end\">\n          <Column marginLeft={1}>\n            <Button\n              type={Button.TYPES.SUBMIT}\n              size={Button.SIZES.SMALL}\n              loading={working}\n              icon=\"envelope\"\n            >\n              <FormattedMessage id=\"share.invite.sendInvite\" />\n            </Button>\n          </Column>\n        </Row>\n      </form>\n    </Layout>\n  );\n};\nrenderInviteContent.propTypes = {\n  onChangeAddress: PropTypes.func.isRequired,\n  onSubmitInvite: PropTypes.func.isRequired,\n  addressInput: PropTypes.object,\n  inviteError: PropTypes.string,\n  userSuggestions: PropTypes.arrayOf(PropTypes.string),\n  working: PropTypes.bool,\n};\n\nconst renderPanelContent = props => {\n  const [tab, setTab] = useState(0);\n\n  if (props.error) {\n    return renderError(props.error);\n  }\n\n  if (!props.dashboard) {\n    return null;\n  }\n\n  const {\n    dashboard: { id: dashboardId, sharing, title },\n    onSelectTab,\n    temporarilyAllowSharing,\n  } = props;\n  const renderLinkContent =\n    sharing === 'y' ? renderPublicContent : renderPrivateContent;\n  const shareTabIndex = 0;\n  const isSharing = sharing === 'y';\n  return (\n    <div>\n      <h3 className={style.heading}>\n        <FormattedMessage id=\"share.heading\" values={{ title }} />\n      </h3>\n      <div className={style.wrapperTabs}>\n        <Tabs\n          selectedIndex={tab}\n          onSelect={tabIndex => {\n            setTab(tabIndex);\n            onSelectTab();\n          }}\n        >\n          <div className={style.layoutTabList}>\n            <TabList>\n              <Tab>\n                <div className={style.tabTitle}>\n                  <span className={style.iconContainer}>\n                    <Icon name=\"link\" />\n                  </span>\n                  <FormattedMessage id=\"share.linkTab\" />\n                </div>\n              </Tab>\n              <Tab>\n                <div className={style.tabTitle}>\n                  <span className={style.iconContainer}>\n                    <Icon name=\"slack\" font={Icon.FONTS.GECKO_FONT} />\n                  </span>\n                  <FormattedMessage id=\"share.slackTab\" />\n                </div>\n              </Tab>\n              <Tab>\n                <div className={style.tabTitle}>\n                  <span className={style.iconContainer}>\n                    <Icon name=\"user-circle\" />\n                  </span>\n                  <FormattedMessage id=\"share.inviteTab\" />\n                </div>\n              </Tab>\n            </TabList>\n          </div>\n          <TabPanel>\n            <PricingGate name=\"sharing\" allowance=\"sharing_urls\">\n              {({ allowed, trialist, onDismiss }) =>\n                allowed || temporarilyAllowSharing\n                  ? renderLinkContent(props)\n                  : renderShareFeatureGate(trialist, onDismiss)\n              }\n            </PricingGate>\n          </TabPanel>\n          <TabPanel>\n            <PricingGate name=\"sharing\" allowance=\"sharing_urls\">\n              {({ allowed, trialist, onDismiss }) =>\n                allowed || temporarilyAllowSharing ? (\n                  <SlackMenuComponent\n                    dashboardId={dashboardId}\n                    isSharing={isSharing}\n                    onDisplaySharingLinkTab={() => setTab(shareTabIndex)}\n                  />\n                ) : (\n                  renderShareFeatureGate(trialist, onDismiss)\n                )\n              }\n            </PricingGate>\n          </TabPanel>\n          <TabPanel>\n            <PricingGate name=\"users\" allowance=\"max_users\" usage=\"users\">\n              {({ allowed }) =>\n                allowed ? renderInviteContent(props) : renderInviteFeatureGate()\n              }\n            </PricingGate>\n          </TabPanel>\n        </Tabs>\n      </div>\n    </div>\n  );\n};\n\nrenderPanelContent.propTypes = {\n  dashboard: PropTypes.object,\n  error: PropTypes.string,\n  temporarilyAllowSharing: PropTypes.bool,\n  onSelectTab: PropTypes.func,\n};\n\nconst renderPanel = props => {\n  const isOpen = props.open && (props.dashboard || props.error);\n\n  const className = classNames(style.panel, {\n    [style.open]: isOpen,\n  });\n\n  return <div className={className}>{renderPanelContent(props)}</div>;\n};\nrenderPanel.propTypes = {\n  dashboard: PropTypes.object,\n  error: PropTypes.string,\n  open: PropTypes.bool,\n};\n\nconst SharingMenuComponent = props => {\n  return (\n    <div>\n      <button\n        className={style.toggleButton}\n        onClick={() => {\n          trackEvent(\n            buttonClicked({\n              'Button identifier': 'Header - Share',\n            }),\n          );\n          props.onToggle();\n        }}\n      >\n        <span className={style.iconContainer}>\n          <Icon name=\"share\" />\n        </span>\n        <FormattedMessage id=\"share\" />\n      </button>\n      {renderPanel(props)}\n    </div>\n  );\n};\n\nSharingMenuComponent.defaultProps = {\n  temporarilyAllowSharing: true,\n};\n\nSharingMenuComponent.propTypes = {\n  onCopyLink: PropTypes.func.isRequired,\n  onDeleteLink: PropTypes.func.isRequired,\n  onEnableSharing: PropTypes.func.isRequired,\n  onToggle: PropTypes.func.isRequired,\n  dashboard: PropTypes.object,\n  error: PropTypes.string,\n  open: PropTypes.bool,\n  regenerateLinkError: PropTypes.string,\n  sharingError: PropTypes.string,\n  temporarilyAllowSharing: PropTypes.bool,\n};\n\nexport default SharingMenuComponent;\n","import { chain } from 'lodash';\nimport { trackEvent } from '@Tracking';\nimport { connect } from 'react-redux';\nimport { dashboardCopiedSharingLink, invitationSent } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\nimport SharingMenuComponent from './sharing-menu-component';\nimport menu from '../hoc/menu';\nimport copy from '../lib/copy-to-clipboard';\nimport * as dashboardActions from '../dashboard/actions/dashboard-actions';\nimport * as sharingMenuActions from '../sharing-menu/actions/sharing-menu-actions';\nimport { formatMessage } from '../lib/i18n';\nimport * as toastActions from '../toast/actions';\nimport { isAccountOwner } from '../lib/user-permissions';\nimport { refreshDashboard } from '../services/app-service';\n\nconst autoCompleteEmailList = (users = [], q = '', alreadySelected = []) => {\n  if (q === '') {\n    // Empty search show all available email\n    return chain(users)\n      .filter(user => !isAccountOwner(user))\n      .map('email')\n      .without(...alreadySelected)\n      .value();\n  }\n\n  const query = q.toLowerCase();\n  const matchingUsers = chain(users)\n    .filter(user => !isAccountOwner(user))\n    .map('email')\n    .filter(email => email.toLowerCase().indexOf(query) === 0)\n    .without(...alreadySelected)\n    .value();\n  return [...matchingUsers, q]; // Append free form value at the end of suggestions\n};\n\nconst SharingMenu = menu(SharingMenuComponent);\n\nconst SharingMenuConnector = connect(\n  state => {\n    const { dashboard, people } = state;\n    const {\n      addressInput: { value: query, values: alreadySelected },\n    } = dashboard;\n    const { users } = people;\n    const userSuggestions = autoCompleteEmailList(\n      users,\n      query,\n      alreadySelected,\n    );\n\n    return { ...dashboard, userSuggestions };\n  },\n  dispatch => {\n    return {\n      onCopyLink: URL => {\n        copy(URL);\n        trackEvent(\n          dashboardCopiedSharingLink({\n            Location: LOCATIONS.DashboardShareMenu,\n          }),\n        );\n        dispatch(\n          toastActions.showSuccessToast(formatMessage('share.linkCopied')),\n        );\n      },\n      onEnableSharing: () => {\n        dispatch(dashboardActions.toggleSharing(true));\n      },\n      onRegenerateLink: () => {\n        dispatch(sharingMenuActions.regenerateSharingLink());\n      },\n      onChangeAddress: value => dispatch(dashboardActions.setAddress(value)),\n      onSelectTab: index =>\n        dispatch(dashboardActions.toggleSharingInviteTab(index)),\n      createOnSubmitInviteHandler: (dashboardId, addresses) => {\n        return () => {\n          dispatch(dashboardActions.addReadOnlyUsers(dashboardId, addresses));\n          trackEvent(\n            invitationSent({\n              Location: LOCATIONS.DashboardShareMenu,\n            }),\n          );\n        };\n      },\n      createOnDeleteLinkHandler: dashboardId => {\n        return () => {\n          dispatch(dashboardActions.toggleSharing(false));\n          refreshDashboard(dashboardId);\n        };\n      },\n    };\n  },\n  (stateProps, dispatchProps, ownProps) => {\n    let onSubmitInvite = () => {};\n    let onDeleteLink = () => {};\n    const { dashboard, addressInput } = stateProps;\n\n    if (dashboard) {\n      const { id: dashboardId } = dashboard;\n      const { values: addresses = [] } = addressInput;\n      const {\n        createOnSubmitInviteHandler,\n        createOnDeleteLinkHandler,\n      } = dispatchProps;\n      onSubmitInvite = createOnSubmitInviteHandler(dashboardId, addresses);\n      onDeleteLink = createOnDeleteLinkHandler(dashboardId);\n    }\n\n    return {\n      ...ownProps,\n      ...stateProps,\n      ...dispatchProps,\n      onSubmitInvite,\n      onDeleteLink,\n    };\n  },\n)(SharingMenu);\n\nexport { SharingMenuConnector as default, SharingMenu };\n","import { connect } from 'react-redux';\nimport SharingMenuConnector from './sharing-menu-connector';\n\nconst SharingMenuDashboardConnector = connect()(SharingMenuConnector);\n\nexport default SharingMenuDashboardConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport DashboardSettingsMenu from '../dashboard-settings-menu';\nimport AddWidgetButton from '../add-widget-button';\nimport SharingMenu from '../../sharing-menu';\nimport style from './dashboard-options-style.scss';\n\nconst DashboardOptionsComponent = ({\n  canEdit,\n  dashboardId,\n  onEnterFullscreen,\n}) => {\n  let sharingMenu, settingsMenu, addWidgetButton;\n\n  if (canEdit) {\n    sharingMenu = (\n      <div className={style.sharingMenu}>\n        <SharingMenu dashboardId={dashboardId} />\n      </div>\n    );\n    settingsMenu = <DashboardSettingsMenu dashboardId={dashboardId} />;\n    addWidgetButton = <AddWidgetButton dashboardId={dashboardId} />;\n  }\n\n  return (\n    <div className=\"masthead-dashboard-options\">\n      {sharingMenu}\n      {settingsMenu}\n      <div className={style.preview}>\n        <button\n          role=\"button\"\n          title=\"Preview\"\n          className={style.fullscreen}\n          onClick={onEnterFullscreen}\n        >\n          Preview\n        </button>\n      </div>\n      {addWidgetButton}\n    </div>\n  );\n};\n\nDashboardOptionsComponent.propTypes = {\n  onEnterFullscreen: PropTypes.func.isRequired,\n  canEdit: PropTypes.bool,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n\nexport default DashboardOptionsComponent;\n","import DashboardOptions from './dashboard-options-component';\nexport default DashboardOptions;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Editable from '../../components/form/editable-input/editable-component';\nimport { MAX_TITLE_LENGTH } from '../../dashboard/dashboard-constants';\n\nimport styles from './dashboard-masthead-title-style.scss';\n\nconst DashboardMastheadTitle = ({ canEdit, title, onChange }) => {\n  const handleSubmit = value => {\n    if (value.length >= 1) {\n      onChange(value);\n    }\n  };\n\n  if (!canEdit) {\n    return <h1 className=\"masthead-title\">{title}</h1>;\n  }\n\n  return (\n    <div className=\"masthead-title\">\n      <Editable\n        text={title}\n        onSubmit={handleSubmit}\n        maxLength={MAX_TITLE_LENGTH}\n        isDashboardTitle\n        inputClassName={styles.input}\n      />\n    </div>\n  );\n};\n\nDashboardMastheadTitle.propTypes = {\n  canEdit: PropTypes.bool,\n  title: PropTypes.string,\n  onChange: PropTypes.func,\n};\n\nexport default DashboardMastheadTitle;\n","import PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport DashboardMastheadTitle from './dashboard-masthead-title-component';\nimport { setDashboardTitle } from '../../dashboard/actions/dashboard-actions';\n\nconst mapStateToProps = state => {\n  const {\n    dashboard: { dashboard: { id, title } = {} },\n  } = state;\n\n  return {\n    dashboardId: id,\n    title,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onChange: value => dispatch(setDashboardTitle(value)),\n});\n\nconst DashboardMastheadTitleConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DashboardMastheadTitle);\n\nDashboardMastheadTitleConnector.propTypes = {\n  canEdit: PropTypes.bool,\n};\n\nexport default DashboardMastheadTitleConnector;\n","import DashboardMastheadTitle from './dashboard-masthead-title-connector';\n\nexport default DashboardMastheadTitle;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './breadcrumb-nav-style.scss';\n\nconst BreadcrumbNav = ({ children }) => {\n  return <nav className={style.breadcrumbNav}>{children}</nav>;\n};\n\nBreadcrumbNav.propTypes = { children: PropTypes.node };\n\nexport default BreadcrumbNav;\n","import BreadcrumbNav from './breadcrumb-nav-component';\nexport default BreadcrumbNav;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport style from './breadcrumb-link-style.scss';\n\nconst BreadcrumbLink = ({ href, text }) => {\n  return (\n    <a className={style.breadcrumbLink} href={href}>\n      {text}\n    </a>\n  );\n};\n\nBreadcrumbLink.propTypes = {\n  href: PropTypes.string,\n  text: PropTypes.string,\n};\n\nexport default BreadcrumbLink;\n","import BreadcrumbLink from './breadcrumb-link-component';\nexport default BreadcrumbLink;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport gql from 'graphql-tag';\nimport { find } from 'lodash';\nimport { Query } from 'react-apollo';\n\n/**\n * This HOC accepts a legacy dashboard ID as a prop\n * and passes on the graphql ID for the dashboard to\n * its wrapped component.\n *\n * To get the graphql ID it fetches all the dashboards\n * from Concierge and matches them with the legacy ID.\n * If the request to Concierge fails it renders nothing.\n */\n\nexport const DASHBOARDS_QUERY = gql`\n  query Dashboards {\n    dashboards {\n      id\n      legacyId\n    }\n  }\n`;\n\nconst withGraphQLId = WrappedComponent => {\n  const Component = props => {\n    const { legacyDashboardId, ...restProps } = props;\n    return (\n      <Query query={DASHBOARDS_QUERY}>\n        {({ data, loading, error }) => {\n          if (error || loading) {\n            return null;\n          }\n          const { dashboards = [] } = data;\n          const dashboard = find(dashboards, {\n            legacyId: legacyDashboardId,\n          });\n\n          if (!dashboard) {\n            return null;\n          }\n\n          return <WrappedComponent dashboardId={dashboard.id} {...restProps} />;\n        }}\n      </Query>\n    );\n  };\n\n  Component.propTypes = {\n    legacyDashboardId: PropTypes.string.isRequired,\n  };\n\n  return Component;\n};\n\nexport default withGraphQLId;\n","import withGraphQLId from './with-graphql-id';\n\nexport default withGraphQLId;\n","import React, { useState } from 'react';\nimport PropTypes from 'prop-types';\nimport gql from 'graphql-tag';\nimport { track } from '../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { dashboardChangedLayout } from '@Tracking/events';\nimport { TRACKING_LAYOUT_TYPES } from '@Tracking/contexts/dashboard';\nimport delay from '../../../lib/delay';\nimport { Mutation } from 'react-apollo';\nimport FormattedMessage from '../../../lib/i18n';\nimport Icon from '@UI/icon';\nimport LoadingSpinner from '@UI/loading-spinner';\nimport styles from './set-container-layout-button-styles.scss';\n\n// exported for testing only\nexport const SWITCH_TO_CONTAINER_LAYOUT = gql`\n  mutation SwitchLayout($dashboardId: ID!) {\n    switchToContainerLayout(dashboardId: $dashboardId) {\n      dashboard {\n        id\n        layoutType {\n          __typename\n        }\n      }\n    }\n  }\n`;\n\nconst SetContainerLayoutButton = ({ dashboardId }) => {\n  const [isLoading, setIsLoading] = useState(false);\n\n  return (\n    <Mutation mutation={SWITCH_TO_CONTAINER_LAYOUT}>\n      {switchToContainerLayout => {\n        const onClick = async () => {\n          setIsLoading(true);\n\n          track('Convert to new layout button - Clicked');\n          trackEvent(\n            dashboardChangedLayout({\n              'From layout': TRACKING_LAYOUT_TYPES.FixedLayout,\n              'To layout': TRACKING_LAYOUT_TYPES.ContainerLayout,\n            }),\n          );\n\n          // small delay here but it seems vital for the earlier track event\n          // to be taken into account\n          await delay(500);\n          try {\n            await switchToContainerLayout({\n              variables: { dashboardId },\n            });\n          } catch (e) {\n            setIsLoading(false);\n          }\n        };\n\n        return (\n          <button\n            className={styles.button}\n            onClick={onClick}\n            disabled={isLoading}\n          >\n            <FormattedMessage id=\"masthead.convertToNewLayout\" />\n            {!isLoading && (\n              <span className={styles.icon}>\n                <Icon name=\"bolt\" />\n              </span>\n            )}\n            {isLoading && (\n              <span className={styles.spinnerContainer}>\n                <LoadingSpinner\n                  className={styles.spinner}\n                  size={17}\n                  theme={LoadingSpinner.THEMES.LIGHT}\n                />\n              </span>\n            )}\n          </button>\n        );\n      }}\n    </Mutation>\n  );\n};\n\nSetContainerLayoutButton.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default SetContainerLayoutButton;\n","import withGraphQLId from '../../../hoc/with-graphql-id';\nimport SetContainerLayoutButton from './set-container-layout-button-component';\n\nexport default withGraphQLId(SetContainerLayoutButton);\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport BaseMasthead from '../base-masthead';\nimport DashboardOptions from '../dashboard-options';\nimport DashboardMastheadTitle from '../dashboard-masthead-title';\nimport FormattedMessage from '../../lib/i18n';\nimport apolloClient from '../../services/concierge-service/apollo-client';\nimport { ApolloProvider } from 'react-apollo';\nimport BreadcrumbNav from '../breadcrumb-nav';\nimport BreadcrumbLink from '../breadcrumb-link';\nimport classNames from 'classnames';\nimport SetContainerLayoutButton from '../../dashboard/container-layout/set-container-layout-button';\nimport { useCanUserEdit } from '@Hooks';\n\nimport style from './dashboard-masthead-style.scss';\n\nconst DashboardMastheadComponent = props => {\n  const {\n    dashboardId,\n    title,\n    canConvertToContainerLayout,\n    canEditDashboard,\n    showDashboardOptions,\n    onEnterFullscreen,\n  } = props;\n  const className = classNames(style.masthead, 'masthead-dashboard');\n  const canUserEdit = useCanUserEdit();\n\n  const renderCustomizeBreadcrumb = () => {\n    const href = `/edit/dashboards/${dashboardId}`;\n\n    if (showDashboardOptions) {\n      return null;\n    }\n\n    return (\n      <BreadcrumbNav>\n        <BreadcrumbLink href={href} text={title} />\n        <span className={style.crumb}>\n          <FormattedMessage id={'customize.breadcrumb'} />\n        </span>\n      </BreadcrumbNav>\n    );\n  };\n\n  const renderDashboardOptions = () => {\n    if (!showDashboardOptions) {\n      return null;\n    }\n\n    return (\n      <DashboardOptions\n        dashboardId={dashboardId}\n        canEdit={canEditDashboard}\n        onEnterFullscreen={onEnterFullscreen}\n      />\n    );\n  };\n\n  const renderEditableTitle = () => {\n    if (!showDashboardOptions) {\n      return null;\n    }\n    return <DashboardMastheadTitle canEdit={canEditDashboard} />;\n  };\n\n  return (\n    <BaseMasthead {...props} className={className}>\n      <div className=\"masthead-title-wrapper\">\n        {renderCustomizeBreadcrumb()}\n        {renderEditableTitle()}\n        {canConvertToContainerLayout && canUserEdit && (\n          <div className={style.setContainerLayoutButton}>\n            <SetContainerLayoutButton legacyDashboardId={dashboardId} />\n          </div>\n        )}\n      </div>\n      {renderDashboardOptions()}\n    </BaseMasthead>\n  );\n};\n\nDashboardMastheadComponent.defaultProps = {\n  showDashboardOptions: true,\n  showGroupName: false,\n  canConvertToContainerLayout: false,\n};\n\nDashboardMastheadComponent.propTypes = {\n  canConvertToContainerLayout: PropTypes.bool,\n  canEditDashboard: PropTypes.bool,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  showDashboardOptions: PropTypes.bool,\n  title: PropTypes.string,\n  onEnterFullscreen: PropTypes.func,\n};\n\nconst MastheadWithApolloProvider = props => {\n  return (\n    <ApolloProvider client={apolloClient.create()}>\n      <DashboardMastheadComponent {...props} />\n    </ApolloProvider>\n  );\n};\n\nexport default MastheadWithApolloProvider;\nexport { DashboardMastheadComponent }; // for testing purposes only\n","import DashboardMastheadComponent from './dashboard-masthead-component';\nimport { connect } from 'react-redux';\nimport connectToHistory from '../../hoc/connect-to-history';\nimport fullscreenChangeListener from '../../hoc/fullscreen-change-listener';\nimport fscreen from 'fscreen';\nimport { track } from '../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\n\nconst ConnectedHistoryDashboardMasthead = connectToHistory(history => ({\n  showDashboardOptions: !history.pathname.match(/customize\\/?$/),\n}))(DashboardMastheadComponent);\n\nconst FullscreenChangeListener = fullscreenChangeListener(\n  ConnectedHistoryDashboardMasthead,\n);\n\nconst mapStateToProps = ({\n  dashboard: { dashboard: { toggles = [] } = {} },\n}) => {\n  // If dashboard is a fixieboard, user can convert to container layout.\n  const canConvertToContainerLayout = toggles.includes('grid');\n  return { canConvertToContainerLayout };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onEnterFullscreen: () =>\n    dispatch(() => {\n      track('Header - Click Preview');\n      trackEvent(buttonClicked({ 'Button identifier': 'Header - Preview' }));\n      fscreen.requestFullscreen(document.body);\n    }),\n  onFullscreenChange: isFullscreen => {\n    window.postMessage({ type: 'handleFullscreenChange', isFullscreen }, '*');\n  },\n});\n\nconst DashboardMastheadConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(FullscreenChangeListener);\n\nexport default DashboardMastheadConnector;\n","import React from 'react';\nimport DashboardMastheadConnector from './dashboard-masthead-connector';\nimport MobileDetector from '../../hoc/mobile-detector';\nimport { isMobileViewport, getShowDesktopView } from '../../lib/mobile';\nimport { getWindow } from '../../lib/global';\n\n// Don't render Masthead on mobile layout\nconst DashboardMasthead = props => {\n  const isMobileViewportSize = isMobileViewport(getWindow().screen.width);\n  const showDesktopView = getShowDesktopView();\n  const showSwitchToMobile = isMobileViewportSize && showDesktopView;\n\n  return (\n    <MobileDetector\n      render={isMobile =>\n        isMobile ? null : (\n          <DashboardMastheadConnector\n            {...props}\n            showSwitchToMobile={showSwitchToMobile}\n          />\n        )\n      }\n    />\n  );\n};\n\nexport default DashboardMasthead;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { router } from '../../router';\nimport classNames from 'classnames';\n\nimport style from './masthead-breadcrumb-style.scss';\n\nclass BreadcrumbComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.handleClick = this.handleClick.bind(this);\n  }\n\n  handleClick(e) {\n    e.preventDefault();\n    const { href, onClick } = this.props;\n    if (!href) return;\n\n    if (onClick) {\n      onClick(href);\n    } else {\n      router.navigate(href);\n    }\n  }\n\n  render() {\n    const { label, href = '', disabled, className } = this.props;\n\n    const classes = classNames(className, {\n      [style.disabled]: disabled,\n    });\n\n    if (disabled) {\n      return <span className={classes}>{label}</span>;\n    }\n\n    // TODO use react-router Link compontent once\n    // bumping to the new version\n    return (\n      <a href={href} className={classes} onClick={this.handleClick}>\n        {label}\n      </a>\n    );\n  }\n}\n\nBreadcrumbComponent.propTypes = {\n  className: PropTypes.string,\n  disabled: PropTypes.bool,\n  href: PropTypes.string,\n  label: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nexport default BreadcrumbComponent;\n","import MastheadBreadcrumb from './masthead-breadcrumb-component';\nexport default MastheadBreadcrumb;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Modal from '../../../components/modal';\nimport DropLink from '../../../components/menu-legacy/drop-link';\nimport Table, { HeaderCell, Cell } from '../../../components/table';\nimport { map, capitalize } from 'lodash';\nimport style from './preview-modal-style.scss';\nimport moment from 'moment-timezone';\n\nclass PreviewModalComponent extends Component {\n  getHeaderCellDescription(field) {\n    let description = capitalize(field.type);\n    if (field.currency_code) {\n      description += ` (${field.currency_code})`;\n    }\n\n    return description;\n  }\n\n  renderHeaderCells(fieldMap) {\n    const cells = fieldMap.map(([name, field]) => {\n      const description = this.getHeaderCellDescription(field);\n\n      return (\n        <HeaderCell description={description} key={name}>\n          {field.name || capitalize(name)}\n        </HeaderCell>\n      );\n    });\n\n    return <tr>{cells}</tr>;\n  }\n\n  renderRow(fieldMap, row, i) {\n    const cells = fieldMap.map(([name, field]) => (\n      <Cell\n        key={name}\n        type={field.type}\n        value={row[name]}\n        unit={field.currency_code}\n      />\n    ));\n\n    return <tr key={i}>{cells}</tr>;\n  }\n\n  render() {\n    const {\n      onChange,\n      dataSet: {\n        id,\n        fields,\n        data,\n        updated_at: updatedAt,\n        total_count: recordCount,\n      },\n    } = this.props;\n    // We map the fields out of the object to ensure that the same order\n    // is maintained when we render our rows\n    const fieldMap = map(fields, (field, name) => [name, field]);\n\n    return (\n      <React.Fragment>\n        <DropLink onClick={() => onChange({ showPreviewModal: true })}>\n          Preview dataset\n        </DropLink>\n        <Modal\n          visible={this.props.showPreviewModal}\n          hasCloseButton\n          onClose={() => onChange({ showPreviewModal: false })}\n        >\n          <div className={style.innerModal}>\n            <header className={style.header}>\n              <h2 className={style.heading}>{id}</h2>\n              <time dateTime={updatedAt} className={style.metadata}>\n                Last updated {moment(updatedAt).fromNow()}\n              </time>\n              <span className={style.metadata}>\n                Previewing {data.length} of {recordCount} records\n              </span>\n            </header>\n            <div className={style.table}>\n              <Table>\n                <thead>{this.renderHeaderCells(fieldMap)}</thead>\n                <tbody>{data.map(this.renderRow.bind(this, fieldMap))}</tbody>\n              </Table>\n            </div>\n          </div>\n        </Modal>\n      </React.Fragment>\n    );\n  }\n}\n\nPreviewModalComponent.defaultProps = {\n  showPreviewModal: false,\n  dataSet: { fields: {}, data: [] },\n};\n\nPreviewModalComponent.propTypes = {\n  dataSet: PropTypes.shape({\n    data: PropTypes.array,\n    fields: PropTypes.object,\n    id: PropTypes.string,\n    total_count: PropTypes.number,\n    updated_at: PropTypes.string,\n  }),\n  showPreviewModal: PropTypes.bool,\n  onChange: PropTypes.func,\n};\n\nexport default PreviewModalComponent;\n","import { connect } from 'react-redux';\nimport PreviewModalComponent from './preview-modal-component';\nimport * as datasetActions from '../../actions/dataset-actions';\nimport { track } from '../../../lib/tracker';\n\nconst PreviewModalConnector = connect(\n  state => {\n    const {\n      datasets: {\n        dataSet,\n        dataSet: { id },\n        showPreviewModal,\n      },\n    } = state;\n\n    return { dataSet, datasetId: id, showPreviewModal };\n  },\n  dispatch => {\n    return {\n      createOnChangeHandler: datasetId => state => {\n        dispatch(datasetActions.datasetSet(state));\n\n        if (state.showPreviewModal) {\n          track('Custom new - Select dataset preview', {\n            properties: { dataset_id: datasetId },\n          });\n        }\n      },\n    };\n  },\n  (stateProps, dispatchProps) => {\n    const { datasetId } = stateProps;\n    const { createOnChangeHandler } = dispatchProps;\n\n    return {\n      ...stateProps,\n      onChange: createOnChangeHandler(datasetId),\n    };\n  },\n)(PreviewModalComponent);\n\nexport default PreviewModalConnector;\n","import PreviewModalConnector from './preview-modal-connector';\nexport default PreviewModalConnector;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport DropMenu from '../../components/menu-legacy/drop-menu';\nimport DropLink from '../../components/menu-legacy/drop-link';\nimport PreviewModal from '../../dataset-config/components/preview-modal';\nimport classNames from 'classnames';\nimport ConditionalDisabledOverlayComponent from '../../components/conditional-disabled-overlay';\n\nimport style from './breadcrumb-dropdown-style.scss';\n\nclass BreadcrumbDropdownComponent extends Component {\n  renderPreviewModalLink() {\n    if (this.props.polecatService !== 'datasets') return null;\n\n    return <PreviewModal />;\n  }\n\n  renderOpenInNewTabLink() {\n    const { openInNewTabText, openInNewTabUrl } = this.props;\n\n    if (!openInNewTabText) {\n      return null;\n    }\n\n    return (\n      <DropLink href={openInNewTabUrl} target=\"_blank\">\n        {openInNewTabText}\n      </DropLink>\n    );\n  }\n\n  render() {\n    const {\n      disabled,\n      label,\n      className,\n      onToggleFilePicker,\n      changeFileText,\n      onRefreshFile,\n      refreshFileText,\n    } = this.props;\n\n    const crumbClass = classNames(className, style.fileTitle);\n\n    return (\n      <ConditionalDisabledOverlayComponent disabled={disabled}>\n        <DropMenu\n          label={label}\n          className={style.dropMenu}\n          toggleClassName={crumbClass}\n          listClassName={style.dropList}\n        >\n          <DropLink onClick={onToggleFilePicker}>{changeFileText}</DropLink>\n          <DropLink onClick={onRefreshFile}>{refreshFileText}</DropLink>\n          {this.renderPreviewModalLink()}\n          {this.renderOpenInNewTabLink()}\n        </DropMenu>\n      </ConditionalDisabledOverlayComponent>\n    );\n  }\n}\n\nBreadcrumbDropdownComponent.propTypes = {\n  changeFileText: PropTypes.string,\n  className: PropTypes.string,\n  disabled: PropTypes.bool,\n  label: PropTypes.string,\n  openInNewTabText: PropTypes.string,\n  openInNewTabUrl: PropTypes.string,\n  polecatService: PropTypes.string,\n  refreshFileText: PropTypes.string,\n  onRefreshFile: PropTypes.func,\n  onToggleFilePicker: PropTypes.func,\n};\n\nexport default BreadcrumbDropdownComponent;\n","import { connect } from 'react-redux';\nimport BreadcrumbDropdownComponent from './breadcrumb-dropdown-component';\nimport * as salesforceConfigActions from '../../salesforce-config/actions/salesforce-config-actions';\nimport * as spreadsheetConfigActions from '../../spreadsheet-config/actions/spreadsheet-config-actions';\nimport * as spreadsheetActions from '../../spreadsheet-config/actions/spreadsheet-actions';\nimport * as datasetActions from '../../dataset-config/actions/dataset-actions';\nimport * as universalQueryActions from '../../universal-config/actions/universal-query-actions';\n\nconst CHANGE_FILE_TEXT_SPREADSHEETS = 'Change spreadsheet';\nconst CHANGE_FILE_TEXT_SALESFORCE = 'Change report';\nconst REFRESH_FILE_TEXT_SPREADSHEETS = 'Reload spreadsheet';\nconst REFRESH_FILE_TEXT_SALESFORCE = 'Reload report';\nconst OPEN_IN_NEW_TAB_TEXT_SALESFORCE = 'Open report in Salesforce';\n\nconst SERVICE_SPECIFIC = {\n  spreadsheets: {\n    changeFileText: CHANGE_FILE_TEXT_SPREADSHEETS,\n    refreshFileText: REFRESH_FILE_TEXT_SPREADSHEETS,\n    actions: spreadsheetConfigActions,\n    fileActions: spreadsheetActions,\n  },\n  salesforce: {\n    changeFileText: CHANGE_FILE_TEXT_SALESFORCE,\n    refreshFileText: REFRESH_FILE_TEXT_SALESFORCE,\n    openInNewTabText: OPEN_IN_NEW_TAB_TEXT_SALESFORCE,\n    actions: salesforceConfigActions,\n    fileActions: salesforceConfigActions,\n  },\n  datasets: {\n    changeFileText: 'Change dataset',\n    refreshFileText: 'Refresh dataset',\n    actions: datasetActions,\n    fileActions: datasetActions,\n  },\n  universal: {\n    changeFileText: 'Change integration',\n    refreshFileText: 'Refresh',\n    actions: universalQueryActions,\n    fileActions: universalQueryActions,\n  },\n};\n\nconst BreadcrumbDropdownConnector = connect(\n  (state, props) => {\n    const { salesforce } = state;\n    const { polecatService } = props;\n    const {\n      changeFileText,\n      refreshFileText,\n      openInNewTabText,\n    } = SERVICE_SPECIFIC[polecatService];\n\n    let openInNewTabUrl;\n\n    if (polecatService === 'salesforce') {\n      ({ meta: { link: openInNewTabUrl } = {} } = salesforce);\n    }\n\n    return {\n      changeFileText,\n      refreshFileText,\n      openInNewTabText,\n      openInNewTabUrl,\n    };\n  },\n  (dispatch, props) => {\n    const { polecatService } = props;\n    const { actions, fileActions } = SERVICE_SPECIFIC[polecatService];\n\n    const onToggleFilePicker = () => {\n      dispatch(actions.toggleFilePicker(true));\n    };\n    const onRefreshFile = () => {\n      dispatch(fileActions.refreshFile());\n    };\n\n    return {\n      onToggleFilePicker,\n      onRefreshFile,\n    };\n  },\n)(BreadcrumbDropdownComponent);\n\nexport default BreadcrumbDropdownConnector;\nexport {\n  CHANGE_FILE_TEXT_SPREADSHEETS,\n  CHANGE_FILE_TEXT_SALESFORCE,\n  REFRESH_FILE_TEXT_SPREADSHEETS,\n  REFRESH_FILE_TEXT_SALESFORCE,\n  OPEN_IN_NEW_TAB_TEXT_SALESFORCE,\n};\n","import BreadcrumbDropdown from './breadcrumb-dropdown-connector';\nexport default BreadcrumbDropdown;\n","import { matchPath } from 'react-router';\nimport { useLocation } from 'react-router-dom';\nimport { values } from 'lodash';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport {\n  PATHS,\n  makePath,\n  STEPS,\n} from '../../spreadsheet-config-beta/helpers/path';\nimport MastheadBreadcrumb from '../masthead-breadcrumb';\n\nimport style from './widget-masthead-style.scss';\n\nconst SpreadsheetsBetaBreadcrumbs = ({ dashboardId }) => {\n  const match = matchPath(useLocation().pathname, {\n    path: [...values(PATHS.create), ...values(PATHS.edit)],\n  });\n  const {\n    params: { fileId, widgetId },\n  } = match;\n  const configureWidgetURL = makePath(STEPS.configure, {\n    fileId,\n    dashboardId,\n    widgetId,\n  });\n  const selectVizURL = makePath(STEPS.selectVisualization, {\n    fileId,\n    dashboardId,\n    widgetId,\n  });\n  const isOnEditStep = useLocation().pathname === configureWidgetURL;\n\n  if (isOnEditStep) {\n    return (\n      <>\n        <MastheadBreadcrumb\n          label=\"Select data\"\n          href={selectVizURL}\n          className={style.crumb}\n        />\n        <MastheadBreadcrumb\n          label=\"Configure widget\"\n          className={style.basicCrumb}\n        />\n      </>\n    );\n  }\n\n  return (\n    <MastheadBreadcrumb label=\"Select data\" className={style.basicCrumb} />\n  );\n};\n\nSpreadsheetsBetaBreadcrumbs.propTypes = {\n  dashboardId: PropTypes.string.isRequired,\n};\n\nexport default SpreadsheetsBetaBreadcrumbs;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { isUndefined } from 'lodash';\nimport BaseMasthead from '../base-masthead';\nimport { getDashboardPath, getServicePath } from '../../lib/path';\nimport MastheadBreadcrumb from '../masthead-breadcrumb';\nimport BreadcrumbDropdown from '../breadcrumb-dropdown';\nimport BreadcrumbNav from '../breadcrumb-nav';\nimport BreadcrumbLink from '../breadcrumb-link';\nimport SpreadsheetsBetaBreadcrumbs from './spreadsheets-beta-breadcrumbs';\n\nimport style from './widget-masthead-style.scss';\n\nconst breadcrumbOverrides = {\n  Spreadsheets: 'Select spreadsheet',\n};\n\nconst getBreadcrumbServiceLabel = serviceTitle => {\n  const override = breadcrumbOverrides[serviceTitle];\n  return override ? override : serviceTitle;\n};\n\nconst WidgetMastheadComponent = props => {\n  const {\n    dashboardId,\n    onTextClick,\n    widgetId,\n    polecatService,\n    serviceTitle,\n    title,\n  } = props;\n  const isSpreadsheetsBeta = polecatService === 'spreadsheetsbeta';\n  const dashboardPath = getDashboardPath(dashboardId);\n\n  const editMode = !isUndefined(widgetId);\n\n  const renderBreadcrumbText = () => {\n    const text = editMode ? 'Edit widget' : 'Add widget';\n\n    return (\n      <MastheadBreadcrumb\n        label={text}\n        href={`/v4/dashboards/${dashboardId}`}\n        disabled={editMode}\n        className={style.crumb}\n        onClick={onTextClick}\n      />\n    );\n  };\n\n  const renderServiceTitle = () => {\n    const { serviceId, serviceName, isNewIntegration } = props;\n\n    const href = getServicePath(serviceName, {\n      dashboardId,\n      serviceId,\n      isNewIntegration,\n    });\n\n    if (!serviceTitle) return null;\n\n    return (\n      <MastheadBreadcrumb\n        label={getBreadcrumbServiceLabel(serviceTitle)}\n        href={href}\n        disabled={editMode}\n        className={style.crumb}\n      />\n    );\n  };\n\n  const renderWidgetTitle = () => {\n    const { widgetTitle, isInitLoading } = props;\n    if (!widgetTitle) return null;\n\n    if (!polecatService) {\n      return <MastheadBreadcrumb label={widgetTitle} className={style.crumb} />;\n    }\n\n    // render dropdown for choosing and refreshing file\n    return (\n      <BreadcrumbDropdown\n        polecatService={polecatService}\n        label={widgetTitle}\n        disabled={isInitLoading}\n        className={style.basicCrumb}\n      />\n    );\n  };\n\n  return (\n    <BaseMasthead {...props}>\n      <BreadcrumbNav>\n        <BreadcrumbLink href={dashboardPath} text={title} />\n        {renderBreadcrumbText()}\n        {renderServiceTitle()}\n        {isSpreadsheetsBeta ? (\n          <SpreadsheetsBetaBreadcrumbs dashboardId={dashboardId} />\n        ) : (\n          renderWidgetTitle()\n        )}\n      </BreadcrumbNav>\n    </BaseMasthead>\n  );\n};\n\nWidgetMastheadComponent.propTypes = {\n  dashboardId: PropTypes.string,\n  isFileMissing: PropTypes.bool,\n  isInitLoading: PropTypes.bool,\n  isNewIntegration: PropTypes.bool,\n  polecatService: PropTypes.string,\n  serviceId: PropTypes.number,\n  serviceName: PropTypes.string,\n  serviceTitle: PropTypes.string,\n  spreadsheetServiceId: PropTypes.string,\n  title: PropTypes.string,\n  widgetId: PropTypes.string,\n  widgetTitle: PropTypes.string,\n  onTextClick: PropTypes.func,\n};\n\nexport default WidgetMastheadComponent;\n","import { connect } from 'react-redux';\nimport WidgetMastheadComponent from './widget-masthead-component';\nimport { cancelConnection } from '../../data-source-connector/actions/data-source-connector-actions';\nimport { find } from 'lodash';\nimport { isPolecatService } from '../../lib/is-polecat-service';\nimport { router } from '../../router';\n\nconst getServiceName = (polecatService, connectServiceId) => {\n  if (polecatService === 'spreadsheetsbeta') {\n    return 'spreadsheets';\n  }\n  return polecatService || connectServiceId;\n};\n\nfunction propsForSpreadsheets(state) {\n  const {\n    spreadsheets: { title, isInitLoading, isFileMissing },\n  } = state;\n\n  return [isInitLoading, { widgetTitle: title, isInitLoading, isFileMissing }];\n}\n\nfunction propsForSalesforce(state) {\n  const {\n    salesforce: { meta: { label } = {}, isInitLoading, isMetaLoading },\n  } = state;\n\n  return [\n    isMetaLoading,\n    { widgetTitle: label, isInitLoading, isFileMissing: false },\n  ];\n}\n\nfunction propsForDatasets(state) {\n  const {\n    datasets: { isLoading, dataSet: { id } = {} },\n  } = state;\n\n  return [\n    isLoading,\n    { widgetTitle: id, isInitLoading: isLoading, isFileMissing: false },\n  ];\n}\n\nfunction getServiceProps(state, serviceName) {\n  switch (serviceName) {\n    case 'spreadsheets':\n      return propsForSpreadsheets(state);\n    case 'salesforce':\n      return propsForSalesforce(state);\n    case 'datasets':\n      return propsForDatasets(state);\n    default:\n      return [false, {}];\n  }\n}\n\nconst getBreadcrumbsProps = (state, serviceName, connectServiceId) => {\n  // get services and find the current service\n  const {\n    dataSources: { services = [] },\n  } = state;\n\n  const { title: serviceTitle, id: serviceId } =\n    find(services, { name: serviceName }) || {};\n\n  const [isLoading, serviceProps] = getServiceProps(state, serviceName);\n\n  // Set widgetTitle to undefined if connection panel is open\n  // or if data is loading\n  if (connectServiceId || isLoading) {\n    serviceProps.widgetTitle = undefined;\n  }\n\n  return { serviceId, serviceTitle, ...serviceProps };\n};\n\nconst WidgetMastheadConnector = connect(\n  (state, props) => {\n    const { dashboardId, polecatService, connectServiceId } = props;\n    const serviceName = getServiceName(polecatService, connectServiceId);\n\n    // if there is no service name we are in gecko-js land\n    // and the breadcrumbs for an old integration are displayed\n    if (!serviceName) {\n      const { serviceId, serviceTitle, widgetTitle } = props;\n      return {\n        isNewIntegration: false,\n        serviceId,\n        serviceTitle,\n        widgetTitle,\n        dashboardId,\n      };\n    }\n\n    // otherwise we are in polecat\n    // either on the connection panel or on the preview screen\n    const {\n      serviceId,\n      serviceTitle,\n      widgetTitle,\n      isInitLoading,\n      isFileMissing,\n    } = getBreadcrumbsProps(state, serviceName, connectServiceId);\n\n    return {\n      isNewIntegration: true,\n      isFileMissing,\n      serviceName,\n      serviceId,\n      serviceTitle,\n      widgetTitle,\n      isInitLoading,\n      dashboardId,\n    };\n  },\n  (dispatch, { polecatService, connectServiceId, serviceType }) => {\n    const serviceName = polecatService || connectServiceId;\n    let onTextClick;\n\n    // Overwrite TextClick to cancel connection if new polecat service connection\n    // TODO: Use a more genereric action that can rely on a state in store\n    // to conditionnally route and / or cancel\n    if (polecatService || isPolecatService(serviceName, serviceType)) {\n      onTextClick = href => {\n        dispatch(cancelConnection());\n        router.navigate(href);\n      };\n    }\n\n    return { onTextClick };\n  },\n)(WidgetMastheadComponent);\n\nexport default WidgetMastheadConnector;\nexport { getBreadcrumbsProps };\n","import WidgetMasthead from './widget-masthead-connector';\nexport default WidgetMasthead;\n","import createReactRenderer from '../react-renderer';\nimport DashboardMasthead from './dashboard-masthead';\nimport WidgetMasthead from './widget-masthead';\nimport BaseMasthead from './base-masthead';\n\nconst Dashboard = createReactRenderer(DashboardMasthead);\nconst Widget = createReactRenderer(WidgetMasthead);\nconst Account = createReactRenderer(BaseMasthead);\n\nexport default { Dashboard, Widget, Account };\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\n\nimport style from './service-search-style.scss';\n\nclass ServiceSearchComponent extends Component {\n  handleChange(e) {\n    e.preventDefault();\n    const query = e.target.value || '';\n\n    this.props.handleSearch(query);\n  }\n\n  render() {\n    const { layoutClasses, value } = this.props;\n    const classes = classNames(\n      {\n        [layoutClasses]: layoutClasses,\n      },\n      style.search,\n    );\n\n    return (\n      <span className={classes}>\n        <input\n          autoFocus\n          type=\"search\"\n          name=\"service\"\n          value={value}\n          onChange={this.handleChange.bind(this)}\n          placeholder={'Search sources'}\n        />\n      </span>\n    );\n  }\n}\n\nServiceSearchComponent.propTypes = {\n  handleSearch: PropTypes.func,\n  layoutClasses: PropTypes.string,\n  value: PropTypes.string,\n};\n\nexport default ServiceSearchComponent;\n","import ServiceSearchComponent from './service-search-component';\nimport layout from '../../../hoc/layout';\nexport default layout(ServiceSearchComponent);\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport StatusLabel from '../../../components/status-label';\nimport ServiceIcon from '../../../components/service-icon';\nimport { getServicePath } from '../../../lib/path';\n\nimport style from './service-pill-style.scss';\n\nconst PillLink = ({\n  children,\n  name,\n  isLegacy,\n  isUniversal,\n  label,\n  dashboardId,\n  serviceId,\n  hasAccounts,\n  hasPresets,\n  onClick,\n}) => {\n  const path = getServicePath(name, {\n    dashboardId,\n    serviceId,\n    isLegacy,\n    isUniversal,\n    hasAccounts,\n    hasPresets,\n  });\n  const dataName = label ? `${name}-${label}` : `${name}`;\n\n  return (\n    <Link\n      className={style.link}\n      to={path}\n      onClick={onClick}\n      data-service-name={dataName}\n    >\n      {children}\n    </Link>\n  );\n};\n\nPillLink.propTypes = {\n  children: PropTypes.node,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  hasAccounts: PropTypes.bool,\n  hasPresets: PropTypes.bool,\n  isLegacy: PropTypes.bool,\n  isUniversal: PropTypes.bool,\n  label: PropTypes.string,\n  name: PropTypes.string,\n  serviceId: PropTypes.number,\n  onClick: PropTypes.func,\n};\n\nconst ServicePill = ({\n  id,\n  dashboardId,\n  title,\n  name,\n  label,\n  isLegacy,\n  isUniversal,\n  has_accounts: hasAccounts,\n  hasPresets,\n  onClick,\n}) => (\n  <div className={style.pillContainer}>\n    <PillLink\n      name={name}\n      dashboardId={dashboardId}\n      serviceId={id}\n      label={label}\n      isLegacy={isLegacy}\n      isUniversal={isUniversal}\n      hasAccounts={hasAccounts}\n      hasPresets={hasPresets}\n      onClick={onClick}\n    >\n      <div className={style.content}>\n        <ServiceIcon\n          className={style.logo}\n          serviceName={name}\n          size={40}\n          rounded\n        />\n        {title}\n      </div>\n    </PillLink>\n    {label && (\n      <div className={style.label}>\n        <StatusLabel type={label} />\n      </div>\n    )}\n  </div>\n);\n\nServicePill.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  featuredDescription: PropTypes.string,\n  hasPresets: PropTypes.bool,\n  has_accounts: PropTypes.bool,\n  id: PropTypes.number,\n  isLegacy: PropTypes.bool,\n  isUniversal: PropTypes.bool,\n  label: PropTypes.string,\n  name: PropTypes.string,\n  title: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nexport { ServicePill as default, PillLink };\n","import ServicePill from './service-pill-component';\nexport default ServicePill;\n","export const SERVICE_LIST_COLUMNS = { col: 12, sm: 6, md: 4, lg: 3 };\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Layout from '../../../components/layout';\nimport Pill from '../service-pill';\nimport { SERVICE_LIST_COLUMNS } from '../../service-list-constants';\n\nconst ServiceComponent = props => {\n  const { service, dashboardId, onClick } = props;\n\n  return (\n    <Layout\n      tag=\"li\"\n      {...SERVICE_LIST_COLUMNS}\n      paddingX={1.5}\n      paddingBottom={1.5}\n    >\n      <Pill\n        {...service}\n        dashboardId={dashboardId}\n        onClick={e => onClick(service, e)}\n      />\n    </Layout>\n  );\n};\n\nServiceComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  service: PropTypes.object,\n  onClick: PropTypes.func,\n};\n\nconst ListComponent = props => {\n  const { dashboardId, onClickService } = props;\n\n  return (\n    <Layout tag=\"ol\" gutter={3} flex flexWrap>\n      {props.services.map(service => (\n        <ServiceComponent\n          key={`${service.id}-${service.key}`}\n          service={service}\n          dashboardId={dashboardId}\n          onClick={onClickService}\n        />\n      ))}\n    </Layout>\n  );\n};\n\nListComponent.defaultProps = {\n  services: [],\n};\n\nListComponent.propTypes = {\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  services: PropTypes.array,\n  onClickService: PropTypes.func,\n};\n\nexport { ListComponent as default, ServiceComponent };\n","import ListComponent from './list-component';\nexport default ListComponent;\n","import React, { useState } from 'react';\nimport { noop } from 'lodash';\nimport PropTypes from 'prop-types';\nimport Button from '@UI/button';\nimport Blob from '@UI/playground/blob';\nimport Icon from '@UI/icon';\nimport IntegrationRequestModal from '../../../integration-request/components/integration-request-modal';\nimport ExternalLink from '../../../components/external-link';\nimport FormattedMessage from '../../../lib/i18n';\n\nimport style from './integrations-page-footer-style.scss';\n\nconst FOOTER_SERVICES = [\n  {\n    title: 'Spreadsheets',\n    icon: 'table',\n    name: 'spreadsheets',\n    link:\n      'https://support.geckoboard.com/hc/en-us/sections/115001960548-Spreadsheets',\n  },\n  {\n    title: 'Databases',\n    icon: 'database',\n    name: 'databases',\n    link: 'https://support.geckoboard.com/hc/en-us/articles/360021211391',\n  },\n  {\n    title: 'Datasets API',\n    icon: 'cogs',\n    name: 'datasets',\n    link:\n      'https://developer.geckoboard.com/hc/en-us/articles/360019745091-Getting-started-with-Datasets',\n  },\n];\n\nconst IntegrationSuggestions = () => {\n  return (\n    <>\n      <p className={style.suggestionsText}>\n        We don't support the Data Source you're looking for, but there are other\n        ways to get your data into Geckoboard:\n      </p>\n      <div className={style.suggestions}>\n        {FOOTER_SERVICES.map(({ icon, title, name, link }, index) => (\n          <div className={style.integration} key={title}>\n            <div className={style.blobContainer}>\n              <Blob size={70} version={`blob_${index + 1}.svg`}>\n                <Icon name={icon} />\n              </Blob>\n            </div>\n            <div className={style.integrationText}>\n              <p className={style.integrationTitle}>{title}</p>\n              <p className={style.subheading}>\n                <FormattedMessage\n                  id={`dataSources.footer.integration.${name}`}\n                />\n              </p>\n              <p>\n                <ExternalLink href={link}>Learn more</ExternalLink>\n              </p>\n            </div>\n          </div>\n        ))}\n      </div>\n    </>\n  );\n};\n\nconst IntegrationRequestSection = ({ onSubmitIntegrationRequest }) => {\n  const [isRequestModalOpen, setIsRequestModalOpen] = useState(false);\n\n  const handleSubmitRequest = data => {\n    onSubmitIntegrationRequest(data);\n    setIsRequestModalOpen(false);\n  };\n\n  const handleOpenModal = () => {\n    setIsRequestModalOpen(true);\n  };\n\n  const handleCloseModal = () => {\n    setIsRequestModalOpen(false);\n  };\n\n  return (\n    <>\n      <div className={style.footerBox}>\n        <div className={style.leftHandSide}>\n          <div>\n            <Blob>\n              <Icon name=\"question\" />\n            </Blob>\n          </div>\n          <div className={style.textContainer}>\n            <p className={style.heading}>\n              Can't find the data source you need?\n            </p>\n            <p className={style.subheading}>\n              If you can't find the data source you need, please tell us what\n              you are looking for.\n            </p>\n          </div>\n        </div>\n        <div className={style.buttonContainer}>\n          <Button onClick={handleOpenModal} intent=\"secondary\">\n            Send us a request\n          </Button>\n        </div>\n      </div>\n      <IntegrationRequestModal\n        visible={isRequestModalOpen}\n        onSubmit={handleSubmitRequest}\n        onClose={handleCloseModal}\n      />\n    </>\n  );\n};\n\nIntegrationRequestSection.defaultProps = {\n  onSubmitIntegrationRequest: noop,\n};\n\nIntegrationRequestSection.propTypes = {\n  onSubmitIntegrationRequest: PropTypes.func,\n};\n\nconst IntegrationsPageFooter = ({\n  isSearchResultEmpty,\n  onSubmitIntegrationRequest,\n}) => {\n  return (\n    <>\n      {isSearchResultEmpty && <IntegrationSuggestions />}\n      <IntegrationRequestSection\n        onSubmitIntegrationRequest={onSubmitIntegrationRequest}\n      />\n    </>\n  );\n};\n\nIntegrationsPageFooter.defaultProps = {\n  onSubmitIntegrationRequest: noop,\n};\n\nIntegrationsPageFooter.propTypes = {\n  isSearchResultEmpty: PropTypes.bool,\n  onSubmitIntegrationRequest: PropTypes.func,\n};\n\nexport default IntegrationsPageFooter;\nexport { IntegrationRequestSection, IntegrationSuggestions }; // exported for testing only.\n","import IntegrationsPageFooter from './integrations-page-footer-connector';\nexport default IntegrationsPageFooter;\n","import { connect } from 'react-redux';\nimport IntegrationsPageFooter from './integrations-page-footer';\nimport { submitIntegrationRequest } from '../../../services/management-service';\nimport * as toastActions from '../../../toast/actions';\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onSubmitIntegrationRequest: async data => {\n      const { name, description } = data;\n      const serviceRequest = {\n        service_name: name,\n        details: description,\n      };\n\n      try {\n        await submitIntegrationRequest(serviceRequest);\n        dispatch(toastActions.showSuccessToast('Request sent. Thanks'));\n      } catch (e) {\n        dispatch(toastActions.showGenericErrorToast());\n      }\n    },\n  };\n};\n\nconst IntegrationsPageFooterConnector = connect(\n  null,\n  mapDispatchToProps,\n)(IntegrationsPageFooter);\n\nexport default IntegrationsPageFooterConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Layout from '../../../components/layout';\n\nimport styles from './service-list-header-style.scss';\n\nconst ServiceListHeader = ({ children }) => (\n  <Layout tag=\"h1\" marginBottom={2} className={styles.header}>\n    {children}\n  </Layout>\n);\n\nServiceListHeader.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default ServiceListHeader;\n","import ServiceListHeader from './service-list-header-component';\nexport default ServiceListHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Layout from '../../../components/layout';\n\nimport styles from './service-list-subheader-style.scss';\n\nconst Subheader = ({ children, flexAuto }) => (\n  <Layout\n    tag=\"h2\"\n    marginBottom={1}\n    className={styles.subheader}\n    flexAuto={flexAuto}\n  >\n    {children}\n  </Layout>\n);\n\nSubheader.propTypes = {\n  children: PropTypes.node,\n  flexAuto: PropTypes.bool,\n};\n\nexport default Subheader;\n","import ServiceListSubheader from './service-list-subheader-component';\nexport default ServiceListSubheader;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { pluralize } from '../lib/toString';\nimport { matches } from '../lib/service';\nimport { sortByTitle } from '../data-sources/data-sources-helpers';\nimport ServiceSearch from './components/service-search';\nimport List from './components/list';\nimport { Column, Row } from '../components/layout';\nimport IntegrationsPageFooter from './components/integrations-page-footer';\nimport ServiceListHeader from './components/service-list-header';\nimport ServiceListSubheader from './components/service-list-subheader';\nimport FormattedMessage from '../lib/i18n';\n\nimport style from './service-list-style.scss';\n\nclass ServiceListComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    this.handleSearch = this.handleSearch.bind(this);\n\n    this.state = {\n      query: '',\n      filtered: [],\n    };\n  }\n\n  handleSearch(query) {\n    if (!query || query === '') {\n      this.setState({ filtered: [], query: '' });\n      return;\n    }\n\n    const { services = [], toolServices = [], afterSearch } = this.props;\n\n    let filtered = [...services, ...toolServices].filter(\n      matches(['title', 'keywords'], query.trim()),\n    );\n\n    filtered = sortByTitle(filtered);\n\n    this.setState({ filtered, query });\n    afterSearch(query, filtered);\n  }\n\n  renderRecents() {\n    const {\n      recentServices,\n      dashboardId,\n      onClickService,\n      onClickManageAllConnections,\n      groupId,\n    } = this.props;\n    const path = `/admin/groups/${groupId}/data-sources`;\n\n    if (!recentServices || recentServices.length === 0 || !!this.state.query) {\n      return null;\n    }\n\n    return (\n      <Column marginBottom={2}>\n        <Row>\n          <ServiceListSubheader flexAuto>\n            Your recent connections\n          </ServiceListSubheader>\n          <a\n            href={path}\n            className={style.manageLink}\n            onClick={e => {\n              e.preventDefault();\n              onClickManageAllConnections(path);\n            }}\n          >\n            Manage all connections\n          </a>\n        </Row>\n        <List\n          services={recentServices}\n          dashboardId={dashboardId}\n          onClickService={(service, event) =>\n            onClickService(service, 'Recent list', event)\n          }\n        />\n      </Column>\n    );\n  }\n\n  renderSources() {\n    const { services, dashboardId, onClickService } = this.props;\n    const { query, filtered } = this.state;\n    let title = 'Data Sources';\n\n    if (!!query) {\n      const n = filtered.length;\n      title = `${n} ${pluralize(n, 'result')} for \"${query}\"`;\n    }\n\n    return (\n      <Column marginBottom={2}>\n        <ServiceListSubheader>{title}</ServiceListSubheader>\n        <List\n          services={!!query ? filtered : services}\n          dashboardId={dashboardId}\n          onClickService={(service, event) =>\n            onClickService(service, 'Main list', event)\n          }\n        />\n      </Column>\n    );\n  }\n\n  renderTools() {\n    const { toolServices, dashboardId, onClickService } = this.props;\n\n    if (!toolServices || !!this.state.query) return null;\n\n    return (\n      <Column marginBottom={2}>\n        <ServiceListSubheader>Dashboard Tools</ServiceListSubheader>\n        <List\n          services={toolServices}\n          dashboardId={dashboardId}\n          onClickService={(service, event) =>\n            onClickService(service, undefined, event)\n          }\n        />\n      </Column>\n    );\n  }\n\n  render() {\n    return (\n      <div className={style.ServiceList}>\n        <div className={style.wrapper} data-page-content=\"integrations\">\n          <Row justify=\"center\">\n            <Column margin={2} md={10}>\n              <ServiceListHeader>\n                <FormattedMessage id=\"integrationsPage.headline\" />\n              </ServiceListHeader>\n              <ServiceSearch\n                marginBottom={2}\n                value={this.state.query}\n                handleSearch={this.handleSearch}\n              />\n              {this.renderRecents()}\n              {this.renderSources()}\n              {this.renderTools()}\n              <IntegrationsPageFooter\n                isSearchResultEmpty={\n                  !!this.state.query && this.state.filtered.length === 0\n                }\n              />\n            </Column>\n          </Row>\n        </div>\n      </div>\n    );\n  }\n}\n\nServiceListComponent.defaultProps = {\n  services: [],\n  featuredServices: [],\n  recentServices: [],\n  toolServices: [],\n};\n\nServiceListComponent.propTypes = {\n  afterSearch: PropTypes.func,\n  dashboardId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  featuredServices: PropTypes.array,\n  groupId: PropTypes.number,\n  isFiltered: PropTypes.bool,\n  recentServices: PropTypes.array,\n  services: PropTypes.array,\n  toolServices: PropTypes.array,\n  onClickManageAllConnections: PropTypes.func,\n  onClickService: PropTypes.func,\n};\n\nexport default ServiceListComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { OnMount } from '../../hoc/on-mount';\n\nconst ServiceListMounter = ({ children, onMount, isReady }) => {\n  if (!isReady) {\n    return null;\n  }\n\n  return <OnMount do={onMount}>{children}</OnMount>;\n};\n\nServiceListMounter.propTypes = {\n  children: PropTypes.any,\n  isReady: PropTypes.bool,\n  onMount: PropTypes.func,\n};\n\nexport default ServiceListMounter;\n","import { connect } from 'react-redux';\nimport ServiceListMounter from './service-list-mounter-component';\nimport * as dataSourceActions from '../../data-sources/actions/data-sources-actions';\nimport activatedMirageIntegrations from '../../universal-config/mirage/activated-mirage-integrations';\nimport * as mirageActions from '../../universal-config/mirage/mirage-actions';\nimport * as groupsActions from '../../groups/actions/groups-actions';\n\nconst mapStateToProps = state => {\n  const {\n    user: { default_group_id: groupId } = {},\n    organization: { date: organizationCreated } = {},\n  } = state.user;\n\n  return {\n    isReady: !!(groupId && organizationCreated),\n    groupId,\n    organizationCreated,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  createHandlers: stateProps => ({\n    onMount: () => {\n      activatedMirageIntegrations.get().then(integrations => {\n        dispatch(mirageActions.setActivatedIntegrations(integrations));\n      });\n      dispatch(groupsActions.getDataSources(stateProps.groupId));\n      dispatch(\n        dataSourceActions.fetchSources(\n          { includeRecentlyConnected: true },\n          stateProps.organizationCreated,\n        ),\n      );\n    },\n  }),\n});\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => ({\n  ...stateProps,\n  ...dispatchProps.createHandlers(stateProps),\n  ...ownProps,\n});\n\nconst ServiceListMounterConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(ServiceListMounter);\n\nexport default ServiceListMounterConnector;\n","import ServiceListMounter from './service-list-mounter-connector';\n\nexport default ServiceListMounter;\n","import { track, trackSnowplow } from '../lib/tracker';\nimport { LOCATIONS } from '@Tracking/constants';\nimport { integrationSelected } from '@Tracking/events';\nimport { trackEvent } from '@Tracking';\n\nconst EXTRA_TRACKING = {\n  custom: 'Custom old',\n  database: 'Database',\n  datasets: 'Custom new',\n  freshdesk: 'Freshdesk',\n  ga2: 'Google Analytics old',\n  gaUniversal: 'Google Analytics',\n  hubspot2: 'Hubspot old',\n  hubspot3: 'Hubspot',\n  intercom2: 'Intercom old',\n  intercom3: 'Intercom',\n  pipedrive: 'Pipedrive old',\n  pipedrive2: 'Pipedrive',\n  salesforce: 'Salesforce old',\n  salesforceNew: 'Salesforce new',\n  spreadsheets: 'Spreadsheets',\n  zendeskUniversal: 'Zendesk',\n  zendeskchat: 'Zendesk chat',\n};\n\nconst trackServiceSelection = (service, source, userId, orgId) => {\n  const { id, title, auth_type: authType, key, name } = service;\n\n  track('Select Service', {\n    properties: {\n      service_id: id,\n      service_name: title,\n      auth_type: authType,\n      source,\n    },\n  });\n\n  trackSnowplow('service_select', '1-0-0', {\n    user_id: `${userId}`,\n    org_id: `${orgId}`,\n    service_id: `${id}`,\n    service_name: title,\n    auth_type: authType,\n    source,\n  });\n\n  trackEvent(\n    integrationSelected({\n      'Auth type': authType,\n      'Integration name': title,\n      'Integration slug': name,\n      Location:\n        source === 'Main list'\n          ? LOCATIONS.IntegrationsMainList\n          : LOCATIONS.IntegrationsRecentList,\n    }),\n  );\n\n  // Key is some magic we use to differentiate between the old and new salesforce\n  // interfaces\n  const extraTracking = EXTRA_TRACKING[key || name];\n\n  if (extraTracking) {\n    track(`${extraTracking} - Select service`);\n  }\n};\n\nexport { trackServiceSelection };\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport {\n  omit,\n  chain,\n  includes,\n  partition,\n  sortBy,\n  isUndefined,\n  some,\n  findIndex,\n  debounce,\n} from 'lodash';\nimport ServiceListComponent from './service-list-component';\nimport ServiceListMounter from './service-list-mounter';\nimport { track, trackSnowplow } from '../lib/tracker';\nimport * as mirageHelpers from '../universal-config/mirage/mirage-helpers';\nimport { redirect } from '../lib/global';\nimport { trackEvent } from '@Tracking';\nimport { integrationListSearched, buttonClicked } from '@Tracking/events';\nimport { addStraightToDashboard } from '../universal-config/actions/universal-config-save-actions';\nimport { trackServiceSelection } from './service-list-helpers';\n\nconst TOOL_SERVICES = ['text', 'image', 'qrcode', 'clock'];\nconst FEATURED_SERVICES = ['spreadsheets', 'database', 'datasets'];\nconst HIDDEN_SERVICES = ['universal-demo'];\n\nconst getFeaturesServices = services => {\n  return chain(services)\n    .filter(s => includes(FEATURED_SERVICES, s.name))\n    .sortBy(s => FEATURED_SERVICES.indexOf(s.name))\n    .value();\n};\n\nconst isRecentlyConnected = (service, recentlyConnectedIds) => {\n  // If service has `polymorphic` property, compare both `id` and `polymorphic`\n  return some(recentlyConnectedIds, ({ id, polymorphic }) => {\n    if (isUndefined(service.polymorphic)) return id === service.id;\n    return id === service.id && polymorphic === service.polymorphic;\n  });\n};\n\nconst orderRecentlyConnected = recentlyConnectedIds => s =>\n  findIndex(\n    recentlyConnectedIds,\n    i =>\n      i.id === s.id &&\n      (isUndefined(s.polymorphic) || i.polymorphic === s.polymorphic),\n  );\n\nconst sortLegacy = service => service.label === 'legacy';\n\nconst trackSearch = (userId, orgId, searchTerm, filteredServices) => {\n  track('Search Services', {\n    properties: {\n      searchTerm,\n      results: filteredServices.length,\n    },\n  });\n\n  trackSnowplow('service_search', '1-0-0', {\n    user_id: `${userId}`,\n    org_id: `${orgId}`,\n    search_term: searchTerm,\n    results_count: filteredServices.length,\n  });\n\n  trackEvent(\n    integrationListSearched({\n      'Search term': searchTerm,\n      'Search results count': filteredServices.length,\n    }),\n  );\n};\nconst trackSearchDebounced = debounce(trackSearch, 750);\n\nconst mapStateToProps = state => {\n  let allServices = state.dataSources.formattedServices || [];\n  const recentlyConnectedIds = state.dataSources.recentlyConnectedIds || [];\n  const {\n    user: {\n      id: userId,\n      organization_id: orgId,\n      default_group_id: groupId,\n      features = [],\n    } = {},\n  } = state.user;\n  const connections = state.allDataSources;\n  const { activatedMirageIntegrations } = state.dataSources;\n\n  allServices = allServices.filter(s => !HIDDEN_SERVICES.includes(s.name));\n\n  const partitionedServices = partition(allServices, s =>\n    includes(TOOL_SERVICES, s.name),\n  );\n  const toolServices = partitionedServices[0];\n  const services = sortBy(partitionedServices[1], sortLegacy);\n  const featuredServices = getFeaturesServices(allServices);\n\n  const recentServices = chain(allServices)\n    .filter(service => isRecentlyConnected(service, recentlyConnectedIds))\n    .filter(service => !service.isAliased)\n    .sortBy(orderRecentlyConnected(recentlyConnectedIds))\n    .value();\n\n  /*\n   * CALLBACKS\n   */\n  const afterSearch = (query, filtered) => {\n    trackSearchDebounced(userId, orgId, query, filtered);\n  };\n\n  const onClickManageAllConnections = path => {\n    track('Integration list - Manage all connections - Click');\n    trackEvent(\n      buttonClicked({\n        'Button identifier': 'Integration list - Manage all connections',\n      }),\n    );\n    redirect(path, 300);\n  };\n\n  return {\n    services,\n    toolServices,\n    featuredServices,\n    recentServices,\n    groupId,\n    afterSearch,\n    onClickManageAllConnections,\n\n    // Used by dispatch props\n    userId,\n    orgId,\n    features,\n    connections,\n    activatedMirageIntegrations,\n    allServices: state.dataSources.formattedServices,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => ({\n  createHandlers: stateProps => ({\n    onClickService: (service, source, event) => {\n      const { dashboardId } = props;\n\n      trackServiceSelection(\n        service,\n        source,\n        stateProps.userId,\n        stateProps.orgId,\n      );\n\n      if (\n        mirageHelpers.shouldCreateMirageWidget(\n          service,\n          stateProps.features,\n          stateProps.connections,\n          stateProps.activatedMirageIntegrations,\n        )\n      ) {\n        event.preventDefault();\n\n        const mirageService = mirageHelpers.findMirageService(\n          stateProps.allServices,\n        );\n\n        dispatch(\n          addStraightToDashboard(\n            mirageService,\n            dashboardId,\n            undefined,\n            service,\n          ),\n        );\n      }\n    },\n  }),\n});\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const remainingStateProps = omit(stateProps, [\n    'userId',\n    'orgId',\n    'features',\n    'allServices',\n    'connections',\n    'activatedMirageIntegrations',\n  ]);\n\n  return {\n    ...remainingStateProps,\n    ...dispatchProps.createHandlers(stateProps),\n    ...ownProps,\n  };\n};\n\nconst ServiceListConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(props => (\n  <ServiceListMounter>\n    <ServiceListComponent {...props} />\n  </ServiceListMounter>\n));\n\nexport default ServiceListConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Layout from '../../../components/layout';\nimport StatusLabel from '../../../components/status-label';\nimport ServiceIcon from '../../../components/service-icon';\nimport { SERVICE_LIST_COLUMNS } from '../../service-list-constants';\n\nimport style from './inactive-list-style.scss';\n\nconst InactiveList = ({ services }) => {\n  return (\n    <Layout tag=\"ol\" gutter={3} flex flexWrap>\n      {services.map(({ name, title, label }, key) => (\n        <Layout\n          key={`${name}-${key}`}\n          tag=\"li\"\n          {...SERVICE_LIST_COLUMNS}\n          paddingX={1.5}\n          paddingBottom={1.5}\n        >\n          <div className={style.container}>\n            <div className={style.content}>\n              <ServiceIcon\n                className={style.logo}\n                serviceName={name}\n                size={40}\n                rounded\n              />\n              {title}\n            </div>\n            {label && (\n              <div className={style.label}>\n                <StatusLabel type={label} />\n              </div>\n            )}\n          </div>\n        </Layout>\n      ))}\n    </Layout>\n  );\n};\n\nInactiveList.defaultProps = {\n  services: [],\n};\n\nInactiveList.propTypes = {\n  services: PropTypes.array,\n};\n\nexport default InactiveList;\n","import InactiveList from './inactive-list-component';\nexport default InactiveList;\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\nimport { Column, Row } from '../../components/layout';\nimport ServiceListHeader from '../components/service-list-header';\nimport ServiceListSubheader from '../components/service-list-subheader';\nimport List from '../components/list';\nimport Button from '@UI/button';\nimport MarketingButton from '../../components/marketing-button';\nimport InactiveList from '../components/inactive-list';\nimport { trackServiceSelection } from '../service-list-helpers';\nimport FormattedMessage from '../../lib/i18n';\n\nimport styles from './restricted-service-list-style.scss';\n\nconst RestrictedServiceList = ({\n  dashboardId,\n  userId,\n  orgId,\n  groupId,\n  allowedServices,\n  restrictedServices,\n}) => {\n  const manageConnectionsPath = `/admin/groups/${groupId}/data-sources`;\n  const history = useHistory();\n  return (\n    <div className={styles.ServiceList}>\n      <div className={styles.wrapper} data-page-content=\"integrations\">\n        <Row justify=\"center\">\n          <Column margin={2} marginTop={2.5} md={10}>\n            <section>\n              <Row justify=\"space-between\">\n                <ServiceListHeader>\n                  <FormattedMessage id=\"integrationsPage.headline\" />\n                </ServiceListHeader>\n                <Column marginBottom={2}>\n                  <Button\n                    intent={Button.INTENT.LINK}\n                    icon=\"cog\"\n                    href={manageConnectionsPath}\n                  >\n                    <FormattedMessage id=\"integrationsPage.manage.connections\" />\n                  </Button>\n                </Column>\n              </Row>\n\n              <Column marginBottom={2}>\n                <div className={styles.freeToConnectHeader}>\n                  <ServiceListSubheader>\n                    <FormattedMessage id=\"integrationsPage.freeSources.headline\" />\n                  </ServiceListSubheader>\n                </div>\n                <List\n                  services={allowedServices}\n                  dashboardId={dashboardId}\n                  onClickService={service => {\n                    trackServiceSelection(service, 'Main list', userId, orgId);\n                  }}\n                />\n              </Column>\n            </section>\n\n            <section className={styles.restrictedServices}>\n              <Column>\n                <ServiceListSubheader>\n                  <FormattedMessage id=\"integrationsPage.paidSources.headline\" />\n                </ServiceListSubheader>\n                <p>\n                  <FormattedMessage id=\"integrationsPage.paidSources.description\" />\n                </p>\n                <div className={styles.cards}>\n                  <div className={styles.trialCard}>\n                    <div>\n                      <h1 className={styles.cardHeading}>\n                        <FormattedMessage id=\"integrationsPage.paidSources.trialCard.heading\" />\n                      </h1>\n                      <span className={styles.cardDescription}>\n                        <FormattedMessage id=\"integrationsPage.paidSources.trialCard.description\" />\n                      </span>\n                    </div>\n                    <div className={styles.cardButton}>\n                      <MarketingButton\n                        intent={Button.INTENT.SECONDARY}\n                        onClick={() =>\n                          history.push(`${history.location.pathname}/trial`)\n                        }\n                      >\n                        <FormattedMessage id=\"integrationsPage.paidSources.trialCard.button\" />\n                      </MarketingButton>\n                    </div>\n                  </div>\n                  <div className={styles.upgradeCard}>\n                    <div>\n                      <h1 className={styles.cardHeading}>\n                        <FormattedMessage id=\"integrationsPage.paidSources.upgradeCard.heading\" />\n                      </h1>\n                      <span className={styles.cardDescription}>\n                        <FormattedMessage id=\"integrationsPage.paidSources.upgradeCard.description\" />\n                      </span>\n                    </div>\n                    <div className={styles.cardButton}>\n                      <MarketingButton\n                        intent={Button.INTENT.SECONDARY}\n                        href=\"/account/plans\"\n                      >\n                        <FormattedMessage id=\"integrationsPage.paidSources.upgradeCard.button\" />\n                      </MarketingButton>\n                    </div>\n                  </div>\n                </div>\n                <div className={styles.restrictedServiceList}>\n                  <InactiveList services={restrictedServices} />\n                </div>\n              </Column>\n            </section>\n          </Column>\n        </Row>\n      </div>\n    </div>\n  );\n};\n\nRestrictedServiceList.defaultProps = {\n  allowedServices: [],\n  restrictedServices: [],\n  onClickService: noop,\n};\n\nRestrictedServiceList.propTypes = {\n  dashboardId: PropTypes.string.isRequired,\n  orgId: PropTypes.number.isRequired,\n  userId: PropTypes.number.isRequired,\n  allowedServices: PropTypes.array,\n  groupId: PropTypes.number,\n  restrictedServices: PropTypes.array,\n  onClickService: PropTypes.func,\n};\n\nexport default RestrictedServiceList;\n","import React, { useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { get, partition, includes, sortBy } from 'lodash';\nimport RestrictedServiceList from './restricted-service-list-component';\nimport * as dataSourceActions from '../../data-sources/actions/data-sources-actions';\n\nconst ALLOWED_SERVICES = [\n  'spreadsheets',\n  'excel',\n  'googlesheets',\n  'clock',\n  'image',\n  'qrcode',\n  'text',\n];\n\nconst sortLegacy = service => service.label === 'legacy';\n\nconst RestrictedServiceListDataProvider = props => {\n  const dispatch = useDispatch();\n  const {\n    id: userId,\n    organization_id: orgId,\n    default_group_id: groupId,\n  } = useSelector(state => get(state, 'user.user'));\n  const organizationCreatedDate = useSelector(state =>\n    get(state, 'user.organization.date'),\n  );\n  const allServices = useSelector(state =>\n    get(state, 'dataSources.formattedServices'),\n  );\n\n  useEffect(() => {\n    dispatch(\n      dataSourceActions.fetchSources(\n        { includeRecentlyConnected: false },\n        organizationCreatedDate,\n      ),\n    );\n  }, [organizationCreatedDate]);\n\n  const partitionedServices = partition(allServices, s =>\n    includes(ALLOWED_SERVICES, s.name),\n  );\n\n  const allowedServices = partitionedServices[0].sort(\n    (a, b) =>\n      // Lets sort the allowed services in the order defined by ALLOWED_SERVICES\n      ALLOWED_SERVICES.indexOf(a.name) - ALLOWED_SERVICES.indexOf(b.name),\n  );\n\n  const restrictedServices = sortBy(partitionedServices[1], sortLegacy);\n\n  return (\n    <RestrictedServiceList\n      {...props}\n      userId={userId}\n      orgId={orgId}\n      groupId={groupId}\n      allowedServices={allowedServices}\n      restrictedServices={restrictedServices}\n    />\n  );\n};\n\nRestrictedServiceListDataProvider.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default RestrictedServiceListDataProvider;\n","import RestrictedServiceList from './restricted-service-list-data-provider';\nexport default RestrictedServiceList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { ApolloProvider } from 'react-apollo';\nimport apolloClient from '../services/concierge-service/apollo-client';\nimport { useFeatureFlags } from '@Hooks';\nimport DashboardTrackingProps from '../dashboard/dashboard-tracking-props';\nimport ServiceList from './service-list-connector';\nimport RestrictedServiceList from './restricted-service-list';\n\nconst ServiceListEntry = ({ dashboardId }) => {\n  const { flags, ready } = useFeatureFlags();\n  const isServiceListRestricted = flags.includes('ff:freemium');\n\n  // Do not render if feature flags are not present yet\n  if (!ready) {\n    return null;\n  }\n\n  return (\n    <ApolloProvider client={apolloClient.create()}>\n      <DashboardTrackingProps legacyId={dashboardId}>\n        {isServiceListRestricted ? (\n          <RestrictedServiceList dashboardId={dashboardId} />\n        ) : (\n          <ServiceList dashboardId={dashboardId} />\n        )}\n      </DashboardTrackingProps>\n    </ApolloProvider>\n  );\n};\n\nServiceListEntry.propTypes = {\n  dashboardId: PropTypes.string,\n};\n\nexport default ServiceListEntry;\n","import createReactRenderer from '../react-renderer';\nimport ServiceListEntry from './service-list-entry';\n\nconst ServiceList = createReactRenderer(ServiceListEntry);\n\nexport default ServiceList;\n","import VisualisedWidgetConnector from './visualised-widget-connector';\nimport createReactRenderer from '../react-renderer';\n\nexport default createReactRenderer(VisualisedWidgetConnector);\n","import createReactRenderer from '../../react-renderer';\nimport ControlledWidget from './controlled-widget-component';\n\nconst ControlledWidgetRenderer = createReactRenderer(ControlledWidget);\n\nexport { ControlledWidget as default, ControlledWidgetRenderer };\n","import { omitBy, isNil, get, capitalize } from 'lodash';\nimport * as dashboardActions from '../dashboard/actions/dashboard-actions';\nimport * as userActions from '../user/actions/user-actions';\nimport * as widgetActions from '../widget/actions/widget-actions';\nimport * as widgetDataActions from '../widget-data/actions/widget-data-actions';\nimport { DASHBOARD_WIDGET_LOCATION } from '../widget/constants/widget-location-constants';\nimport AuthStrategy from './auth-strategy';\nimport { intercom, redirect, getWindow } from '../lib/global';\nimport { trackEvent } from '@Tracking';\nimport { LOCATIONS } from '@Tracking/constants';\nimport {\n  dashboardChangedLayout,\n  dashboardCopied,\n  dashboardDeleted,\n  buttonClicked,\n  widgetCreated,\n  widgetConfigEdited,\n} from '@Tracking/events';\nimport { TRACKING_LAYOUT_TYPES } from '@Tracking/contexts/dashboard';\nimport { LAYOUT_TYPES } from '../dashboard/dashboard-layout/constants';\nimport apolloClient from '../services/concierge-service/apollo-client';\nimport { TrackingPropsLegacyIdQuery } from '../services/concierge-service/graphql/dashboard-tracking-props-query.graphql';\n\nconst handleWidgetCreateAndUpdate = async (event, payload) => {\n  const { dashboardId, widgetType, widgetId } = payload;\n\n  try {\n    const response = await apolloClient.create().query({\n      query: TrackingPropsLegacyIdQuery,\n      variables: { legacyId: dashboardId },\n    });\n    const dashboard = get(response, 'data.dashboard');\n    const isContainerLayout =\n      dashboard.layoutType.__typename === LAYOUT_TYPES.ContainerLayout;\n\n    const grid = dashboard.layoutType.grid;\n\n    const type = get(widgetType, 'template.type') || widgetType.template_type;\n\n    await trackEvent(\n      event(\n        omitBy(\n          {\n            'Legacy widget ID': `${widgetId}`,\n            Visualisation: type,\n            'Widget type ID': `${widgetType.id}`,\n            'Widget type name': widgetType.title,\n            'Integration name': widgetType.service_title,\n            'Integration slug': widgetType.service_name,\n            'Dashboard ID': dashboard.id,\n            'Legacy dashboard ID': `${dashboard.legacyId}`,\n            'Dashboard type':\n              TRACKING_LAYOUT_TYPES[dashboard.layoutType.__typename],\n            'Classicboard column count': dashboard.layoutType.columnCount,\n            'Fixieboard grid size': grid ? capitalize(grid) : null,\n          },\n          isNil,\n        ),\n      ),\n    );\n\n    isContainerLayout\n      ? redirect(`/edit/dashboards/${dashboard.id}`)\n      : redirect(`/edit/dashboards/${dashboardId}#${widgetId}`);\n  } catch (e) {\n    redirect(`/edit/dashboards/${dashboardId}`);\n  }\n};\n\nconst handleGeckoJSMessage = (type, payload) => dispatch => {\n  switch (type) {\n    case 'set:dashboard':\n      dispatch(dashboardActions.initDashboard({ ...payload }));\n      break;\n\n    case 'change:dashboard':\n      dispatch(dashboardActions.changeDashboard({ ...payload }));\n      break;\n\n    case 'set:currentUser':\n      dispatch(userActions.getCurrentUserSuccess({ ...payload }));\n      break;\n\n    case 'set:currentOrganization':\n      dispatch(userActions.setUserOrganization({ ...payload }));\n      break;\n\n    case 'set:groups':\n      dispatch(userActions.setUserGroups([...payload]));\n      break;\n\n    case 'set:authStrategy':\n      AuthStrategy.getInstance().set(payload);\n      break;\n\n    case 'widgets:waiting_initial_server_side_refresh':\n      dispatch(widgetActions.setAwaitingInitialServerSideRefresh(payload));\n      break;\n\n    case 'widgets:data_received':\n      {\n        const {\n          key,\n          data: { data, updatedAt },\n          dataType,\n        } = payload;\n\n        dispatch(\n          widgetActions.processDataReceived({\n            key,\n            data: dataType === 'json' ? JSON.parse(data) : data,\n            updatedAt,\n          }),\n        );\n      }\n      break;\n\n    case 'widgets:data_error':\n      dispatch(widgetDataActions.dataError(payload.error, payload.key));\n      break;\n\n    case 'widgets:reset':\n      dispatch(widgetActions.reset(payload));\n      break;\n\n    case 'widgets:add':\n      dispatch(widgetActions.addWidget(payload));\n      break;\n\n    case 'dashboards:add':\n      dispatch(dashboardActions.addDashboard(payload));\n      break;\n\n    case 'dashboards:convertedToClassic':\n      trackEvent(\n        dashboardChangedLayout({\n          'From layout': TRACKING_LAYOUT_TYPES.FixedLayout,\n          'To layout': TRACKING_LAYOUT_TYPES.ClassicLayout,\n        }),\n      );\n      break;\n\n    case 'dashboards:copied':\n      trackEvent(dashboardCopied());\n      break;\n\n    case 'dashboards:delete':\n      trackEvent(\n        dashboardDeleted({\n          Location: LOCATIONS.DashboardDeleteModal,\n        }),\n      );\n      dispatch(dashboardActions.deleteDashboard(payload));\n      break;\n\n    case 'dashboards:change':\n      dispatch(dashboardActions.changeDashboard(payload));\n      break;\n\n    case 'dashboards:reset':\n      dispatch(dashboardActions.setDashboards(payload));\n      break;\n\n    case 'widgets:moved':\n      payload.forEach(({ key, layout }) => {\n        dispatch(\n          widgetActions.widgetLocationChanged({\n            widgetKey: key,\n            layout,\n            location: DASHBOARD_WIDGET_LOCATION,\n          }),\n        );\n      });\n      break;\n\n    case 'button:clicked':\n      trackEvent(buttonClicked({ 'Button identifier': payload.identifier }));\n      break;\n\n    case 'cancel:account':\n      if (!!getWindow().Intercom) {\n        intercom('showNewMessage', \"Hi! I'd like to cancel my account.\");\n      } else {\n        redirect(\n          \"mailto:support@geckoboard.com?subject=I'd like to close my account\",\n        );\n      }\n\n      break;\n\n    case 'widget:created':\n      return handleWidgetCreateAndUpdate(widgetCreated, payload);\n\n    case 'widget:updated':\n      return handleWidgetCreateAndUpdate(widgetConfigEdited, payload);\n\n    default:\n      break;\n  }\n\n  return undefined;\n};\n\nexport default handleGeckoJSMessage;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport styles from './admin-content-container-style.scss';\n\nconst AdminContentContainerComponent = ({ children }) => {\n  return <div className={styles.container}>{children}</div>;\n};\n\nAdminContentContainerComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default AdminContentContainerComponent;\n","import AdminContentContainer from './admin-content-container-component';\n\nexport default AdminContentContainer;\n","import AdminPermissionDenied from './admin-permission-denied-component';\nexport default AdminPermissionDenied;\n","import React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport Helmet from 'react-helmet';\nimport AdminContentContainer from '../admin-content-container';\nimport { formatMessage } from '../../../lib/i18n';\nimport { BaseMastheadConnector as BaseMasthead } from '../../../masthead/base-masthead';\n\nimport adminStyle from '../admin-style.scss';\nimport titleBarStyle from '../titlebar/titlebar.scss';\n\nconst PermissionDenied = () => {\n  return (\n    <div className={adminStyle.container}>\n      <Helmet\n        defaultTitle={formatMessage('unauthorized.heading')}\n        titleTemplate={formatMessage('unauthorized.heading')}\n      />\n      <BaseMasthead />\n      <div className={titleBarStyle.container}>\n        <div className={titleBarStyle.contentRow}>\n          <h1>\n            <FormattedMessage id=\"unauthorized.heading\" />\n          </h1>\n        </div>\n      </div>\n      <AdminContentContainer>\n        <FormattedMessage id=\"unauthorized.body\" />\n      </AdminContentContainer>\n    </div>\n  );\n};\n\nexport default PermissionDenied;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport FormattedMessage from '../../../lib/i18n';\nimport { NavLink } from 'react-router-dom';\nimport Icon from '@UI/icon';\n\nimport styles from '../titlebar/titlebar.scss';\n\nconst renderTabs = groupId => {\n  if (!groupId) {\n    return null;\n  }\n\n  const baseUrl = `/admin/groups/${groupId}`;\n\n  return (\n    <div className={styles.tabs}>\n      <div className={styles.tabsInner}>\n        <NavLink\n          to={`${baseUrl}/dashboards`}\n          className={styles.tabLink}\n          activeClassName={styles.active}\n        >\n          <span className={styles.iconContainer}>\n            <Icon name=\"th-large\" />\n          </span>\n          <FormattedMessage id=\"admin.tabs.dashboards\" />\n        </NavLink>\n        <NavLink\n          to={`${baseUrl}/loops`}\n          className={styles.tabLink}\n          activeClassName={styles.active}\n        >\n          <span className={styles.iconContainer}>\n            <Icon name=\"retweet\" />\n          </span>\n          <FormattedMessage id=\"admin.tabs.loops\" />\n        </NavLink>\n        <NavLink\n          to=\"/admin/people\"\n          className={styles.tabLink}\n          activeClassName={styles.active}\n        >\n          <span className={styles.iconContainer}>\n            <Icon name=\"user-circle\" />\n          </span>\n          <FormattedMessage id=\"admin.tabs.people\" />\n        </NavLink>\n        <NavLink\n          to={`${baseUrl}/data-sources`}\n          className={styles.tabLink}\n          activeClassName={styles.active}\n        >\n          <span className={styles.iconContainer}>\n            <Icon name=\"puzzle-piece\" />\n          </span>\n          <FormattedMessage id=\"admin.tabs.dataSources\" />\n        </NavLink>\n      </div>\n    </div>\n  );\n};\n\nconst GroupAdminTitleBar = ({ groupId, button }) => {\n  return (\n    <div className={styles.container}>\n      <div className={styles.contentRow}>\n        <FormattedMessage id=\"admin.admin\" />\n      </div>\n      <div className={styles.contentRow}>\n        {renderTabs(groupId)}\n        {button}\n      </div>\n    </div>\n  );\n};\n\nGroupAdminTitleBar.propTypes = {\n  button: PropTypes.node,\n  groupId: PropTypes.number,\n};\n\nexport default GroupAdminTitleBar;\n","import GroupAdminTitleBar from './group-admin-titlebar-component';\n\nexport default GroupAdminTitleBar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './ghost-list-style.scss';\n\nconst GhostListComponent = ({ children }) => (\n  <div className={styles.container}>{children}</div>\n);\n\nGhostListComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default GhostListComponent;\n","import GhostList from './ghost-list-component';\n\nexport default GhostList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Image from '@UI/image';\nimport FormattedMessage from '../../../../lib/i18n';\nimport Button from '@UI/button';\nimport Icon from '@UI/icon';\nimport Layout, { Row } from '../../../../components/layout';\nimport config from '../../../../universal/config';\nimport { router } from '../../../../router';\nimport styles from '../empty-state-style.scss';\n\nconst OrganizationMembersEmptyStateComponent = ({ groupId }) => {\n  return (\n    <Layout flex flexColumn align=\"center\">\n      <Row>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/welcome-team-with-fade.png`}\n          className={styles.image}\n          width=\"200\"\n          height=\"200\"\n        />\n      </Row>\n      <Row marginBottom={1}>\n        <p className={styles.instructions}>\n          <FormattedMessage id=\"groups.noMembersInstructions\" />\n        </p>\n      </Row>\n      <Row marginBottom={1}>\n        <Button onClick={() => router.setQueryParam('invite-admin', groupId)}>\n          {\n            <span>\n              <span className={styles.iconContainer}>\n                <Icon name=\"user-plus\" />\n              </span>\n              <FormattedMessage id=\"groups.people.invite\" />\n            </span>\n          }\n        </Button>\n      </Row>\n    </Layout>\n  );\n};\n\nOrganizationMembersEmptyStateComponent.propTypes = {\n  groupId: PropTypes.number.isRequired,\n};\n\nexport default OrganizationMembersEmptyStateComponent;\n","import OrganizationMembersEmptyState from './organization-members-empty-state-component';\n\nexport default OrganizationMembersEmptyState;\n","import OrganizationViewersEmptyState from './organization-viewers-empty-state-component';\n\nexport default OrganizationViewersEmptyState;\n","import React from 'react';\nimport Image from '@UI/image';\nimport { FormattedHTMLMessage } from '../../../../lib/i18n';\nimport Layout from '../../../../components/layout';\nimport config from '../../../../universal/config';\nimport styles from '../empty-state-style.scss';\n\nconst OrganizationViewersEmptyStateComponent = () => {\n  return (\n    <Layout flex flexColumn align=\"center\">\n      <Image\n        src={`${\n          config.get().StaticAssetBaseURL\n        }/travelling-salesman-with-fade.png`}\n        className={styles.image}\n        width=\"200\"\n        height=\"200\"\n      />\n      <p className={styles.instructions}>\n        <FormattedHTMLMessage id=\"groups.noViewersInstructions\" />\n      </p>\n    </Layout>\n  );\n};\n\nexport default OrganizationViewersEmptyStateComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { getInitials } from '../../lib/user';\nimport Icon from '@UI/icon';\n\nimport styles from './user-initials-style.scss';\n\nconst UserInitialsComponent = ({ user }) => {\n  const { first_name: firstName, last_name: lastName } = user;\n\n  if (!firstName && !lastName) {\n    return (\n      <span className={styles.pending}>\n        <Icon name=\"envelope\" light />\n      </span>\n    );\n  }\n\n  return (\n    <span className={styles.initials}>{getInitials(firstName, lastName)}</span>\n  );\n};\n\nUserInitialsComponent.propTypes = {\n  user: PropTypes.object,\n};\n\nexport default UserInitialsComponent;\n","import UserInitialsComponent from './user-initials-component';\n\nexport default UserInitialsComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport DropMenu from '../../../../../components/menu/drop-menu';\nimport DropItemWithDescription from '../../../../../components/menu/drop-item-with-description';\nimport DropMenuSelectLabel from '../../../../../components/menu/drop-menu-select-label';\nimport FormattedMessage from '../../../../../lib/i18n';\n\nimport styles from './person-permission-select-style.scss';\n\nconst PersonPermissionsSelectComponent = ({ onChange, value }) => {\n  const labelId =\n    value === 'read_only'\n      ? 'groups.people.permissions.readOnly'\n      : 'groups.people.permissions.admin';\n\n  return (\n    <div className={styles.container}>\n      <DropMenu\n        listClassName={`${styles.permissionDropMenuList}`}\n        label={\n          <DropMenuSelectLabel>\n            <FormattedMessage id={labelId} />\n          </DropMenuSelectLabel>\n        }\n        isAnchored={false}\n      >\n        <DropItemWithDescription\n          label={<FormattedMessage id=\"groups.people.permissions.admin\" />}\n          description={\n            <FormattedMessage id=\"groups.people.permissions.adminDescription\" />\n          }\n          value={'admin'}\n          selected={value === 'admin'}\n          handleClick={onChange}\n        />\n        <DropItemWithDescription\n          label={<FormattedMessage id=\"groups.people.permissions.readOnly\" />}\n          description={\n            <FormattedMessage id=\"groups.people.permissions.readOnlyDescription\" />\n          }\n          value={'read_only'}\n          selected={value === 'read_only'}\n          handleClick={onChange}\n        />\n      </DropMenu>\n    </div>\n  );\n};\n\nPersonPermissionsSelectComponent.propTypes = {\n  value: PropTypes.oneOf(['admin', 'read_only']).isRequired,\n  onChange: PropTypes.func.isRequired,\n};\n\nexport default PersonPermissionsSelectComponent;\n","import PersonPermissionSelect from './person-permissions-select-component';\n\nexport default PersonPermissionSelect;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport classNames from 'classnames';\nimport styles from './drop-item-link-style.scss';\nimport dropItemStyles from '../drop-item/drop-item-style.scss';\n\nconst DropItemLinkComponent = ({\n  children,\n  dividerTop,\n  isSmall,\n  layoutClassName,\n  to,\n  onClick,\n}) => {\n  const containerClasses = classNames(\n    dropItemStyles.dropItem,\n    dropItemStyles.pointer,\n    layoutClassName,\n  );\n  const innerWrapperClasses = classNames(\n    dropItemStyles.innerWrapper,\n    styles.link,\n    {\n      [dropItemStyles.small]: isSmall,\n      [dropItemStyles.dividerTop]: dividerTop,\n    },\n  );\n\n  return (\n    <li role=\"menuitem\" tabIndex={-1} className={containerClasses}>\n      <Link to={to} onClick={onClick} className={innerWrapperClasses}>\n        {children}\n      </Link>\n    </li>\n  );\n};\n\nDropItemLinkComponent.propTypes = {\n  to: PropTypes.string.isRequired,\n  children: PropTypes.node,\n  dividerTop: PropTypes.bool,\n  isSmall: PropTypes.bool,\n  layoutClassName: PropTypes.string,\n  onClick: PropTypes.func,\n};\n\nexport default DropItemLinkComponent;\n","import DropItemLink from './drop-item-link-component';\n\nexport default DropItemLink;\n","import PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { isAccountOwner } from '../lib/user-permissions';\n\nconst AccountOwnerOnly = ({ user, children }) => {\n  return isAccountOwner(user) ? children : null;\n};\n\nAccountOwnerOnly.propTypes = {\n  children: PropTypes.node,\n  user: PropTypes.object,\n};\n\nconst AccountOwnerOnlyConnector = connect(state => {\n  const {\n    user: { user },\n  } = state;\n  return { user };\n})(AccountOwnerOnly);\n\nexport default AccountOwnerOnlyConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Layout from '../../../../components/layout';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../lib/i18n';\nimport Warning from '../../../../components/warning';\n\nconst RevokeOwnerConfirmModal = ({ userName, visible, onClose, onConfirm }) => {\n  return (\n    <ConfirmModal\n      visible={visible}\n      heading={\n        <FormattedMessage\n          id=\"groups.people.revokeOwner.modalHeading\"\n          values={{ userName }}\n        />\n      }\n      confirmButtonLabel={<FormattedMessage id=\"people.revokeOwner\" />}\n      isNegative\n      onConfirm={onConfirm}\n      onClose={onClose}\n    >\n      <Layout marginBottom={1}>\n        <Warning>\n          <FormattedMessage id=\"groups.people.revokeOwner.modalWarning\" />\n        </Warning>\n      </Layout>\n      <FormattedMessage\n        id=\"groups.people.revokeOwner.modalBody\"\n        values={{ userName }}\n      />\n    </ConfirmModal>\n  );\n};\n\nRevokeOwnerConfirmModal.propTypes = {\n  userName: PropTypes.string,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default RevokeOwnerConfirmModal;\n","import RevokeOwnerConfirmModal from './revoke-owner-confirm-modal-component';\n\nexport default RevokeOwnerConfirmModal;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../lib/i18n';\n\nconst MakeOwnerConfirmModalComponent = ({\n  userName,\n  visible,\n  onClose,\n  onConfirm,\n}) => (\n  <ConfirmModal\n    visible={visible}\n    heading={\n      <FormattedMessage\n        id=\"groups.people.makeOwner.modalHeading\"\n        values={{ userName }}\n      />\n    }\n    confirmButtonLabel={\n      <FormattedMessage id=\"groups.people.makeOwner.button\" />\n    }\n    onConfirm={onConfirm}\n    onClose={onClose}\n  >\n    <FormattedMessage\n      id=\"groups.people.makeOwner.modalBody\"\n      values={{ userName }}\n    />\n  </ConfirmModal>\n);\n\nMakeOwnerConfirmModalComponent.propTypes = {\n  userName: PropTypes.string,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default MakeOwnerConfirmModalComponent;\n","import MakeOwnerConfirmModalComponent from './make-owner-confirm-modal-component';\n\nexport default MakeOwnerConfirmModalComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../lib/i18n';\n\nconst PromoteToMemberConfirmModalComponent = ({\n  userName,\n  visible,\n  onClose,\n  onConfirm,\n}) => (\n  <ConfirmModal\n    visible={visible}\n    heading={\n      <FormattedMessage\n        id=\"groups.people.promoteToMember.modalHeading\"\n        values={{ userName }}\n      />\n    }\n    confirmButtonLabel={\n      <FormattedMessage id=\"groups.people.promoteToMember.button\" />\n    }\n    onConfirm={onConfirm}\n    onClose={onClose}\n  >\n    <FormattedMessage\n      id=\"groups.people.promoteToMember.modalBody\"\n      values={{ userName }}\n    />\n  </ConfirmModal>\n);\n\nPromoteToMemberConfirmModalComponent.propTypes = {\n  userName: PropTypes.string,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default PromoteToMemberConfirmModalComponent;\n","import PromoteToMemberConfirmModalComponent from './promote-to-member-confirm-modal-component';\n\nexport default PromoteToMemberConfirmModalComponent;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../lib/i18n';\nimport Warning from '../../../../components/warning';\n\nconst DeleteUserConfirmModalComponent = ({\n  userName,\n  visible,\n  onClose,\n  onConfirm,\n}) => {\n  return (\n    <ConfirmModal\n      visible={visible}\n      heading={\n        <FormattedMessage\n          id=\"people.deleteUser.modalHeading\"\n          values={{ userName }}\n        />\n      }\n      confirmButtonLabel={<FormattedMessage id=\"people.deleteUser\" />}\n      isNegative\n      onConfirm={onConfirm}\n      onClose={onClose}\n    >\n      <Warning>\n        <FormattedMessage id=\"people.deleteUser.modalWarning\" />\n      </Warning>\n    </ConfirmModal>\n  );\n};\n\nDeleteUserConfirmModalComponent.propTypes = {\n  userName: PropTypes.string,\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default DeleteUserConfirmModalComponent;\n","import DeleteUserConfirmModal from './delete-user-confirm-modal-component';\n\nexport default DeleteUserConfirmModal;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport FormattedMessage from '../../../../../lib/i18n';\nimport { bindAll } from 'lodash';\nimport {\n  isAccountOwner,\n  isGroupAdmin,\n  isGroupViewer,\n  isDashboardViewOnly,\n} from '../../../../../lib/user-permissions';\nimport Layout, { Column, Row } from '../../../../../components/layout';\nimport ListItem, { ListItemMeta } from '../../../../../components/list-item';\nimport UserInitials from '../../../../../components/user-initials';\nimport PersonPermissionsSelect from '../person-permissions-select';\nimport MenuLabel from '../../../../../components/menu/menu-label';\nimport DropMenu from '../../../../../components/menu/drop-menu';\nimport DropItem from '../../../../../components/menu/drop-item';\nimport DropItemLink from '../../../../../components/menu/drop-item-link';\nimport AccountOwnerOnly from '../../../../../hoc/account-owner-only';\nimport RevokeOwnerConfirmModal from '../../../../components/modals/revoke-owner-confirm-modal';\nimport MakeOwnerConfirmModal from '../../../../components/modals/make-owner-confirm-modal';\nimport PromoteToMemberConfirmModal from '../../../../components/modals/promote-to-member-confirm-modal';\nimport DeleteUserConfirmModal from '../../../../components/modals/delete-user-confirm-modal';\nimport { getUserDisplayName } from '../../../../../admin/helpers';\nimport style from './person-style.scss';\n\nconst getPermissionSection = (\n  member,\n  dashboardIds,\n  onChange,\n  isCurrentUser,\n) => {\n  if (isAccountOwner(member)) {\n    return null;\n  }\n\n  if (isCurrentUser && isGroupAdmin(member)) {\n    return <FormattedMessage id=\"people.admin\" />;\n  }\n\n  if (isGroupAdmin(member) || isGroupViewer(member)) {\n    return (\n      <PersonPermissionsSelect value={member.permission} onChange={onChange} />\n    );\n  }\n\n  // Dashboard view only user\n  return (\n    <Layout marginLeft={1}>\n      <FormattedMessage\n        id=\"people.dashboardsShared\"\n        values={{ dashboardsShared: dashboardIds.length }}\n      />\n    </Layout>\n  );\n};\n\nclass PersonComponent extends Component {\n  constructor(props) {\n    super(props);\n\n    bindAll(this, [\n      'toggleRevokeOwnerModal',\n      'toggleMakeOwnerModal',\n      'togglePromoteToMemberModal',\n      'toggleDeleteUserModal',\n      'handleRevokeOwner',\n      'handleMakeOwner',\n      'handlePromoteToMember',\n      'handleDeleteUser',\n    ]);\n\n    this.state = {\n      isRevokeOwnerModalVisible: false,\n      isMakeOwnerModalVisible: false,\n      isPromoteToMemberModalVisible: false,\n      isDeleteUserModalVisible: false,\n    };\n  }\n\n  handleRevokeOwner() {\n    this.toggleRevokeOwnerModal();\n    this.props.onRevokeAccountOwner();\n  }\n\n  handleMakeOwner() {\n    this.toggleMakeOwnerModal();\n    this.props.onMakeAccountOwner();\n  }\n\n  handlePromoteToMember() {\n    this.togglePromoteToMemberModal();\n    this.props.onPromoteToMember();\n  }\n\n  handleDeleteUser() {\n    this.toggleDeleteUserModal();\n    this.props.onDeleteUser();\n  }\n\n  render() {\n    const {\n      member,\n      dashboardIds,\n      isCurrentUser,\n      currentUserIsAccountOwner,\n      onDemoteToDashboardViewOnly,\n      onResendInvite,\n      onPermissionsChange,\n    } = this.props;\n    const { id: memberId, invite_pending: invitePending, email } = member;\n    const manageDashboardAccessPath = `/admin/people/dashboard-permissions/${memberId}`;\n    const displayName = getUserDisplayName(member);\n\n    // If the user is an account owner, they can delete any user (except themselves). If they are a group admin, they can delete anyone except\n    // account owners (again, except themselves)\n    const canDeleteUser =\n      currentUserIsAccountOwner ||\n      (!currentUserIsAccountOwner && !isAccountOwner(member));\n\n    // We show the Pip Menu, unless the user is the current user, or the current user is an admin and the user\n    // they are trying to interact with is an owner\n    const showMenu =\n      !isCurrentUser && !(!currentUserIsAccountOwner && isAccountOwner(member));\n\n    return (\n      <ListItem hasHoverState={false}>\n        <Column flexNone justify=\"center\" marginRight={1}>\n          <UserInitials user={member} />\n        </Column>\n        <Column flexNone justify=\"center\" marginRight={1}>\n          <div className={style.usersListItemName}>{displayName}</div>\n        </Column>\n        <Column flexAuto justify=\"center\" marginRight={3}>\n          <ListItemMeta>\n            {invitePending ? <FormattedMessage id=\"people.pending\" /> : email}\n          </ListItemMeta>\n        </Column>\n        <Column flexNone justify=\"center\" className={style.lastColumn}>\n          <Row justify=\"flex-end\">\n            <Column justify=\"center\" flexAuto marginRight={3}>\n              {getPermissionSection(\n                member,\n                dashboardIds,\n                onPermissionsChange,\n                isCurrentUser,\n              )}\n            </Column>\n            {isCurrentUser && (\n              <Column justify=\"center\" marginRight={0.5}>\n                <ListItemMeta>\n                  <FormattedMessage id=\"people.you\" />\n                </ListItemMeta>\n              </Column>\n            )}\n            <Column justify=\"center\">\n              {showMenu && (\n                <DropMenu\n                  label={<MenuLabel />}\n                  origin=\"top left\"\n                  isAnchored={false}\n                >\n                  {invitePending && (\n                    <AccountOwnerOnly>\n                      <DropItem onClick={onResendInvite} isSmall>\n                        <FormattedMessage id=\"people.resendInvite\" />\n                      </DropItem>\n                    </AccountOwnerOnly>\n                  )}\n                  {(isGroupAdmin(member) || isGroupViewer(member)) && (\n                    <AccountOwnerOnly>\n                      <DropItem onClick={this.toggleMakeOwnerModal} isSmall>\n                        <FormattedMessage id=\"people.makeOwner\" />\n                      </DropItem>\n                    </AccountOwnerOnly>\n                  )}\n                  {isAccountOwner(member) && (\n                    <AccountOwnerOnly>\n                      <DropItem onClick={this.toggleRevokeOwnerModal} isSmall>\n                        <FormattedMessage id=\"people.revokeOwner\" />\n                      </DropItem>\n                    </AccountOwnerOnly>\n                  )}\n                  {isDashboardViewOnly(member) && (\n                    <DropItemLink to={manageDashboardAccessPath} isSmall>\n                      <FormattedMessage id=\"people.manageDashboardAccess\" />\n                    </DropItemLink>\n                  )}\n                  {isDashboardViewOnly(member) && (\n                    <DropItem onClick={this.togglePromoteToMemberModal} isSmall>\n                      <FormattedMessage id=\"people.promoteToOrganizationMember\" />\n                    </DropItem>\n                  )}\n                  {(isGroupAdmin(member) || isGroupViewer(member)) && (\n                    <DropItem onClick={onDemoteToDashboardViewOnly} isSmall>\n                      <FormattedMessage id=\"people.demoteToDashboardViewOnly\" />\n                    </DropItem>\n                  )}\n                  {canDeleteUser && (\n                    <DropItem onClick={this.toggleDeleteUserModal} isSmall>\n                      <FormattedMessage id=\"people.deleteUser\" />\n                    </DropItem>\n                  )}\n                  <RevokeOwnerConfirmModal\n                    userName={displayName}\n                    visible={this.state.isRevokeOwnerModalVisible}\n                    onClose={this.toggleRevokeOwnerModal}\n                    onConfirm={this.handleRevokeOwner}\n                  />\n                  <MakeOwnerConfirmModal\n                    userName={displayName}\n                    visible={this.state.isMakeOwnerModalVisible}\n                    onClose={this.toggleMakeOwnerModal}\n                    onConfirm={this.handleMakeOwner}\n                  />\n                  <PromoteToMemberConfirmModal\n                    userName={displayName}\n                    visible={this.state.isPromoteToMemberModalVisible}\n                    onClose={this.togglePromoteToMemberModal}\n                    onConfirm={this.handlePromoteToMember}\n                  />\n                  <DeleteUserConfirmModal\n                    userName={displayName}\n                    visible={this.state.isDeleteUserModalVisible}\n                    onClose={this.toggleDeleteUserModal}\n                    onConfirm={this.handleDeleteUser}\n                  />\n                </DropMenu>\n              )}\n            </Column>\n          </Row>\n        </Column>\n      </ListItem>\n    );\n  }\n\n  toggleRevokeOwnerModal() {\n    this.setState({\n      isRevokeOwnerModalVisible: !this.state.isRevokeOwnerModalVisible,\n    });\n  }\n\n  toggleMakeOwnerModal() {\n    this.setState({\n      isMakeOwnerModalVisible: !this.state.isMakeOwnerModalVisible,\n    });\n  }\n\n  togglePromoteToMemberModal() {\n    this.setState({\n      isPromoteToMemberModalVisible: !this.state.isPromoteToMemberModalVisible,\n    });\n  }\n\n  toggleDeleteUserModal() {\n    this.setState({\n      isDeleteUserModalVisible: !this.state.isDeleteUserModalVisible,\n    });\n  }\n}\n\nPersonComponent.propTypes = {\n  currentUserIsAccountOwner: PropTypes.bool,\n  dashboardIds: PropTypes.arrayOf(PropTypes.number),\n  groupId: PropTypes.number,\n  isCurrentUser: PropTypes.bool,\n  member: PropTypes.shape({\n    email: PropTypes.string,\n    first_name: PropTypes.string,\n    id: PropTypes.number,\n    invite_pending: PropTypes.bool,\n    last_name: PropTypes.string,\n    owner: PropTypes.bool,\n    permission: PropTypes.oneOf(['admin', 'read_only']),\n  }),\n  onDeleteUser: PropTypes.func,\n  onDemoteToDashboardViewOnly: PropTypes.func,\n  onMakeAccountOwner: PropTypes.func,\n  onPermissionsChange: PropTypes.func,\n  onPromoteToMember: PropTypes.func,\n  onResendInvite: PropTypes.func,\n  onRevokeAccountOwner: PropTypes.func,\n};\n\nexport default PersonComponent;\n","import Person from './person-connector';\n\nexport default Person;\n","import { connect } from 'react-redux';\nimport { trackEvent } from '@Tracking';\nimport { invitationResent } from '@Tracking/events';\nimport Person from './person-component';\nimport { isAccountOwner } from '../../../../../lib/user-permissions';\nimport { track, getUserPermissionString } from '../../../../../lib/tracker';\nimport * as groupsActions from '../../../../../groups/actions/groups-actions';\nimport * as peopleActions from '../../../../../people/actions/people-actions';\nimport { getUserDashboardIds } from '../../../../reducer/users-dashboards-reducer';\n\nconst TRACKING_SOURCE = 'people group page';\n\nconst mapStateToProps = (state, props) => {\n  const {\n    user: { user = {} },\n    usersDashboards,\n  } = state;\n  const { member } = props;\n\n  const dashboardIds = getUserDashboardIds(usersDashboards, member.id);\n\n  return {\n    dashboardIds,\n    currentUserIsAccountOwner: isAccountOwner(user),\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  const { groupId, member } = ownProps;\n  const { id: userId } = member;\n\n  return {\n    onDemoteToDashboardViewOnly: () => {\n      dispatch(\n        groupsActions.demoteToDashboardViewOnly(\n          groupId,\n          userId,\n          TRACKING_SOURCE,\n        ),\n      );\n    },\n    onDeleteUser: () => {\n      const permission = getUserPermissionString(member);\n      dispatch(\n        peopleActions.deleteUser(groupId, userId, permission, TRACKING_SOURCE),\n      );\n    },\n    onResendInvite: () => {\n      dispatch(groupsActions.resendInvite(groupId, userId));\n      track('Resend invite');\n      trackEvent(invitationResent());\n    },\n    onMakeAccountOwner: () => {\n      dispatch(groupsActions.makeAccountOwner(userId));\n    },\n    onPromoteToMember: () => {\n      dispatch(groupsActions.promoteToMember(userId, groupId));\n    },\n    onRevokeAccountOwner: () => {\n      dispatch(groupsActions.revokeAccountOwner(userId, groupId));\n    },\n    onPermissionsChange: role => {\n      dispatch(groupsActions.setPermissions(groupId, userId, role));\n    },\n  };\n};\n\nconst PersonConnector = connect(mapStateToProps, mapDispatchToProps)(Person);\n\nexport default PersonConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport InfoBubble from '../../../components/info-bubble';\nimport Icon from '@UI/icon';\nimport Layout from '../../../components/layout';\n\nimport style from './list-heading-style.scss';\n\nconst ListHeading = ({ icon, title, helpMessage }) => {\n  return (\n    <p className={style.listHeading}>\n      <span className={style.iconContainer}>\n        <Icon name={icon} />\n      </span>\n      {title}\n      {helpMessage && (\n        <Layout marginLeft={0.5} tag=\"span\">\n          <InfoBubble isDark isBubbleWide>\n            {helpMessage}\n          </InfoBubble>\n        </Layout>\n      )}\n    </p>\n  );\n};\n\nListHeading.propTypes = {\n  icon: PropTypes.string.isRequired,\n  title: PropTypes.node.isRequired,\n  helpMessage: PropTypes.node,\n};\n\nexport default ListHeading;\n","import ListHeading from './list-heading-component';\n\nexport default ListHeading;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { isUndefined } from 'lodash';\nimport Helmet from 'react-helmet';\nimport { router } from '../../../router';\nimport AdminContentContainer from '../../components/admin-content-container';\nimport GroupAdminTitleBar from '../../components/group-admin-titlebar';\nimport Button from '@UI/button';\nimport List from '../../../components/list';\nimport GhostList from '../../components/ghost-list';\nimport OrganizationMembersEmptyState from '../../components/empty-states/organization-members-empty-state';\nimport OrganizationViewersEmptyState from '../../components/empty-states/organization-viewers-empty-state';\nimport Person from './components/person';\nimport ConditionalLoadingIndicator from '../../../components/conditional-loading-indicator';\nimport FormattedMessage, { formatMessage } from '../../../lib/i18n';\nimport ListHeading from '../../components/list-heading';\nimport { OnMount } from '../../../hoc/on-mount';\nimport style from './people-page-style.scss';\n\nconst filterPeopleBeingDeleted = (people = {}) => {\n  const { members = [], owners = [], viewers = [] } = people;\n\n  return {\n    members: members.filter(person => !person.isBeingDeleted),\n    owners: owners.filter(person => !person.isBeingDeleted),\n    viewers: viewers.filter(person => !person.isBeingDeleted),\n  };\n};\n\nconst renderAccountOwners = (owners, groupId, currentUserId) => {\n  if (owners.length > 0) {\n    return (\n      <div className={style.section}>\n        <List data-acc-id=\"owners\">\n          {owners.map(person => (\n            <Person\n              key={person.id}\n              groupId={groupId}\n              isCurrentUser={person.id === currentUserId}\n              member={{ ...person, owner: true }}\n            />\n          ))}\n        </List>\n      </div>\n    );\n  }\n\n  return null;\n};\n\nconst renderMembers = (members, groupId, currentUserId) => {\n  if (members.length > 0) {\n    return (\n      <div className={style.section}>\n        <List data-acc-id=\"members\">\n          {members.map(person => (\n            <Person\n              key={person.id}\n              groupId={groupId}\n              isCurrentUser={person.id === currentUserId}\n              member={person}\n            />\n          ))}\n        </List>\n      </div>\n    );\n  }\n\n  return (\n    <GhostList>\n      <OrganizationMembersEmptyState groupId={groupId} />\n    </GhostList>\n  );\n};\n\nconst renderDashboardViewOnlyUsers = (viewers, groupId, currentUserId) => {\n  if (viewers.length > 0) {\n    return (\n      <div className={style.section}>\n        <List data-acc-id=\"viewers\">\n          {viewers.map(person => (\n            <Person\n              key={person.id}\n              groupId={groupId}\n              isCurrentUser={person.id === currentUserId}\n              member={person}\n            />\n          ))}\n        </List>\n      </div>\n    );\n  }\n\n  return (\n    <GhostList>\n      <OrganizationViewersEmptyState />\n    </GhostList>\n  );\n};\n\nconst PeoplePageComponent = ({\n  groupId,\n  currentUserId,\n  peopleForGroup,\n  onMount,\n}) => {\n  const isLoading = isUndefined(peopleForGroup);\n  const { members, owners, viewers } = filterPeopleBeingDeleted(peopleForGroup);\n\n  const TitleBarButton = (\n    <div className={style.buttonIconProvider}>\n      <Button onClick={() => router.setQueryParam('invite-admin', groupId)}>\n        <FormattedMessage id=\"groups.people.invite\" />\n      </Button>\n    </div>\n  );\n\n  return (\n    <div>\n      <OnMount do={() => onMount(groupId)} />\n      <Helmet>\n        <title>{formatMessage('admin.pageTitle.group.people')}</title>\n      </Helmet>\n      <GroupAdminTitleBar groupId={groupId} button={TitleBarButton} />\n      <AdminContentContainer>\n        <ConditionalLoadingIndicator isLoading={isLoading} isDark>\n          <ListHeading\n            icon=\"key\"\n            title={\n              <FormattedMessage\n                id=\"groups.people.ownersListHeading\"\n                values={{ count: owners.length }}\n              />\n            }\n            helpMessage={\n              <FormattedMessage id=\"groups.people.help.ownerAccess\" />\n            }\n          />\n          {renderAccountOwners(owners, groupId, currentUserId)}\n\n          <ListHeading\n            icon=\"building\"\n            title={\n              <FormattedMessage\n                id=\"groups.people.membersListHeading\"\n                values={{ count: members.length }}\n              />\n            }\n            helpMessage={\n              <FormattedMessage id=\"groups.people.help.groupMemberAccess\" />\n            }\n          />\n          {renderMembers(members, groupId, currentUserId)}\n\n          <ListHeading\n            icon=\"lock\"\n            title={\n              <FormattedMessage\n                id=\"groups.people.viewersListHeading\"\n                values={{ count: viewers.length }}\n              />\n            }\n            helpMessage={\n              <FormattedMessage id=\"groups.people.help.viewerAccess\" />\n            }\n          />\n          {renderDashboardViewOnlyUsers(viewers, groupId, currentUserId)}\n        </ConditionalLoadingIndicator>\n      </AdminContentContainer>\n    </div>\n  );\n};\nPeoplePageComponent.propTypes = {\n  onMount: PropTypes.func.isRequired,\n  currentUserId: PropTypes.number,\n  groupId: PropTypes.number,\n  peopleForGroup: PropTypes.shape({\n    members: PropTypes.array,\n    owners: PropTypes.array,\n    viewers: PropTypes.array,\n  }),\n};\n\nexport default PeoplePageComponent;\n","import PeoplePageConnector from './people-page-connector';\nexport default PeoplePageConnector;\n","import { connect } from 'react-redux';\nimport * as groupsActions from '../../../groups/actions/groups-actions';\nimport PeoplePageComponent from './people-page-component';\n\nconst mapStateToProps = state => {\n  const {\n    allUsers,\n    user: { user = {} },\n  } = state;\n  const { default_group_id: groupId } = user;\n\n  return {\n    groupId,\n    currentUserId: user.id,\n    peopleForGroup: allUsers,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMount: () => dispatch(groupsActions.getPeople()),\n  };\n};\n\nconst PeoplePageConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(PeoplePageComponent);\n\nexport default PeoplePageConnector;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport FormattedMessage from '../../../../lib/i18n';\n\n// NOTE: This is used for regenerating both dashboard AND loop sharing links.\nconst RegenerateSharingLinkConfirmModalComponent = ({\n  visible,\n  onClose,\n  onConfirm,\n}) => (\n  <ConfirmModal\n    visible={visible}\n    heading={\n      <FormattedMessage id=\"dashboards.regenerateSharingLink.modalHeading\" />\n    }\n    confirmButtonLabel={\n      <FormattedMessage id=\"dashboards.regenerateSharingLink.button\" />\n    }\n    onConfirm={onConfirm}\n    onClose={onClose}\n  >\n    <FormattedMessage id=\"dashboards.regenerateSharingLink.modalBody\" />\n  </ConfirmModal>\n);\n\nRegenerateSharingLinkConfirmModalComponent.propTypes = {\n  visible: PropTypes.bool,\n  onClose: PropTypes.func,\n  onConfirm: PropTypes.func,\n};\n\nexport default RegenerateSharingLinkConfirmModalComponent;\n","import RegenerateSharingLinkConfirmModalComponent from './regenerate-sharing-link-confirm-modal-component';\n\nexport default RegenerateSharingLinkConfirmModalComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Helmet from 'react-helmet';\nimport { formatMessage } from '../../../lib/i18n';\nimport List from '../../../components/list';\nimport ListItem, { ListItemMeta } from '../../../components/list-item';\nimport ListHeading from '../../components/list-heading';\nimport IconBadge from '@UI/icon-badge';\nimport { Column, Row } from '../../../components/layout';\nimport AdminContentContainer from '../../components/admin-content-container';\nimport GroupAdminTitleBar from '../../components/group-admin-titlebar';\nimport ConditionalLoadingIndicator from '../../../components/conditional-loading-indicator';\nimport FormattedMessage from '../../../lib/i18n';\nimport MenuLabel from '../../../components/menu/menu-label';\nimport DropMenu from '../../../components/menu/drop-menu';\nimport DropItem from '../../../components/menu/drop-item';\nimport DropItemLink from '../../../components/menu/drop-item-link';\nimport Tooltip from '../../../components/tooltip';\nimport { OnMount } from '../../../hoc/on-mount';\nimport RegenerateSharingLinkConfirmModal from '../../components/modals/regenerate-sharing-link-confirm-modal';\nimport ConfirmModal from '../../../components/confirm-modal';\nimport Warning from '../../../components/warning';\n\nconst renderDashboards = (\n  dashboards,\n  groupId,\n  onCopySharingLinkClick,\n  onRegenerateSharingLinkClick,\n  onDeleteDashboardClick,\n) => {\n  return dashboards.map(dashboard => (\n    <ListItem key={dashboard.id} hasHoverState={false}>\n      <Column flexEqualWidth justify=\"center\" marginRight={1} marginLeft={0.5}>\n        {dashboard.title}\n      </Column>\n      <Row flexEqualWidth>\n        <Column flexFill justify=\"center\">\n          {dashboard.sharedUsers.length > 0 && (\n            <ListItemMeta>\n              <FormattedMessage\n                id=\"dashboards.usersSharedWith\"\n                values={{ usersSharedWith: dashboard.sharedUsers.length }}\n              />\n            </ListItemMeta>\n          )}\n        </Column>\n        <Column flexNone justify=\"center\" align=\"flex-end\" marginRight={1}>\n          {dashboard.sharing === 'y' && (\n            <Tooltip\n              tooltip={<FormattedMessage id=\"dashboards.sharingLinkTooltip\" />}\n            >\n              <IconBadge name=\"link\" background={IconBadge.BACKGROUNDS.GREY} />\n            </Tooltip>\n          )}\n        </Column>\n        <Column flexNone justify=\"center\" align=\"flex-end\">\n          <DropMenu label={<MenuLabel />} origin=\"top left\" isAnchored={false}>\n            <DropItemLink to={`/edit/dashboards/${dashboard.id}`} isSmall>\n              <FormattedMessage id=\"dashboards.goToDashboard\" />\n            </DropItemLink>\n            {dashboard.sharing === 'y' && (\n              <DropItem\n                onClick={() =>\n                  onCopySharingLinkClick(dashboard.sharing_hash, dashboard.id)\n                }\n                isSmall\n              >\n                <FormattedMessage id=\"dashboards.copySharingLink\" />\n              </DropItem>\n            )}\n            {dashboard.sharing === 'y' && (\n              <DropItem\n                onClick={() => onRegenerateSharingLinkClick(dashboard.id)}\n                isSmall\n              >\n                <FormattedMessage id=\"dashboards.regenerateSharingLink\" />\n              </DropItem>\n            )}\n            <DropItemLink\n              to={`/admin/groups/${groupId}/dashboards/user-permissions/${dashboard.id}`}\n              isSmall\n            >\n              <FormattedMessage id=\"dashboards.manageUserAccess\" />\n            </DropItemLink>\n            {dashboards.length > 1 && (\n              <DropItem\n                onClick={() =>\n                  onDeleteDashboardClick(dashboard.id, dashboard.title)\n                }\n                isSmall\n              >\n                <FormattedMessage id=\"dashboards.deleteDashboard\" />\n              </DropItem>\n            )}\n          </DropMenu>\n        </Column>\n      </Row>\n    </ListItem>\n  ));\n};\n\nclass DashboardsGroupPageComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isRegenerateSharingLinkModalVisible: false,\n      isDeleteDashboardModalVisible: false,\n      dashboardId: undefined,\n    };\n  }\n\n  handleRegenerateSharingLink() {\n    const { dashboardId } = this.state;\n    this.toggleRegenerateSharingLinkModal();\n    this.props.onRegenerateSharingLink(dashboardId);\n  }\n\n  render() {\n    const {\n      dashboards,\n      groupId,\n      isLoading,\n      children,\n      onCopySharingLink,\n      onMount,\n    } = this.props;\n    const {\n      isRegenerateSharingLinkModalVisible,\n      isDeleteDashboardModalVisible,\n      deleteDashboardTitle,\n    } = this.state;\n    return (\n      <div>\n        <OnMount do={() => onMount(groupId)} />\n        <Helmet>\n          <title>{formatMessage('admin.pageTitle.group.dashboards')}</title>\n        </Helmet>\n        <GroupAdminTitleBar groupId={groupId} />\n        <AdminContentContainer>\n          <ConditionalLoadingIndicator isLoading={isLoading} isDark>\n            <ListHeading\n              icon=\"th-large\"\n              title={\n                <FormattedMessage\n                  id=\"dashboards.dashboardsListHeading\"\n                  values={{ count: dashboards.length }}\n                />\n              }\n            />\n            <List data-acc-id=\"dashboards\">\n              {renderDashboards(\n                dashboards,\n                groupId,\n                onCopySharingLink,\n                dashboardId =>\n                  this.toggleRegenerateSharingLinkModal(dashboardId),\n                (dashboardId, dashboardTitle) =>\n                  this.toggleDeleteDashboardModal(dashboardId, dashboardTitle),\n              )}\n            </List>\n          </ConditionalLoadingIndicator>\n          <RegenerateSharingLinkConfirmModal\n            visible={isRegenerateSharingLinkModalVisible}\n            onClose={() => this.toggleRegenerateSharingLinkModal()}\n            onConfirm={() => this.handleRegenerateSharingLink()}\n          />\n          <ConfirmModal\n            heading={\n              <FormattedMessage\n                id=\"dashboards.confirmDeleteDashboard\"\n                values={{ title: deleteDashboardTitle }}\n              />\n            }\n            confirmButtonLabel=\"Delete\"\n            visible={isDeleteDashboardModalVisible}\n            onClose={() => this.toggleDeleteDashboardModal()}\n            onConfirm={() => this.deleteDashboard()}\n            isNegative\n          >\n            <Warning>\n              <FormattedMessage id=\"dashboards.deleteDashboardModalWarning\" />\n            </Warning>\n          </ConfirmModal>\n        </AdminContentContainer>\n        {children}\n      </div>\n    );\n  }\n\n  deleteDashboard() {\n    this.props.onDeleteDashboard(this.state.deleteDashboardId);\n    this.setState({\n      isDeleteDashboardModalVisible: false,\n      deleteDashboardId: undefined,\n    });\n  }\n\n  toggleDeleteDashboardModal(deleteDashboardId, deleteDashboardTitle) {\n    this.setState({\n      isDeleteDashboardModalVisible: !this.state.isDeleteDashboardModalVisible,\n      deleteDashboardId,\n      deleteDashboardTitle,\n    });\n  }\n\n  toggleRegenerateSharingLinkModal(dashboardId) {\n    this.setState({\n      isRegenerateSharingLinkModalVisible: !this.state\n        .isRegenerateSharingLinkModalVisible,\n      dashboardId,\n    });\n  }\n}\n\nDashboardsGroupPageComponent.propTypes = {\n  dashboards: PropTypes.array.isRequired,\n  onCopySharingLink: PropTypes.func.isRequired,\n  onDeleteDashboard: PropTypes.func.isRequired,\n  onMount: PropTypes.func.isRequired,\n  onRegenerateSharingLink: PropTypes.func.isRequired,\n  children: PropTypes.node,\n  groupId: PropTypes.number,\n  isLoading: PropTypes.bool,\n};\n\nexport default DashboardsGroupPageComponent;\n","import { connect } from 'react-redux';\nimport {\n  getDashboards,\n  getPeople,\n} from '../../../groups/actions/groups-actions';\nimport DashboardsGroupPage from './dashboards-group-page-component';\nimport * as toastActions from '../../../toast/actions/toast-actions';\nimport * as toastConstants from '../../../toast/toast-constants';\nimport * as adminActions from '../../actions/admin-actions';\nimport { getDashboardUserIds } from '../../reducer/users-dashboards-reducer';\nimport copy from '../../../lib/copy-to-clipboard';\nimport { getSharingURL } from '../../../lib/sharing';\nimport { sortBy } from 'lodash';\nimport { trackEvent } from '@Tracking';\nimport { dashboardCopiedSharingLink } from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\nimport { getDashboardTrackingProps } from '../../helpers';\n\nconst getDashboardsArray = dashboards => {\n  return sortBy(dashboards, dashboard => dashboard.title.toLowerCase());\n};\n\nconst mapStateToProps = (state, props) => {\n  const {\n    admin: { loadingDashboards },\n    allDashboards,\n    usersDashboards,\n  } = state;\n\n  const groupId = parseInt(props.match.params.groupId, 10);\n  const dashboards = getDashboardsArray(allDashboards).map(dashboard => {\n    return {\n      ...dashboard,\n      sharedUsers: getDashboardUserIds(usersDashboards, dashboard.id),\n    };\n  });\n\n  return {\n    groupId,\n    dashboards,\n    isLoading: loadingDashboards && dashboards.length === 0,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onMount: groupId => {\n    dispatch(getDashboards(groupId));\n    dispatch(getPeople());\n  },\n  onCopySharingLink: (sharingHash, dashboardId) => {\n    copy(getSharingURL(sharingHash));\n    trackEvent(\n      dashboardCopiedSharingLink({\n        ...getDashboardTrackingProps(dashboardId),\n        Location: LOCATIONS.AdminDashboards,\n      }),\n    );\n    dispatch(\n      toastActions.showToast({ type: toastConstants.SHARING_LINK_COPIED }),\n    );\n  },\n  onRegenerateSharingLink: dashboardId => {\n    dispatch(adminActions.regenerateDashboardSharingLink(dashboardId));\n  },\n  onDeleteDashboard: dashboardId => {\n    dispatch(adminActions.deleteDashboard(dashboardId));\n  },\n});\n\nconst DashboardsGroupPageConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DashboardsGroupPage);\n\nexport default DashboardsGroupPageConnector;\n","import DashboardsGroupPageConnector from './dashboards-group-page-connector';\n\nexport default DashboardsGroupPageConnector;\n","import DataSourceListItem from './data-source-list-item-component';\nexport default DataSourceListItem;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\nimport styles from './checkbox-with-label-styles.scss';\n\nconst CheckboxWithLabelComponent = ({ name, checked, label, onChange }) => {\n  return (\n    <label className={styles.label}>\n      <input\n        name={name}\n        type=\"checkbox\"\n        checked={checked}\n        onChange={onChange}\n      />\n      {label}\n    </label>\n  );\n};\n\nCheckboxWithLabelComponent.propTypes = {\n  checked: PropTypes.bool,\n  label: PropTypes.node,\n  name: PropTypes.string,\n  onChange: PropTypes.func,\n};\n\nexport default CheckboxWithLabelComponent;\n","import Checkbox from './checkbox-with-label-component';\n\nexport default Checkbox;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Column } from '../../../../../../components/layout';\nimport List from '../../../../../../components/list';\nimport ListItem, { ListItemMeta } from '../../../../../../components/list-item';\nimport FormattedMessage from '../../../../../../lib/i18n';\n\nconst renderListItems = widgets => {\n  return widgets.map(widget => {\n    return (\n      <ListItem key={widget.id} hasHoverState={false} type=\"small\">\n        <Column flexAuto justify=\"center\">\n          {widget.title ? (\n            <span>{widget.title}</span>\n          ) : (\n            <FormattedMessage id=\"datasources.untitledWidget\" />\n          )}\n        </Column>\n        <Column justify=\"center\" align=\"flex-end\">\n          <ListItemMeta>{widget.dashboard.title}</ListItemMeta>\n        </Column>\n      </ListItem>\n    );\n  });\n};\n\nconst AffectedWidgetsList = ({ widgets }) => {\n  if (!widgets) return null;\n  return <List>{renderListItems(widgets)}</List>;\n};\n\nAffectedWidgetsList.propTypes = {\n  widgets: PropTypes.array,\n};\n\nexport default AffectedWidgetsList;\n","import AffectedWidgetsList from './affected-widgets-list-component';\n\nexport default AffectedWidgetsList;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from '../../../../../components/modal';\nimport Layout, { Row, Column } from '../../../../../components/layout';\nimport Button from '@UI/button';\nimport CheckboxWithLabel from '../../../../../components/checkbox-with-label';\nimport FormattedMessage, {\n  FormattedHTMLMessage,\n} from '../../../../../lib/i18n';\nimport AffectedWidgetsList from './affected-widgets-list';\nimport Warning from '../../../../../components/warning';\n\nimport adminModalStyles from '../../admin-modal.scss';\n\nclass DeleteDataSourceConfirmModal extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      deleteAssociatedWidgets: true,\n    };\n\n    this.onCheckboxChange = this.onCheckboxChange.bind(this);\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    // When modal was hidden and becomes visible, set the initial state to make sure the checkbox isn't ticked.\n    // Since the modal is always mounted the state won't reset when it's closed. This pattern is used in the InviteMembersModal too.\n    if (nextProps.visible && !this.props.visible) {\n      this.setState({ deleteAssociatedWidgets: true });\n    }\n  }\n\n  onCheckboxChange(event) {\n    const target = event.target;\n\n    this.setState({\n      deleteAssociatedWidgets: !target.checked,\n    });\n  }\n\n  renderDetails(connectionTitle, dashboardCount, widgetCount, widgets) {\n    // render nothing if dashboard count is zero or not set\n    if (!dashboardCount) {\n      return undefined;\n    }\n    const summary = (\n      <FormattedHTMLMessage\n        id=\"datasources.deleteSummary\"\n        values={{\n          connectionTitle,\n          dashboardCount,\n          widgetCount,\n        }}\n      />\n    );\n\n    return (\n      <Layout marginTop={1.5}>\n        <ModalText>{summary}</ModalText>\n        <AffectedWidgetsList widgets={widgets} />\n        <CheckboxWithLabel\n          name=\"dontDeleteWidgets\"\n          checked={!this.state.deleteAssociatedWidgets}\n          label={<FormattedMessage id=\"datasources.deleteConnectionOnly\" />}\n          onChange={this.onCheckboxChange}\n        />\n      </Layout>\n    );\n  }\n\n  render() {\n    const {\n      visible,\n      onClose,\n      onDelete,\n      connectionId,\n      dashboardCount,\n      widgetCount,\n      widgets,\n      isDeleting,\n      service,\n    } = this.props;\n\n    return (\n      <Modal visible={visible} onClose={onClose}>\n        <ModalSection>\n          <div className={adminModalStyles.adminModal}>\n            <ModalHeading>\n              <FormattedMessage id=\"groups.deleteDataSourceHeading\" />\n            </ModalHeading>\n            <ModalText>\n              <Warning>\n                <FormattedMessage id=\"groups.deleteDataSourceWarning\" />\n              </Warning>\n            </ModalText>\n            {this.renderDetails(\n              service.title,\n              dashboardCount,\n              widgetCount,\n              widgets,\n            )}\n            <Row marginTop={2} justify=\"flex-end\">\n              <Column>\n                <Button intent={Button.INTENT.SECONDARY} onClick={onClose}>\n                  <FormattedMessage id=\"button.cancel\" />\n                </Button>\n              </Column>\n              <Column marginLeft={1}>\n                <Button\n                  loading={isDeleting}\n                  type={Button.TYPES.SUBMIT}\n                  onClick={() =>\n                    onDelete(\n                      connectionId,\n                      this.state.deleteAssociatedWidgets,\n                      service,\n                    )\n                  }\n                  intent={Button.INTENT.NEGATIVE}\n                >\n                  <FormattedMessage id=\"datasources.delete\" />\n                </Button>\n              </Column>\n            </Row>\n          </div>\n        </ModalSection>\n      </Modal>\n    );\n  }\n}\n\nDeleteDataSourceConfirmModal.defaultProps = {\n  service: {},\n};\n\nDeleteDataSourceConfirmModal.propTypes = {\n  onClose: PropTypes.func.isRequired,\n  onDelete: PropTypes.func.isRequired,\n  connectionId: PropTypes.number,\n  connectionTitle: PropTypes.string,\n  dashboardCount: PropTypes.number,\n  isDeleting: PropTypes.bool,\n  service: PropTypes.shape({\n    auth_type: PropTypes.string,\n    name: PropTypes.string,\n    title: PropTypes.string,\n  }),\n  visible: PropTypes.bool,\n  widgetCount: PropTypes.number,\n  widgets: PropTypes.array,\n};\n\nexport default DeleteDataSourceConfirmModal;\n","import DeleteDataSourceConfirmModal from './component/delete-data-source-confirm-modal-connector';\n\nexport default DeleteDataSourceConfirmModal;\n","import { connect } from 'react-redux';\nimport * as actions from '../actions/delete-data-source-confirm-modal-actions';\nimport * as groupActions from '../../../../../groups/actions/groups-actions';\nimport { trackEvent } from '@Tracking';\nimport { connectionDeleted } from '@Tracking/events';\nimport DeleteDataSourceConfirmModal from './delete-data-source-confirm-modal-component';\n\nconst mapStateToProps = state => {\n  const {\n    isModalOpen,\n    connectionId,\n    widgets,\n    dashboardCount,\n    widgetCount,\n    isDeleting,\n  } = state.deleteDataSourceConfirmModal;\n\n  const dataSources = state.allDataSources;\n\n  // Get the service from the data source\n  let service;\n  if (connectionId && dataSources) {\n    // if group data has loaded\n    const dataSource = dataSources[connectionId];\n    service = {\n      title: dataSource.service.title,\n      name: dataSource.service.name,\n      auth_type: dataSource.service.auth_type,\n    };\n  }\n\n  return {\n    visible: isModalOpen,\n    connectionId,\n    widgets,\n    dashboardCount,\n    widgetCount,\n    isDeleting,\n    service,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const { groupId } = props;\n  return {\n    onClose: () => dispatch(actions.closeModal()),\n    onDelete: (connectionId, deleteAssociatedWidgets, service) => {\n      dispatch(\n        groupActions.deleteDataSource(\n          groupId,\n          connectionId,\n          deleteAssociatedWidgets,\n        ),\n      );\n      trackEvent(\n        connectionDeleted({\n          'Auth type': service.auth_type,\n          'Integration name': service.title,\n          'Integration slug': service.name,\n        }),\n      );\n    },\n  };\n};\n\nconst DeleteDataSourceConfirmModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DeleteDataSourceConfirmModal);\n\nexport default DeleteDataSourceConfirmModalConnector;\n","import DataSourcesEmptyState from './data-sources-empty-state-component';\n\nexport default DataSourcesEmptyState;\n","import React from 'react';\nimport Image from '@UI/image';\nimport FormattedMessage from '../../../../lib/i18n';\nimport Layout, { Row } from '../../../../components/layout';\nimport config from '../../../../universal/config';\nimport styles from './data-sources-empty-state-style.scss';\nimport emptyStateStyles from '../empty-state-style.scss';\n\nconst DataSourcesEmptyStateComponent = () => {\n  return (\n    <Layout flex flexColumn align=\"center\">\n      <Row>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/integrations-logo-grid.png`}\n          className={styles.image}\n          width=\"460\"\n          height=\"200\"\n        />\n      </Row>\n      <Row marginBottom={1}>\n        <p className={emptyStateStyles.instructions}>\n          <FormattedMessage id=\"groups.noDataSourcesInstructions\" />\n        </p>\n      </Row>\n    </Layout>\n  );\n};\n\nexport default DataSourcesEmptyStateComponent;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Alert from '@UI/alert';\nimport MenuLabel from '../../../components/menu/menu-label';\nimport DropMenu from '../../../components/menu/drop-menu';\nimport DropItem from '../../../components/menu/drop-item';\nimport { Column } from '../../../components/layout';\nimport List from '../../../components/list';\nimport ListHeading from '../../components/list-heading';\nimport ListItem from '../../../components/list-item';\nimport ConfirmModal from '../../../components/confirm-modal';\nimport FormattedMessage from '../../../lib/i18n';\n\nclass DatabaseConnectionList extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      toBeDeleted: undefined,\n    };\n\n    this.closeDeleteModal = this.closeDeleteModal.bind(this);\n    this.deleteConnection = this.deleteConnection.bind(this);\n  }\n\n  render() {\n    const { connections } = this.props;\n    const { toBeDeleted } = this.state;\n\n    // If empty, don't show this section\n    if (!connections || !connections.length) {\n      return null;\n    }\n\n    // Due to an awkward issue with React-Intl and testing, I'm having to manually\n    // handle pluralisation in the FormattedMessage below\n\n    return (\n      <div>\n        <ListHeading\n          icon=\"database\"\n          title={\n            <FormattedMessage\n              id=\"datasources.databaseConnectionsListHeading\"\n              values={{\n                number: connections.length,\n                plural: connections.length > 1 ? 's' : '',\n              }}\n            />\n          }\n        />\n        <List data-acc-id=\"database-connections\">\n          {connections.map(connection => (\n            <ListItem hasHoverState={false} key={connection.id}>\n              <Column flexAuto marginRight={1} marginLeft={1}>\n                {connection.name}\n              </Column>\n              <Column flexNone justify=\"center\" align=\"flex-end\">\n                <div>\n                  <DropMenu\n                    label={<MenuLabel />}\n                    origin=\"top left\"\n                    isAnchored={false}\n                  >\n                    <DropItem\n                      onClick={() => this.openDeleteModal(connection)}\n                      isSmall\n                    >\n                      <FormattedMessage id=\"datasources.delete\" />\n                    </DropItem>\n                  </DropMenu>\n                </div>\n              </Column>\n            </ListItem>\n          ))}\n          <ConfirmModal\n            visible={!!toBeDeleted}\n            isNegative\n            confirmButtonLabel={<FormattedMessage id=\"button.delete\" />}\n            heading={\n              <FormattedMessage\n                id=\"database.delete.confirmModal.title\"\n                values={{\n                  connectionName: toBeDeleted ? toBeDeleted.name : 'the',\n                }}\n              />\n            }\n            onClose={this.closeDeleteModal}\n            onConfirm={this.deleteConnection}\n          >\n            <Alert\n              type={Alert.TYPES.WARNING}\n              title={\n                <FormattedMessage id=\"database.delete.confirmModal.alert.title\" />\n              }\n              message={\n                <FormattedMessage id=\"database.delete.confirmModal.alert.message\" />\n              }\n            />\n          </ConfirmModal>\n        </List>\n      </div>\n    );\n  }\n\n  openDeleteModal(connection) {\n    this.setState({ toBeDeleted: connection });\n  }\n\n  closeDeleteModal() {\n    this.setState({ toBeDeleted: undefined });\n  }\n\n  deleteConnection() {\n    const connection = this.state.toBeDeleted;\n    this.props.onDeleteConnection(connection);\n    this.closeDeleteModal();\n  }\n}\n\nDatabaseConnectionList.defaultProps = {\n  connections: [],\n};\n\nDatabaseConnectionList.propTypes = {\n  connections: PropTypes.array,\n  onDeleteConnection: PropTypes.func,\n};\n\nexport default DatabaseConnectionList;\n","import React from 'react';\nimport { useQuery, useMutation } from '@apollo/react-hooks';\nimport { DatabaseConnections } from '../../../database-config/database-connections-query.graphql';\nimport { DatabaseConnectionDelete } from '../../../database-config/database-connection-delete.graphql';\nimport DatabaseConnectionList from './database-connection-list-component';\n\nconst createCacheUpdater = connectionId => proxy => {\n  // Read the database connection list from cache\n  const cache = proxy.readQuery({\n    query: DatabaseConnections,\n  });\n\n  // Remove the connection we want to delete\n  cache.databaseConnections = cache.databaseConnections.filter(\n    c => c.id !== connectionId,\n  );\n\n  // Write to the cache\n  proxy.writeQuery({\n    query: DatabaseConnections,\n    data: cache,\n  });\n};\n\nconst DatabaseConnectionListConnector = () => {\n  const { data } = useQuery(DatabaseConnections);\n  const [deleteConnection] = useMutation(DatabaseConnectionDelete);\n\n  if (!data || !data.databaseConnections) {\n    return null;\n  }\n\n  return (\n    <DatabaseConnectionList\n      connections={data.databaseConnections}\n      onDeleteConnection={({ id }) =>\n        deleteConnection({\n          variables: { id },\n          update: createCacheUpdater(id),\n        })\n      }\n    />\n  );\n};\n\nexport default DatabaseConnectionListConnector;\n","import DatabaseConnectionList from './database-connection-list-connector';\nexport default DatabaseConnectionList;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport Helmet from 'react-helmet';\nimport List from '../../../components/list';\nimport ListHeading from '../../components/list-heading';\nimport GhostList from '../../components/ghost-list';\nimport AdminContentContainer from '../../components/admin-content-container';\nimport GroupAdminTitleBar from '../../components/group-admin-titlebar';\nimport DataSourceListItem from '../../../components/data-source-list-item';\nimport DeleteDataSourceConfirmModal from '../../components/modals/delete-data-source-confirm-modal';\nimport DataSourcesEmptyState from '../../components/empty-states/data-sources-empty-state';\nimport ConditionalLoadingIndicator from '../../../components/conditional-loading-indicator';\nimport DatabaseConnectionList from '../../components/database-connection-list';\nimport FormattedMessage, { formatMessage } from '../../../lib/i18n';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n  ModalText,\n} from '../../../components/modal';\nimport { Row, Column } from '../../../components/layout';\nimport Button from '@UI/button';\nimport { OnMount } from '../../../hoc/on-mount';\nimport { get } from 'lodash';\n\nimport style from './data-sources-page-style.scss';\n\nconst renderDataSources = (\n  dataSourcesForGroup,\n  groupId,\n  onOpenReconnectModal,\n  onOpenDeleteDataSourceConfirmModal,\n) => {\n  if (!dataSourcesForGroup || dataSourcesForGroup.length === 0) {\n    return (\n      <GhostList>\n        <DataSourcesEmptyState />\n      </GhostList>\n    );\n  }\n\n  return (\n    <div className={style.section}>\n      <ListHeading\n        icon=\"plug\"\n        title={\n          <FormattedMessage\n            id=\"datasources.datasourcesListHeading\"\n            values={{ count: dataSourcesForGroup.length }}\n          />\n        }\n      />\n      <List data-acc-id=\"data-sources\">\n        {dataSourcesForGroup.map(dataSource => (\n          <DataSourceListItem\n            key={dataSource.id}\n            dataSource={dataSource}\n            onReconnect={() => onOpenReconnectModal(dataSource.id)}\n            onOpenDeleteConfirmModal={() =>\n              onOpenDeleteDataSourceConfirmModal(dataSource.id)\n            }\n          />\n        ))}\n      </List>\n    </div>\n  );\n};\n\nconst renderDatabaseConnections = () => {\n  return (\n    <div className={style.section}>\n      <DatabaseConnectionList />\n    </div>\n  );\n};\n\n// We need to keep groupId as a separate prop so we can access\n// it before group is loaded. Otherwise we wouldn't be able to\n// render the tabs until the group loads.\nconst DataSourcesGroupPageComponent = ({\n  groupId,\n  dataSourcesForGroup,\n  loadingDataSources,\n  onReconnectDataSource,\n  onOpenReconnectModal,\n  onCloseReconnectModal,\n  reconnectingDataSource,\n  isReconnectModalOpen,\n  onOpenDeleteDataSourceConfirmModal,\n  onMount,\n}) => {\n  const reconnectingServiceName = get(\n    reconnectingDataSource,\n    'service.title',\n    '',\n  );\n\n  // If there are datasources we don't want to show a loader, even if\n  // loadingDataSources is true, because they will update silently in the background.\n  // However it's possible there are no datasources for the group in which case dataSourcesForGroup\n  // is an empty array. This check prevents an infinite loader when there are no datasources.\n  const isLoading =\n    !dataSourcesForGroup ||\n    (dataSourcesForGroup.length === 0 && loadingDataSources);\n\n  return (\n    <div>\n      <OnMount do={() => onMount(groupId)} />\n      <Helmet>\n        <title>{formatMessage('admin.pageTitle.group.dataSources')}</title>\n      </Helmet>\n      <GroupAdminTitleBar groupId={groupId} />\n      <AdminContentContainer>\n        <ConditionalLoadingIndicator isLoading={isLoading} isDark>\n          {renderDataSources(\n            dataSourcesForGroup,\n            groupId,\n            onOpenReconnectModal,\n            onOpenDeleteDataSourceConfirmModal,\n          )}\n\n          {renderDatabaseConnections(\n            dataSourcesForGroup,\n            groupId,\n            onOpenReconnectModal,\n            onOpenDeleteDataSourceConfirmModal,\n          )}\n        </ConditionalLoadingIndicator>\n      </AdminContentContainer>\n      <Modal visible={isReconnectModalOpen} onClose={onCloseReconnectModal}>\n        <ModalSection>\n          <ModalHeading>\n            <FormattedMessage id=\"datasources.reconnectModalHeading\" />\n          </ModalHeading>\n          <ModalText>\n            <FormattedMessage\n              id=\"datasources.reconnectModalMessage\"\n              values={{ serviceName: reconnectingServiceName }}\n            />\n          </ModalText>\n          <Row marginTop={2} justify=\"flex-end\">\n            <Column>\n              <Button\n                intent={Button.INTENT.SECONDARY}\n                onClick={onCloseReconnectModal}\n              >\n                <FormattedMessage id=\"button.cancel\" />\n              </Button>\n            </Column>\n            <Column marginLeft={1}>\n              <Button\n                type={Button.TYPES.SUBMIT}\n                onClick={() =>\n                  onReconnectDataSource(groupId, reconnectingDataSource)\n                }\n              >\n                <FormattedMessage id=\"datasources.reconnect\" />\n              </Button>\n            </Column>\n          </Row>\n        </ModalSection>\n      </Modal>\n      <DeleteDataSourceConfirmModal groupId={groupId} />\n    </div>\n  );\n};\n\nDataSourcesGroupPageComponent.defaultProps = {\n  dataSourcesForGroup: null,\n};\n\nDataSourcesGroupPageComponent.propTypes = {\n  onReconnectDataSource: PropTypes.func.isRequired,\n  dataSourcesForGroup: PropTypes.array,\n  groupId: PropTypes.number,\n  isReconnectModalOpen: PropTypes.bool,\n  loadingDataSources: PropTypes.bool,\n  reconnectingDataSource: PropTypes.shape({\n    id: PropTypes.number,\n    service: PropTypes.shape({ id: PropTypes.number, name: PropTypes.string }),\n  }),\n  onCloseReconnectModal: PropTypes.func,\n  onMount: PropTypes.func,\n  onOpenDeleteDataSourceConfirmModal: PropTypes.func,\n  onOpenReconnectModal: PropTypes.func,\n};\n\nexport default DataSourcesGroupPageComponent;\n","import DataSourcesGroupPageConnector from './data-sources-group-page-connector';\nexport default DataSourcesGroupPageConnector;\n","import { connect } from 'react-redux';\nimport { sortBy, find } from 'lodash';\nimport * as groupActions from '../../../groups/actions/groups-actions';\nimport * as deleteDatasourceConfirmModalAction from '../../components/modals/delete-data-source-confirm-modal/actions/delete-data-source-confirm-modal-actions';\nimport DataSourcesGroupPageComponent from './data-sources-group-page-component';\n\nconst mapStateToProps = (state, props) => {\n  const groupId = parseInt(props.match.params.groupId, 10);\n\n  const {\n    loadingDataSources,\n    reconnectingDataSourceId,\n    isReconnectModalOpen,\n  } = state.admin;\n\n  const dataSourcesForGroup = sortBy(state.allDataSources, [\n    ({ service: { title = '' } = {} }) => title.toLowerCase(),\n    ({ name = '' }) => name.toLowerCase(),\n    'id',\n  ]);\n\n  const reconnectingDataSource = find(dataSourcesForGroup, {\n    id: reconnectingDataSourceId,\n  });\n\n  return {\n    groupId,\n    dataSourcesForGroup,\n    loadingDataSources,\n    reconnectingDataSource,\n    isReconnectModalOpen,\n  };\n};\n\nconst mapDispatchToProps = dispatch => {\n  return {\n    onMount: groupId => {\n      dispatch(groupActions.getDataSources(groupId));\n    },\n    onReconnectDataSource: (groupId, dataSource) => {\n      dispatch(groupActions.reconnectDataSource(groupId, dataSource));\n    },\n    onOpenReconnectModal: dataSourceId => {\n      dispatch(groupActions.openReconnectModal(dataSourceId));\n    },\n    onCloseReconnectModal: () => {\n      dispatch(groupActions.closeReconnectModal());\n    },\n    onOpenDeleteDataSourceConfirmModal: connectionId => {\n      dispatch(\n        deleteDatasourceConfirmModalAction.openModalWithConnection(\n          connectionId,\n        ),\n      );\n    },\n  };\n};\n\nconst DataSourcesGroupPageConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DataSourcesGroupPageComponent);\n\nexport default DataSourcesGroupPageConnector;\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport ListItem, { ListItemMeta } from '../../../../components/list-item';\nimport { Column, Row } from '../../../../components/layout';\nimport MenuLabel from '../../../../components/menu/menu-label';\nimport DropMenu from '../../../../components/menu/drop-menu';\nimport DropItem from '../../../../components/menu/drop-item';\nimport DropItemLink from '../../../../components/menu/drop-item-link';\nimport FormattedMessage from '../../../../lib/i18n';\nimport ConfirmModal from '../../../../components/confirm-modal';\nimport Warning from '../../../../components/warning';\nimport PricingGate from '../../../../components/pricing-gate';\nimport { track } from '../../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport { buttonClicked } from '@Tracking/events';\n\nconst renderConfirmDeletionModal = (title, visible, onDeleteLoop, onCancel) => {\n  return (\n    <ConfirmModal\n      visible={visible}\n      heading={\n        <FormattedMessage\n          id=\"loops.deleteConfirmationHeading\"\n          values={{ title }}\n        />\n      }\n      confirmButtonLabel={<FormattedMessage id=\"loops.deleteConfirmButton\" />}\n      onConfirm={onDeleteLoop}\n      onClose={onCancel}\n      isNegative\n    >\n      <Warning>\n        <FormattedMessage id=\"loops.deleteConfirmMessage\" />\n      </Warning>\n    </ConfirmModal>\n  );\n};\n\nclass LoopListItemComponent extends PureComponent {\n  constructor() {\n    super();\n    this.state = {\n      isDeleteModalVisible: false,\n    };\n  }\n\n  render() {\n    const {\n      id,\n      title,\n      dashboard_ids: dashboardIds,\n      code,\n      onDeleteLoop,\n      onCopySharingLink,\n      onRegenerateSharingLink,\n      groupId,\n    } = this.props;\n    const { isDeleteModalVisible } = this.state;\n    const onClickDelete = () => this.setState({ isDeleteModalVisible: true });\n    const onConfirmDelete = () => onDeleteLoop(id);\n    const onCancelDelete = () => this.setState({ isDeleteModalVisible: false });\n\n    return (\n      <ListItem hasHoverState={false}>\n        <Column\n          flexEqualWidth\n          justify=\"center\"\n          marginRight={1}\n          marginLeft={0.5}\n        >\n          {title}\n        </Column>\n        <Row flexEqualWidth>\n          <Column flexFill justify=\"center\">\n            <ListItemMeta>\n              <FormattedMessage\n                id=\"loops.dashboardCount\"\n                values={{ count: dashboardIds.length }}\n              />\n            </ListItemMeta>\n          </Column>\n          <Column flexNone align=\"flex-end\" justify=\"center\">\n            <DropMenu\n              label={<MenuLabel />}\n              origin=\"top left\"\n              isAnchored={false}\n            >\n              <PricingGate name=\"sharing_urls\" allowance=\"sharing_urls\">\n                {({ allowed, trialist }) =>\n                  allowed || trialist ? (\n                    <div>\n                      <DropItem\n                        onClick={() => onCopySharingLink(code, id)}\n                        isSmall\n                      >\n                        <FormattedMessage id=\"loops.copySharingLink\" />\n                      </DropItem>\n                      <DropItem\n                        onClick={() => onRegenerateSharingLink(id)}\n                        isSmall\n                      >\n                        <FormattedMessage id=\"loops.regenerateSharingLink\" />\n                      </DropItem>\n                    </div>\n                  ) : null\n                }\n              </PricingGate>\n\n              <DropItemLink\n                to={`/admin/groups/${groupId}/loops/${id}`}\n                onClick={() => {\n                  track('Admin - Loops - Click edit loop');\n                  trackEvent(\n                    buttonClicked({\n                      'Button identifier': 'Admin - Loops - Edit loop',\n                    }),\n                  );\n                }}\n                isSmall\n              >\n                <FormattedMessage id=\"loops.editLoop\" />\n              </DropItemLink>\n              <DropItem onClick={onClickDelete} isSmall>\n                <FormattedMessage id=\"loops.deleteLoop\" />\n              </DropItem>\n            </DropMenu>\n          </Column>\n        </Row>\n        {renderConfirmDeletionModal(\n          title,\n          isDeleteModalVisible,\n          onConfirmDelete,\n          onCancelDelete,\n        )}\n      </ListItem>\n    );\n  }\n}\nLoopListItemComponent.propTypes = {\n  code: PropTypes.string.isRequired,\n  dashboard_ids: PropTypes.array.isRequired,\n  groupId: PropTypes.number.isRequired,\n  id: PropTypes.number.isRequired,\n  title: PropTypes.string.isRequired,\n  onCopySharingLink: PropTypes.func.isRequired,\n  onDeleteLoop: PropTypes.func.isRequired,\n  onRegenerateSharingLink: PropTypes.func.isRequired,\n};\n\nexport default LoopListItemComponent;\n","import LoopListItemComponent from './loop-list-item-component';\nexport default LoopListItemComponent;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Image from '@UI/image';\nimport FormattedMessage from '../../../../lib/i18n';\nimport Button from '@UI/button';\nimport Icon from '@UI/icon';\nimport Layout, { Row } from '../../../../components/layout';\nimport config from '../../../../universal/config';\n\nimport styles from '../empty-state-style.scss';\n\nconst LoopsEmptyStateComponent = ({ groupId, onAddLoopClick }) => {\n  return (\n    <Layout flex flexColumn align=\"center\">\n      <Row>\n        <Image\n          src={`${config.get().StaticAssetBaseURL}/images/empty-loop.png`}\n          className={styles.image}\n          width=\"360\"\n          height=\"132\"\n        />\n      </Row>\n      <Row marginBottom={1}>\n        <p className={styles.instructions}>\n          <FormattedMessage id=\"groups.noLoopsInstructions\" />\n        </p>\n      </Row>\n      <Row marginBottom={1}>\n        <Button onClick={() => onAddLoopClick(groupId)}>\n          {\n            <span>\n              <span className={styles.iconContainer}>\n                <Icon name=\"plus\" />\n              </span>\n              <FormattedMessage id=\"loops.addLoop\" />\n            </span>\n          }\n        </Button>\n      </Row>\n    </Layout>\n  );\n};\n\nLoopsEmptyStateComponent.propTypes = {\n  groupId: PropTypes.number.isRequired,\n  onAddLoopClick: PropTypes.func.isRequired,\n};\n\nexport default LoopsEmptyStateComponent;\n","import LoopsEmptyState from './loops-empty-state-component';\n\nexport default LoopsEmptyState;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport Helmet from 'react-helmet';\nimport Button from '@UI/button';\nimport AdminContentContainer from '../../components/admin-content-container';\nimport GroupAdminTitleBar from '../../components/group-admin-titlebar';\nimport FormattedMessage, { formatMessage } from '../../../lib/i18n';\nimport { OnMount } from '../../../hoc/on-mount';\nimport ConditionalLoadingIndicator from '../../../components/conditional-loading-indicator';\nimport ListHeading from '../../components/list-heading';\nimport List from '../../../components/list';\nimport LoopListItem from './loop-list-item';\nimport GhostList from '../../components/ghost-list';\nimport LoopsEmptyState from '../../components/empty-states/loops-empty-state';\nimport RegenerateSharingLinkConfirmModal from '../../components/modals/regenerate-sharing-link-confirm-modal';\n\nimport style from './loops-group-page-style.scss';\n\nconst renderLoopsList = (\n  loops,\n  groupId,\n  onAddLoopClick,\n  onDeleteLoop,\n  onCopySharingLink,\n  onRegenerateSharingLink,\n) => {\n  if (loops.length > 0) {\n    return (\n      <List data-acc-id=\"loops\">\n        {loops.map(loop => (\n          <LoopListItem\n            {...loop}\n            groupId={groupId}\n            key={loop.id}\n            onDeleteLoop={onDeleteLoop}\n            onCopySharingLink={onCopySharingLink}\n            onRegenerateSharingLink={onRegenerateSharingLink}\n          />\n        ))}\n      </List>\n    );\n  }\n\n  return (\n    <GhostList>\n      <LoopsEmptyState groupId={groupId} onAddLoopClick={onAddLoopClick} />\n    </GhostList>\n  );\n};\n\nclass LoopsGroupPageComponent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isRegenerateSharingLinkModalVisible: false,\n      loopId: undefined,\n    };\n  }\n\n  handleRegenerateSharingLink() {\n    const { loopId } = this.state;\n    this.toggleRegenerateSharingLinkModal();\n    this.props.onRegenerateSharingLink(loopId);\n  }\n\n  render() {\n    const {\n      groupId,\n      onMount,\n      loops,\n      isLoading,\n      onAddLoopClick,\n      onDeleteLoop,\n      onCopySharingLink,\n      children,\n    } = this.props;\n    const { isRegenerateSharingLinkModalVisible } = this.state;\n\n    const TitleBarButton = (\n      <div className={style.buttonIconProvider}>\n        <Button onClick={() => onAddLoopClick(groupId)}>\n          <FormattedMessage id=\"loops.addLoop\" />\n        </Button>\n      </div>\n    );\n\n    return (\n      <div>\n        <OnMount do={() => onMount(groupId)} />\n        <Helmet>\n          <title>{formatMessage('admin.pageTitle.group.loops')}</title>\n        </Helmet>\n        <GroupAdminTitleBar groupId={groupId} button={TitleBarButton} />\n        <AdminContentContainer>\n          <ConditionalLoadingIndicator isLoading={isLoading} isDark>\n            <ListHeading\n              icon=\"retweet\"\n              title={\n                <FormattedMessage\n                  id=\"loops.loopsListHeading\"\n                  values={{ count: loops.length }}\n                />\n              }\n            />\n            {renderLoopsList(\n              loops,\n              groupId,\n              onAddLoopClick,\n              onDeleteLoop,\n              onCopySharingLink,\n              loopId => this.toggleRegenerateSharingLinkModal(loopId),\n            )}\n          </ConditionalLoadingIndicator>\n          <RegenerateSharingLinkConfirmModal\n            visible={isRegenerateSharingLinkModalVisible}\n            onClose={() => this.toggleRegenerateSharingLinkModal()}\n            onConfirm={() => this.handleRegenerateSharingLink()}\n          />\n        </AdminContentContainer>\n        {children}\n      </div>\n    );\n  }\n\n  toggleRegenerateSharingLinkModal(loopId) {\n    this.setState({\n      isRegenerateSharingLinkModalVisible: !this.state\n        .isRegenerateSharingLinkModalVisible,\n      loopId,\n    });\n  }\n}\n\nLoopsGroupPageComponent.propTypes = {\n  groupId: PropTypes.number.isRequired,\n  isLoading: PropTypes.bool.isRequired,\n  loops: PropTypes.array.isRequired,\n  onAddLoopClick: PropTypes.func.isRequired,\n  onCopySharingLink: PropTypes.func.isRequired,\n  onDeleteLoop: PropTypes.func.isRequired,\n  onMount: PropTypes.func.isRequired,\n  onRegenerateSharingLink: PropTypes.func.isRequired,\n  children: PropTypes.node,\n};\n\nexport default LoopsGroupPageComponent;\n","import LoopsGroupPageConnector from './loops-group-page-connector';\nexport default LoopsGroupPageConnector;\n","import { connect } from 'react-redux';\nimport { sortBy } from 'lodash';\nimport { getLoops, deleteLoop } from '../../actions/loop-actions';\nimport copy from '../../../lib/copy-to-clipboard';\nimport { getLoopURL } from '../../../lib/loop';\nimport * as adminActions from '../../actions/admin-actions';\nimport * as toastActions from '../../../toast/actions';\nimport * as toastConstants from '../../../toast/toast-constants';\nimport LoopsGroupPageComponent from './loops-group-page-component';\nimport { router } from '../../../router';\nimport { track } from '../../../lib/tracker';\nimport { trackEvent } from '@Tracking';\nimport {\n  dashboardLoopCopiedSharingLink,\n  buttonClicked,\n} from '@Tracking/events';\nimport { LOCATIONS } from '@Tracking/constants';\n\nconst mapStateToProps = (state, props) => {\n  const groupId = parseInt(props.match.params.groupId, 10);\n  const {\n    allLoops,\n    admin: { loadingLoops },\n  } = state;\n  const loops = sortBy(allLoops, loop => loop.title.toLowerCase());\n\n  return {\n    groupId,\n    loops,\n    isLoading: loadingLoops && loops.length === 0,\n  };\n};\n\nconst mapDispatchToProps = dispatch => ({\n  onMount: groupId => dispatch(getLoops(groupId)),\n  onAddLoopClick: groupId => {\n    track('Admin - Loops - Click add loop');\n    trackEvent(\n      buttonClicked({\n        'Button identifier': 'Admin - Loops - Add loop',\n      }),\n    );\n    router.setQueryParam('addLoop', groupId);\n  },\n  onDeleteLoop: loopId => {\n    track('Admin - Loops - Delete loop');\n    dispatch(deleteLoop(loopId));\n  },\n  onCopySharingLink: (code, loopId) => {\n    track('Admin - Loops - Copy URL');\n    copy(getLoopURL(code));\n    dispatch(\n      toastActions.showToast({ type: toastConstants.SHARING_LINK_COPIED }),\n    );\n\n    trackEvent(\n      dashboardLoopCopiedSharingLink({\n        'Dashboard loop ID': `${loopId}`,\n        Location: LOCATIONS.AdminLoops,\n      }),\n    );\n  },\n  onRegenerateSharingLink: loopId => {\n    track('Admin - Loops - Regenerate URL');\n    dispatch(adminActions.regenerateLoopSharingLink(loopId));\n  },\n});\n\nconst LoopsGroupPageConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(LoopsGroupPageComponent);\n\nexport default LoopsGroupPageConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './scrollable-list-style.scss';\n\nconst ScrollableListComponent = ({ children }) => (\n  <ol className={styles.list}>{children}</ol>\n);\n\nScrollableListComponent.propTypes = {\n  children: PropTypes.node,\n};\n\nexport default ScrollableListComponent;\n","import ScrollableList from './scrollable-list-component';\n\nexport default ScrollableList;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Column } from '../layout';\nimport ListItem from '../list-item';\nimport ToggleInput from '../form/toggle-input';\n\nconst DashboardPermissionListItemComponent = ({\n  dashboard,\n  hasAccess,\n  onToggleAccess,\n  isHighlighted,\n}) => {\n  return (\n    <ListItem isHighlighted={isHighlighted} hasHoverState={false}>\n      <Column flexAuto justify=\"center\" marginLeft={0.5}>\n        {dashboard.title}\n      </Column>\n      <Column flexNone justify=\"center\" paddingTop={0.5} paddingBottom={0.5}>\n        <ToggleInput\n          checked={hasAccess}\n          onToggle={checked => onToggleAccess(dashboard.id, checked)}\n        />\n      </Column>\n    </ListItem>\n  );\n};\n\nDashboardPermissionListItemComponent.propTypes = {\n  dashboard: PropTypes.shape({\n    id: PropTypes.number.isRequired,\n    title: PropTypes.string.isRequired,\n  }).isRequired,\n  hasAccess: PropTypes.bool.isRequired,\n  onToggleAccess: PropTypes.func.isRequired,\n  isHighlighted: PropTypes.bool,\n};\n\nexport default DashboardPermissionListItemComponent;\n","import DashboardPermissionListItem from './dashboard-permission-list-item-component';\n\nexport default DashboardPermissionListItem;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { without, includes, isEqual, difference } from 'lodash';\nimport { router } from '../../../../router';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n} from '../../../../components/modal';\nimport ScrollableList from '../../../../components/scrollable-list';\nimport DashboardPermissionListItem from '../../../../components/dashboard-permission-list-item';\nimport ConditionalLoadingIndicator from '../../../../components/conditional-loading-indicator';\nimport Layout, { Row, Column } from '../../../../components/layout';\nimport Button from '@UI/button';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../../../lib/i18n';\nimport { getUserDisplayName } from '../../../helpers';\nimport styles from './dashboard-permissions-modal-style.scss';\nimport UserInitials from '../../../../components/user-initials';\n\nclass DashboardPermissionsModal extends Component {\n  constructor(props) {\n    super(props);\n\n    this.onClose = this.onClose.bind(this);\n    this.handleToggleAccess = this.handleToggleAccess.bind(this);\n    this.handleSubmit = this.handleSubmit.bind(this);\n    this.hasAccess = this.hasAccess.bind(this);\n    this.hasChanged = this.hasChanged.bind(this);\n    this.hasChangesPending = this.hasChangesPending.bind(this);\n\n    this.state = {\n      dashboardIds: props.dashboardIds,\n    };\n  }\n\n  componentDidMount() {\n    if (this.props.isVisible) {\n      this.props.onOpen();\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (isEqual(this.props.dashboardIds, nextProps.dashboardIds)) {\n      return;\n    }\n    this.setState({ dashboardIds: nextProps.dashboardIds });\n  }\n\n  componentDidUpdate(prevProps) {\n    // When the modal opens, fetch the user's dashboards\n    if (this.props.isVisible && !prevProps.isVisible) {\n      this.props.onOpen();\n    }\n  }\n\n  onClose() {\n    router.navigate('/admin/people');\n  }\n\n  handleToggleAccess(dashboardId) {\n    const { dashboardIds } = this.state;\n    const alreadyToggled = includes(dashboardIds, dashboardId);\n\n    if (alreadyToggled) {\n      this.setState({\n        dashboardIds: without(dashboardIds, dashboardId),\n      });\n    } else {\n      this.setState({\n        dashboardIds: [...dashboardIds, dashboardId],\n      });\n    }\n  }\n\n  handleSubmit() {\n    const { onSubmit, dashboards, user } = this.props;\n    const { dashboardIds: localdashboardIds } = this.state;\n\n    const usersDashboardsPermissions = dashboards.map(dashboard => {\n      return {\n        userId: user.id,\n        dashboardId: dashboard.id,\n        role: includes(localdashboardIds, dashboard.id) ? 'viewer' : 'none',\n      };\n    });\n\n    onSubmit(usersDashboardsPermissions);\n  }\n\n  renderInfoMessage() {\n    const { dashboardIds } = this.props;\n    const { dashboardIds: localdashboardIds } = this.state;\n\n    const changes = [\n      ...difference(dashboardIds, localdashboardIds),\n      ...difference(localdashboardIds, dashboardIds),\n    ];\n\n    if (changes.length === 0) {\n      return null;\n    }\n\n    return (\n      <FormattedHTMLMessage\n        id=\"groups.manageDashboardAccess.changes\"\n        values={{ count: changes.length }}\n      />\n    );\n  }\n\n  render() {\n    const { isVisible, dashboards, isLoading, user } = this.props;\n\n    return (\n      <Modal visible={isVisible} onClose={this.onClose}>\n        <ModalSection>\n          <div className={styles.container}>\n            <div className={styles.header}>\n              <div className={styles.title}>\n                <Layout flex align=\"baseline\">\n                  <Column marginRight={0.5}>\n                    <UserInitials user={user} />\n                  </Column>\n                  <Column>\n                    <ModalHeading>\n                      <FormattedHTMLMessage\n                        id=\"groups.manageDashboardAccess.modalHeading\"\n                        values={{ name: getUserDisplayName(user) }}\n                      />\n                    </ModalHeading>\n                  </Column>\n                </Layout>\n                <Row marginTop={1} marginBottom={2}>\n                  <div className={styles.infoMessage}>\n                    <FormattedHTMLMessage id=\"groups.manageDashboardAccess.learnMore\" />\n                  </div>\n                </Row>\n              </div>\n            </div>\n            <ConditionalLoadingIndicator\n              className={styles.content}\n              isLoading={isLoading}\n              isDark\n            >\n              <div className={styles.list}>\n                <ScrollableList>\n                  {dashboards.map(dashboard => (\n                    <DashboardPermissionListItem\n                      key={dashboard.id}\n                      dashboard={dashboard}\n                      hasAccess={this.hasAccess(dashboard.id)}\n                      isHighlighted={this.hasChanged(dashboard.id)}\n                      onToggleAccess={() =>\n                        this.handleToggleAccess(dashboard.id)\n                      }\n                    />\n                  ))}\n                </ScrollableList>\n              </div>\n              <div className={styles.footer}>\n                <Row marginTop={2} justify=\"flex-end\">\n                  <Column flexAuto justify=\"center\">\n                    <div className={styles.infoMessage}>\n                      {this.renderInfoMessage()}\n                    </div>\n                  </Column>\n                  <Column>\n                    <Button\n                      onClick={this.onClose}\n                      intent={Button.INTENT.SECONDARY}\n                    >\n                      <FormattedMessage id=\"button.cancel\" />\n                    </Button>\n                  </Column>\n                  <Column marginLeft={1}>\n                    <Button\n                      onClick={this.handleSubmit}\n                      disabled={!this.hasChangesPending()}\n                    >\n                      <FormattedMessage id=\"button.update\" />\n                    </Button>\n                  </Column>\n                </Row>\n              </div>\n            </ConditionalLoadingIndicator>\n          </div>\n        </ModalSection>\n      </Modal>\n    );\n  }\n\n  hasAccess(dashboardId) {\n    const { dashboardIds } = this.state;\n\n    return includes(dashboardIds, dashboardId);\n  }\n\n  hasChanged(dashboardId) {\n    const { dashboardIds } = this.props;\n    const { dashboardIds: localdashboardIds } = this.state;\n\n    const changes = [\n      ...difference(dashboardIds, localdashboardIds),\n      ...difference(localdashboardIds, dashboardIds),\n    ];\n\n    return includes(changes, dashboardId);\n  }\n\n  hasChangesPending() {\n    const { dashboardIds } = this.props;\n    const { dashboardIds: localdashboardIds } = this.state;\n\n    return !isEqual(dashboardIds, localdashboardIds);\n  }\n}\n\nDashboardPermissionsModal.defaultProps = {\n  dashboards: [],\n  dashboardIds: [],\n  user: { first_name: 'Joe', last_name: 'Bloggs' },\n};\n\nDashboardPermissionsModal.propTypes = {\n  user: PropTypes.object.isRequired,\n  onOpen: PropTypes.func.isRequired,\n  onSubmit: PropTypes.func.isRequired,\n  dashboardIds: PropTypes.arrayOf(PropTypes.number),\n  dashboards: PropTypes.arrayOf(\n    PropTypes.shape({\n      id: PropTypes.number.isRequired,\n      title: PropTypes.string.isRequired,\n    }),\n  ),\n  isLoading: PropTypes.bool,\n  isVisible: PropTypes.bool,\n};\n\nexport default DashboardPermissionsModal;\n","import { formatMessage } from '../../../../../lib/i18n';\nimport * as userActions from '../../../../../user/actions/user-actions';\nimport * as toastActions from '../../../../../toast/actions';\nimport { router } from '../../../../../router';\nimport { getUserDashboardIds } from '../../../../reducer/users-dashboards-reducer';\nimport { track } from '../../../../../lib/tracker';\n\nconst getDashboardPermissionChanges = (dashboardIds, permissions) => {\n  const added = permissions.filter(perm => {\n    return perm.role === 'viewer' && !dashboardIds.includes(perm.dashboardId);\n  });\n\n  const removed = permissions.filter(perm => {\n    return perm.role === 'none' && dashboardIds.includes(perm.dashboardId);\n  });\n\n  return { added, removed };\n};\n\nexport const modalUpdate = (\n  groupId,\n  userId,\n  usersDashboardsPermissions,\n) => async (dispatch, getState) => {\n  try {\n    const { usersDashboards } = getState();\n    const usersCurrentDashboardIds = getUserDashboardIds(\n      usersDashboards,\n      userId,\n    );\n\n    const { added, removed } = getDashboardPermissionChanges(\n      usersCurrentDashboardIds,\n      usersDashboardsPermissions,\n    );\n\n    await dispatch(\n      userActions.updateUsersDashboardsPermissions(\n        groupId,\n        usersDashboardsPermissions,\n      ),\n    );\n\n    track('Read only user - Changed dashboard access', {\n      properties: {\n        dashboard_permissions_added: added.length,\n        dashboard_permissions_removed: removed.length,\n      },\n    });\n\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('groups.manageDashboardAccess.success'),\n      ),\n    );\n\n    router.navigate(`/admin/people`);\n  } catch (err) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","import { connect } from 'react-redux';\nimport { isUndefined } from 'lodash';\nimport DashboardPermissionsModal from './dashboard-permissions-modal-component';\nimport * as groupsActions from '../../../../groups/actions/groups-actions';\nimport * as modalActions from './actions/dashboard-permissions-modal-actions';\nimport { getUserDashboardIds } from '../../../reducer/users-dashboards-reducer';\n\nconst getDashboardsArray = dashboards => {\n  return Object.keys(dashboards).map(dashboardId => dashboards[dashboardId]);\n};\n\nconst getUser = (allUsers = {}, userId) => {\n  if (isUndefined(allUsers.viewers)) {\n    return undefined;\n  }\n\n  return allUsers.viewers.find(person => person.id === userId);\n};\n\n// This will incorrectly return false for a user who has access to 0 dashbaords\n// as we are unable to tell the difference between no access and the data\n// still being loaded.\nconst haveCachedData = (users, dashboards, dashboardIds) =>\n  !isUndefined(users) && dashboards.length !== 0 && dashboardIds.length !== 0;\n\nconst mapStateToProps = (state, ownProps) => {\n  const {\n    admin: { isDashboardPermissionsModalLoading },\n    allDashboards,\n    allUsers,\n    usersDashboards,\n    user: {\n      user: { default_group_id: groupId },\n    },\n  } = state;\n  const { userId } = ownProps;\n  const user = getUser(allUsers, userId);\n  const dashboards = getDashboardsArray(allDashboards);\n  const dashboardIds = getUserDashboardIds(usersDashboards, userId);\n  const isLoading =\n    isDashboardPermissionsModalLoading &&\n    !haveCachedData(allUsers, dashboards, dashboardIds);\n\n  return {\n    dashboards,\n    groupId,\n    isLoading,\n    dashboardIds,\n    user,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  const { userId } = ownProps;\n\n  return {\n    createHandlers: groupId => ({\n      onOpen: () =>\n        dispatch(groupsActions.openDashboardPermissionsModal(groupId, userId)),\n      onSubmit: usersDashboardsPermissions => {\n        dispatch(\n          modalActions.modalUpdate(groupId, userId, usersDashboardsPermissions),\n        );\n      },\n    }),\n  };\n};\n\nconst mergeProps = (stateProps, dispatchProps, ownProps) => {\n  const { createHandlers, ...remainingDispatchProps } = dispatchProps;\n  const { groupId } = stateProps;\n  const handlers = createHandlers(groupId);\n\n  return {\n    ...stateProps,\n    ...remainingDispatchProps,\n    ...ownProps,\n    ...handlers,\n  };\n};\n\nconst DashboardPermissionsModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n  mergeProps,\n)(DashboardPermissionsModal);\n\nexport default DashboardPermissionsModalConnector;\n","import DashboardPermissionsModal from './dashboard-permissions-modal-connector.js';\n\nexport default DashboardPermissionsModal;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { getUserDisplayName } from '../../../../../helpers';\nimport { Column } from '../../../../../../components/layout';\nimport ListItem from '../../../../../../components/list-item';\nimport ToggleInput from '../../../../../../components/form/toggle-input';\nimport UserInitials from '../../../../../../components/user-initials';\n\nconst UserPermissionListItem = ({\n  user,\n  hasAccess,\n  onToggleAccess,\n  isHighlighted,\n}) => {\n  return (\n    <ListItem isHighlighted={isHighlighted} hasHoverState={false}>\n      <Column flexNone justify=\"center\" marginRight={1}>\n        <UserInitials user={user} />\n      </Column>\n      <Column flexAuto justify=\"center\" marginRight={1}>\n        <span>{getUserDisplayName(user)}</span>\n      </Column>\n      <Column flexNone justify=\"center\" paddingTop={0.5} paddingBottom={0.5}>\n        <ToggleInput\n          checked={hasAccess}\n          onToggle={checked => onToggleAccess(user.id, checked)}\n        />\n      </Column>\n    </ListItem>\n  );\n};\n\nUserPermissionListItem.propTypes = {\n  hasAccess: PropTypes.bool,\n  isHighlighted: PropTypes.bool,\n  user: PropTypes.object,\n  onToggleAccess: PropTypes.func,\n};\n\nexport default UserPermissionListItem;\n","import UserPermissionListItem from './user-permission-list-item-component';\nexport default UserPermissionListItem;\n","import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { noop, includes, isEqual, without, difference } from 'lodash';\nimport { router } from '../../../../router';\nimport Modal, {\n  ModalSection,\n  ModalHeading,\n} from '../../../../components/modal';\nimport FormattedMessage, { FormattedHTMLMessage } from '../../../../lib/i18n';\nimport ScrollableList from '../../../../components/scrollable-list';\nimport ConditionalLoadingIndicator from '../../../../components/conditional-loading-indicator';\nimport { Row, Column } from '../../../../components/layout';\nimport Button from '@UI/button';\nimport UserPermissionListItem from './components/user-permission-list-item';\nimport OrganizationViewersEmptyState from '../../empty-states/organization-viewers-empty-state';\n\nimport styles from './user-permissions-modal-style.scss';\n\nclass UserPermissionsModal extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      userIds: props.userIds,\n    };\n  }\n\n  componentDidMount() {\n    if (this.props.isVisible) {\n      this.props.onOpen();\n    }\n  }\n\n  // eslint-disable-next-line camelcase\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if (isEqual(this.props.userIds, nextProps.userIds)) {\n      return;\n    }\n\n    this.setState({ userIds: nextProps.userIds });\n  }\n\n  componentDidUpdate(prevProps) {\n    // When the modal opens, fetch the user's dashboards\n    if (this.props.isVisible && !prevProps.isVisible) {\n      this.props.onOpen();\n    }\n  }\n\n  onClose() {\n    const { groupId } = this.props;\n    const href = `/admin/groups/${groupId}/dashboards`;\n\n    router.navigate(href);\n  }\n\n  handleToggleAccess(userId) {\n    const { userIds } = this.state;\n    const alreadyToggled = includes(userIds, userId);\n\n    if (alreadyToggled) {\n      this.setState({\n        userIds: without(userIds, userId),\n      });\n    } else {\n      this.setState({\n        userIds: [...userIds, userId],\n      });\n    }\n  }\n\n  handleSubmit() {\n    const { onSubmit, dashboardViewOnlyUsers, dashboard } = this.props;\n    const { userIds: localuserIds } = this.state;\n\n    const usersDashboardsPermissions = dashboardViewOnlyUsers.map(user => {\n      return {\n        userId: user.id,\n        dashboardId: dashboard.id,\n        role: includes(localuserIds, user.id) ? 'viewer' : 'none',\n      };\n    });\n\n    onSubmit(usersDashboardsPermissions);\n  }\n\n  renderInfoMessage() {\n    const { userIds } = this.props;\n    const { userIds: localuserIds } = this.state;\n\n    const changes = [\n      ...difference(userIds, localuserIds),\n      ...difference(localuserIds, userIds),\n    ];\n\n    if (changes.length === 0) {\n      return null;\n    }\n\n    return (\n      <FormattedHTMLMessage\n        id=\"dashboards.manageUserAccess.changes\"\n        values={{ count: changes.length }}\n      />\n    );\n  }\n\n  renderUserList() {\n    const { dashboardViewOnlyUsers = [] } = this.props;\n\n    if (dashboardViewOnlyUsers.length === 0) {\n      return <OrganizationViewersEmptyState />;\n    }\n\n    return (\n      <div className={styles.list}>\n        <ScrollableList>\n          {dashboardViewOnlyUsers.map(user => (\n            <UserPermissionListItem\n              key={user.id}\n              user={user}\n              hasAccess={this.hasAccess(user.id)}\n              isHighlighted={this.hasChanged(user.id)}\n              onToggleAccess={() => this.handleToggleAccess(user.id)}\n            />\n          ))}\n        </ScrollableList>\n      </div>\n    );\n  }\n\n  renderSubmitButton() {\n    const { dashboardViewOnlyUsers = [] } = this.props;\n\n    if (dashboardViewOnlyUsers.length === 0) {\n      return null;\n    }\n\n    return (\n      <Column marginLeft={1}>\n        <Button\n          onClick={() => this.handleSubmit()}\n          disabled={!this.hasChangesPending()}\n        >\n          <FormattedMessage id=\"button.update\" />\n        </Button>\n      </Column>\n    );\n  }\n\n  render() {\n    const { isVisible, isLoading, dashboard } = this.props;\n\n    return (\n      <Modal visible={isVisible} onClose={() => this.onClose()}>\n        {isVisible && (\n          <ModalSection>\n            <div className={styles.container}>\n              <div className={styles.header}>\n                <ModalHeading>\n                  <FormattedHTMLMessage\n                    id=\"dashboards.manageUserAccess.modalHeading\"\n                    values={{ title: dashboard ? dashboard.title : '' }}\n                  />\n                </ModalHeading>\n                <Row marginTop={1} marginBottom={2}>\n                  <div className={styles.infoMessage}>\n                    <FormattedHTMLMessage id=\"dashboards.manageUserAccess.learnMore\" />\n                  </div>\n                </Row>\n              </div>\n              <ConditionalLoadingIndicator\n                className={styles.content}\n                isLoading={isLoading}\n                isDark\n              >\n                {this.renderUserList()}\n                <div className={styles.footer}>\n                  <Row marginTop={2} justify=\"flex-end\">\n                    <Column flexAuto justify=\"center\">\n                      <div className={styles.infoMessage}>\n                        {this.renderInfoMessage()}\n                      </div>\n                    </Column>\n                    <Column>\n                      <Button\n                        onClick={() => this.onClose()}\n                        intent={Button.INTENT.SECONDARY}\n                      >\n                        <FormattedMessage id=\"button.cancel\" />\n                      </Button>\n                    </Column>\n                    {this.renderSubmitButton()}\n                  </Row>\n                </div>\n              </ConditionalLoadingIndicator>\n            </div>\n          </ModalSection>\n        )}\n      </Modal>\n    );\n  }\n\n  hasAccess(userId) {\n    const { userIds } = this.state;\n\n    return includes(userIds, userId);\n  }\n\n  hasChanged(userId) {\n    const { userIds } = this.props;\n    const { userIds: localuserIds } = this.state;\n\n    const changes = [\n      ...difference(userIds, localuserIds),\n      ...difference(localuserIds, userIds),\n    ];\n\n    return includes(changes, userId);\n  }\n\n  hasChangesPending() {\n    const { userIds } = this.props;\n    const { userIds: localuserIds } = this.state;\n\n    return !isEqual(userIds, localuserIds);\n  }\n}\n\nUserPermissionsModal.defaultProps = {\n  dashboardViewOnlyUsers: [],\n  onOpen: noop,\n  onSubmit: noop,\n};\n\nUserPermissionsModal.propTypes = {\n  dashboard: PropTypes.object,\n  dashboardViewOnlyUsers: PropTypes.arrayOf(PropTypes.object),\n  group: PropTypes.object,\n  groupId: PropTypes.number,\n  isLoading: PropTypes.bool,\n  isVisible: PropTypes.bool,\n  userIds: PropTypes.arrayOf(PropTypes.number),\n  onOpen: PropTypes.func,\n  onSubmit: PropTypes.func,\n};\n\nexport default UserPermissionsModal;\n","import UserPermissionsModal from './user-permissions-modal-connector';\nexport default UserPermissionsModal;\n","import { connect } from 'react-redux';\nimport { isUndefined } from 'lodash';\nimport * as groupsActions from '../../../../groups/actions/groups-actions';\nimport { getDashboardUserIds } from '../../../reducer/users-dashboards-reducer';\nimport * as modalActions from './actions/user-permissions-modal-actions';\nimport UserPermissionsModal from './user-permissions-modal-component';\n\n// This will incorrectly return false for a user who has access to 0 dashbaords\n// as we are unable to tell the difference between no access and the data\n// still being loaded.\nconst haveCachedData = (users, dashboards, userIds) =>\n  !isUndefined(users) && dashboards.length !== 0 && userIds.length !== 0;\n\nconst mapStateToProps = (state, ownProps) => {\n  const {\n    admin: { isUserPermissionsModalLoading },\n    allDashboards,\n    allUsers,\n    user: { user: currentUser = {} },\n    usersDashboards,\n  } = state;\n  const { groupId, dashboardId } = ownProps;\n  const dashboard = allDashboards[dashboardId];\n  const group = {\n    id: groupId,\n    name: currentUser.company,\n  };\n  const userIds = getDashboardUserIds(usersDashboards, dashboardId);\n  const isLoading =\n    isUserPermissionsModalLoading &&\n    !haveCachedData(allUsers, allDashboards, userIds);\n\n  return {\n    dashboardViewOnlyUsers: allUsers.viewers,\n    group,\n    isLoading,\n    userIds,\n    dashboard,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  const { groupId, dashboardId } = ownProps;\n\n  return {\n    onOpen: () =>\n      dispatch(groupsActions.openUserPermissionsModal(groupId, dashboardId)),\n    onSubmit: usersDashboardsPermissions => {\n      dispatch(modalActions.modalUpdate(groupId, usersDashboardsPermissions));\n    },\n  };\n};\n\nconst UserPermissionsModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(UserPermissionsModal);\n\nexport default UserPermissionsModalConnector;\n","import { formatMessage } from '../../../../../lib/i18n';\nimport * as userActions from '../../../../../user/actions/user-actions';\nimport * as toastActions from '../../../../../toast/actions';\nimport { router } from '../../../../../router';\n\nexport const modalUpdate = (\n  groupId,\n  usersDashboardsPermissions,\n) => async dispatch => {\n  try {\n    await dispatch(\n      userActions.updateUsersDashboardsPermissions(\n        groupId,\n        usersDashboardsPermissions,\n      ),\n    );\n\n    dispatch(\n      toastActions.showSuccessToast(\n        formatMessage('dashboards.manageUserAccess.success'),\n      ),\n    );\n\n    router.navigate(`/admin/groups/${groupId}/dashboards`);\n  } catch (err) {\n    dispatch(toastActions.showGenericErrorToast());\n  }\n};\n","import EditLoopModalConnector from './edit-loop-modal-connector';\nexport default EditLoopModalConnector;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { isUndefined, isEmpty } from 'lodash';\nimport LoopModal from '../loop-modal-component';\nimport FormattedMessage from '../../../../../lib/i18n';\nimport { updateLoop } from '../../../../actions/loop-actions';\nimport { getDashboards } from '../../../../../groups/actions/groups-actions';\nimport { track } from '../../../../../lib/tracker';\n\nconst mapStateToProps = (state, props) => {\n  const { allLoops = {}, allDashboards = {} } = state;\n  const {\n    match: {\n      params: { loopId, groupId },\n    },\n    history,\n  } = props;\n\n  const loop = allLoops[loopId];\n  const visible = !!loopId;\n  const isLoading = isEmpty(allDashboards) || isUndefined(loop);\n  const onClose = () => history.goBack();\n\n  return {\n    modalHeading: <FormattedMessage id=\"loops.modal.editLoopHeading\" />,\n    isLoading,\n    allDashboards,\n    loop,\n    visible,\n    onClose,\n    groupId,\n    showManageLink: false,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, props) => {\n  const {\n    match: {\n      params: { loopId, groupId },\n    },\n  } = props;\n  return {\n    onMount: () => {\n      dispatch(getDashboards(groupId));\n    },\n    onUpdate: loop => {\n      track('Loops - Click update');\n      dispatch(updateLoop(groupId, loopId, loop));\n    },\n  };\n};\n\nconst LoopModalConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(LoopModal);\n\nexport default LoopModalConnector;\n","import AdminComponent from './components/admin-component';\n\nexport default AdminComponent;\n","import React from 'react';\nimport Helmet from 'react-helmet';\nimport { Route } from 'react-router';\nimport { useQuery } from 'react-apollo';\nimport AccountOwnerOrGroupAdmin from '../../hoc/account-owner-or-group-admin';\nimport AdminPermissionDenied from './admin-permission-denied';\nimport { formatMessage } from '../../lib/i18n';\nimport { BaseMastheadConnector as BaseMasthead } from '../../masthead/base-masthead';\nimport PeoplePage from '../pages/people-page';\nimport DashboardsGroupPage from '../pages/dashboards-group-page';\nimport DataSourcesGroupPage from '../pages/data-sources-group-page';\nimport LoopsGroupPage from '../pages/loops-group-page';\nimport DashboardPermissionsModal from './modals/dashboard-permissions-modal';\nimport UserPermissionsModal from './modals/user-permissions-modal';\nimport EditLoopModal from '../pages/loops-group-page/loop-modal/edit-loop-modal';\nimport { Dashboards } from '../../services/concierge-service/graphql/dashboards-query.graphql';\n\nimport style from './admin-style.scss';\n\nconst AdminComponent = () => {\n  // We want to fetch the users dashboards so that\n  // we can send dashboard information to our Tracking\n  // service when any dashoard related actions happen.\n  // This shouldn't block the admin page from rendering\n  // so we won't do anything with the response.\n  useQuery(Dashboards);\n\n  return (\n    <AccountOwnerOrGroupAdmin fallback={() => <AdminPermissionDenied />}>\n      <div className={style.container}>\n        <Helmet\n          defaultTitle={formatMessage('admin.pageTitle.default')}\n          titleTemplate={formatMessage('admin.pageTitle.template')}\n        />\n        <BaseMasthead />\n        <Route path=\"/admin/people\" component={PeoplePage} />\n        <Route path=\"/admin/people/dashboard-permissions/:userId\">\n          {({ match }) => (\n            <DashboardPermissionsModal\n              isVisible={!!match}\n              userId={match ? parseInt(match.params.userId, 10) : undefined}\n            />\n          )}\n        </Route>\n        <Route\n          path=\"/admin/groups/:groupId/dashboards\"\n          component={DashboardsGroupPage}\n        />\n        <Route path=\"/admin/groups/:groupId/dashboards/user-permissions/:dashboardId\">\n          {({ match }) => (\n            <UserPermissionsModal\n              isVisible={!!match}\n              dashboardId={\n                match ? parseInt(match.params.dashboardId, 10) : undefined\n              }\n              groupId={match ? parseInt(match.params.groupId, 10) : undefined}\n            />\n          )}\n        </Route>\n        <Route\n          path=\"/admin/groups/:groupId/data-sources\"\n          component={DataSourcesGroupPage}\n        />\n        <Route path=\"/admin/groups/:groupId/loops\" component={LoopsGroupPage} />\n        <Route\n          path=\"/admin/groups/:groupId/loops/:loopId\"\n          component={EditLoopModal}\n        />\n      </div>\n    </AccountOwnerOrGroupAdmin>\n  );\n};\n\nexport default AdminComponent;\n","import React, { Component } from 'react';\nimport FormattedMessage, { formatMessage } from '../../lib/i18n';\nimport Button from '@UI/button';\nimport { getWindow } from '../../lib/global';\nimport { router } from '../../router';\n\nimport style from './offline-menu-message-style.scss';\n\nconst renderSVG = () => (\n  <svg height=\"33\" width=\"43\" viewBox=\"0 0 46 33\">\n    <g fill=\"none\" fillRule=\"evenodd\" opacity=\".3\">\n      <path\n        fill=\"#3E4552\"\n        d=\"M17.531 4.281c-1.504 0-2.89.366-4.157 1.096a8.026 8.026 0 0 0-2.997 2.997c-.73 1.268-1.096 2.653-1.096 4.157v.065c-1.761.258-3.233 1.063-4.415 2.417-1.181 1.353-1.772 2.932-1.772 4.737 0 1.29.322 2.492.967 3.61a7.09 7.09 0 0 0 2.642 2.642 7.102 7.102 0 0 0 3.61.967h21.656c1.718 0 3.18-.602 4.382-1.805 1.204-1.203 1.805-2.664 1.805-4.383 0-1.718-.601-3.18-1.805-4.383-1.203-1.203-2.664-1.804-4.382-1.804h-.58c.386-.645.58-1.332.58-2.063 0-1.16-.398-2.137-1.193-2.932-.795-.795-1.772-1.193-2.932-1.193-1.032 0-1.934.323-2.707.967-.602-1.504-1.59-2.728-2.965-3.674-1.375-.945-2.922-1.418-4.64-1.418zm0-3.093c1.762 0 3.416.386 4.963 1.16a12.091 12.091 0 0 1 3.932 3.093 7.912 7.912 0 0 1 1.418-.128c1.89 0 3.534.644 4.93 1.933 1.397 1.29 2.16 2.879 2.288 4.77 1.848.644 3.341 1.772 4.48 3.383a9.111 9.111 0 0 1 1.708 5.382 8.958 8.958 0 0 1-1.257 4.64 9.459 9.459 0 0 1-3.384 3.385 8.958 8.958 0 0 1-4.64 1.256H10.312c-1.847 0-3.566-.461-5.156-1.385a10.24 10.24 0 0 1-3.77-3.77A10.088 10.088 0 0 1 0 19.75c0-2.105.59-4.028 1.772-5.769 1.182-1.74 2.74-2.997 4.673-3.77.516-2.621 1.816-4.78 3.9-6.478 2.084-1.697 4.48-2.545 7.186-2.545z\"\n      />\n      <path stroke=\"#3E4552\" strokeWidth=\"3\" d=\"M3 4l39 27M3 4l39 27\" />\n      <path\n        stroke=\"#F0F2F3\"\n        strokeLinecap=\"square\"\n        strokeWidth=\"3\"\n        d=\"M4.5 2.5l39 27\"\n      />\n    </g>\n  </svg>\n);\n\nclass OfflineMenuMessage extends Component {\n  constructor() {\n    super();\n\n    this.state = {\n      showBackButton: true,\n      lastDashboardUrl: undefined,\n    };\n  }\n\n  componentDidMount() {\n    this.getLastDashboard();\n  }\n\n  getLastDashboard() {\n    // Back button is shown by default since if the menu is\n    // available offline there is probably a dashboard cached.\n    // After checking the cache, if there is no dashboard then\n    // hide the button.\n    const caches = getWindow().caches;\n    if (caches) {\n      caches.open('management-cache').then(cache => {\n        cache.keys().then(keys => {\n          if (!keys.length || !keys[0].url) {\n            this.setState({\n              showBackButton: false,\n            });\n          } else {\n            const key = keys[0].url;\n            const match = key.match(/dashboards\\/(\\d+)/);\n            const dashboardId = match[1];\n            this.setState({\n              lastDashboardUrl: `/edit/dashboards/${dashboardId}`,\n            });\n          }\n        });\n      });\n    } else {\n      this.setState({\n        showBackButton: false,\n      });\n    }\n  }\n\n  render() {\n    const { showBackButton, lastDashboardUrl } = this.state;\n\n    return (\n      <div className={style.container}>\n        {renderSVG()}\n        <div className={style.offlineText}>\n          <FormattedMessage id=\"mobile.menuOffline\" />\n        </div>\n        {showBackButton && (\n          <Button\n            size={Button.SIZES.LARGE}\n            onClick={() =>\n              lastDashboardUrl && router.navigate(lastDashboardUrl)\n            }\n          >\n            {formatMessage('mobile.toOfflineDashboard')}\n          </Button>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default OfflineMenuMessage;\n","import OfflineMenuMessage from './offline-menu-message-component';\n\nexport default OfflineMenuMessage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useParams } from 'react-router-dom';\nimport classnames from 'classnames';\nimport OfflineBanner from '../components/offline-banner';\nimport OfflineMessage from './offline-menu-message';\nimport FormattedMessage from '../lib/i18n';\nimport DropItem from '../components/menu/drop-item';\nimport { isEmpty } from 'lodash';\nimport { LAYOUT_TYPES } from '../dashboard/dashboard-layout/constants';\nimport { router } from '../router';\nimport config from '../universal/config';\nimport Image from '@UI/image';\n\nimport style from './mobile-menu-style.scss';\n\nconst renderOffline = (isOffline, dashboards) => {\n  if (!isOffline) {\n    return null;\n  }\n\n  return (\n    <div>\n      <OfflineBanner />\n      {dashboards.length > 1 && <OfflineMessage />}\n    </div>\n  );\n};\n\nconst MobileMenu = props => {\n  const { dashboards, isOffline } = props;\n  const { dashboardId } = useParams();\n\n  const logoSrc = `${config.get().AssetBaseURL}/geckoboard-dashboard-logo.svg`;\n\n  return (\n    <div className={style.mobileMenuPage}>\n      <svg width=\"0\" height=\"0\">\n        <defs>\n          <clipPath id=\"mobileMenuCurve\" clipPathUnits=\"objectBoundingBox\">\n            <path d=\"M0 0 L0 1 L1 1 L1 0 C0.75 0.5, 0.25 0.5, 0 0 Z\" />\n          </clipPath>\n        </defs>\n      </svg>\n\n      <div className={style.heading}>\n        <Image width={32} height={32} src={logoSrc} alt=\"Geckoboard\" />\n        <span>\n          <FormattedMessage id=\"mobile.menu.dashboardList.heading\" />\n        </span>\n      </div>\n\n      <div className={style.scrollWrapper}>\n        {renderOffline(isOffline, dashboards)}\n\n        <ul className={style.dashboardList}>\n          {!isEmpty(dashboards) &&\n            dashboards.map(dashboard => {\n              const { title, id, legacyId, layoutType } = dashboard;\n              const dashboardUrl =\n                layoutType.__typename === LAYOUT_TYPES.ContainerLayout\n                  ? `/edit/dashboards/${id}`\n                  : `/edit/dashboards/${legacyId}`;\n\n              const menuItemClasses = classnames(style.menuItem, {\n                [style.menuItemActive]:\n                  dashboardId === id || dashboardId === legacyId,\n              });\n\n              return (\n                <DropItem key={id} innerClassName={menuItemClasses}>\n                  <a href={dashboardUrl}>{title}</a>\n                </DropItem>\n              );\n            })}\n        </ul>\n\n        <div className={style.settings}>\n          <a href={'/logout'} rel=\"nofollow\" className={style.logoutLink}>\n            <FormattedMessage id=\"mobile.menu.logoutLink\" />\n          </a>\n        </div>\n      </div>\n\n      <div className={style.closeButtonWrapper}>\n        <div className={style.closeButton}>\n          <button onClick={() => router.goBack()} className=\"fa fa-times\" />\n        </div>\n      </div>\n    </div>\n  );\n};\n\nMobileMenu.defaultProps = {\n  dashboards: [],\n  isOffline: false,\n};\n\nMobileMenu.propTypes = {\n  dashboards: PropTypes.array,\n  isOffline: PropTypes.bool,\n};\n\nexport default MobileMenu;\n","import React from 'react';\nimport { useQuery } from '@apollo/react-hooks';\nimport { Dashboards } from '../services/concierge-service/graphql/dashboards-query.graphql';\nimport MobileMenu from './mobile-menu-component';\nimport MobileDetector from '../hoc/mobile-detector';\nimport OfflineDetector from '../hoc/offline-detector';\n\nexport const WrappedMenu = props => (\n  <MobileDetector\n    render={() => (\n      <OfflineDetector\n        render={isOffline => <MobileMenu {...props} isOffline={isOffline} />}\n      />\n    )}\n  />\n);\n\nconst MobileMenuQuery = () => {\n  const { loading, error, data } = useQuery(Dashboards);\n\n  if (loading || error || !data || !data.dashboards) {\n    return null;\n  }\n\n  return <WrappedMenu dashboards={data.dashboards} />;\n};\n\nexport default MobileMenuQuery;\n","import MobileMenu from './mobile-menu-query';\nexport default MobileMenu;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { Router, Route, Redirect, Switch } from 'react-router';\nimport Admin from '../../../admin';\nimport MobileMenu from '../../../mobile-menu';\nimport MobileLayout from '../../../dashboard/mobile-layout';\nimport { ApolloProvider } from 'react-apollo';\n\nconst redirects = [\n  { from: '/account', to: '/account/details' },\n  { from: '/admin/groups/:groupId', to: '/admin/groups/:groupId/dashboards' },\n  { from: '/admin/groups/:groupId/people', to: '/admin/people' },\n  {\n    from: '/admin/groups/:groupId/people/dashboard-permissions/:userId',\n    to: '/admin/people/dashboard-permissions/:userId',\n  },\n];\n\nconst RoutesComponent = ({\n  history,\n  GeckoRouter,\n  ThemedDashboard,\n  PreviewDashboard,\n  client,\n}) => (\n  <ApolloProvider client={client}>\n    <Router history={history}>\n      <Switch>\n        {redirects.map(({ from, to }) => (\n          <Redirect exact key={from} from={from} to={to} />\n        ))}\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/trial\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/trial/:content\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/services/:serviceId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/widgets/new\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/widgets/:widgetId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/connect/:connectServiceId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/connect/:serviceType/:connectServiceId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/widgets/:widgetId/:polecatService\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/widgets/:widgetId/:polecatService/:step\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/:polecatService/:fileId\"\n          component={GeckoRouter}\n        />\n        <Route\n          exact\n          path=\"/v4/dashboards/:dashboardId/:polecatService/:fileId/:presetId\"\n          component={GeckoRouter}\n        />\n        <Route\n          path=\"/edit/dashboards/:dashboardId\"\n          component={PreviewDashboard}\n        />\n        <Route\n          exact\n          path=\"/dashboards/:dashboardId/mobile-menu\"\n          component={MobileMenu}\n        />\n        <Route exact path=\"/dashboards/offline\" component={MobileLayout} />\n        <Route\n          exact\n          path={[\n            '/dashboard(s)/:sharingHash',\n            '/dashboard(s)/:sharingHash/inception',\n          ]}\n          component={props => <ThemedDashboard isSharing {...props} />}\n        />\n        <Route\n          exact\n          path={['/loop/:loopHash', '/loop/:loopHash/inception']}\n          component={props => <ThemedDashboard isSharing {...props} />}\n        />\n        <Route\n          exact\n          path={['/tv/:deviceToken', '/tv/:deviceToken/inception']}\n          component={props => <ThemedDashboard isSharing {...props} />}\n        />\n        <Route\n          exact\n          path={'/v5/tv/:screenId/inception'}\n          component={props => <ThemedDashboard isScreen {...props} />}\n        />\n        <Route\n          exact\n          path=\"/v5/dashboards/:sharingHash/inception\"\n          component={props => <ThemedDashboard isSharing {...props} />}\n        />\n        <Route path=\"/admin\" component={Admin} />\n        <Route exact path=\"/account/details\" component={GeckoRouter} />\n        <Route exact path=\"/account/plans\" component={GeckoRouter} />\n        <Route exact path=\"/account/invoices\" component={GeckoRouter} />\n      </Switch>\n    </Router>\n  </ApolloProvider>\n);\n\nRoutesComponent.propTypes = {\n  GeckoRouter: PropTypes.func,\n  PreviewDashboard: PropTypes.func,\n  ThemedDashboard: PropTypes.func,\n  client: PropTypes.object,\n  history: PropTypes.object,\n};\n\nexport default RoutesComponent;\n","import RoutesComponent from './routes-component';\nexport default RoutesComponent;\n","import createReactRenderer from '../react-renderer';\nimport RoutesComponent from './components/routes';\n\nconst Routes = createReactRenderer(RoutesComponent);\n\nexport default Routes;\n","const mapBuiltInThemeToProp = {\n  DARK: 'dark',\n  LIGHT: 'light',\n  NAVY: 'navy',\n  PURPLE: 'purple',\n};\n\nconst mapFrameStyleToWidgetStyle = {\n  SHADED: 'auto',\n  DARK: 'dark',\n  LIGHT: 'light',\n};\n\nconst getTheme = (__typename, themeType) => {\n  switch (__typename) {\n    case 'CustomTheme':\n      return 'user';\n    case 'CustomCSSTheme':\n      return 'custom';\n    default:\n      return mapBuiltInThemeToProp[themeType];\n  }\n};\n\nconst graphqlToCustomizationProps = customization => {\n  const {\n    theme: { __typename, themeType, backgroundColor, fileName, frameStyle },\n  } = customization;\n  const props = {\n    theme: getTheme(__typename, themeType),\n  };\n  if (props.theme === 'user') {\n    props.themeBackgroundColor = backgroundColor;\n    props.themeWidgetStyle = mapFrameStyleToWidgetStyle[frameStyle];\n  } else if (props.theme === 'custom') {\n    props.cssFile = fileName;\n  }\n  return props;\n};\n\nconst getContainerLayoutTheme = customization => {\n  const {\n    theme: { __typename, themeType },\n  } = customization;\n\n  if (__typename === 'BuiltInTheme' && themeType === 'LIGHT') {\n    return 'dashiesLight';\n  }\n\n  return 'dashiesDark';\n};\n\nexport { graphqlToCustomizationProps, getContainerLayoutTheme };\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {\n  graphqlToCustomizationProps,\n  getContainerLayoutTheme,\n} from './customization-applicator-graphql-helper';\nimport filterByAllowances from '../../customize/filter-by-allowances';\nimport CustomizationApplicatorComponent from './customization-applicator-component';\nimport { useCurrentDashboardCustomization } from '@Hooks';\nimport DashboardLoadingSpinner from '../dashboard-loading-spinner';\n\nconst CustomizationApplicatorQuery = props => {\n  const { data, loading, error } = useCurrentDashboardCustomization();\n  const { allowances } = props;\n\n  if (error) {\n    return null;\n  }\n\n  if (loading) {\n    return <DashboardLoadingSpinner />;\n  }\n\n  const { dashboard } = data;\n  let values = {};\n\n  if (dashboard && dashboard.layoutType.__typename === 'ContainerLayout') {\n    values = { theme: getContainerLayoutTheme(dashboard.customization) };\n  } else if (dashboard) {\n    values = graphqlToCustomizationProps(dashboard.customization);\n    values = filterByAllowances(values, allowances);\n  }\n\n  return (\n    <CustomizationApplicatorComponent {...values}>\n      {props.children}\n    </CustomizationApplicatorComponent>\n  );\n};\n\nCustomizationApplicatorQuery.defaultProps = {\n  allowances: {},\n};\n\nCustomizationApplicatorQuery.propTypes = {\n  allowances: PropTypes.object,\n  children: PropTypes.node,\n};\n\nexport default CustomizationApplicatorQuery;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport * as userActions from '../../user/actions/user-actions';\nimport { setCustomCSSLoaded } from '../../customize/actions/customize-actions';\nimport CustomizationApplicatorComponent from './customization-applicator-component';\nimport CustomizationApplicatorQuery from './customization-applicator-query';\nimport AuthStrategy from '../../lib/auth-strategy';\nimport filterByAllowances from '../../customize/filter-by-allowances';\nimport { getCustomizeValues } from '../../customize/helpers';\n\nclass CustomizationApplicatorGraphQlWrapper extends Component {\n  constructor(props) {\n    super(props);\n\n    if (props.useGraphQL && props.isSharing) {\n      AuthStrategy.getInstance().set({\n        strategy: 'sharing_hash',\n        value: props.sharingHash,\n      });\n    }\n  }\n\n  componentDidMount() {\n    const { isScreen, useGraphQL } = this.props;\n    if (useGraphQL && isScreen) {\n      this.props.initScreenPage();\n    }\n  }\n\n  render() {\n    const { deviceToken, isScreen, useGraphQL, ...restProps } = this.props;\n\n    if (!useGraphQL) {\n      return <CustomizationApplicatorComponent {...restProps} />;\n    }\n\n    if (isScreen && !deviceToken) {\n      // Wait for device token to fetch before loading dashboard,\n      // so that the device_token auth strategy has been set.\n      return null;\n    }\n\n    return <CustomizationApplicatorQuery {...restProps} />;\n  }\n}\n\nCustomizationApplicatorGraphQlWrapper.defaultProps = {\n  useGraphQL: false,\n};\n\nCustomizationApplicatorGraphQlWrapper.propTypes = {\n  children: PropTypes.node,\n  deviceToken: PropTypes.string,\n  initScreenPage: PropTypes.func,\n  isScreen: PropTypes.bool,\n  isSharing: PropTypes.bool,\n  sharingHash: PropTypes.string,\n  useGraphQL: PropTypes.bool,\n};\n\nconst mapStateToProps = (state, ownProps) => {\n  const {\n    customize,\n    user: { user: { allowances = {} } = {} } = {},\n    dashboard: { dashboard },\n    tvPage: { device: { token: deviceToken } = {} } = {},\n  } = state;\n\n  const {\n    location,\n    match: {\n      params: { sharingHash },\n    },\n    useGraphQL,\n  } = ownProps;\n\n  if (useGraphQL) {\n    return {\n      allowances,\n      deviceToken,\n      sharingHash,\n    };\n  }\n\n  const isPreview = !!location.pathname.match(/customize\\/?$/);\n  let values = getCustomizeValues(dashboard, customize);\n\n  if (!isPreview) {\n    values = filterByAllowances(values, allowances);\n  }\n\n  return {\n    theme: values.theme,\n    themeBackgroundColor: values.themeBackgroundColor,\n    themeWidgetStyle: values.themeWidgetStyle,\n    cssFile: values.cssFile,\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => {\n  return {\n    onCustomCSSLoad: () => dispatch(setCustomCSSLoaded()),\n    initScreenPage: () => {\n      const { match: { params: { screenId } = {} } = {} } = ownProps;\n      if (screenId) {\n        dispatch(userActions.initialiseScreenGraphQLDashboard(screenId));\n      }\n    },\n  };\n};\n\nconst CustomizationApplicatorConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(CustomizationApplicatorGraphQlWrapper);\n\nexport default CustomizationApplicatorConnector;\n","import CustomizationApplicatorConnector from './customization-applicator-connector';\nexport default CustomizationApplicatorConnector;\n","function fitToBox(sourceWidth, sourceHeight, targetWidth, targetHeight) {\n  const x = targetWidth / sourceWidth;\n  const y = targetHeight / sourceHeight;\n\n  return Math.min(x, y);\n}\n\nexport function getDashboardScaleForPreview(\n  dashboardDimensions,\n  containerDimensions,\n  scaleToFit,\n) {\n  const targetWidth = containerDimensions[0];\n  const sourceHeight = dashboardDimensions[1];\n  let [sourceWidth, targetHeight] = dashboardDimensions;\n\n  if (scaleToFit) {\n    targetHeight = containerDimensions[1];\n  } else {\n    sourceWidth = 1920; // Width of a 1080p TV\n  }\n\n  return fitToBox(sourceWidth, sourceHeight, targetWidth, targetHeight);\n}\n\nexport function getDashboardDimensions(domDashboard) {\n  const width = domDashboard.clientWidth;\n\n  // Collect all children of the dashboard to find the widget furthest down the page\n  // this is the real height of our dashboard\n  let height = Array.from(domDashboard.querySelectorAll('.widget')).reduce(\n    (max, node) => {\n      return Math.max(max, node.getBoundingClientRect().bottom);\n    },\n    0,\n  );\n\n  height -= domDashboard.getBoundingClientRect().top;\n\n  return [width, height];\n}\n\nexport function getFooterScaleForPreview(domDashboardFooter, containerWidth) {\n  if (!domDashboardFooter) {\n    return [1, 0];\n  }\n\n  const {\n    clientWidth: footerWidth,\n    clientHeight: footerHeight,\n  } = domDashboardFooter;\n  const scale = containerWidth / footerWidth;\n\n  return [scale, footerHeight * scale];\n}\n","import PropTypes from 'prop-types';\nimport React, { PureComponent } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport classNames from 'classnames';\nimport style from './preview-scaling-style.scss';\nimport { getWindow } from '../../lib/global';\nimport {\n  getDashboardDimensions,\n  getDashboardScaleForPreview,\n  getFooterScaleForPreview,\n} from './scale-for-preview';\n\nconst mutationObserverFactory = () =>\n  getWindow().MutationObserver || getWindow().WebkitMutationObserver || null;\n\nfunction clearScaling(domNode) {\n  const domTarget = domNode.querySelector('#dashboard-wrapper');\n\n  if (!domTarget) return;\n\n  const domContainer = domTarget.querySelector(\n    '#dashboard-resizable-container',\n  );\n  const domDashboardFooter = domNode.querySelector('.dashboard-footer');\n  const dashboardStyle = domContainer.style;\n\n  dashboardStyle.transform = 'none';\n  dashboardStyle.marginLeft = '';\n\n  if (domDashboardFooter) {\n    domDashboardFooter.style.transform = 'none';\n  }\n}\n\nfunction scalePreview(domNode, scaleToFit) {\n  //\n  // ***** NOTE: Scaling code is duplicated in gecko-js! *****\n  //\n\n  // Reset the scaling to ensure that the dashboard dimensions are calculated correctly\n  clearScaling(domNode);\n\n  const domTarget = domNode.querySelector('#dashboard-wrapper');\n\n  if (!domTarget) return;\n\n  const domContainer = domTarget.querySelector(\n    '#dashboard-resizable-container',\n  );\n  const domDashboardFooter = domNode.querySelector('.dashboard-footer');\n  const dashboardStyle = domContainer.style;\n  const dashboardDimensions = getDashboardDimensions(domContainer);\n  const containerWidth = domTarget.clientWidth;\n  const [footerScale, footerHeight] = getFooterScaleForPreview(\n    domDashboardFooter,\n    containerWidth,\n  );\n\n  if (domDashboardFooter) {\n    domDashboardFooter.style.transform = `scale(${footerScale})`;\n  }\n\n  const containerHeight = domTarget.clientHeight - footerHeight;\n  const scale = getDashboardScaleForPreview(\n    dashboardDimensions,\n    [containerWidth, containerHeight],\n    scaleToFit,\n  );\n  dashboardStyle.marginLeft = '50%';\n  dashboardStyle.transform = `scale(${scale}) translateX(-50%)`;\n  dashboardStyle.transformOrigin = '0% 0% 0px';\n}\n\nclass PreviewScalingComponent extends PureComponent {\n  constructor(props) {\n    super(props);\n\n    this.handlePreviewScaling = this.handlePreviewScaling.bind(this);\n    this.MutationObserver = mutationObserverFactory();\n\n    if (this.MutationObserver) {\n      this.observer = new MutationObserver(this.handlePreviewScaling);\n    }\n  }\n\n  componentDidMount() {\n    this.setMode();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.isPreview !== this.props.isPreview) {\n      this.setMode();\n    }\n\n    if (this.props.isPreview) {\n      this.handlePreviewScaling();\n    }\n  }\n\n  componentWillUnmount() {\n    this.unbindEventHandlers();\n  }\n\n  handlePreviewScaling() {\n    const { scaleToFit } = this.props;\n    scalePreview(findDOMNode(this), scaleToFit);\n  }\n\n  render() {\n    // IE10 does not support MutationObserver so we'll disable the preview mode for it\n    const isPreview = this.props.isPreview && this.MutationObserver;\n\n    const className = classNames({\n      [style.isPreview]: isPreview,\n    });\n\n    return <div className={className}>{this.props.children}</div>;\n  }\n\n  enterPreviewMode() {\n    this.handlePreviewScaling();\n\n    getWindow().addEventListener('resize', this.handlePreviewScaling);\n\n    if (this.observer) {\n      this.observer.observe(findDOMNode(this), {\n        childList: true,\n        subtree: true,\n      });\n    }\n  }\n\n  leavePreviewMode() {\n    clearScaling(findDOMNode(this));\n    this.unbindEventHandlers();\n  }\n\n  unbindEventHandlers() {\n    getWindow().removeEventListener('resize', this.handlePreviewScaling);\n\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n  }\n\n  // We only modify then styles on resize or change when in preview mode to\n  // avoid conflicting with the dashboard scaling code in gecko-js.\n  // Without this both polecat and gecko-js can attempt to scale the footer\n  // causing style issues.\n  setMode() {\n    if (this.props.isPreview) {\n      this.enterPreviewMode();\n    } else {\n      this.leavePreviewMode();\n    }\n  }\n}\n\nPreviewScalingComponent.defaultProps = {\n  isPreview: false,\n  scaleToFit: false,\n};\n\nPreviewScalingComponent.propTypes = {\n  children: PropTypes.node,\n  isPreview: PropTypes.bool,\n  scaleToFit: PropTypes.bool,\n};\n\nexport default PreviewScalingComponent;\n","import PreviewScalingConnector from './preview-scaling-connector';\nexport default PreviewScalingConnector;\n","import PreviewScalingComponent from './preview-scaling-component';\nimport { connect } from 'react-redux';\nimport { getCustomizeValues } from '../../customize/helpers';\n\nconst PreviewScalingConnector = connect((state, { location }) => {\n  const {\n    customize = {},\n    dashboard: { dashboard = {} },\n  } = state;\n  const { toggles = [] } = dashboard;\n  const { scaleToFit } = getCustomizeValues(dashboard, customize);\n  const isClassicboard = !toggles.includes('grid');\n\n  // Do not render PreviewScaling on classicboards because they use\n  // their own scaleToFit functionality to scale in preview mode.\n  const isPreview =\n    !!location.pathname.match(/customize\\/?$/) && !isClassicboard;\n\n  return {\n    isPreview,\n    scaleToFit,\n  };\n})(PreviewScalingComponent);\n\nexport default PreviewScalingConnector;\n","import PropTypes from 'prop-types';\nimport { PureComponent } from 'react';\nimport { findDOMNode } from 'react-dom';\nimport { getWindow } from '../../lib/global';\n\nclass CustomCSSPreviewComponent extends PureComponent {\n  componentDidMount() {\n    this.cssBackgroundProps = [\n      'background',\n      'background-attachment',\n      'background-blend-mode',\n      'background-clip',\n      'background-color',\n      'background-image',\n      'background-origin',\n      'background-position',\n      'background-position-x',\n      'background-position-y',\n      'background-repeat',\n      'background-size',\n    ];\n\n    this.applyCustomCSS();\n  }\n\n  componentDidUpdate() {\n    this.applyCustomCSS();\n  }\n\n  render() {\n    return this.props.children;\n  }\n\n  applyCustomCSS() {\n    const domNode = findDOMNode(this);\n    if (!domNode) return;\n\n    const domTarget = domNode.querySelector('#dashboard-wrapper');\n    if (!domTarget) return;\n\n    if (this.props.isCSSPreview && this.props.customCSSLoadedInPage) {\n      const bodyStyles = getWindow().getComputedStyle(document.body);\n      if (bodyStyles.background) {\n        domTarget.style.background = bodyStyles.background;\n        return;\n      }\n\n      // Firefox doesn't support getting all the background styles with getComputedStyle().background,\n      // so we have to check all background properties.\n      for (let i = 0; i < this.cssBackgroundProps.length; i++) {\n        const styleProperty = this.cssBackgroundProps[i];\n        if (bodyStyles[styleProperty]) {\n          domTarget.style[styleProperty] = bodyStyles[styleProperty];\n        }\n      }\n    } else if (!this.props.isCSSPreview) {\n      domTarget.style.background = '';\n    }\n  }\n}\nCustomCSSPreviewComponent.propTypes = {\n  children: PropTypes.node,\n  customCSSLoadedInPage: PropTypes.bool,\n  isCSSPreview: PropTypes.bool,\n};\nCustomCSSPreviewComponent.defaultProps = {\n  isCSSPreview: false,\n};\n\nexport default CustomCSSPreviewComponent;\n","import CustomCSSPreviewConnector from './custom-css-preview-connector';\nexport default CustomCSSPreviewConnector;\n","import CustomCSSPreviewComponent from './custom-css-preview-component';\nimport { connect } from 'react-redux';\nimport { CUSTOM_THEME } from '../themes/theme-constants';\nimport { getCustomizeValues } from '../../customize/helpers';\n\nconst CustomCSSPreviewConnector = connect((state, { location }) => {\n  const {\n    customize,\n    dashboard: { dashboard },\n  } = state;\n\n  const { theme } = getCustomizeValues(dashboard, customize);\n\n  const isPreview = !!location.pathname.match(/customize\\/?$/);\n\n  return {\n    isCSSPreview: isPreview && theme === CUSTOM_THEME,\n    customCSSLoadedInPage: customize.customCSSLoadedInPage,\n  };\n})(CustomCSSPreviewComponent);\n\nexport default CustomCSSPreviewConnector;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Query } from 'react-apollo';\nimport { connect } from 'react-redux';\nimport { find } from 'lodash';\nimport { Route } from 'react-router';\nimport { finishCelebration } from '../../widget/actions/widget-actions';\nimport { setSharingMode, setEditMode } from '../actions/dashboard-actions';\nimport DashboardLayoutComponent from './dashboard-layout-component';\nimport { LAYOUT_TYPES } from './constants';\nimport { Dashboards } from '../../services/concierge-service/graphql/dashboards-query.graphql';\nimport { saveDashboardsToStorage } from '../graphql-dashboard-helpers';\n\nconst mapStateToProps = (\n  {\n    dashboard: {\n      dashboard,\n      dashboard: { can_edit: canEdit, toggles = [] } = {},\n    },\n    user: { user: { features = [] } = {} },\n    widgets,\n    widgetMenu = {},\n  },\n  { location },\n) => {\n  const isPreview = !!location.pathname.match(/customize\\/?$/);\n  const celebrationWidget = find(widgets, { isCelebrating: true });\n\n  let layoutType;\n\n  if (toggles.includes('grid')) {\n    layoutType = LAYOUT_TYPES.FixedLayout;\n  } else {\n    layoutType = LAYOUT_TYPES.ClassicLayout;\n  }\n\n  return {\n    layoutType,\n    canEdit: !!canEdit,\n    isPreview,\n    isEditMode: !!canEdit && !isPreview,\n    celebrationWidget,\n    isDashboardLoaded: !!dashboard,\n    isEditingDatabaseWidget: !!widgetMenu.isEditingQuery,\n    shouldRenderClassicboardsInGeckoJS: features.includes(\n      'ff:classicboardInGeckoJs',\n    ),\n  };\n};\n\nconst mapDispatchToProps = (dispatch, ownProps) => ({\n  onMount: () => {\n    if (ownProps.isSharing) {\n      dispatch(setSharingMode());\n    } else {\n      dispatch(setEditMode());\n    }\n  },\n  onFinishCelebration: widgetKey => dispatch(finishCelebration(widgetKey)),\n});\n\nconst DashboardLayoutConnector = connect(\n  mapStateToProps,\n  mapDispatchToProps,\n)(DashboardLayoutComponent);\n\nconst DashboardLayoutWithDashboardsQuery = props => {\n  if (!!props.sharingHash) {\n    return <DashboardLayoutConnector {...props} />;\n  }\n\n  // When on the edit page we need to store all the dashboards together\n  // with their layout type in the session storage. This helps us to redirect\n  // back to the correct dashboard when adding or editing a widget.\n  return (\n    <Query\n      query={Dashboards}\n      onCompleted={({ dashboards = [] }) => {\n        saveDashboardsToStorage(dashboards);\n      }}\n    >\n      {() => <DashboardLayoutConnector {...props} />}\n    </Query>\n  );\n};\nDashboardLayoutWithDashboardsQuery.propTypes = {\n  sharingHash: PropTypes.string,\n};\n\nconst DashboardLayoutWithURLParams = props => (\n  <Route>\n    {({ match }) => (\n      <DashboardLayoutWithDashboardsQuery\n        {...props}\n        dashboardId={match.params.dashboardId}\n        sharingHash={match.params.sharingHash}\n      />\n    )}\n  </Route>\n);\n\nexport { DashboardLayoutConnector, DashboardLayoutWithDashboardsQuery };\nexport default DashboardLayoutWithURLParams;\n","import DashboardLayout from './dashboard-layout-connector';\nexport default DashboardLayout;\n","import React, { useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport gql from 'graphql-tag';\nimport { useQuery } from 'react-apollo';\nimport bugsnag from '../../lib/bugsnag';\nimport { FormattedHTMLMessage } from '../../lib/i18n';\nimport { LAYOUT_TYPES } from '../dashboard-layout/constants';\nimport { redirect } from '../../lib/global';\nimport DashboardLoadingSpinner from '../dashboard-loading-spinner';\n\nexport const LEGACY_DASHBOARD_QUERY = gql`\n  query DashboardLayoutType($legacyId: ID!) {\n    dashboard: dashboardByLegacyId(legacyId: $legacyId) {\n      id\n      legacyId\n      layoutType {\n        __typename\n      }\n    }\n  }\n`;\n\nexport const DASHBOARD_QUERY = gql`\n  query DashboardLayoutType($id: ID!) {\n    dashboard: dashboard(id: $id) {\n      id\n      legacyId\n      layoutType {\n        __typename\n      }\n    }\n  }\n`;\n\nexport const RoadieImportError = () => {\n  return (\n    <div\n      style={{\n        margin: '40px auto 0 auto',\n        textAlign: 'center',\n        width: 550,\n        lineHeight: 1.5,\n      }}\n    >\n      <FormattedHTMLMessage id=\"generic.roadie.failure\" />\n    </div>\n  );\n};\n\nconst DashboardLayoutRedirectComponent = ({\n  children,\n  match = {},\n  location,\n}) => {\n  const timeoutRef = useRef();\n\n  const { params: { dashboardId } = {} } = match;\n  const [pollingTimedOut, setPollingTimedOut] = useState(false);\n  const isOnLegacyId = !dashboardId.startsWith('dash_');\n  const query = isOnLegacyId ? LEGACY_DASHBOARD_QUERY : DASHBOARD_QUERY;\n  const variables = isOnLegacyId\n    ? { legacyId: dashboardId }\n    : { id: dashboardId };\n  const { data, loading, error, startPolling, stopPolling } = useQuery(query, {\n    variables,\n  });\n\n  if (pollingTimedOut) {\n    bugsnag.send(\n      `Failed to load dashboard by ID ${dashboardId} from Concierge after trying for one minute.`,\n      error ? { error } : undefined,\n    );\n    return <RoadieImportError />;\n  }\n\n  if (loading) {\n    return <DashboardLoadingSpinner key=\"loadingSpinner\" />;\n  }\n\n  const { dashboard } = data || {};\n  if (!dashboard) {\n    // When the dashboard isn't returned it might not have been,\n    // imported to roadie yet. Start polling until the dashboard\n    // is returned, or 1 minute passes.\n    startPolling(3000);\n\n    // Stop polling after 1 minute\n    timeoutRef.current = setTimeout(() => {\n      stopPolling();\n      setPollingTimedOut(true);\n    }, 60000);\n\n    return <DashboardLoadingSpinner key=\"loadingSpinner\" />;\n  }\n\n  // Stop polling when we've received the dashboard\n  stopPolling();\n  clearTimeout(timeoutRef.current);\n\n  const {\n    layoutType: { __typename: layoutType },\n  } = dashboard;\n  if (layoutType !== LAYOUT_TYPES.ContainerLayout && !isOnLegacyId) {\n    // we're trying to load a dashie when the dashboard is a fixie\n    redirect(location.pathname.replace(dashboardId, dashboard.legacyId));\n    return null;\n  }\n  if (layoutType === LAYOUT_TYPES.ContainerLayout && isOnLegacyId) {\n    // we're trying to load a fixie when the dashboard is a dashie\n    redirect(location.pathname.replace(dashboardId, dashboard.id));\n    return null;\n  }\n\n  return children;\n};\n\nDashboardLayoutRedirectComponent.propTypes = {\n  children: PropTypes.node,\n  location: PropTypes.object,\n  match: PropTypes.object,\n};\n\nexport default DashboardLayoutRedirectComponent;\n","import DashboardLayoutRedirect from './dashboard-layout-redirect-component';\nexport default DashboardLayoutRedirect;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport CustomizationApplicator from './customization-applicator';\nimport PreviewScaling from './preview-scaling';\nimport CustomCSSPreview from './custom-css-preview';\nimport DashboardLayout from './dashboard-layout';\nimport DashboardLayoutRedirect from './dashboard-layout-redirect';\nimport DashboardTrackingProps from './dashboard-tracking-props/';\n\nconst applyTheming = (DecoratedComponent, useGraphQL) => props => {\n  return (\n    <CustomizationApplicator useGraphQL={useGraphQL} {...props}>\n      <DecoratedComponent {...props} />\n    </CustomizationApplicator>\n  );\n};\n\nconst applyPreview = DecoratedComponent => props => {\n  return (\n    <PreviewScaling {...props}>\n      <CustomCSSPreview {...props}>\n        <DecoratedComponent {...props} />\n      </CustomCSSPreview>\n    </PreviewScaling>\n  );\n};\n\nconst injectDashboardTrackingProps = DecoratedComponent => props => {\n  const { match: { params: { dashboardId } = {} } = {} } = props;\n  return (\n    <DashboardTrackingProps legacyId={dashboardId}>\n      <DecoratedComponent {...props} />\n    </DashboardTrackingProps>\n  );\n};\n\nconst ensureCorrectLayout = DecoratedComponent => {\n  const EnsuredDashboard = props => {\n    const shouldRenderQuery = !props.isSharing && !props.isScreen;\n\n    return (\n      <Fragment>\n        {!shouldRenderQuery ? (\n          <DecoratedComponent {...props} />\n        ) : (\n          <DashboardLayoutRedirect\n            match={props.match}\n            location={props.location}\n          >\n            <DecoratedComponent {...props} />\n          </DashboardLayoutRedirect>\n        )}\n      </Fragment>\n    );\n  };\n\n  EnsuredDashboard.propTypes = {\n    isScreen: PropTypes.bool,\n    isSharing: PropTypes.bool,\n    location: PropTypes.object,\n    match: PropTypes.object,\n  };\n  return EnsuredDashboard;\n};\n\nexport {\n  DashboardLayout as default,\n  applyPreview,\n  applyTheming,\n  ensureCorrectLayout,\n  injectDashboardTrackingProps,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport gql from 'graphql-tag';\nimport { Query } from 'react-apollo';\n\n/**\n * This component fetches data for a GraphQL screen page that\n * both container and non-container layouts need. After this each\n * layout component will fetch more dashboard details they need.\n *\n * The dashboard ID is used to listen on the\n * dashboard pusher channel for remote refresh event.\n */\n\nexport const GET_DASHBOARD_QUERY = gql`\n  query Dashboard($screenId: ID!) {\n    dashboard: screenContent(screenId: $screenId) {\n      ... on Dashboard {\n        id\n        layoutType {\n          __typename\n        }\n      }\n    }\n  }\n`;\n\nconst GraphqlScreenDataProvider = props => {\n  const { children, screenId } = props;\n  return (\n    <Query query={GET_DASHBOARD_QUERY} variables={{ screenId }}>\n      {({ data, loading, error }) => {\n        if (loading || error) {\n          return null;\n        }\n\n        const dashboardId = data.dashboard ? data.dashboard.id : undefined;\n        const layoutType = data.dashboard\n          ? data.dashboard.layoutType.__typename\n          : undefined;\n        return children({ dashboardId, layoutType });\n      }}\n    </Query>\n  );\n};\n\nGraphqlScreenDataProvider.propTypes = {\n  screenId: PropTypes.string.isRequired,\n  children: PropTypes.func,\n};\n\nexport default GraphqlScreenDataProvider;\n","import GraphqlScreenDataProvider from './graphql-screen-data-provider';\n\nexport default GraphqlScreenDataProvider;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport gql from 'graphql-tag';\nimport { Query } from 'react-apollo';\n\n/**\n * This component fetches data for a GraphQL sharing page that\n * both container and non-container layouts need. After this each\n * layout component will fetch more dashboard details they need.\n *\n * The dashboard ID is used to listen on the\n * dashboard pusher channel for remote refresh event.\n */\n\nexport const GET_DASHBOARD_QUERY = gql`\n  query Dashboard($sharingHash: String!) {\n    dashboard: dashboardBySharingHash(sharingHash: $sharingHash) {\n      id\n      layoutType {\n        __typename\n      }\n    }\n  }\n`;\n\nconst GraphqlSharePageDataProvider = props => {\n  const { children, sharingHash } = props;\n  return (\n    <Query query={GET_DASHBOARD_QUERY} variables={{ sharingHash }}>\n      {({ data, loading, error }) => {\n        if (loading || error) {\n          return null;\n        }\n\n        const dashboardId = data.dashboard ? data.dashboard.id : undefined;\n        const layoutType = data.dashboard\n          ? data.dashboard.layoutType.__typename\n          : undefined;\n        return children({ dashboardId, layoutType });\n      }}\n    </Query>\n  );\n};\n\nGraphqlSharePageDataProvider.propTypes = {\n  sharingHash: PropTypes.string.isRequired,\n  children: PropTypes.func,\n};\n\nexport default GraphqlSharePageDataProvider;\n","import GraphqlSharePageDataProvider from './graphql-share-page-data-provider';\n\nexport default GraphqlSharePageDataProvider;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Route } from 'react-router';\nimport AsyncComponentLoader from '../async-component-loader';\nimport * as graphQLHelpers from '../services/concierge-service/graphql-helpers';\nimport { LAYOUT_TYPES } from '../dashboard/dashboard-layout/constants';\nimport GraphqlScreenDataProvider from '../graphql-share-page/data-provider/screen-data-provider/';\nimport GraphqlSharePageDataProvider from '../graphql-share-page/data-provider/sharing-url-data-provider';\nimport { useMobileDetect } from '@Hooks';\n\n/**\n * This component gets rendered by the router when we want\n * to use the GraphQL API. It's imported in main.js and\n * passed down to the router as ThemedDashboard. It's\n * used for deciding to render the edit or sharing\n * GraphQL page since our router setup doesn't handle\n * that very well at the moment.\n */\n\nconst _importGraphQLEditPageComponent = () => import('../graphql-edit-page');\nconst AsyncGraphQLEditPage = props => (\n  <AsyncComponentLoader\n    importComponent={_importGraphQLEditPageComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: GraphQLEditPage } = component;\n      return <GraphQLEditPage {...props} />;\n    }}\n  />\n);\n\nconst _importGraphQLSharePageComponent = () => import('../graphql-share-page');\nconst AsyncGraphQLSharePage = props => (\n  <AsyncComponentLoader\n    importComponent={_importGraphQLSharePageComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: GraphQLSharePage } = component;\n      return <GraphQLSharePage {...props} />;\n    }}\n  />\n);\n\nconst _importGraphQLMobilePageComponent = () =>\n  import('../graphql-mobile-page');\nconst AsyncGraphQLMobilePage = props => (\n  <AsyncComponentLoader\n    importComponent={_importGraphQLMobilePageComponent}\n    renderComponent={({ isLoading, component }) => {\n      if (isLoading) {\n        return null;\n      }\n\n      const { default: GraphQLMobilePage } = component;\n      return <GraphQLMobilePage {...props} />;\n    }}\n  />\n);\n\nconst GraphQLPageContainer = ({\n  dashboardId,\n  screenId,\n  sharingHash,\n  ...rest\n}) => {\n  const isMobile = useMobileDetect();\n\n  if (graphQLHelpers.isContainerLayoutEditMode()) {\n    if (isMobile) {\n      return <AsyncGraphQLMobilePage />;\n    }\n\n    return (\n      <AsyncGraphQLEditPage\n        dashboardId={dashboardId}\n        layoutType={LAYOUT_TYPES.ContainerLayout}\n        {...rest}\n      />\n    );\n  }\n\n  if (screenId) {\n    return (\n      <GraphqlScreenDataProvider screenId={screenId}>\n        {data => (\n          <AsyncGraphQLSharePage\n            dashboardId={data.dashboardId}\n            layoutType={data.layoutType}\n            {...rest}\n          />\n        )}\n      </GraphqlScreenDataProvider>\n    );\n  }\n\n  // TODO: Stop passing sharingHash here and make GraphQLSharePage\n  // get it using react router useParams() hook instead.\n  // It needs sharingHash to dispatch\n  // initialiseSharedGraphQLDashboard action.\n  return (\n    <GraphqlSharePageDataProvider sharingHash={sharingHash}>\n      {data => {\n        // Render mobile page only for dashies on sharing urls\n        if (isMobile && data.layoutType === LAYOUT_TYPES.ContainerLayout) {\n          return <AsyncGraphQLMobilePage />;\n        }\n\n        return (\n          <AsyncGraphQLSharePage\n            isSharing\n            sharingHash={sharingHash}\n            dashboardId={data.dashboardId}\n            layoutType={data.layoutType}\n            {...rest}\n          />\n        );\n      }}\n    </GraphqlSharePageDataProvider>\n  );\n};\n\nGraphQLPageContainer.propTypes = {\n  dashboardId: PropTypes.string,\n  screenId: PropTypes.string,\n  sharingHash: PropTypes.string,\n};\n\nconst GraphQLPageContainerWithURLParams = props => (\n  <Route>\n    {({ match }) => (\n      <GraphQLPageContainer\n        {...props}\n        dashboardId={match.params.dashboardId}\n        screenId={match.params.screenId}\n        sharingHash={match.params.sharingHash}\n      />\n    )}\n  </Route>\n);\n\nexport {\n  GraphQLPageContainer,\n  AsyncGraphQLEditPage,\n  AsyncGraphQLSharePage,\n  AsyncGraphQLMobilePage,\n};\nexport default GraphQLPageContainerWithURLParams;\n","import GraphQLPageContainer from './graphql-page-container-component';\n\nexport default GraphQLPageContainer;\n","import { useView } from './lib/gecko-view';\nimport RoutesRenderer from './routes';\nimport { history } from './router';\nimport { isGraphQLDashboard } from './services/concierge-service/graphql-helpers';\nimport DashboardLayout, {\n  applyTheming,\n  applyPreview,\n  ensureCorrectLayout,\n  injectDashboardTrackingProps,\n} from './dashboard';\nimport GraphQLDashboardPage from './graphql-page-container';\nimport * as Tracking from '@Tracking';\nimport apolloClient from './services/concierge-service/apollo-client';\n\nconst main = domHost => {\n  const renderer = new RoutesRenderer(domHost);\n\n  let ThemedDashboard;\n  let GeckoRouter;\n\n  // We avoid rendering GeckoJS on GraphQL dashboards and therefore\n  // can't do useView('gecko-router') on this URL.\n  if (!isGraphQLDashboard()) {\n    GeckoRouter = useView('gecko-router');\n    ThemedDashboard = injectDashboardTrackingProps(\n      ensureCorrectLayout(applyTheming(DashboardLayout, false)),\n    );\n  } else {\n    ThemedDashboard = ensureCorrectLayout(\n      applyTheming(GraphQLDashboardPage, true),\n    );\n  }\n  const PreviewDashboard = applyPreview(ThemedDashboard);\n  const client = apolloClient.create();\n\n  Tracking.setApolloClient(client);\n\n  const props = {\n    history,\n    GeckoRouter,\n    ThemedDashboard,\n    PreviewDashboard,\n    client,\n  };\n\n  renderer.render(props);\n};\n\nexport default main;\n","import './public-path';\nimport 'core-js/stable';\nimport 'regenerator-runtime/runtime';\nimport * as Tracking from '@Tracking';\nimport * as TrackingEvents from '@Tracking/events';\n\n/*\n * Import global css which should be removed\n * when switching completely to CSS Modules\n */\nimport '../style/index.scss';\nimport 'atacama.css';\n\nimport { formatMessage } from './lib/i18n';\n\nimport Account from './account';\nimport DashboardFooter from './dashboard/components/dashboard-footer';\nimport ConfigWrapper from './config-wrapper';\nimport DataSourceConnector from './data-source-connector';\nimport EmptyDashboard from './empty-dashboard';\nimport { IntegrationRequest } from './integration-request';\nimport Masthead from './masthead';\nimport ServiceList from './service-list';\nimport * as ToastConstants from './toast/toast-constants';\nimport { scheduleToast as scheduleToastDelegate } from './toast/toast-storage';\nimport { TvPageEmpty } from './tv-page';\nimport Visualisation from './visualisation';\nimport Widget from './widget';\nimport { ControlledWidgetRenderer } from './widget/controlled-widget';\nimport idempotentInitApp from './init';\nimport handleGeckoJSMessage from './lib/handle-geckojs-message';\nimport PushManager from './lib/push-manager';\nimport * as humaniseNumber from './lib/humanise-number';\nimport { getEditWidgetPath } from './lib/path';\nimport { trackSnowplow } from './lib/tracker';\n\nimport _ from 'lodash';\n\n// Stop lodash from being a complete arse\n// `_` is installed on the global even when imported as a module\n// this trashes the older version used by gecko-js and causes issues.\n_.noConflict();\n\n/*\n * Add Intl support for old browsers. 'intl' handles all the Polyfill\n * logic internally so we just need to import it along with the data\n * for locales we want to support. When all browsers that we want\n * to support have native Intl support, we can delete this.\n */\nimport 'intl';\nimport 'intl/locale-data/jsonp/en.js';\n\nimport { registerView } from './lib/gecko-view';\nimport main from './main';\nimport { navigate, router } from './router';\nimport widgetStorage from './lib/widget-storage';\n\nconst tracking = { trackEvent: Tracking.trackEvent, events: TrackingEvents };\n\nconst postMessage = (...args) => {\n  // TODO: Can we use `getReduxStore` here instead?\n  idempotentInitApp()\n    .getStore()\n    .dispatch(handleGeckoJSMessage(...args));\n};\n\nconst scheduleToast = toast => {\n  // TODO: Can we use `getReduxStore` here instead?\n  const getState = () =>\n    idempotentInitApp()\n      .getStore()\n      .getState();\n\n  return scheduleToastDelegate(toast, getState);\n};\n\nexport {\n  Account,\n  DashboardFooter,\n  ConfigWrapper,\n  ControlledWidgetRenderer as ControlledWidget,\n  DataSourceConnector,\n  EmptyDashboard,\n  formatMessage,\n  humaniseNumber,\n  IntegrationRequest,\n  main,\n  Masthead,\n  navigate,\n  router,\n  registerView,\n  ServiceList,\n  ToastConstants,\n  scheduleToast,\n  TvPageEmpty,\n  Visualisation,\n  widgetStorage,\n  postMessage,\n  PushManager,\n  Widget,\n  getEditWidgetPath,\n  trackSnowplow,\n  tracking,\n};\n"],"sourceRoot":""}